Internationalization 使用i18Next时,在;a「;及;";取决于插值变量中的第一个字母
下一步我用的是i18Next。我希望插值变量前面的单词“A”/“An”根据插值变量的第一个字母进行切换 下面是一个本地化键:值对示例: 错误:“{{tagName}}html标记不能在“p”标记内。” 有两种情况: 1) 标记名可以是“a”(或一些通常以元音开头的标记),在这种情况下,返回的本地化和插值字符串应该是: “h1”html标记不能在“p”标记内 或: 2) 标记名可以是“section”(或一些以辅音开头的标记),在这种情况下,返回的本地化和插值字符串应该是: “section”html标记不能位于“p”标记内Internationalization 使用i18Next时,在;a「;及;";取决于插值变量中的第一个字母,internationalization,i18next,Internationalization,I18next,下一步我用的是i18Next。我希望插值变量前面的单词“A”/“An”根据插值变量的第一个字母进行切换 下面是一个本地化键:值对示例: 错误:“{{tagName}}html标记不能在“p”标记内。” 有两种情况: 1) 标记名可以是“a”(或一些通常以元音开头的标记),在这种情况下,返回的本地化和插值字符串应该是: “h1”html标记不能在“p”标记内 或: 2) 标记名可以是“section”(或一些以辅音开头的标记),在这种情况下,返回的本地化和插值字符串应该是: “section”ht
关于最好的解决方法的想法?第一部分是,这个“a vs.a”问题只针对英语,因此i18next没有具体的答案是有道理的 但是,i18next可以使用“format”函数作为i18n插值过程的一部分,以以下方式处理它 以下是解决方案的文档: 以下是您将用于此实现的密钥:
"sample-key": "{{tag, en-handle-an-capitalized}} <{{tag}}> tag always needs a closing </{{tag}}> tag. Writing <{{tag}}/> is not allowed.",
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;
}
}
});
}