Skip to main content

Täydellinen opas React:in kansainvälistämiseen

Tyhjästä monikieliseksi: ota i18n käyttöön React-sovelluksessasi ja automatisoi sitten käännökset tekoälyllä.

1

Asenna paketit

Tarvitset kolme pakettia: react-i18next (React-sidokset), i18next (ydinkirjasto) ja halutessasi i18next-browser-languagedetector automaattiseen kieliversion tunnistukseen.

react-i18next tarjoaa React-koukut ja -komponentit. i18next on käännösten lataamisen, interpoloinnin ja monikkomuotojen käsittelyn ydinmoottori. Kielentunnistuslisäosa lukee selaimen kieliasetuksen automaattisesti.
Terminal
npm install react-i18next i18next i18next-browser-languagedetector i18next-http-backend
2

Määritä i18n-instanssi

Luo i18n-määritystiedosto, joka alustaa i18next:in oletuskielelläsi, käännösresursseillasi ja lisäosaketjullasi. Tiedosto on tuotava sovelluksen aloituspisteessä ennen minkään komponentin hahmontamista.

src/i18n.ts
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;
Virhe "You will need to pass in an i18next instance by using initReactI18next" tarkoittaa, että unohdit kutsua i18n.use(initReactI18next)-metodia ennen i18n.init()-metodia. .use()-kutsu on tehtävä ennen .init()-kutsua.
3

Ympäröi sovelluksesi I18nextProviderilla

Tuo i18n-määritystiedosto sovelluksen juureen ja ympäröi komponenttipuu I18nextProviderilla. Muuten useTranslation() palauttaa käännetyn tekstin sijaan käsittelemättömät avaimet.

src/main.tsx
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>
);
Jos käännöksissä näkyy "welcome"-avaimen kaltaisia käsittelemättömiä avaimia tekstin "Welcome to our app" sijaan, tavallisin syy on puuttuva I18nextProvider tai tuomatta jäänyt i18n-määritystiedosto.
4

Luo käännöstiedostot

Luo jokaiselle kielelle yksi JSON-tiedosto. Järjestä merkkijonot ominaisuuden tai sivun mukaan sisäkkäisillä avaimilla. Pidä lähdekieli, tavallisesti englanti, ainoana ensisijaisena lähteenä.

public/locales/en/translation.json
// 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"
  }
}
Nimeä avaimet sen mukaan, mitä ne kuvaavat, älä niiden sijainnin mukaan: "cart.itemCount" on parempi kuin "homepageCartLabel". Avainten tulisi kestää käyttöliittymän uudistukset.
5

Käytä käännöksiä komponenteissa

Kutsu useTranslation()-funktiota missä tahansa komponentissa saadaksesi t()-funktion. Käytä sitä yksinkertaisiin merkkijonoihin, interpoloituihin muuttujiin ja Trans-komponentilla tehtäviin JSX-upotettuihin käännöksiin.

Greeting.tsx
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>
  );
}
Trans component for JSX
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" />
    }} />
  );
}
Dynaamiset avaimet, kuten t(`error.$'{code}'`), toimivat suorituksen aikana, mutta i18next-scannerin kaltaiset työkalut eivät voi poimia niitä staattisesti. Jos käytät poimintatyökaluja, luettele dynaamiset avaimet erikseen tai käytä kommenttivihjettä.
6

Käsittele monikkomuodot ja muuttujat

i18next käsittelee monikkomuodot CLDR-säännöillä, ei vain yksikkö- ja monikkomuodolla. Arabiassa on kuusi muotoa (zero, one, two, few, many, other), japanissa yksi (other). Määritä käännöstiedostoissasi kaikki tarvittavat muodot, niin i18next valitsee oikean automaattisesti.

Plural forms by language
// 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ä koskaan kovakoodaa yksikkömuodon tunnistukseksi count === 1. Ranskan kaltaisissa kielissä 0 käsitellään yksikkönä. Venäjässä, arabiassa ja puolassa on muotoja, joita englannissa ei ole. Anna i18next:in käsitellä monikkosäännöt.
7

Lisää kielen vaihto ja tunnistus

Luo kielivalitsin, joka kutsuu i18n.changeLanguage()-funktiota. Yhdistä se selaimen kielentunnistukseen, jotta käyttäjän ensisijainen kieli tunnistetaan automaattisesti ensimmäisellä käynnillä ja käyttäjän oma valinta säilytetään sen jälkeen.

LanguageSwitcher.tsx
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>
  );
}
Jos käytät SSR:ää (Next.js, Remix), palvelin voi tunnistaa eri kielen kuin asiakasohjelma, koska palvelin ei tiedä selaimen asetuksia. Tämä aiheuttaa hydraation ristiriidan. Korjaus: välitä tunnistettu kieliversio palvelimelta asiakasohjelmalle ominaisuutena tai evästeenä, jotta molemmat hahmontavat saman kielen.
8

Automatisoi käännökset

Kun i18n on otettu käyttöön, käännä kieliversiotiedostosi tekoälyllä. Pyydä IDE-ympäristössäsi tekoälyavustajaasi kääntämään lähdetiedostosi tai käytä i18n Agent:in CLI:tä CI/CD-putkessasi.

Terminal
# 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,es
Käännä vaiheittain — kun lisäät uusia avaimia lähdetiedostoon, käännä vain muutokset äläkä luo kaikkia tiedostoja uudelleen. Näin ihmisten tarkistamat käännökset säilyvät.

Automatisoi käännöslaatu

Löydä puuttuvat avaimet ja rikkoutuneet paikkamerkit i18n-validate:lla ennen julkaisua. Testaa käyttöliittymää tekaistuilla käännöksillä i18n-pseudo:n avulla ennen oikeiden käännösten valmistumista.

Tavalliset sudenkuopat

Käännökset näyttävät käsittelemättömät avaimet

Syitä: I18nextProvider puuttuu, i18n-määritystä ei ole tuotu sovelluksen juuressa, nimiavaruutta ei ole ladattu tai käännöksiä ladataan vielä asynkronisesti. Etsi vihjeitä selaimen konsolista asetuksella debug: true.

Suspense-virhe ilman varasisältöä

Virhe "A component suspended while responding to synchronous input" — lisää sovelluksesi ympärille '&lt;Suspense&gt;'-raja tai aseta i18next:in alustuksen määrityksissä useSuspense: false.

SSR-hydraation ristiriita

Palvelin hahmontaa yhdellä kieliversiolla ja asiakasohjelma hydratoi toisella. Varmista, että molemmat käyttävät samaa kieliversiolähdettä — välitä se ominaisuutena palvelimelta äläkä luota pelkkään selaintunnistukseen.

Käännösavaimilla ei ole automaattista täydennystä

Laajenna i18next-moduulia resurssityypilläsi: declare module 'i18next' '{ interface CustomTypeOptions { resources: typeof resources } }'. Näin t()-kutsut ovat tyyppiturvallisia ja niissä toimii automaattinen täydennys.

Suositeltu tiedostorakenne

Project Structure
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.json

Kokeile i18n Agent:ia nyt

Pudota käännöstiedostosi tähän

JSON, YAML, PO, XML, CSV, Markdown, Properties

tai valitse napsauttamalla

Kohdekielet

Rekisteröitymistä ei tarvitaVälitön arvio

Usein kysytyt kysymykset