【问题标题】:Use same resource for languages with different IETF language tag in i18next在 i18next 中对具有不同 IETF 语言标签的语言使用相同的资源
【发布时间】:2019-09-11 01:07:16
【问题描述】:

我有以下代码:

import i18n from 'i18next'

import { initReactI18next } from 'react-i18next'
import locales from 'locales'

const resources = {
  en: locales.en,
  no: locales.no,
  de: locales.de,
  se: locales.se
}

function getDefaultLocale() {
  const preferredLanguage = localStorage.getItem('preferredLanguage')
  const lng = locales.languages
    .map(({ code }) => code)
    .find(code =>
      code === preferredLanguage || // The user has set a preferred language
        code === '__DEFAULT_LOCALE__' || // Default locale set at build time.
        code === navigator.language
    )
  return lng
}

i18n
  .use(initReactI18next)
  .init({
    resources,
    lng: getDefaultLocale(),
    appendNamespaceToCIMode: true
  })

export default i18n

我的问题是,假设用navigator.language 检测到英语,它可能是enen-USen-GB,或者对于挪威语,它可能是nbnb-NO , ny-NO

我们希望为所有英语语言代码提供相同的翻译,并为所有挪威语言代码提供相同的翻译。

我目前的解决方案是像这样定义资源:

const resources = {
  en: locales.en,
  'en-US': locales.en,
  'en-GB': locales.en,
  no: locales.no,
  'nb-NO': locales.no,
  'ny-NO': locales.no,
  de: locales.de,
  se: locales.se
}

但是必须有更好的解决方案!有人可以帮忙吗?

【问题讨论】:

    标签: i18next react-i18next


    【解决方案1】:

    包含区域的语言环境的默认行为是回退到主要语言代码。

    例如,我们检测到en-GB,但没有分配给此语言环境的翻译文件。假设en 翻译已经到位,预期的行为将是继续处理它们,不会造成任何麻烦。

    这实际上意味着您可以从初始化代码中删除重复声明:

    const resources = {
      en: locales.en,
      no: locales.no,
      de: locales.de,
      se: locales.se
    }
    

    如果您愿意,可以以更简洁的方式完成:

    const resources = { ...locales }
    

    【讨论】:

      猜你喜欢
      • 2019-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多