Naučte se, jak implementovat plynulou internacionalizaci (i18n) ve vašich Next.js aplikacích pro oslovení globálního publika. Pokrývá směrování, překlad obsahu a osvědčené postupy.
Internacionalizace v Next.js: Tvorba vícejazyčných aplikací pro globální publikum
V dnešním propojeném světě již není tvorba aplikací, které oslovují globální publikum, luxusem – je to nutnost. Next.js, výkonný framework pro React, poskytuje robustní funkce pro implementaci internacionalizace (i18n), což vám umožňuje vytvářet vícejazyčné aplikace, které poskytují lokalizovaný zážitek uživatelům po celém světě. Tento komplexní průvodce vás provede základními koncepty, technikami a osvědčenými postupy pro tvorbu internacionalizovaných aplikací v Next.js.
Pochopení internacionalizace a lokalizace
Než se ponoříme do specifik i18n v Next.js, ujasněme si klíčové pojmy:
- Internacionalizace (i18n): Proces navrhování a vývoje aplikace tak, aby ji bylo možné snadno přizpůsobit různým jazykům a regionům bez nutnosti technických změn. To zahrnuje abstrakci textu, formátování a dalších prvků specifických pro danou lokalitu.
- Lokalizace (l10n): Proces přizpůsobení aplikace konkrétnímu jazyku a regionu. To zahrnuje překlad textu, úpravu formátů data a času, symbolů měn a další.
V podstatě i18n připravuje vaši aplikaci na lokalizaci. Oddělením prvků závislých na jazyku od jádra kódu usnadníte lokalizaci aplikace pro různé trhy.
Proč implementovat internacionalizaci v Next.js?
Implementace i18n ve vaší aplikaci Next.js nabízí řadu výhod:
- Rozšířený dosah: Oslovte širší publikum poskytováním obsahu v jejich preferovaném jazyce.
- Zlepšený uživatelský zážitek: Nabídněte personalizovanější a poutavější zážitek pro uživatele v různých regionech.
- Vylepšené SEO: Zlepšete optimalizaci pro vyhledávače (SEO) poskytováním lokalizovaného obsahu, který cílí na specifické geografické regiony.
- Zvýšené konverze: Zvyšte konverze prezentací informací v rodném jazyce uživatele, což podporuje důvěru a porozumění.
- Globální přítomnost značky: Vybudujte silnější globální přítomnost značky tím, že prokážete závazek k inkluzivitě a uspokojení různorodého publika.
Funkce a konfigurace i18n v Next.js
Next.js nabízí vestavěnou podporu pro i18n prostřednictvím svých funkcí směrování a správy obsahu. Následuje přehled důležitých funkcí:
1. Konfigurace i18n v next.config.js
Základní konfigurace pro i18n se nachází v souboru next.config.js
. Zde je příklad:
/** @type {import('next').NextConfig} */
const nextConfig = {
i18n: {
locales: ['en', 'es', 'fr'], // Pole podporovaných lokalit (kódy jazyků)
defaultLocale: 'en', // Výchozí lokalita, která se má použít
localeDetection: true, // Povolit/zakázat automatickou detekci lokality na základě nastavení prohlížeče (volitelné)
// domains: [
// {
// domain: 'example.com',
// defaultLocale: 'en',
// },
// {
// domain: 'example.es',
// defaultLocale: 'es',
// },
// ],
},
}
module.exports = nextConfig;
Vysvětlení:
locales
: Pole obsahující kódy jazyků (např.'en'
pro angličtinu,'es'
pro španělštinu,'fr'
pro francouzštinu) jazyků podporovaných vaší aplikací. Pro konzistenci dodržujte kódy jazyků ISO 639-1.defaultLocale
: Výchozí jazyk, který bude vaše aplikace používat. Je to jazyk zobrazený, pokud v URL není specifikován žádný jiný jazyk nebo není detekován z nastavení prohlížeče uživatele. Zvolte jazyk, který je reprezentativní pro vaše primární cílové publikum.localeDetection
: Booleovská hodnota, která řídí, zda Next.js automaticky detekuje preferovaný jazyk uživatele na základě nastavení jeho prohlížeče. Pokud je nastavena natrue
, Next.js se pokusí přesměrovat uživatele na příslušnou jazykovou verzi vašeho webu.domains
(volitelné): Pole, které vám umožňuje přiřadit lokality ke konkrétním doménám. To je užitečné, pokud máte samostatné domény pro různé jazyky (např.example.com
pro angličtinu,example.es
pro španělštinu).
2. Směrování s prefixy lokalit
Next.js automaticky přidává k trasám prefix lokality. Například, pokud máte stránku na /about
a lokalita je 'es' (španělština), URL se stane /es/about
. To umožňuje různé jazykové verze stránek a umožňuje vyhledávačům indexovat obsah pro každou lokalitu. Framework za vás spravuje přesměrování a směrování.
3. Využití hooku useRouter
Hook useRouter
z next/router
poskytuje přístup k aktuální lokalitě a dalším informacím o směrování.
import { useRouter } from 'next/router';
function MyComponent() {
const router = useRouter();
const { locale, locales, defaultLocale } = router;
return (
Aktuální lokalita: {locale}
Dostupné lokality: {locales.join(', ')}
Výchozí lokalita: {defaultLocale}
);
}
export default MyComponent;
Objekt router
nabízí následující klíčové vlastnosti:
locale
: Aktuálně vybraná lokalita (např. 'en', 'es', 'fr').locales
: Pole všech podporovaných lokalit definovaných vnext.config.js
.defaultLocale
: Výchozí lokalita nastavená vnext.config.js
.asPath
: Cesta, jak je zobrazena v prohlížeči, včetně prefixu lokality (např./es/about
).pathname
: Cesta bez prefixu lokality (např./about
).
Strategie překladu obsahu
Jakmile máte vaši aplikaci Next.js nakonfigurovanou pro i18n, budete muset implementovat strategie pro překlad vašeho obsahu. Zde je několik populárních přístupů:
1. Použití dedikovaného systému pro správu překladů (TMS)
Pro rozsáhlé projekty s mnoha jazyky je vysoce doporučen TMS. Mezi populární možnosti patří:
- Phrase: Cloudový TMS s integracemi pro různé platformy, včetně Next.js. Nabízí funkce pro spolupráci a automatizované pracovní postupy.
- Localize: Další cloudový TMS, který podporuje širokou škálu formátů souborů a poskytuje funkce pro správu překladů.
- Crowdin: Výkonný TMS, který je velmi populární v komunitě open-source a dobře se integruje s Next.js, což týmům umožňuje efektivně překládat obsah.
Výhody:
- Centralizovaná správa překladů.
- Funkce pro spolupráci překladatelů.
- Automatizace překladatelských pracovních postupů.
- Integrace s vaším vývojovým procesem.
2. Vytváření JSON souborů s překlady
Pro menší projekty je použití JSON souborů k ukládání překladů jednoduchou a efektivní metodou.
Příklad adresářové struktury:
/src
├── locales
│ ├── en.json
│ └── es.json
├── components
│ └── MyComponent.js
└── pages
└── index.js
Příklad en.json
:
{
"greeting": "Hello, world!",
"welcomeMessage": "Welcome to our website."
}
Příklad es.json
:
{
"greeting": "¡Hola, mundo!",
"welcomeMessage": "Bienvenido a nuestro sitio web."
}
Příklad MyComponent.js
:
import { useRouter } from 'next/router';
import en from '../locales/en.json';
import es from '../locales/es.json';
function MyComponent() {
const { locale } = useRouter();
const t = locale === 'es' ? es : en;
return (
{t.greeting}
{t.welcomeMessage}
);
}
export default MyComponent;
Tento přístup poskytuje flexibilitu a je přímočarý pro menší projekty. Obecně se snadno aktualizuje a udržuje.
3. Použití překladatelské knihovny
Několik JavaScriptových knihoven zjednodušuje překlad obsahu ve vašich React komponentách.
next-i18next
: Populární knihovna speciálně navržená pro Next.js. Dobře se integruje s frameworkem a poskytuje funkce jako server-side rendering (SSR) a překlad na straně klienta.react-i18next
: Obecná i18n knihovna pro React. Můžete ji použít ve svých Next.js aplikacích, i když může vyžadovat více konfigurace ve srovnání snext-i18next
.
Příklad s next-i18next
(Instalace: npm install next-i18next i18next react-i18next
):
Vytvořte konfigurační soubor i18n (např. i18n.js
ve vašem kořenovém adresáři):
// i18n.js
import { createServerSideHelpers } from 'next-i18next'
import { i18n } from './next-i18next.config'
export function initI18next(req, res, namespaces = ['common']) {
const helpers = createServerSideHelpers(
req,
res,
i18n,
namespaces
)
return helpers
}
export { appWithTranslation } from 'next-i18next'
export { i18n }
Vytvořte svou Next.js konfiguraci pro next-i18next.
// next-i18next.config.js
const { i18n } = require('./next-i18next.config');
/** @type {import('next').NextConfig} */
const nextConfig = {
reactStrictMode: true,
i18n: {
defaultLocale: 'en',
locales: ['en', 'es', 'fr'],
},
// další konfigurace
}
module.exports = nextConfig
Přidejte konfiguraci a import překladu do vašeho souboru _app.js
:
import { appWithTranslation } from 'next-i18next';
import '../styles/globals.css';
function MyApp({ Component, pageProps }) {
return ;
}
export default appWithTranslation(MyApp);
Vytvořte složku a naplňte ji lokalitami pro vaše překlady.
/public
└── locales
├── en
│ └── common.json
├── es
│ └── common.json
└── fr
└── common.json
Příklad en/common.json:
{
"greeting": "Hello, world!",
"welcomeMessage": "Welcome to our website."
}
Použití překladu v komponentě:
import { useTranslation } from 'next-i18next';
function MyComponent() {
const { t } = useTranslation('common');
return (
{t('greeting')}
{t('welcomeMessage')}
);
}
export default MyComponent;
Tento příklad používá hook useTranslation
k načtení překladů na základě aktuální lokality.
Zpracování dynamických tras a generování statických stránek (SSG)
Internacionalizace se stává složitější při práci s dynamickými trasami (např. příspěvky na blogu, stránky produktů) a generováním statických stránek (SSG).
1. Dynamické trasy (např. /blog/[slug])
Pro dynamické trasy budete muset vygenerovat správné cesty pro každou lokalitu během sestavování pomocí getStaticPaths
. Tato funkce vrací pole cest, které by měl Next.js předem vykreslit.
export async function getStaticPaths() {
const paths = [];
const locales = ['en', 'es', 'fr'];
const posts = await fetchPosts(); // Načtení dat příspěvků na blogu
posts.forEach(post => {
locales.forEach(locale => {
paths.push({
params: {
slug: post.slug,
},
locale,
});
});
});
return {
paths,
fallback: false, // nebo 'blocking', pokud chcete zobrazit stav načítání
};
}
export async function getStaticProps({ params, locale }) {
const post = await getPostBySlug(params.slug, locale);
return {
props: {
post,
},
};
}
Vysvětlení:
getStaticPaths
: Tato funkce iteruje přes vaše příspěvky na blogu a generuje cestu pro každý příspěvek a každou lokalitu. Objektparams
obsahuje parametry trasy (např. slug příspěvku na blogu).locale
: Tento parametr poskytuje aktuální lokalitu, což vám umožňuje načíst přeložený obsah pro konkrétní lokalitu.fallback
: Určuje, jak Next.js zpracovává cesty nedefinované vgetStaticPaths
.fallback: false
generuje 404 stránky pro nedefinované cesty.fallback: 'blocking'
předem vykresluje stránky na vyžádání.
2. Generování statických stránek (SSG) s getStaticProps
V getStaticProps
můžete načíst přeložený obsah na základě parametru locale
.
export async function getStaticProps({ params, locale }) {
// Načtení obsahu na základě lokality a parametrů
const { post } = await getPostBySlug(params.slug, locale);
return {
props: {
post,
},
};
}
Funkce getPostBySlug
by měla načíst přeložený obsah pro daný slug a lokalitu, který může být získán z vašich překladových souborů, databáze nebo CMS.
3. Vykreslování na straně serveru (SSR) s getServerSideProps
Pro obsah, který je třeba načíst v době požadavku, použijte getServerSideProps
. To je užitečné, pokud se obsah často mění nebo je personalizován pro každého uživatele.
export async function getServerSideProps({ params, locale, req, res }) {
// Načtení dat na základě lokality a parametrů (např. z databáze)
const data = await fetchData(params.slug, locale);
return {
props: {
data,
},
};
}
Osvědčené postupy pro internacionalizaci v Next.js
Dodržování těchto osvědčených postupů vám pomůže vytvořit robustní, udržovatelné a uživatelsky přívětivé vícejazyčné aplikace:
- Plánujte brzy: Zvažte internacionalizaci od samého začátku vašeho projektu. Je mnohem snazší ji implementovat předem než ji dodatečně přidávat.
- Oddělte obsah od kódu: Ukládejte veškerý přeložitelný text do samostatných souborů (např. JSON soubory nebo TMS) a vyhněte se pevně zakódovanému textu přímo ve vašich komponentách.
- Použijte systém pro správu překladů (TMS): Pro větší projekty může TMS zjednodušit proces překladu a zlepšit spolupráci.
- Důkladně testujte: Testujte svou aplikaci ve všech podporovaných jazycích, abyste zajistili přesné překlady, správné formátování a řádné vykreslování napříč různými prohlížeči a zařízeními. Testujte na skutečných zařízeních, nejen na emulátorech.
- Zvažte jazyky psané zprava doleva (RTL): Pokud podporujete jazyky jako arabština nebo hebrejština, zajistěte, aby váš design a rozložení vyhovovaly směru textu zprava doleva. Next.js to automaticky neřeší, takže jsou vyžadovány CSS nebo jiná řešení.
- Zpracujte formátování data a času: Používejte knihovny nebo vestavěné funkce pro formátování dat a časů podle lokality uživatele. Moment.js a date-fns jsou dvě populární knihovny, které jsou užitečné.
- Spravujte formátování čísel a měn: Správně formátujte čísla a symboly měn na základě lokality uživatele.
- Optimalizujte SEO: Používejte meta tagy specifické pro jazyk (
hreflang
), abyste pomohli vyhledávačům správně indexovat váš obsah. Zahrňte kódy jazyků do vašich URL. - Upřednostněte uživatelský zážitek: Poskytněte jasný a intuitivní způsob, jak mohou uživatelé přepínat mezi jazyky. Zvažte nabídku automatické detekce jazyka na základě nastavení prohlížeče.
- Zůstaňte aktuální: Udržujte svou verzi Next.js a i18n knihovny aktuální, abyste mohli využívat nejnovější funkce a bezpečnostní záplaty.
- Zvažte přístupnost (a11y): Zajistěte, aby byl váš přeložený obsah přístupný uživatelům s postižením. Poskytněte alternativní text pro obrázky a používejte příslušné ARIA atributy. Používejte čtečky obrazovky k testování.
SEO aspekty pro internacionalizované webové stránky
Optimalizace vaší internacionalizované webové stránky pro vyhledávače je nezbytná pro přilákání organické návštěvnosti z celého světa. Zde jsou některé klíčové osvědčené postupy SEO:
- Značky
hreflang
: Implementujte značkyhreflang
v<head>
vašeho HTML, abyste vyhledávačům sdělili jazykové a regionální varianty vašeho obsahu. To je pro SEO klíčové. Například:<link rel="alternate" hreflang="en" href="https://example.com/en/" />
a<link rel="alternate" hreflang="es" href="https://example.com/es/" />
- URL specifické pro jazyk: Používejte kódy jazyků ve vašich URL (např.
/en/about
,/es/acerca-de
). To jasně signalizuje jazyk obsahu jak uživatelům, tak vyhledávačům. - Lokalizovaný obsah: Překládejte svůj obsah přesně a přirozeně. Strojové překlady by měl zkontrolovat rodilý mluvčí.
- Lokalizované meta popisky a titulky: Napište jedinečné a přesvědčivé meta popisky a titulky pro každý jazyk, abyste zlepšili míru prokliku ve výsledcích vyhledávání.
- XML sitemapy: Vytvořte a odešlete XML sitemapy, které zahrnují všechny jazykové varianty vašich stránek.
- Interní prolinkování: Používejte vhodné interní odkazy mezi jazykovými verzemi vašeho obsahu.
- Výzkum klíčových slov pro konkrétní zemi: Proveďte výzkum klíčových slov v každém jazyce, abyste identifikovali termíny, které uživatelé v každém regionu vyhledávají.
Příklad: Vytvoření jednoduchého vícejazyčného blogu
Vytvořme zjednodušený příklad vícejazyčného blogu pomocí Next.js. To poskytne konkrétnější ilustraci, jak aplikovat výše uvedené koncepty.
1. Nastavení projektu
Vytvořte nový projekt Next.js:
npx create-next-app my-multi-lang-blog
cd my-multi-lang-blog
2. Konfigurace i18n (next.config.js
)
/** @type {import('next').NextConfig} */
const nextConfig = {
reactStrictMode: true,
i18n: {
locales: ['en', 'es', 'fr'],
defaultLocale: 'en',
},
}
module.exports = nextConfig
3. Vytvoření překladových souborů
Vytvořte složku locales
v kořenovém adresáři a přidejte následující JSON soubory:
locales/en.json
:
{
"title": "Welcome to My Blog",
"postTitle": "My First Post",
"postContent": "This is the content of my first blog post."
}
locales/es.json
:
{
"title": "Bienvenido a mi Blog",
"postTitle": "Mi Primer Post",
"postContent": "Este es el contenido de mi primer publicación de blog."
}
locales/fr.json
:
{
"title": "Bienvenue sur Mon Blog",
"postTitle": "Mon Premier Article",
"postContent": "Ceci est le contenu de mon premier article de blog."
}
4. Vytvoření komponenty blogového příspěvku (např. components/BlogPost.js
)
import { useRouter } from 'next/router';
import en from '../locales/en.json';
import es from '../locales/es.json';
import fr from '../locales/fr.json';
function BlogPost() {
const router = useRouter();
const { locale } = router;
let translations;
switch (locale) {
case 'es':
translations = es;
break;
case 'fr':
translations = fr;
break;
default:
translations = en;
}
return (
{translations.postTitle}
{translations.postContent}
);
}
export default BlogPost;
5. Vytvoření úvodní stránky (pages/index.js
)
import { useRouter } from 'next/router';
import BlogPost from '../components/BlogPost';
import en from '../locales/en.json';
import es from '../locales/es.json';
import fr from '../locales/fr.json';
function HomePage() {
const router = useRouter();
const { locale, locales } = router;
let translations;
switch (locale) {
case 'es':
translations = es;
break;
case 'fr':
translations = fr;
break;
default:
translations = en;
}
return (
);
}
export default HomePage;
Tento zjednodušený příklad ukazuje základní principy internacionalizace v Next.js. Můžete tento základní rámec rozšířit o složitější funkce, jako jsou dynamické trasy a integrace se systémy pro správu překladů. Zvažte vylepšení výše uvedených odkazů pomocí komponenty Link
a přidejte příslušný atribut locale
.
6. Spuštění aplikace
Spusťte aplikaci příkazem:
npm run dev
Nyní můžete přistupovat ke svému blogu na adresách http://localhost:3000
(anglicky), http://localhost:3000/es
(španělsky) a http://localhost:3000/fr
(francouzsky). Měli byste vidět titulek a obsah blogového příspěvku přeložený podle vybrané lokality.
Závěr
Next.js poskytuje komplexní sadu funkcí pro implementaci internacionalizace ve vašich webových aplikacích. Dodržováním principů a technik uvedených v tomto průvodci můžete vytvářet vícejazyčné aplikace, které poskytují lokalizované zážitky uživatelům po celém světě. Nezapomeňte si svou i18n strategii naplánovat včas, zvolit správnou metodu překladu pro vaše potřeby a upřednostnit uživatelský zážitek. S pečlivým plánováním a realizací můžete vytvářet aplikace, které rezonují s globálním publikem a otevírají nové příležitosti k růstu. Neustálé učení, sledování nejnovějších vydání a osvědčených postupů zajistí, že efektivně využíváte své nástroje a technologie.
S postupem technologií očekávejte, že se objeví pokročilejší funkce i18n. Schopnost oslovit uživatele napříč různými kulturami a jazykovými skupinami zůstane klíčovou prioritou pro vývojáře aplikací po celém světě. Proto je zvládnutí základů i18n cennou dovedností, která zvýší vaši hodnotu v dnešním globálním vývojářském prostředí.