在回放本地应用程序中创建多语言支持系统

构建支持多种语言的移动应用程序已不再是可选的,而要求任何旨在全球采用软件。 具有跨平台能力的“原始”软件提供了实施国际化(i18n)和本地化(l10n)的几种有力方法。 本条为构建“本土反应”的多语言支持系统提供了深入指南,涵盖了图书馆、配置、动态切换、处理复杂的复数规则、左权调整和最佳操作做法。

地方化的核心概念

本地化超越了简单的文本翻译。 它涉及格式化的数字、 日期、 货币、 处理文本方向( LTR vs. RTL) 、 复数化、 性别表, 甚至调整 UI 的布局以适应翻译字符串。 一个设计良好的i18n 系统将可转换的内容从您的代码库中分离出来, 使用基于密钥的引用, 并且支持运行时语言切换, 而不需要应用程序重新启动 。

本地反应中的关键挑战

  • 用于设备本地化检测的原生模块(iOS和Android之间的差异).
  • 高效加载和缓存翻译文件 。
  • 在整个应用软件中管理活动语言状态(包括导航和坚持偏好).
  • 处理RTL布局 - react 原生支持 但需要小心对齐.
  • 测试和验证上下文中所有已翻译字符串 。

选择右 i18n 库

虽然存在几个库,但 react-i18next是React-native Nublication 上方最受欢迎和最完整的特性选择。它提供钩子、HOC和无缝融合的组件。替代方案包括i18n-js(简单但功率较小)和[ react-native-inclocation[(用于本地检测,而不是翻译)。对于企业应用程序,建议用额外的插件(如i18nex-browser-语言检测器适应Native)来反应。

安装核心库

开始安装所需的软件包:

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

可选添加i18next-浏览器语言检测器[],用于基于设备偏好自动语言检测. 注意,您可能需要将本地模块链接到反应-内在-本地化(自动链接在RN 0.60+)中.

设置 i18n 实例

创建配置文件, 例如 [[FLT: 2]] :

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;

使用 [[FLT: 0]] 反应- 本地化- 定位 [[FLT: 1] 保证您的应用尊重设备的区域设置。 [[FLT: 4] 函数运行一次并设置初始语言。 对于持续更新(如果用户在应用程序打开时更改其设备语言), 您可以订阅 [[FLT: 5] 修改 。

翻译文件结构

按语言和命名空间组织您在嵌入式 JSON 文件中的翻译。 示例 :

{
 "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."
 }
}

使用命名空间(例如,])帮助管理大型应用程序,并使得可以懒惰地加载翻译块.

使用组件中的翻译

翻译钩

在任何职能组成部分中:

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
 
 
 );
};

t 函数插入变量并处理复数。要更改语言,请调用 ——这触发了所有已订阅组件的重置。

使用 Trans 组件

对于带有嵌入式标记或反射组件的复杂字符串:

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

 Welcome, {user}!

处理多元性、性别和背景

i18next 支持框外的高级复数规则。 定义密钥时, 后缀或使用 [ [FLT: 14]] 。 例 :

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

用法:根据地块自动选择正确的形式,性别和其他上下文可以通过 选项处理。

动态语言切换和持久性

要坚持用户的语言偏好,请将所选语言存储在 AsyncStorage [ (或] react-native-mmkv 中,并在应用程序启动时加载. 修改 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 },
});

现在当用户切换语言时,首选功能会保存下来,并在下一次发射时自动恢复.

左转右转支持

React Industrial通过模块支持RTL. 当语言是阿拉伯语,希伯来语或波斯语时,强制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
};

对于完整的RTL体验,请仔细使用和]. 考虑使用像 反应-内在-反式[这样的库来进行主题导向.

从服务器装入翻译( Over- the- Air)

对于需要添加语言而无需应用商店更新的应用程序,请从后端获取翻译 JSONs。使用 [ i18next- http- backend ,并带有自定义的本地语后端:

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',
});

缓存 AsyncStorage 中获取的翻译, 以避免重复请求。 组合到一个版本机制中, 仅下载更新的文件 。

业绩考量

  • 使用命名空间分割:只为当前屏幕装入翻译。懒惰的加载会减少初始捆绑大小 。
  • ] Avoid re-reforders :]]钩子已经通过只订阅语言变化来优化。用 包装昂贵的组件。
  • 预编译文件:在构建过程中,将JSON转换为精密格式.
  • 对于大型应用程序,考虑使用i18next-scanner[自动从您的代码库中提取翻译密钥.

测试多语言功能

为您的翻译文件撰写单元测试: 确保不丢失密钥, 所有占位符都提供, 复数工作正确。 使用模拟 i18n 等。 用于集成测试, 模拟语言交换器, 并检查显示正确文本的组件。 同时测试两个平台的 RTL 版式渲染 。

最佳做法简介

  • 总是使用翻译密钥——从未使用硬码的用户-faceing字符串.
  • 保持通过特性或屏幕(namespaces)排列的翻译[].
  • 使用倒置语言防止不完全翻译突破UI.
  • 在不同地方设置的实设备上进行测试.
  • 考虑文化差异语言以外的:日期格式,颜色含义,图像.
  • 为翻译和开发者记录您的i18n工作流程.

在 React Industrial 中实施多语言支持是一种值得奖励的投资。 有了像 的 react-i18next 的 反应-native-location 这样的库,你可以建立一个强大的系统,以用户基础为尺度。为了进一步阅读,请参考官方 的 react-i18next文档 i18next 核心指南 的 react-native-location prium。启动小的,其脚步和应用程序将用语言来表达用户的语言。