我正在使用i18Next。我希望插值变量前面的单词“A”/“An”根据插值变量的第一个字母进行切换。
以下是一个示例本地化键:值对:
“错误”:“{{tagName}} html标记不能位于”p“标记内。”
有两种情况: 1)tagName可以是“a”(或者通常以元音开头的某个标签),在这种情况下,返回的本地化和插值字符串应为:
“h1”html标记不能位于“p”标记内。
OR:
2)tagName可以是“section”(或者某个以辅音开头的标签),在这种情况下,返回的本地化和插值字符串应为:
“section”html标记不能位于“p”标记内。
关于最佳方法的想法?
答案 0 :(得分:1)
第一部分是这个" a vs."问题仅针对英语,因此i18next没有特定的答案是有道理的。
然而,i18next可以使用"格式"以下列方式处理它。作为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.",
&#34;烯手柄的&#34; /&#34;烯手柄的资本化&#34;意思是:
这是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;
}
}
});
}