
Panduan Lengkap Pengantarabangsaan React
Daripada sifar hingga berbilang bahasa: sediakan i18n dalam aplikasi React, kemudian automatikkan terjemahan dengan AI.
Pasang Pakej
Anda memerlukan tiga pakej: react-i18next (pengikatan React), i18next (pustaka teras), dan i18next-browser-languagedetector sebagai pilihan untuk mengesan bahasa secara automatik.
npm install react-i18next i18next i18next-browser-languagedetector i18next-http-backendKonfigurasikan Kejadian i18n
Cipta fail konfigurasi i18n yang memulakan i18next dengan bahasa lalai, sumber terjemahan, dan rantaian pemalam. Fail ini perlu diimport pada titik masuk aplikasi sebelum sebarang komponen dipaparkan.
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;Balut Aplikasi dengan I18nextProvider
Import fail konfigurasi i18n pada akar aplikasi dan balut pepohon komponen dengan I18nextProvider. Tanpanya, useTranslation() mengembalikan kekunci mentah, bukan teks terjemahan.
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>
);Cipta Fail Terjemahan
Cipta satu fail JSON untuk setiap bahasa. Gunakan kekunci tersarang untuk menyusun rentetan mengikut ciri atau halaman. Jadikan bahasa sumber (biasanya bahasa Inggeris) sebagai satu-satunya sumber rujukan.
// 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"
}
}Gunakan Terjemahan dalam Komponen
Panggil useTranslation() dalam sebarang komponen untuk mendapatkan fungsi t(). Gunakannya untuk rentetan ringkas, pemboleh ubah interpolasi, dan terjemahan yang dibenamkan dalam JSX dengan komponen 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" />
}} />
);
}Kendalikan Bentuk Jamak dan Pemboleh Ubah
i18next mengendalikan bentuk jamak dengan peraturan CLDR—bukan hanya tunggal/jamak. Bahasa Arab mempunyai 6 bentuk (zero, one, two, few, many, other). Jepun mempunyai 1 (other). Takrifkan semua bentuk yang diperlukan dalam fail terjemahan dan i18next akan memilih bentuk yang betul secara automatik.
// 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}}個のアイテム"
}Tambahkan Penukaran dan Pengesanan Bahasa
Bina pemilih bahasa yang memanggil i18n.changeLanguage(). Gabungkan dengan pengesan bahasa pelayar untuk mengesan bahasa pilihan pengguna secara automatik pada lawatan pertama, kemudian simpan pilihan jelas mereka.
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>
);
}Automatikkan Terjemahan
Selepas persediaan i18n selesai, terjemah fail bahasa dengan AI. Dalam IDE, minta pembantu AI menterjemah fail sumber atau gunakan CLI i18n Agent dalam saluran CI/CD.
# 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,esAutomatikkan Kualiti Terjemahan
Kesilapan Umum
Terjemahan Memaparkan Kekunci Mentah
Ralat Suspense Tanpa Sandaran
Ketidakpadanan Hidrasi SSR
Tiada Pelengkapan Automatik untuk Kekunci Terjemahan
Struktur Fail yang Disyorkan
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.jsonCuba i18n Agent Sekarang
Lepaskan fail terjemahan anda di sini
JSON, YAML, PO, XML, CSV, Markdown, Properties
atau klik untuk semak imbas
Bahasa sasaran