
Den kompletta guiden till internationalisering i React
Från ett språk till flera: konfigurera i18n i din React-app och automatisera sedan översättningarna med AI.
Installera paket
Du behöver tre paket: react-i18next (React-bindningarna), i18next (kärnbiblioteket) och eventuellt i18next-browser-languagedetector för automatisk identifiering av språkvariant.
npm install react-i18next i18next i18next-browser-languagedetector i18next-http-backendKonfigurera i18n-instansen
Skapa en i18n-konfigurationsfil som initierar i18next med ditt standardspråk, dina översättningsresurser och din kedja av insticksprogram. Filen måste importeras vid appens startpunkt innan någon komponent renderas.
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;Omslut appen med I18nextProvider
Importera din i18n-konfigurationsfil i appens rot och omslut komponentträdet med I18nextProvider. Utan detta returnerar useTranslation() råa nycklar i stället för översatt text.
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>
);Skapa översättningsfiler
Skapa en JSON-fil per språk. Använd nästlade nycklar för att organisera strängar efter funktion eller sida. Behåll källspråket (vanligtvis engelska) som enda källa.
// 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"
}
}Använd översättningar i komponenter
Anropa useTranslation() i valfri komponent för att hämta funktionen t(). Använd den för enkla strängar, interpolerade variabler och översättningar med inbäddad JSX via komponenten 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" />
}} />
);
}Hantera pluralformer och variabler
i18next hanterar pluralformer med CLDR-regler, inte bara singular och plural. Arabiska har 6 former (zero, one, two, few, many, other). Japanska har 1 (other). Definiera alla former som behövs i översättningsfilerna så väljer i18next automatiskt rätt form.
// 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}}個のアイテム"
}Lägg till språkbyte och språkidentifiering
Skapa en språkväljare som anropar i18n.changeLanguage(). Kombinera den med webbläsarens språkidentifiering för att automatiskt identifiera användarens önskade språk vid det första besöket och spara sedan användarens uttryckliga val.
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>
);
}Automatisera översättningar
När din i18n-konfiguration är klar kan du översätta språkfilerna med AI. Be AI-assistenten i din IDE att översätta källfilen eller använd i18n Agent CLI i din CI/CD-pipeline.
# 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,esAutomatisera översättningskvaliteten
Vanliga fallgropar
Översättningar visar råa nycklar
Suspense-fel utan reservinnehåll
Hydreringskonflikt med SSR
Ingen automatisk komplettering av översättningsnycklar
Rekommenderad filstruktur
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.jsonProva i18n Agent nu
Släpp din översättningsfil här
JSON, YAML, PO, XML, CSV, Markdown, Properties
eller klicka för att välja en fil
Målspråk