使用 i18Next 时,根据插值变量中的第一个字母在 "a" 和 "an" 之间切换
When using i18Next, switch between "a" and "an" depending on the first letter in an interpolated variable
我正在使用 i18Next。我希望插值变量前面的单词 "A"/"An" 根据插值变量的第一个字母进行切换。
这是一个本地化的示例 key:value 对:
"error": "A {{tagName}} html tag cannot be within a "p" 标签。"
有两种情况:
1) tagName 可以是 "a"(或者一些以元音开头的标签,通常)在这种情况下返回的本地化和内插字符串应该是:
"h1"html 标签不能在 "p" 标签内。
或:
2) tagName 可以是 "section"(或某些以辅音开头的标签),在这种情况下返回的本地化和内插字符串应该是:
A "section" html 标签不能在 "p" 标签内。
关于执行此操作的最佳方法的想法?
第一部分是这个 "a vs. an" 问题仅针对英语,因此 i18next 没有针对它的具体答案是有道理的。
但是,i18next 可以使用 "format" 函数作为 i18n 插值过程的一部分,按以下方式处理它。
以下解决方案的文档在此处:
http://i18next.com/translate/formatting/
这是您将用于此实现的密钥:
"sample-key": "{{tag, en-handle-an-capitalized}} <{{tag}}> tag always needs a closing </{{tag}}> tag. Writing <{{tag}}/> is not allowed.",
"en-handle-an"/"en-handle-an-capitalized"表示如下:
- "en"-这仅适用于 "en" 语言环境字符串
- "handle-an"-它在做什么
- "capitalized"- A 或 An should/should 不被大写。
这里是i18n的初始化(包括格式键和语言匹配时插值过程的格式步骤调用的辅助函数):
const getVariationOfAOrAn = function(value, capitalize) {
const letters = ['a','e','i','o','u','h'];
let firstLetter = value.substring(0,1);
let correctWordForm = '';
if (letters.find(function(l) {
return firstLetter === l;
})) {
correctWordForm = capitalize ? 'An' : 'an';
} else {
correctWordForm = capitalize ? 'A' : 'a';
}
return correctWordForm;
}
export default function() {
init({
fallbackLng: 'en',
resources,
interpolation: {
format: function(value, format, lng) {
if (format === 'en-handle-an') return (!lng || lng === 'en') ? getVariationOfAOrAn(value, false) : '';
if (format === 'en-handle-an-capitalized') return (!lng || lng === 'en') ? getVariationAOrAn(value, true) : '';
return value;
}
}
});
}
我正在使用 i18Next。我希望插值变量前面的单词 "A"/"An" 根据插值变量的第一个字母进行切换。
这是一个本地化的示例 key:value 对:
"error": "A {{tagName}} html tag cannot be within a "p" 标签。"
有两种情况: 1) tagName 可以是 "a"(或者一些以元音开头的标签,通常)在这种情况下返回的本地化和内插字符串应该是:
"h1"html 标签不能在 "p" 标签内。
或:
2) tagName 可以是 "section"(或某些以辅音开头的标签),在这种情况下返回的本地化和内插字符串应该是:
A "section" html 标签不能在 "p" 标签内。
关于执行此操作的最佳方法的想法?
第一部分是这个 "a vs. an" 问题仅针对英语,因此 i18next 没有针对它的具体答案是有道理的。
但是,i18next 可以使用 "format" 函数作为 i18n 插值过程的一部分,按以下方式处理它。
以下解决方案的文档在此处: http://i18next.com/translate/formatting/
这是您将用于此实现的密钥:
"sample-key": "{{tag, en-handle-an-capitalized}} <{{tag}}> tag always needs a closing </{{tag}}> tag. Writing <{{tag}}/> is not allowed.",
"en-handle-an"/"en-handle-an-capitalized"表示如下:
- "en"-这仅适用于 "en" 语言环境字符串
- "handle-an"-它在做什么
- "capitalized"- A 或 An should/should 不被大写。
这里是i18n的初始化(包括格式键和语言匹配时插值过程的格式步骤调用的辅助函数):
const getVariationOfAOrAn = function(value, capitalize) {
const letters = ['a','e','i','o','u','h'];
let firstLetter = value.substring(0,1);
let correctWordForm = '';
if (letters.find(function(l) {
return firstLetter === l;
})) {
correctWordForm = capitalize ? 'An' : 'an';
} else {
correctWordForm = capitalize ? 'A' : 'a';
}
return correctWordForm;
}
export default function() {
init({
fallbackLng: 'en',
resources,
interpolation: {
format: function(value, format, lng) {
if (format === 'en-handle-an') return (!lng || lng === 'en') ? getVariationOfAOrAn(value, false) : '';
if (format === 'en-handle-an-capitalized') return (!lng || lng === 'en') ? getVariationAOrAn(value, true) : '';
return value;
}
}
});
}