发布于 2026-01-06 3 阅读
0

使用 React Native 创建多语言应用程序

使用 React Native 创建多语言应用程序

语言一直是任何企业不可或缺的一部分。随着业务的增长,拓展到不同国家和地区变得至关重要。为了在这些地区取得成功,提供本地化服务至关重要。

对于移动应用而言,情况也并无二致。随着应用用户遍布世界各地,为用户提供使用其母语的功能就显得尤为重要。

在本文中,我们将使用react-native-localize包构建一个支持多语言的 React Native 应用程序。

先决条件

本教程需要您具备 React Native 的基础知识。要配置您的开发环境,请按照此处的官方指南进行操作。

为了确保我们理解一致,以下是本教程中使用的版本 -

  • Node v10.15.0
  • npm 6.4.1
  • 纱线 1.16.0
  • react-native 0.59.9
  • react-native-localize 1.1.3
  • i18n-js 3.3.0

入门

我们将构建一个 React Native 应用,该应用将支持英语法语阿拉伯语

如果您想立即查看源代码,这是 Github链接

要使用 创建新项目react-native-cli,请在终端中输入以下命令:

$ react-native init multiLanguage
$ cd multiLanguage

添加所需库

react-native-localize输入以下命令进行安装:

$ yarn add react-native-localize

然后使用以下方式链接:

$ react-native link react-native-localize

如果在安装过程中遇到任何错误,请查看此处的安装说明。

react-native-localize库提供了许多与本地化相关的设备常量,但没有提供 i18n 库。

我们将使用I18n.jsJavaScript 提供 I18n 翻译。

$ yarn add i18n-js

由于i18n-js似乎没有提供任何缓存/记忆化功能,我们将使用lodash.memoize相同的方法。

$ yarn add lodash.memoize

添加翻译

在目录内创建一个translations目录src,然后在目录下为每种语言创建三个 JSON 文件,如下所示。

  1. en.json英语
  2. fr.json法语
  3. ar.json阿拉伯语

这些文件内部将包含一个带有键和值的 JSON 对象。

每种语言的键都相同,将在应用程序中用于显示文本。

该值将是我们希望向用户显示的实际翻译,并且每种语言的值都会不同。

英文版:

{
  "hello": "Hello World!"
}

法语版:

{
  "hello": "Salut le Monde!"
}

阿拉伯语版:

{
  "hello": "أهلاً بالعالم"
}

同样地,您可以为应用程序中将要使用的每个文本添加更多键值对。

添加主代码

打开App.js文件并导入以下内容:

import React from "react";
import * as RNLocalize from "react-native-localize";
import i18n from "i18n-js";
import memoize from "lodash.memoize"; // Use for caching/memoize for better performance

import {
  I18nManager,
  SafeAreaView,
  ScrollView,
  StyleSheet,
  Text,
  View
} from "react-native";

之后,我们将添加一些辅助函数和常量,以便稍后使用。

const translationGetters = {
  // lazy requires (metro bundler does not support symlinks)
  ar: () => require("./src/translations/ar.json"),
  en: () => require("./src/translations/en.json"),
  fr: () => require("./src/translations/fr.json")
};

const translate = memoize(
  (key, config) => i18n.t(key, config),
  (key, config) => (config ? key + JSON.stringify(config) : key)
);

const setI18nConfig = () => {
  // fallback if no available language fits
  const fallback = { languageTag: "en", isRTL: false };

  const { languageTag, isRTL } =
    RNLocalize.findBestAvailableLanguage(Object.keys(translationGetters)) ||
    fallback;

  // clear translation cache
  translate.cache.clear();
  // update layout direction
  I18nManager.forceRTL(isRTL);
  // set i18n-js config
  i18n.translations = { [languageTag]: translationGetters[languageTag]() };
  i18n.locale = languageTag;
};

现在,我们将创建App类组件。

export default class App extends React.Component {
  constructor(props) {
    super(props);
    setI18nConfig(); // set initial config
  }

  componentDidMount() {
    RNLocalize.addEventListener("change", this.handleLocalizationChange);
  }

  componentWillUnmount() {
    RNLocalize.removeEventListener("change", this.handleLocalizationChange);
  }

  handleLocalizationChange = () => {
    setI18nConfig();
    this.forceUpdate();
  };

  render() {
    return (
      <SafeAreaView style={styles.safeArea}>
        <Text style={styles.value}>{translate("hello")}</Text>
      </SafeAreaView>
    );
  }
}

const styles = StyleSheet.create({
  safeArea: {
    backgroundColor: "white",
    flex: 1,
    alignItems: "center",
    justifyContent: "center"
  },
  value: {
    fontSize: 18
  }
});

在我们的构造函数中,我们调用了setI18nConfig()该函数来设置初始配置。

然后,componentDidMount()我们将添加一个事件监听器,该监听器将监听任何更改,并handleLocalizationChange()在发生任何更改时调用。

handleLocalizationChange()方法执行两项操作,一是触发事件setI18nConfig(),二是重新渲染组件forceUpdate(),这对于安卓设备来说是必要的,因为组件需要重新渲染才能使更改可见。

我们将移除生命周期方法中的监听器componentWillUnmount()

最后,我们将使用render()`printf` 函数并将我们的值作为参数传递给它。它会自动确定语言以及需要显示的文本。hellotranslate()key

运行应用程序

现在是时候看看翻译是否有效了。

输入以下命令,即可在模拟器或仿真器中运行您的应用:

$ react-native run-ios
$ react-native run-android

应该是这样的:

你好,世界英语

现在,请将设备语言设置更改为法语,然后重新打开应用。

你好世界法语

同样,您可以将语言设置更改为阿拉伯语,然后看到阿拉伯语的“你好”。

目前为止一切顺利。

但如果我选择了一种应用程序中没有收录翻译的随机语言,会发生什么情况?它会回退到哪种语言?

事实证明,它的目标findBestAvailableLanguage是返回最佳可用翻译。因此,它会查看您的语言偏好设置来确定备用语言。

在 iOS 模拟器中,您可以进入“语言与地区”设置,查看语言的偏好顺序。

语言偏好设置

如果所选语言不是首选语言,findBestAvailableLanguage则会返回undefined(因此保留的值将是您的备用值),因为您的翻译中没有任何用户首选语言可用。

奖金

react-native-localizeAPI 可提供对批次定位相关设备常量的访问。请务必查看文档中提供的完整 API 说明。

结论

添加多语言支持就是这么简单。现在您可以使用 react-native-localize 轻松地为您的应用提供多语言支持,这有助于提高用户应用的使用率。

您可以在这里找到GitHub仓库中的源代码

本文最初发表于Medium。

如果你喜欢这篇文章,请点赞并分享。

文章来源:https://dev.to/vikrantnegi/creating-a-multi-language-app-in-react-native-1joj