首页 > 解决方案 > ReactNative - 使用 i18n 设置首选应用程序语言

问题描述

我想添加允许用户在应用程序中设置特定语言的选项。我正在使用i18nreact-native-localize库来检测设备语言。

import * as RNLocalize from "react-native-localize"
import i18n from "i18n-js"

const en = require("./en")
const pl = require("./pl")
const ru = require("./ru")
const de = require("./de")
const fr = require("./fr")
const nl = require("./nl")
const uk = require("./uk")
const vi = require("./vi")

i18n.fallbacks = true
i18n.translations = { en, pl, ru, de, fr, nl, uk, vi }

const fallback = { languageTag: "en", isRTL: false }
const { languageTag } =
  RNLocalize.findBestAvailableLanguage(Object.keys(i18n.translations)) || fallback
i18n.locale = languageTag

它确实有效 - 如果我更改我的设备语言,静态内容会被翻译成检测到的语言,但我也有存储在数据库中的内容被翻译成django-modeltranslation. 这里有些麻烦来了。在我的语言视图(移动)中,我有:

changeLanguage = async (language) => {
    console.log(language)
    const error = await this.props.userStore.updateUserDetails({
      attrs: {
        preferredLang: toJS(language)
      }
    })

    if (error != null) this.showModal(error)
    else this.hideModal()
    this.refresh()
  }

在这种方法中,我将选择的首选语言添加到我的用户配置文件中。在后端,我返回翻译的语言。它也有效。但这仅适用于数据库。例如:如果用户选择语言“de”且设备语言为“fr”,则静态内容为法语,数据库中的内容为德语。在移动视图中选择语言期间,我想更新i18n.locale. 我正在尝试类似的东西:

changeLanguage = async (language) => {
    console.log(language)
    i18n.locale = language
    const error = await this.props.userStore.updateUserDetails({
      attrs: {
        preferredLang: toJS(language)
      }
    })

    if (error != null) this.showModal(error)
    else this.hideModal()
    this.refresh()
  }

但不知何故,它正在重新启动到我的 django 默认语言。有人可以帮我找到解决方案或提供一些提示吗?

标签: javascriptreact-nativelocalizationreact-native-localize

解决方案


推荐阅读