在 i18n 中对同一语言环境使用两种语言代码
Using two language codes for same locale in i18n
我正在使用 i18n 进行翻译 English/Japanese -- 我在 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;
非常感谢您对这个基本问题的帮助。
您可以将 backend.loadPath
定义为 函数 ,它获取 langs
& namespace
和 returns 带有路径的字符串到文件。
// 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;
},
},
};
我正在使用 i18n 进行翻译 English/Japanese -- 我在 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;
非常感谢您对这个基本问题的帮助。
您可以将 backend.loadPath
定义为 函数 ,它获取 langs
& namespace
和 returns 带有路径的字符串到文件。
// 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;
},
},
};