Dowiedz się, jak wdrożyć płynną internacjonalizację (i18n) w aplikacjach Next.js, aby dotrzeć do globalnej publiczności. Obejmuje routing, tłumaczenie treści i najlepsze praktyki.
Internacjonalizacja w Next.js: Tworzenie wielojęzycznych aplikacji dla globalnej publiczności
W dzisiejszym połączonym świecie tworzenie aplikacji dla globalnej publiczności nie jest już luksusem – to konieczność. Next.js, potężny framework React, dostarcza solidne funkcje do implementacji internacjonalizacji (i18n), pozwalając tworzyć wielojęzyczne aplikacje, które zapewniają zlokalizowane doświadczenie użytkownikom na całym świecie. Ten kompleksowy przewodnik przeprowadzi Cię przez podstawowe koncepcje, techniki i najlepsze praktyki tworzenia zinternacjonalizowanych aplikacji w Next.js.
Zrozumienie internacjonalizacji i lokalizacji
Zanim zagłębimy się w szczegóły i18n w Next.js, wyjaśnijmy kluczowe terminy:
- Internacjonalizacja (i18n): Proces projektowania i tworzenia aplikacji w taki sposób, aby można ją było łatwo dostosować do różnych języków i regionów bez konieczności zmian inżynieryjnych. Obejmuje to abstrahowanie tekstu, formatowania i innych elementów specyficznych dla danego locale.
- Lokalizacja (l10n): Proces dostosowywania aplikacji do konkretnego języka i regionu. Obejmuje to tłumaczenie tekstu, dostosowywanie formatów daty i czasu, symboli walut i wiele innych.
Zasadniczo, i18n przygotowuje Twoją aplikację do lokalizacji. Oddzielając elementy zależne od języka od głównego kodu, ułatwiasz lokalizację aplikacji na różne rynki.
Dlaczego warto wdrażać internacjonalizację w Next.js?
Implementacja i18n w aplikacji Next.js oferuje liczne korzyści:
- Zwiększony zasięg: Dotrzyj do szerszej publiczności, dostarczając treści w ich preferowanym języku.
- Lepsze doświadczenie użytkownika: Zaoferuj bardziej spersonalizowane i angażujące doświadczenie użytkownikom z różnych regionów.
- Poprawione SEO: Popraw optymalizację pod kątem wyszukiwarek (SEO), dostarczając zlokalizowane treści skierowane do określonych regionów geograficznych.
- Zwiększone konwersje: Zwiększ konwersje, prezentując informacje w ojczystym języku użytkownika, budując zaufanie i zrozumienie.
- Globalna obecność marki: Ustanów silniejszą globalną obecność marki, demonstrując zaangażowanie w inkluzywność i zaspokajanie potrzeb zróżnicowanych odbiorców.
Funkcje i konfiguracja i18n w Next.js
Next.js oferuje wbudowane wsparcie dla i18n poprzez swoje funkcje routingu i zarządzania treścią. Poniżej znajduje się omówienie ważnych funkcji:
1. Konfiguracja i18n w next.config.js
Główna konfiguracja i18n znajduje się w pliku next.config.js
. Oto przykład:
/** @type {import('next').NextConfig} */
const nextConfig = {
i18n: {
locales: ['en', 'es', 'fr'], // Tablica obsługiwanych języków (kody językowe)
defaultLocale: 'en', // Domyślny język do użycia
localeDetection: true, // Włącz/wyłącz automatyczne wykrywanie języka na podstawie ustawień przeglądarki (opcjonalne)
// domains: [
// {
// domain: 'example.com',
// defaultLocale: 'en',
// },
// {
// domain: 'example.es',
// defaultLocale: 'es',
// },
// ],
},
}
module.exports = nextConfig;
Wyjaśnienie:
locales
: Tablica zawierająca kody języków (np.'en'
dla angielskiego,'es'
dla hiszpańskiego,'fr'
dla francuskiego) obsługiwanych przez Twoją aplikację. Pamiętaj, aby dla spójności stosować kody języków ISO 639-1.defaultLocale
: Domyślny język, którego będzie używać Twoja aplikacja. Jest to język wyświetlany, jeśli żaden inny język nie jest określony w adresie URL ani wykryty z ustawień przeglądarki użytkownika. Wybierz język reprezentatywny dla Twojej głównej grupy docelowej.localeDetection
: Wartość logiczna, która kontroluje, czy Next.js automatycznie wykrywa preferowany język użytkownika na podstawie ustawień jego przeglądarki. Jeśli ustawione natrue
, Next.js spróbuje przekierować użytkownika do odpowiedniej wersji językowej Twojej witryny.domains
(opcjonalnie): Tablica, która pozwala powiązać języki z określonymi domenami. Jest to przydatne, jeśli masz osobne domeny dla różnych języków (np.example.com
dla angielskiego,example.es
dla hiszpańskiego).
2. Routing z prefiksami językowymi
Next.js automatycznie dodaje prefiks językowy do tras. Na przykład, jeśli masz stronę pod adresem /about
, a językiem jest 'es' (hiszpański), URL zmieni się na /es/about
. Umożliwia to tworzenie różnych wersji językowych stron i pozwala wyszukiwarkom na indeksowanie treści dla każdego języka. Framework sam obsługuje przekierowania i routing.
3. Wykorzystanie haka useRouter
Hak useRouter
z next/router
zapewnia dostęp do bieżącego języka i innych informacji o routingu.
import { useRouter } from 'next/router';
function MyComponent() {
const router = useRouter();
const { locale, locales, defaultLocale } = router;
return (
Bieżący język: {locale}
Dostępne języki: {locales.join(', ')}
Domyślny język: {defaultLocale}
);
}
export default MyComponent;
Obiekt router
oferuje następujące kluczowe właściwości:
locale
: Aktualnie wybrany język (np. 'en', 'es', 'fr').locales
: Tablica wszystkich obsługiwanych języków zdefiniowanych wnext.config.js
.defaultLocale
: Domyślny język ustawiony wnext.config.js
.asPath
: Ścieżka wyświetlana w przeglądarce, zawierająca prefiks językowy (np./es/about
).pathname
: Ścieżka bez prefiksu językowego (np./about
).
Strategie tłumaczenia treści
Gdy już skonfigurujesz swoją aplikację Next.js pod kątem i18n, będziesz musiał wdrożyć strategie tłumaczenia treści. Oto kilka popularnych podejść:
1. Użycie dedykowanego systemu zarządzania tłumaczeniami (TMS)
W przypadku dużych projektów z wieloma językami, TMS jest wysoce zalecany. Popularne opcje to:
- Phrase: Chmurowy TMS z integracjami dla różnych platform, w tym Next.js. Oferuje funkcje współpracy i zautomatyzowane przepływy pracy.
- Localize: Inny chmurowy TMS, który obsługuje szeroką gamę formatów plików i zapewnia funkcje zarządzania tłumaczeniami.
- Crowdin: Potężny TMS, bardzo popularny w społeczności open-source, który dobrze integruje się z Next.js, pozwalając zespołom na efektywne tłumaczenie treści.
Korzyści:
- Scentralizowane zarządzanie tłumaczeniami.
- Funkcje współpracy dla tłumaczy.
- Automatyzacja przepływów pracy tłumaczeniowej.
- Integracja z Twoim procesem deweloperskim.
2. Tworzenie plików tłumaczeń w formacie JSON
W przypadku mniejszych projektów, użycie plików JSON do przechowywania tłumaczeń jest prostą i skuteczną metodą.
Przykładowa struktura katalogów:
/src
├── locales
│ ├── en.json
│ └── es.json
├── components
│ └── MyComponent.js
└── pages
└── index.js
Przykład en.json
:
{
"greeting": "Hello, world!",
"welcomeMessage": "Welcome to our website."
}
Przykład es.json
:
{
"greeting": "¡Hola, mundo!",
"welcomeMessage": "Bienvenido a nuestro sitio web."
}
Przykład 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;
To podejście zapewnia elastyczność i jest proste w przypadku mniejszych projektów. Zazwyczaj jest łatwe w aktualizacji i utrzymaniu.
3. Użycie biblioteki do tłumaczeń
Kilka bibliotek JavaScript usprawnia tłumaczenie treści w komponentach React.
next-i18next
: Popularna biblioteka zaprojektowana specjalnie dla Next.js. Dobrze integruje się z frameworkiem i zapewnia funkcje takie jak renderowanie po stronie serwera (SSR) i tłumaczenie po stronie klienta.react-i18next
: Ogólna biblioteka i18n dla React. Możesz jej używać w aplikacjach Next.js, chociaż może wymagać więcej konfiguracji w porównaniu donext-i18next
.
Przykład z next-i18next
(Instalacja: npm install next-i18next i18next react-i18next
):
Utwórz plik konfiguracyjny i18n (np. i18n.js
w głównym katalogu):
// 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 }
Utwórz konfigurację Next.js dla 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'],
},
// inna konfiguracja
}
module.exports = nextConfig
Dodaj konfigurację i import tłumaczeń do swojego pliku _app.js
:
import { appWithTranslation } from 'next-i18next';
import '../styles/globals.css';
function MyApp({ Component, pageProps }) {
return ;
}
export default appWithTranslation(MyApp);
Utwórz folder i wypełnij go plikami językowymi dla swoich tłumaczeń.
/public
└── locales
├── en
│ └── common.json
├── es
│ └── common.json
└── fr
└── common.json
Przykład en/common.json:
{
"greeting": "Hello, world!",
"welcomeMessage": "Welcome to our website."
}
Użycie tłumaczenia w komponencie:
import { useTranslation } from 'next-i18next';
function MyComponent() {
const { t } = useTranslation('common');
return (
{t('greeting')}
{t('welcomeMessage')}
);
}
export default MyComponent;
Ten przykład używa haka useTranslation
do pobierania tłumaczeń na podstawie bieżącego języka.
Obsługa dynamicznych tras i statycznego generowania stron (SSG)
Internacjonalizacja staje się bardziej złożona w przypadku dynamicznych tras (np. wpisy na blogu, strony produktów) i statycznego generowania stron (SSG).
1. Dynamiczne trasy (np. /blog/[slug])
Dla dynamicznych tras będziesz musiał wygenerować poprawne ścieżki dla każdego języka w czasie budowania aplikacji, używając getStaticPaths
. Ta funkcja zwraca tablicę ścieżek, które Next.js powinien wstępnie wyrenderować.
export async function getStaticPaths() {
const paths = [];
const locales = ['en', 'es', 'fr'];
const posts = await fetchPosts(); // Pobierz dane wpisów na blogu
posts.forEach(post => {
locales.forEach(locale => {
paths.push({
params: {
slug: post.slug,
},
locale,
});
});
});
return {
paths,
fallback: false, // lub 'blocking', jeśli chcesz pokazać stan ładowania
};
}
export async function getStaticProps({ params, locale }) {
const post = await getPostBySlug(params.slug, locale);
return {
props: {
post,
},
};
}
Wyjaśnienie:
getStaticPaths
: Ta funkcja iteruje po Twoich wpisach na blogu i generuje ścieżkę dla każdego wpisu i każdego języka. Obiektparams
zawiera parametry trasy (np. slug wpisu na blogu).locale
: Ten parametr dostarcza bieżący język, co pozwala na pobranie przetłumaczonej treści dla konkretnego języka.fallback
: Określa, jak Next.js obsługuje ścieżki niezdefiniowane wgetStaticPaths
.fallback: false
generuje strony 404 dla niezdefiniowanych ścieżek.fallback: 'blocking'
renderuje strony na żądanie.
2. Statyczne generowanie stron (SSG) z getStaticProps
W getStaticProps
możesz pobierać przetłumaczoną treść na podstawie parametru locale
.
export async function getStaticProps({ params, locale }) {
// Pobierz treść na podstawie języka i parametrów
const { post } = await getPostBySlug(params.slug, locale);
return {
props: {
post,
},
};
}
Funkcja getPostBySlug
powinna pobrać przetłumaczoną treść dla danego sluga i języka, która może pochodzić z Twoich plików tłumaczeń, bazy danych lub CMS.
3. Renderowanie po stronie serwera (SSR) z getServerSideProps
Dla treści, które muszą być pobierane w czasie żądania, użyj getServerSideProps
. Jest to przydatne, jeśli treść często się zmienia lub jest spersonalizowana dla każdego użytkownika.
export async function getServerSideProps({ params, locale, req, res }) {
// Pobierz dane na podstawie języka i parametrów (np. z bazy danych)
const data = await fetchData(params.slug, locale);
return {
props: {
data,
},
};
}
Najlepsze praktyki internacjonalizacji w Next.js
Stosowanie się do tych najlepszych praktyk pomoże Ci budować solidne, łatwe w utrzymaniu i przyjazne dla użytkownika aplikacje wielojęzyczne:
- Planuj wcześnie: Rozważ internacjonalizację od samego początku projektu. Znacznie łatwiej jest ją wdrożyć na wstępie niż dodawać później.
- Oddzielaj treść od kodu: Przechowuj cały tekst do przetłumaczenia w osobnych plikach (np. plikach JSON lub w TMS) i unikaj wpisywania tekstu na stałe bezpośrednio w komponentach.
- Używaj systemu zarządzania tłumaczeniami (TMS): W przypadku większych projektów, TMS może usprawnić proces tłumaczenia i poprawić współpracę.
- Testuj dokładnie: Testuj swoją aplikację we wszystkich obsługiwanych językach, aby zapewnić dokładność tłumaczeń, poprawne formatowanie i prawidłowe renderowanie na różnych przeglądarkach i urządzeniach. Testuj na prawdziwych urządzeniach, a nie tylko na emulatorach.
- Rozważ języki pisane od prawej do lewej (RTL): Jeśli wspierasz języki takie jak arabski czy hebrajski, upewnij się, że Twój projekt i układ są dostosowane do kierunku tekstu od prawej do lewej. Next.js nie obsługuje tego automatycznie, więc wymagane są rozwiązania CSS lub inne.
- Obsługuj formatowanie daty i czasu: Używaj bibliotek lub wbudowanych funkcji do formatowania dat i godzin zgodnie z językiem użytkownika. Moment.js i date-fns to dwie popularne i pomocne biblioteki.
- Zarządzaj formatowaniem liczb i walut: Poprawnie formatuj liczby i symbole walut na podstawie języka użytkownika.
- Optymalizuj SEO: Używaj specyficznych dla języka metatagów (
hreflang
), aby pomóc wyszukiwarkom poprawnie indeksować Twoje treści. Uwzględniaj kody języków w swoich adresach URL. - Priorytetyzuj doświadczenie użytkownika: Zapewnij jasny i intuicyjny sposób na przełączanie się między językami. Rozważ oferowanie automatycznego wykrywania języka na podstawie ustawień przeglądarki.
- Bądź na bieżąco: Aktualizuj swoją wersję Next.js i biblioteki i18n, aby korzystać z najnowszych funkcji i poprawek bezpieczeństwa.
- Rozważ dostępność (a11y): Upewnij się, że Twoje przetłumaczone treści są dostępne dla użytkowników z niepełnosprawnościami. Podaj alternatywny tekst dla obrazów i używaj odpowiednich atrybutów ARIA. Używaj czytników ekranu do testowania.
Kwestie SEO dla zinternacjonalizowanych witryn internetowych
Optymalizacja zinternacjonalizowanej witryny pod kątem wyszukiwarek jest niezbędna do pozyskiwania ruchu organicznego z całego świata. Oto kilka kluczowych najlepszych praktyk SEO:
- Tagi
hreflang
: Zaimplementuj tagihreflang
w sekcji<head>
swojego kodu HTML, aby poinformować wyszukiwarki o językowych i regionalnych wariacjach Twojej treści. Jest to kluczowe dla SEO. Na przykład:<link rel="alternate" hreflang="en" href="https://example.com/en/" />
oraz<link rel="alternate" hreflang="es" href="https://example.com/es/" />
- Adresy URL specyficzne dla języka: Używaj kodów języków w adresach URL (np.
/en/about
,/es/acerca-de
). To jasno wskazuje język treści zarówno użytkownikom, jak i wyszukiwarkom. - Zlokalizowana treść: Tłumacz swoje treści dokładnie i naturalnie. Tłumaczenia maszynowe powinny być zweryfikowane przez native speakera.
- Zlokalizowane meta opisy i tytuły: Pisz unikalne i przekonujące meta opisy i tytuły dla każdego języka, aby poprawić współczynniki klikalności w wynikach wyszukiwania.
- Mapy witryn XML: Twórz i przesyłaj mapy witryn XML, które zawierają wszystkie warianty językowe Twoich stron.
- Linkowanie wewnętrzne: Używaj odpowiednich linków wewnętrznych między wersjami językowymi Twoich treści.
- Badanie słów kluczowych specyficzne dla kraju: Przeprowadzaj badania słów kluczowych w każdym języku, aby zidentyfikować terminy, których użytkownicy szukają w poszczególnych regionach.
Przykład: Budowa prostego wielojęzycznego bloga
Stwórzmy uproszczony przykład wielojęzycznego bloga przy użyciu Next.js. Pomoże to w bardziej konkretnym zilustrowaniu, jak zastosować omówione powyżej koncepcje.
1. Konfiguracja projektu
Utwórz nowy projekt Next.js:
npx create-next-app my-multi-lang-blog
cd my-multi-lang-blog
2. Konfiguracja i18n (next.config.js
)
/** @type {import('next').NextConfig} */
const nextConfig = {
reactStrictMode: true,
i18n: {
locales: ['en', 'es', 'fr'],
defaultLocale: 'en',
},
}
module.exports = nextConfig
3. Utworzenie plików tłumaczeń
Utwórz folder locales
w głównym katalogu i dodaj następujące pliki JSON:
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. Utworzenie komponentu wpisu na blogu (np. 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. Utworzenie strony głównej (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;
Ten uproszczony przykład pokazuje podstawowe zasady internacjonalizacji w Next.js. Możesz rozbudować tę podstawową strukturę o bardziej złożone funkcje, takie jak dynamiczne trasy i integracja z systemami zarządzania tłumaczeniami. Rozważ ulepszenie powyższych linków za pomocą komponentu Link
i dodanie odpowiedniego atrybutu locale
.
6. Uruchomienie aplikacji
Uruchom aplikację za pomocą:
npm run dev
Teraz możesz uzyskać dostęp do swojego bloga pod adresem http://localhost:3000
(angielski), http://localhost:3000/es
(hiszpański) i http://localhost:3000/fr
(francuski). Powinieneś zobaczyć tytuł i treść wpisu na blogu przetłumaczone w zależności od wybranego języka.
Podsumowanie
Next.js dostarcza kompleksowy zestaw funkcji do wdrażania internacjonalizacji w aplikacjach internetowych. Stosując się do zasad i technik przedstawionych w tym przewodniku, możesz tworzyć wielojęzyczne aplikacje, które zapewniają zlokalizowane doświadczenia użytkownikom na całym świecie. Pamiętaj, aby wcześnie zaplanować strategię i18n, wybrać odpowiednią metodę tłumaczenia dla swoich potrzeb i priorytetyzować doświadczenie użytkownika. Dzięki starannemu planowaniu i wykonaniu możesz tworzyć aplikacje, które rezonują z globalną publicznością i otwierają nowe możliwości rozwoju. Ciągłe uczenie się, śledzenie najnowszych wydań i najlepszych praktyk zapewni, że efektywnie wykorzystujesz swoje narzędzia i technologie.
W miarę postępu technologii można spodziewać się pojawienia bardziej zaawansowanych funkcji i18n. Zdolność docierania do użytkowników z różnych kultur i grup językowych pozostanie kluczowym priorytetem dla twórców aplikacji na całym świecie. Dlatego opanowanie podstaw i18n jest cenną umiejętnością, która zwiększy Twoją wartość na dzisiejszym globalnym rynku deweloperskim.