Skip to main content

React uluslararasılaştırma için eksiksiz rehber

Sıfırdan çok dilli uygulamaya: React uygulamanızda i18n'i kurun, ardından çevirileri yapay zekayla otomatikleştirin.

1

Paketleri yükleyin

Üç pakete ihtiyacınız var: react-i18next (React bağlamaları), i18next (çekirdek kitaplık) ve isteğe bağlı olarak otomatik yerel ayar algılaması için i18next-browser-languagedetector.

react-i18next, React hook'ları ve bileşenleri sağlar. i18next; çevirilerin yüklenmesini, değer yerleştirmeyi ve çoğullaştırmayı yöneten çekirdek motordur. Dil algılayıcı eklentisi, tarayıcının dil tercihini otomatik olarak okur.
Terminal
npm install react-i18next i18next i18next-browser-languagedetector i18next-http-backend
2

i18n örneğini yapılandırın

i18next'i varsayılan diliniz, çeviri kaynaklarınız ve eklenti zincirinizle başlatan bir i18n yapılandırma dosyası oluşturun. Bu dosya, herhangi bir bileşen oluşturulmadan önce uygulamanızın giriş noktasında içe aktarılmalıdır.

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;
"You will need to pass in an i18next instance by using initReactI18next" — bu hata, i18n.init() çağrısından önce i18n.use(initReactI18next) çağrısını yapmayı unuttuğunuz anlamına gelir. .use() çağrısı .init() çağrısından önce gelmelidir.
3

Uygulamanızı I18nextProvider ile sarmalayın

i18n yapılandırma dosyanızı uygulamanın kökünde içe aktarın ve bileşen ağacınızı I18nextProvider ile sarmalayın. Bunu yapmazsanız useTranslation(), çevrilmiş metin yerine ham anahtarları döndürür.

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>
);
Çevirilerde "Welcome to our app" yerine "welcome" gibi ham anahtarlar görünüyorsa en yaygın neden I18nextProvider eksikliği veya i18n yapılandırma dosyasının içe aktarılmamış olmasıdır.
4

Çeviri dosyaları oluşturun

Her dil için bir JSON dosyası oluşturun. Dizeleri özelliğe veya sayfaya göre düzenlemek için iç içe anahtarlar kullanın. Kaynak dilinizi (genellikle İngilizce) tek doğruluk kaynağı olarak koruyun.

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"
  }
}
Anahtarları göründükleri yere göre değil, tanımladıkları şeye göre adlandırın: "homepageCartLabel" yerine "cart.itemCount" daha uygundur. Anahtarlar, kullanıcı arayüzü yeniden tasarlandığında da kullanılabilmelidir.
5

Çevirileri bileşenlerde kullanın

t() işlevini almak için herhangi bir bileşende useTranslation() çağrısını yapın. Bu işlevi basit dizelerde, değişken değerlerini yerleştirmede ve Trans bileşeniyle JSX'e gömülen çevirilerde kullanın.

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" />
    }} />
  );
}
t(`error.$'{code}'`) gibi dinamik anahtarlar çalışma zamanında çalışır, ancak i18next-scanner gibi araçlar tarafından statik olarak çıkarılamaz. Çıkarma araçları kullanıyorsanız dinamik anahtarları açıkça listeleyin veya bir yorum ipucu kullanın.
6

Çoğulları ve değişkenleri yönetin

i18next, yalnızca tekil/çoğul ayrımıyla değil CLDR kurallarıyla çoğulları yönetir. Arapçada 6 biçim (zero, one, two, few, many, other), Japoncada ise 1 biçim (other) vardır. Gerekli tüm biçimleri çeviri dosyalarınızda tanımlayın; i18next doğru biçimi otomatik olarak seçer.

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}}個のアイテム"
}
Tekil biçimi algılamak için count === 1 koşulunu asla doğrudan kodlamayın. Fransızca gibi diller 0'ı tekil kabul eder. Rusça, Arapça ve Lehçede İngilizcede bulunmayan biçimler vardır. Çoğul kurallarını i18next'in yönetmesine izin verin.
7

Dil değiştirme ve algılama ekleyin

i18n.changeLanguage() çağrısını yapan bir dil seçici oluşturun. İlk ziyarette kullanıcının tercih ettiği dili otomatik olarak algılamak için bunu tarayıcı dil algılayıcısıyla birleştirin, ardından kullanıcının açık seçimini kalıcı olarak saklayın.

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>
  );
}
SSR (Next.js, Remix) kullanıyorsanız sunucu, istemciden farklı bir dil algılayabilir (sunucuda tarayıcı tercihleri yoktur). Bu durum hidrasyon uyuşmazlığına yol açar. Çözüm: Her ikisinin de aynı dilde çıktı oluşturması için algılanan yerel ayarı sunucudan istemciye bir prop veya çerez olarak aktarın.
8

Çevirileri otomatikleştirin

i18n kurulumunuzu tamamladıktan sonra yerel ayar dosyalarınızı yapay zekayla çevirin. IDE'nizde yapay zeka asistanınızdan kaynak dosyanızı çevirmesini isteyin veya CI/CD işlem hattınızda i18n Agent CLI'ı kullanın.

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
Artımlı çeviri yapın: Kaynak dosyanıza yeni anahtarlar eklediğinizde tüm dosyaları yeniden oluşturmak yerine yalnızca farkı çevirin. Böylece insanlar tarafından incelenmiş çeviriler korunur.

Çeviri kalitesini otomatikleştirin

Eksik anahtarları ve bozuk yer tutucuları kullanıma sunulmadan önce i18n-validate ile yakalayın. Gerçek çeviriler gelmeden önce kullanıcı arayüzünüzü i18n-pseudo kullanarak sahte çevirilerle test edin.

Yaygın sorunlar

Çevirilerde ham anahtarların görünmesi

Nedenler: I18nextProvider eksik olabilir, i18n yapılandırması uygulama kökünde içe aktarılmamış olabilir, ad alanı yüklenmemiş olabilir veya çeviriler hâlâ eşzamansız olarak yükleniyor olabilir. İpuçları için tarayıcı konsolunu debug: true ayarıyla kontrol edin.

Geri dönüş olmadan Suspense hatası

"A component suspended while responding to synchronous input" — uygulamanızın çevresine bir '&lt;Suspense&gt;' sınırı ekleyin veya i18next başlangıç yapılandırmasında useSuspense: false ayarını kullanın.

SSR hidrasyon uyuşmazlığı

Sunucu bir yerel ayarda çıktı oluştururken istemci başka bir yerel ayarda hidrasyon yapar. Her ikisinin de aynı yerel ayar kaynağını kullandığından emin olun; bu değeri sunucudan prop olarak aktarın ve yalnızca tarayıcı algılamasına güvenmeyin.

Çeviri anahtarları için otomatik tamamlama olmaması

i18next modülünü kaynak türünüzle genişletin: declare module 'i18next' '{ interface CustomTypeOptions { resources: typeof resources } }'. Böylece otomatik tamamlamalı ve tür güvenli t() çağrıları elde edersiniz.

Önerilen dosya yapısı

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

i18n Agent'ı şimdi deneyin

Çeviri dosyanızı buraya bırakın

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

veya göz atmak için tıklayın

Hedef diller

Kayıt gerekmezAnında fiyat tahmini

Sık sorulan sorular