我正在使用i18n来翻译英语/日语-我的默认语言是en
中的英语。但最近发现我的网站未使用日语的正确ISO语言代码。 jp
而不是ja
。
我想知道在i18n中是否可能有两个语言代码引用相同的语言环境文件-以及如何做到这一点感到困惑。
例如,我希望/whatever?lng=jp
和/whatever?lng=ja
用于日语文本。
这是我的配置:
i18nConfig.js
const path = require("path");
module.exports = {
fallbackLng: "en",
preload: ["en", "ja", "jp"],
ns: [
"localefiles"
],
backend: {
loadPath: path.join(__dirname, "locales", "{{lng}}", "{{ns}}.json"),
addPath: path.join(__dirname, "locales", "{{lng}}", "{{ns}}.missing.json"),
},
};
i18n.js
const i18n = require("i18next");
const XHR = require("i18next-xhr-backend");
const LanguageDetector = require("i18next-browser-languagedetector");
const options = {
fallbackLng: "en",
load: "languageOnly",
ns: ["common"],
defaultNS: "common",
debug: process.env.NODE_ENV !== "production" && false,
saveMissing: true,
interpolation: {
escapeValue: false,
formatSeparator: ",",
format: (value, format) => {
if (format === "uppercase") {
return value.toUpperCase();
}
return value;
},
},
};
if (process.browser) {
i18n.use(XHR).use(LanguageDetector);
}
if (!i18n.isInitialized) {
i18n.init(options);
}
if (i18n.initialLanguage == "jp") {
console.log({i18n})
i18n.setLng("ja");
}
i18n.getInitialProps = (req, namespaces) => {
if (!namespaces) {
namespaces = i18n.options.defaultNS;
}
if (typeof namespaces === "string") {
namespaces = [namespaces];
}
req.i18n.toJSON = () => null;
const initialI18nStore = {};
req.i18n.languages.forEach((lan) => {
initialI18nStore[lan] = {};
namespaces.forEach((ns) => {
initialI18nStore[lan][ns] = req.i18n.services.resourceStore.data[lan]
? req.i18n.services.resourceStore.data[lan][ns] || {}
: {};
});
});
return {
i18n: req.i18n,
initialI18nStore,
initialLanguage: req.i18n.language,
};
};
module.exports = i18n;
非常感谢您对这个基本问题的帮助。
答案 0 :(得分:0)
您可以将backend.loadPath
定义为函数,该函数将获得langs
和namespace
并返回包含文件路径的字符串。
// i18next.js
const i18n = require('i18next');
const XHR = require('i18next-xhr-backend');
const LanguageDetector = require('i18next-browser-languagedetector');
const options = {
fallbackLng: 'en',
load: 'languageOnly',
ns: ['common'],
defaultNS: 'common',
debug: process.env.NODE_ENV !== 'production' && false,
saveMissing: true,
backend: {
loadPath(lng, ns) {
if (lng === 'jp') { // <---
return '/locales/ja/{{ns}}.json';
}
return '/locales/{{lng}}/{{ns}}.json';
},
addPath: path.join(__dirname, 'locales', '{{lng}}', '{{ns}}.missing.json'),
},
interpolation: {
escapeValue: false,
formatSeparator: ',',
format: (value, format) => {
if (format === 'uppercase') {
return value.toUpperCase();
}
return value;
},
},
};