Covening a Multi-Bahasa Sistem Dukungan dalam React Apps Pribumi

Aplikasi mobile yang mendukung berbagai bahasa tidak lagi opsional ⁇ ini merupakan syarat untuk aplikasi manapun yang bertujuan untuk adopsi global. React Pribumi, dengan kemampuan platform silangnya, menawarkan beberapa pendekatan yang kuat untuk mengimplementasikan internasionalisasi (i18n) dan lokalisasi (l10n). Artikel ini menyediakan panduan in-depth untuk memarsitekkan sistem dukungan multi-bahasa di React Pribumi, meliputi perpustakaan, konfigurasi, switching dinamis, menangani aturan plural kompleks, penyesuaian tata letak kanan-ke-kiri (RTL), dan praktik kinerja terbaik.

Konsep Inti Lokalisasi

Lokalisasi ensif tidak lagi diterjemahkan teks sederhana. Ini melibatkan pemformatan nomor, tanggal, currencies, penanganan arah teks (LTR vs RTL), pluralisasi, bentuk gender, dan bahkan menyesuaikan tata letak UI agar sesuai dengan string terjemahan. Sistem i18n yang dirancang dengan baik memisahkan konten translatable dari codebase Anda, menggunakan referensi berbasis kunci, dan mendukung switching bahasa runtime tanpa memerlukan app restart.

Tantangan Kunci di Penduduk Asli yang Reak

  • Modul pribumi untuk deteksi lokalisasi perangkat (diferensi antara iOS dan Android).
  • Mengisi dan mengepalkan berkas terjemahan dengan baik.
  • Melembar negara untuk bahasa aktif di seluruh aplikasi (termasuk navigasi dan preferensi yang terus-menerus).
  • ¡Offord Handling RTL susunatur ⁇ React native support tetapi membutuhkan alignment yang hati-hati.
  • Takhro Testing dan memverifikasi semua string yang diterjemahkan dalam konteks.

Bahasa Latin yang Memilih Perpustakaan I18n yang Benar

Sementara beberapa pustaka yang ada, react-i18next, ini adalah pilihan paling populer dan lengkap fitur untuk React Pribumi. Dibangun di atas i18next, ini menyediakan kait, HOCs, dan komponen untuk integrasi tak-tersejahtera. Alternatif termasuk i18n-js] (sederhana, tetapi kurang kuat) dan react-nactive-localize[TFLT:7]] (untuk deteksi lokal) (untuk deteksi lokal), bukan untuk deteksi terjemahan, untuk perusahaan, reakturner-in dengan plugin tambahan (next., reactive-rower-rousity, reactive-root-root-rousedable.

Meminstal pustaka inti

Dimulai dengan memasang paket yang diperlukan:

npm install react-i18next i18next i18next-http-backend react-native-localize

Secara opsional menambahkan i18next-browser-languagedetector untuk deteksi bahasa otomatis berdasarkan preferensi perangkat. Perlu dicatat bahwa Anda mungkin perlu untuk menghubungkan modul asli untuk reaction-native-locualize (auto-linking dalam RN 0.60+).

Istansi I18n Menetapan Kependudukan

Arondisemenkand membuat berkas konfigurasi, misalnya, :

import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';
import * as RNLocalize from 'react-native-localize';
import en from './translations/en.json';
import es from './translations/es.json';
import fr from './translations/fr.json';

const resources = { en: { translation: en }, es: { translation: es }, fr: { translation: fr } };

const detectionOptions = {
 order: ['localStorage', 'navigator'],
 caches: ['localStorage'],
};

i18n
 .use(initReactI18next)
 .use(require('i18next-browser-languagedetector').default) // for RN, you may replace with custom detector
 .init({
 resources,
 fallbackLng: 'en',
 interpolation: { escapeValue: false },
 detection: {
 // For RN, we'll override detection manually (see below)
 },
 });

// Detect device language at startup
const detectLanguage = () => {
 const locales = RNLocalize.getLocales();
 if (locales && locales.length > 0) {
 const langCode = locales[0].languageCode;
 const supportedLanguages = Object.keys(resources);
 const lang = supportedLanguages.includes(langCode) ? langCode : i18n.options.fallbackLng[0];
 i18n.changeLanguage(lang);
 }
};
detectLanguage();

// Listen to app focus for locale changes
export default i18n;

Menggunakan nama dana react-native-locualize memastikan aplikasi anda menghormati pengaturan regional perangkat. Fungsi berjalan sekali dan menetapkan bahasa awal. Untuk pembaruan berkelanjutan (jika pengguna mengubah bahasa perangkatnya saat aplikasi terbuka), anda dapat berlangganan perubahan.

Struktur Berkas Terjemahan Bahasan

Organisasi terjemahan Anda dalam berkas JSON bersarang oleh bahasa dan ruang nama. Contoh untuk :

{
 "common": {
 "welcome": "Welcome",
 "greeting": "Hello, {{name}}!"
 },
 "home": {
 "title": "Home Screen",
 "description": "This is a multi-language React Native app."
 },
 "errors": {
 "network": "Network error. Please try again."
 }
}

Kegunaan ruang-nama (misalnya, , ) membantu mengelola aplikasi-aplikasi besar dan memungkinkan pemuatan malas dari potongan terjemahan.

Terjemahan Terjemahan Bahasan dalam Komponen

hooks useTranslation

Dalam komponen fungsional apapun:

import { useTranslation } from 'react-i18next';

const MyComponent = () => {
 const { t, i18n } = useTranslation('common');
 return (
 
 {t('welcome')}
 {t('greeting', { name: 'John' })}
  i18n.changeLanguage('es')}>
 Switch to Spanish
 
 
 );
};

Parameter t fungsi interpolates variabel dan menangani plural. Untuk mengubah bahasa, sebut ⁇ ini memicu sebuah re-render dari semua komponen yang dilanggani.

Wonedon menggunakan komponen Trans

Untuk komplet string dengan bandit atau komponen React:

import { Trans } from 'react-i18next';
// In translations: "welcome_html": "Welcome, {user}!"

 Welcome, {user}!

ORb - ORANG Plural, Jenis Jantina, dan Konteks

iEgonext mendukung aturan plural lanjutan keluar dari kotak. Definisikan kunci dengan akhiran atau penggunaan konteks. Contoh:

{
 "item": "{{count}} item",
 "item_plural": "{{count}} items",
 "item_other": "{{count}} items"
}

Penggunaan ke Luaran: secara otomatis memilih bentuk yang benar berdasarkan lokal. Jenis kelamin dan konteks lain dapat ditangani melalui pilihan .

Beralih dan Kekalan Bahasa Dinamik

Untuk bertahan pada preferensi bahasa pengguna, simpan bahasa terpilih dalam AsyncStorage[ (atau react-native-mmkv) dan muat pada startup aplikasi. Ubah konfigurasi i18n:

import AsyncStorage from '@react-native-async-storage/async-storage';

const languageDetector = {
 type: 'languageDetector',
 async: true,
 detect: async (callback) => {
 const storedLang = await AsyncStorage.getItem('user-language');
 callback(storedLang || 'en');
 },
 init: () => {},
 cacheUserLanguage: async (lng) => {
 await AsyncStorage.setItem('user-language', lng);
 },
};

i18n.use(initReactI18next).use(languageDetector).init({
 fallbackLng: 'en',
 resources,
 interpolation: { escapeValue: false },
});

Sekarang ketika pengguna beralih bahasa, preferensi disimpan dan secara otomatis dipulihkan pada peluncuran berikutnya.

Dukungan Kanan-ke- Kiri (RTL)

Penduduk Asli React mendukung RTL melalui modul . Bila bahasa tersebut adalah bahasa Arab, Ibrani, atau Persia, paksa RTL:

import { I18nManager } from 'react-native';

const changeLanguage = async (lng) => {
 await i18n.changeLanguage(lng);
 const isRTL = i18n.dir(lng) === 'rtl';
 I18nManager.forceRTL(isRTL);
 // On Android, you may need to restart the app for full RTL effect
};

Untuk pengalaman RTL yang lengkap, gunakan dan dengan hati-hati. Pertimbangkan menggunakan pustaka seperti react-native-restyle untuk arah berbasis tema.

Memuat terjemahan dari Server (Teratas-Air)

Untuk aplikasi yang perlu menambahkan bahasa tanpa pembaruan toko aplikasi, ambil terjemahan JSON dari sebuah backend. Gunakan i18next-http-backend[ dengan backend tersendiri untuk React Pribumi:

import HttpBackend from 'i18next-http-backend';

i18n.use(HttpBackend).init({
 backend: {
 loadPath: 'https://your-api.com/locales/{{lng}}/{{ns}}.json',
 },
 fallbackLng: 'en',
 ns: ['common', 'home'],
 defaultNS: 'common',
});

Cache terjemahan yang diambil dalam AsyncStorage untuk menghindari permintaan berulang. Gabung dengan mekanisme versi untuk hanya mengunduh berkas yang diperbarui.

Pertimbangan Kinerja Kinerja

  • EUGNO Gunakan pembagian ruang nama: Hanya muat terjemahan untuk layar saat ini. Pemuatan malas mengurangi ukuran bundel awal.
  • OCLC [[NOLFLT:0]]Avoid re-renders: cangkul yang sudah dioptimalkan dengan hanya berlangganan perubahan bahasa. Lipat komponen mahal dengan .
  • [[ZOZOFLT:0]] berkas terjemahan Pre-compail terlalat: Selama membangun, mengubah JSON ke format terminifikasi.
  • [[AfronthFLT:0]]For big apps, mempertimbangkan menggunakan i18next-scanner untuk secara otomatis mengekstrak kunci terjemahan dari codebase anda.

¡Folin Pengujian Fungsi Multi Bahasa

Tes unit tulis gnosta untuk berkas terjemahan anda: pastikan tidak ada kunci yang hilang, semua pemegang tempat disediakan, dan plural bekerja dengan benar. Gunakan dengan contoh i18n yang diolok. Untuk tes integrasi, simulasikan switch bahasa dan periksa bahwa komponen menampilkan teks yang benar. Juga uji penerapan tata letak RTL pada kedua platform.

Praktek Terbaik Rekap

  • [[Efol ⁇ tidak pernah hardcode user-facing string.
  • Keep terjemahan terorganisir oleh fitur atau layar (namespaces).
  • [[EfleksifLT:0]]Gunakan bahasa fallback untuk mencegah terjemahan tidak lengkap dari melanggar UI.
  • [[CharlesFLT:0]]Uji pada perangkat nyata dengan pengaturan lokal yang berbeda.
  • Perbedaan budaya Bertentangan di luar bahasa: format tanggal, makna warna, gambar.
  • [[ZOLT:0]]Dokumenkan alur kerja i18n Anda untuk penerjemah dan pengembang.

Implementasi multi-bahasa dukungan dalam React Pribumi adalah investasi yang menguntungkan. Dengan perpustakaan seperti react-i18next[ dan react-native-localize, anda dapat membangun sistem yang kuat yang bersimbangan dengan basis pengguna anda. Untuk pembacaan lebih lanjut, merujuk pada situs resmi react-i18next dokumentasi], , panduan inti [FLT7]], dan [[TFLT:8]]:Reactory-act-reactive[T9], Startate:L9]], dan pengguna akan berbicara dalam bahasa aplikasi anda.