Table of Contents
Tạo ra một hệ thống hỗ trợ đa ngôn ngữ trong ứng dụng bản địa phản ứng
Ứng dụng di động hỗ trợ nhiều ngôn ngữ không còn tùy chọn nữa. Yêu cầu thiết lập bất kỳ ứng dụng nào để nhận nuôi toàn cầu. Phản ứng tự nhiên, với khả năng tạo mẫu chéo, với khả năng bao gồm thư viện, cấu hình, thay đổi động lực, quản lý các quy tắc phức tạp, bố trí đa năng (TT- L) và hiệu quả tốt nhất.
Nhận định về việc địa phương hóa
Sự địa phương hóa không chỉ đơn giản dịch văn bản. Nó còn bao gồm định dạng số, ngày tháng, tiền tệ, quản lý hướng văn bản (LTR vs. RTL), đa dạng hóa, dạng giới tính, và thậm chí điều chỉnh bố trí UI để phù hợp với chuỗi đã dịch. Một hệ thống i18n được thiết kế tốt tách nội dung chuyển dạng từ cơ sở mã của bạn, sử dụng tham chiếu cơ sở dữ liệu dựa trên phím, và hỗ trợ việc chuyển đổi ngôn ngữ chạy mà không cần thiết lập lại ứng dụng.
Những thử thách chính trong việc phản ứng với bản địa
- Mô- đun bản địa cho khả năng phát hiện thiết bị cục bộ (điên giữa iOS và A- rô-bốt).
- Các tập tin dịch thuật có tính chất tải và đốt cháy.
- Quản lý ngôn ngữ hoạt động qua toàn bộ ứng dụng (bao gồm cả định hướng và sự thích nghi bền vững).
- Bố trí RTL - hỗ trợ người bản địa nhưng cần phải thẳng hàng cẩn thận.
- Kiểm tra và kiểm tra tất cả các chuỗi được dịch trong văn cảnh.
Chọn thư viện I18n bên phải
Trong khi có nhiều thư viện, [FLT: 3] [FLT: 3, nó cung cấp các móc, HC và các thành phần cho sự kết hợp liền mạch. Các phương pháp khác bao gồm [FT:4] 18i, nhưng ít mạnh hơn và [LT: 6] [Frect- rit] [Frect- rit], [FLcal- n], và các phần bổ sung để tìm kiếm, không có khả năng thêm. Đối với ứng dụng phát hiện, cũng không có khả năng sử dụng để truy cập.
Cài đặt các thư viện lõi
Bắt đầu bằng cách cài đặt các gói cần thiết:
npm install react-i18next i18next i18next-http-backend react-native-localize
Thêm [FLT:] i18next-nearsage fer để phát hiện tự động ngôn ngữ dựa trên thiết bị. Ghi chú rằng bạn có thể cần liên kết các mô- đun bản địa để phản ứng- valud (tự động kết nối trong RN 0.60+).
Thiết lập tính cách i18
Tạo tập tin cấu hình, e.g.,
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;
Dùng để xác định [FLT: 0] khả năng [FLT:] chạy một lần và đặt ngôn ngữ gốc. Để thay đổi liên tục ngôn ngữ thiết bị trong khi ứng dụng mở, bạn có thể đăng ký [FLT:] thay đổi.
Cấu hình tập tin dịch
Quản lý bản dịch của bạn trong tập tin cấu tạo JSON bằng ngôn ngữ và không gian tên. Ví dụ cho :
{
"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."
}
}
Dùng khoảng cách tên (v. d., , giúp quản lý các ứng dụng lớn và cho phép tải đoạn dịch lười biếng.
Dùng các bản dịch trong các thành phần
♪ The use trinslation hook
Trong bất kỳ thành phần chức năng nào:
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
);
};
[FLT: 0]t chức năng cân nhắc biến số và xử lý số nhiều. Để thay đổi ngôn ngữ, gọi . Điều này gây ra việc thay đổi mọi thành phần đã đăng ký.
Sử dụng thành phần chuyển đổi
Đối với chuỗi phức tạp với các thành phần đánh dấu hoặc phản ứng nhúng:
import { Trans } from 'react-i18next';
// In translations: "welcome_html": "Welcome, {user} !"
Welcome, {user} !
Giải quyết số lượng, mức sống và văn cảnh
i18next hỗ trợ số nhiều trong hộp. Định nghĩa phím có hậu tố hoặc dùng . Ví dụ:
{
"item": "{{count}} item",
"item_plural": "{{count}} items",
"item_other": "{{count}} items"
}
Sử dụng: tự động chọn dạng thức đúng dựa trên địa phương. Giới tính và các ngữ cảnh khác có thể được xử lý bằng tùy chọn .
Công việc chuyển đổi ngôn ngữ động
Để bền bỉ về ngôn ngữ của người dùng, hãy lưu trữ ngôn ngữ đã chọn trong [FLT: 0] ) và nạp nó vào ứng dụng [FLT: 1] (hoặc ). Thay đổi cấu hình i18:
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 },
});
Bây giờ khi người dùng chuyển đổi ngôn ngữ, sự ưu tiên được lưu và tự động phục hồi vào lần khởi động tiếp theo.
Hỗ trợ sang phải (RL)
Khi ngôn ngữ là tiếng Ả Rập, Do Thái, hay Ba Tư, thì lực 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
};
Để có một kinh nghiệm RTL đầy đủ, hãy dùng và cẩn thận. Hãy xem xét sử dụng thư viện như [FLT: 0] để chỉ hướng chủ đề.
Đang nạp dịch từ máy phục vụ (trên Air)
Để biết ứng dụng cần thêm ngôn ngữ không cần cập nhật ứng dụng, lấy bản dịch JSON từ hậu phương. Hãy dùng [FLT: 0] [FLT: 0] i18next-htext-backend [FLT: 1) với một hậu phương tự chọn cho người bản địa:
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',
});
Hãy tạm thời dùng các bản dịch có sẵn trong AsyncStorage để tránh các yêu cầu lặp đi lặp lại. Kết hợp với cơ chế phiên bản để chỉ tải về tập tin cập nhật.
Xem xét hiệu suất
- Dùng vùng phân chia tên ): chỉ nạp bản dịch cho màn hình hiện thời. Lzy tải ít kích cỡ ban đầu.
- Không cho phép tái chiếu ): móc đã tối ưu hóa bằng cách chỉ phụ thuộc vào sự thay đổi ngôn ngữ. Ngắt các thành phần đắt tiền với .
- Trong quá trình xây dựng, chuyển JSON sang dạng minified.
- Để dùng ứng dụng lớn , hãy xem xét sử dụng ) [FLT: 2] i18next-scanner để tự động lấy các phím dịch từ cơ sở mã của bạn.
Thử ra hàm đa thức
Đơn vị ghi các tập tin dịch: bảo đảm không có phím nào bị mất, mọi bộ giữ chỗ được cung cấp, và hoạt động đúng. Hãy dùng với một ví dụ i18n giả. Để thử tích hợp, hãy mô phỏng công tắc ngôn ngữ, và kiểm tra xem các thành phần hiển thị văn bản đúng. Cũng thử vẽ bố trí RTL trên cả hai nền tảng.
Tập lại
- luôn luôn sử dụng phím dịch - không bao giờ mã mã người dùng-phụ thuộc.
- Giữ các bản dịch được tổ chức [FLT: 0] bằng tính năng hoặc màn hình (không gian tên).
- Dùng những ngôn ngữ phụ để ngăn cản các bản dịch không đầy đủ vi phạm UI.
- Đặt trên thiết bị thật với thiết lập địa phương khác nhau.
- khác biệt văn hóa ngoài ngôn ngữ: định dạng ngày tháng, ý nghĩa màu, ảnh.
- Hãy ghi chép dòng công việc i18n cho các dịch giả và các nhà phát triển.
Việc hỗ trợ đa ngôn ngữ trong bản địa phản ứng là một sự đầu tư bổ ích. Với thư viện như [FLT: 1] và [FLT:] chính thức-nact [FLT], bản [FLT:] [FLT:], [L:], [LT], [L: 6],], bạn có thể xây dựng một hệ thống mạnh mẽ với người dùng của bạn. Để đọc thêm, hãy nhắc đến [FTTTTTTT: 4, trang đầu tư liệu nhỏ [Frec] [Frecate], ngôn ngữ gốc] và bắt đầu [Frect].