【问题标题】:How to create localization with react native?如何使用 React Native 创建本地化?
【发布时间】:2019-09-18 02:20:17
【问题描述】:

我正在为 react native 进行本地化,这是我目前所做的

import React, { useState, useContext } from 'react'
import { Platform, NativeModules } from 'react-native'
import PropTypes from 'prop-types'

const languageJson = require('../../language.json')

const deviceLanguage =
    Platform.OS === 'ios'
        ? NativeModules.SettingsManager.settings.AppleLocale
        : NativeModules.I18nManager.localeIdentifier

export const LanguageContext = React.createContext(deviceLanguage)

export const T = ({ children }) => {
    const { language } = useContext(LanguageContext)
    if (!children) return ''
    let res =
        languageJson[children] && languageJson[children][language]
            ? languageJson[children][language]
            : languageJson[children]['en_US']
    return res
}

export const t = string =>
    languageJson[string] && languageJson[string][deviceLanguage]
        ? languageJson[string][deviceLanguage]
        : languageJson[string]['en_US']

export default function Language({ children }) {
    const [language, setLanguage] = useState(deviceLanguage)

    const t = key => {
        let string =
            languageJson[key] && languageJson[key][language]
                ? languageJson[key][language]
                : languageJson[key]['en_US']

        if (string) return string
        throw Error(`Key ${key} not found`)
    }

    return (
        <LanguageContext.Provider value={{ language, setLanguage, t }}>
            {children}
        </LanguageContext.Provider>
    )
}

Language.propTypes = {
    children: PropTypes.node,
}

所以在这段代码中,我读取了一个 json 文件并获取设备语言来读取字符串。

因为我使用上下文来传递设备语言,但这就是问题的开始。

在某些情况下,我需要 a 字符串,但它不在组件内,所以我创建了函数 t(即在组件外),但是当 language 更改时,t 不会t 改变,因为它不在上下文中,而且我也不能在不是反应组件的函数中使用上下文。

如何实现这个t函数,既能看到设备语言的变化,又能与上下文协同工作?

【问题讨论】:

  • 我建议使用著名的 3rd 方库 react-intl 来本地化 React 应用程序。它也适用于 React 本机应用程序。 github.com/formatjs/react-intl/blob/master/docs/…
  • 你解决了吗?
  • @OliverD 还没有,有点停止寻找它,抱歉
  • 我写了一篇针对 React Native 本地化的博文 - 但是,我没有使用上下文 API - 相反,我只是通过使用 useSelector / mapStateToProps / 连接到应用程序的顶部组件添加当前本地化Redux 商店。这是链接:stefan-majiros.com/blog/…

标签: reactjs react-native react-context


【解决方案1】:

在本地化可用的 react 原生节点包中

https://github.com/AlexanderZaytsev/react-native-i18n

例子:

import I18n from 'react-native-i18n';

I18n.t('name');

【讨论】:

  • 对不起,这不能回答我的问题,这个包已被弃用
猜你喜欢
  • 2023-03-27
  • 2017-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多