
Pilnīgs React internacionalizācijas ceļvedis
No nulles līdz vairākām valodām: iestatiet i18n React lietotnē, pēc tam automatizējiet tulkošanu ar MI.
Instalēt pakotnes
Vajadzīgas trīs pakotnes: react-i18next (React saistījumi), i18next (pamatbibliotēka) un pēc izvēles i18next-browser-languagedetector automātiskai lokalizācijas noteikšanai.
npm install react-i18next i18next i18next-browser-languagedetector i18next-http-backendKonfigurēt i18n instanci
Izveidojiet i18n konfigurācijas failu, kas inicializē i18next ar noklusējuma valodu, tulkošanas resursiem un spraudņu ķēdi. Šis fails jāimportē lietotnes ieejas punktā, pirms tiek atveidots jebkurš komponents.
import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';
import LanguageDetector from 'i18next-browser-languagedetector';
import Backend from 'i18next-http-backend';
i18n
.use(Backend)
.use(LanguageDetector)
.use(initReactI18next) // Must come before .init()
.init({
fallbackLng: 'en',
debug: process.env.NODE_ENV === 'development',
interpolation: {
escapeValue: false, // React already escapes
},
backend: {
loadPath: '/locales/{{lng}}/{{ns}}.json',
},
});
export default i18n;Ietvert lietotni I18nextProvider
Importējiet i18n konfigurācijas failu lietotnes saknē un ietveriet komponentu koku ar I18nextProvider. Bez tā useTranslation() atgriež neapstrādātas atslēgas, nevis tulkotu tekstu.
import React, { Suspense } from 'react';
import ReactDOM from 'react-dom/client';
import { I18nextProvider } from 'react-i18next';
import i18n from './i18n'; // Import your config
import App from './App';
ReactDOM.createRoot(document.getElementById('root')!).render(
<React.StrictMode>
<Suspense fallback={<div>Loading...</div>}>
<I18nextProvider i18n={i18n}>
<App />
</I18nextProvider>
</Suspense>
</React.StrictMode>
);Izveidot tulkošanas failus
Izveidojiet vienu JSON failu katrai valodai. Sakārtojiet virknes pēc funkcijas vai lapas, izmantojot ligzdotas atslēgas. Avota valodu (parasti angļu) uzturiet kā vienīgo patiesības avotu.
// public/locales/en/translation.json
{
"nav": {
"home": "Home",
"about": "About",
"settings": "Settings"
},
"greeting": "Hello, {{name}}!",
"cart": {
"itemCount_one": "{{count}} item",
"itemCount_other": "{{count}} items"
}
}
// public/locales/de/translation.json
{
"nav": {
"home": "Startseite",
"about": "Über uns",
"settings": "Einstellungen"
},
"greeting": "Hallo, {{name}}!",
"cart": {
"itemCount_one": "{{count}} Artikel",
"itemCount_other": "{{count}} Artikel"
}
}Izmantot tulkojumus komponentos
Izsauciet useTranslation() jebkurā komponentā, lai iegūtu funkciju t(). Izmantojiet to vienkāršām virknēm, interpolētiem mainīgajiem un JSX iegultiem tulkojumiem ar komponentu Trans.
import { useTranslation } from 'react-i18next';
function Greeting({ userName }: { userName: string }) {
const { t } = useTranslation();
return (
<div>
<h1>{t('greeting', { name: userName })}</h1>
<nav>
<a href="/">{t('nav.home')}</a>
<a href="/about">{t('nav.about')}</a>
</nav>
</div>
);
}import { Trans, useTranslation } from 'react-i18next';
// For JSX inside translations:
// "terms": "By signing up, you agree to our <link>Terms</link>."
function SignUp() {
const { t } = useTranslation();
return (
<Trans i18nKey="terms" components={{
link: <a href="/terms" className="underline" />
}} />
);
}Apstrādāt daudzskaitli un mainīgos
i18next apstrādā daudzskaitli atbilstoši CLDR kārtulām, nevis tikai vienskaitlim un daudzskaitlim. Arābu valodā ir 6 formas (zero, one, two, few, many, other), japāņu — 1 (other). Definējiet visas vajadzīgās formas tulkošanas failos, un i18next automātiski izvēlēsies pareizo.
// English: 2 forms (one, other)
{
"itemCount_one": "{{count}} item",
"itemCount_other": "{{count}} items"
}
// Arabic: 6 forms (zero, one, two, few, many, other)
{
"itemCount_zero": "لا عناصر",
"itemCount_one": "عنصر واحد",
"itemCount_two": "عنصران",
"itemCount_few": "{{count}} عناصر",
"itemCount_many": "{{count}} عنصرًا",
"itemCount_other": "{{count}} عنصر"
}
// Japanese: 1 form (other)
{
"itemCount_other": "{{count}}個のアイテム"
}Pievienot valodas pārslēgšanu un noteikšanu
Izveidojiet valodas atlasītāju, kas izsauc i18n.changeLanguage(). Apvienojiet to ar pārlūka valodas noteicēju, lai pirmajā apmeklējumā automātiski noteiktu lietotāja vēlamo valodu un pēc tam saglabātu skaidri norādīto izvēli.
import { useTranslation } from 'react-i18next';
const LANGUAGES = [
{ code: 'en', label: 'English' },
{ code: 'de', label: 'Deutsch' },
{ code: 'ja', label: '日本語' },
{ code: 'es', label: 'Español' },
];
function LanguageSwitcher() {
const { i18n } = useTranslation();
return (
<select
value={i18n.language}
onChange={(e) => i18n.changeLanguage(e.target.value)}
>
{LANGUAGES.map(({ code, label }) => (
<option key={code} value={code}>{label}</option>
))}
</select>
);
}Automatizēt tulkošanu
Kad i18n iestatīšana ir pabeigta, tulkojiet lokalizācijas failus ar MI. IDE lūdziet MI asistentam iztulkot avota failu vai CI/CD konveijerā izmantojiet i18n Agent CLI.
# In your IDE, ask your AI assistant:
> Translate public/locales/en/translation.json to German, Japanese, and Spanish
✓ de/translation.json created (1.2s)
✓ ja/translation.json created (1.5s)
✓ es/translation.json created (1.1s)
# Or use the CLI in CI/CD:
npx i18n-agent translate public/locales/en/translation.json --lang de,ja,esAutomatizēt tulkojumu kvalitāti
Biežākās kļūdas
Tulkojumos redzamas neapstrādātas atslēgas
Suspense kļūda bez atkāpšanās satura
SSR hidratācijas neatbilstība
Nav tulkošanas atslēgu automātiskās pabeigšanas
Ieteicamā failu struktūra
my-react-app/
├── public/
│ └── locales/
│ ├── en/
│ │ ├── translation.json # Default namespace
│ │ ├── common.json # Shared strings
│ │ └── dashboard.json # Feature namespace
│ ├── de/
│ │ ├── translation.json
│ │ ├── common.json
│ │ └── dashboard.json
│ └── ja/
│ └── ...
├── src/
│ ├── i18n.ts # i18n configuration
│ ├── main.tsx # App entry with Provider
│ ├── App.tsx
│ └── components/
│ └── LanguageSwitcher.tsx
└── package.jsonIzmēģiniet i18n Agent tūlīt
Nometiet tulkošanas failu šeit
JSON, YAML, PO, XML, CSV, Markdown, Properties
vai noklikšķiniet, lai izvēlētos
Mērķa valodas