
Panduan Lengkap Internasionalisasi React
Dari nol hingga multibahasa: siapkan i18n di aplikasi React, lalu otomatiskan penerjemahan dengan AI.
Instal Paket
Anda memerlukan tiga paket: react-i18next (binding React), i18next (library inti), dan i18next-browser-languagedetector sebagai pilihan untuk mendeteksi bahasa secara otomatis.
npm install react-i18next i18next i18next-browser-languagedetector i18next-http-backendKonfigurasikan Instance i18n
Buat file konfigurasi i18n yang menginisialisasi i18next dengan bahasa default, sumber daya terjemahan, dan rantai plugin. File ini harus diimpor di titik masuk aplikasi sebelum komponen apa pun dirender.
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;Bungkus Aplikasi dengan I18nextProvider
Impor file konfigurasi i18n di root aplikasi dan bungkus pohon komponen dengan I18nextProvider. Tanpanya, useTranslation() mengembalikan kunci 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>
);Buat File Terjemahan
Buat satu file JSON untuk setiap bahasa. Gunakan kunci bertingkat untuk menyusun string menurut fitur atau halaman. Jadikan bahasa sumber (biasanya Inggris) sebagai satu-satunya acuan utama.
// 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() di komponen mana pun untuk mendapatkan fungsi t(). Gunakan untuk string sederhana, variabel interpolasi, dan terjemahan yang disematkan 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" />
}} />
);
}Tangani Bentuk Jamak dan Variabel
i18next menangani bentuk jamak dengan aturan CLDR—bukan hanya tunggal/jamak. Bahasa Arab memiliki 6 bentuk (zero, one, two, few, many, other). Jepang memiliki 1 (other). Tentukan semua bentuk yang diperlukan dalam file terjemahan dan i18next akan memilih bentuk yang benar secara otomatis.
// 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 Pengalihan dan Deteksi Bahasa
Buat pemilih bahasa yang memanggil i18n.changeLanguage(). Gabungkan dengan pendeteksi bahasa browser untuk mendeteksi bahasa pilihan pengguna secara otomatis saat kunjungan pertama, lalu simpan pilihan eksplisit 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>
);
}Otomatiskan Penerjemahan
Setelah penyiapan i18n selesai, terjemahkan file bahasa dengan AI. Di IDE, minta asisten AI menerjemahkan file sumber atau gunakan CLI i18n Agent di pipeline 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,esOtomatiskan Kualitas Terjemahan
Kesalahan Umum
Terjemahan Menampilkan Kunci Mentah
Kesalahan Suspense Tanpa Fallback
Ketidakcocokan Hidrasi SSR
Tidak Ada Pelengkapan Otomatis untuk Kunci Terjemahan
Struktur File yang Disarankan
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.jsonCoba i18n Agent Sekarang
Lepaskan file terjemahan Anda di sini
JSON, YAML, PO, XML, CSV, Markdown, Properties
atau klik untuk menjelajahi
Bahasa target