我有以下代码:
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
检测到英语时,它可能是en
,en-US
,en-GB
,或者对于挪威语,可能是是nb
,nb-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
}
但是必须对此有更好的解决方案!有人可以帮忙吗?
答案 0 :(得分:1)
包含区域的语言环境的默认行为是回退到主要语言代码。
例如,我们检测到en-GB
,但是没有分配给该语言环境的翻译文件。假设en
翻译已经到位,则预期的行为是继续进行翻译,不会造成任何麻烦。
这实际上意味着您可以从初始化代码中删除重复的声明:
const resources = {
en: locales.en,
no: locales.no,
de: locales.de,
se: locales.se
}
如果您愿意,可以用更简洁的方式完成:
const resources = { ...locales }