Internationalization 使用i18Next时,在;a「;及;";取决于插值变量中的第一个字母

Internationalization 使用i18Next时,在;a「;及;";取决于插值变量中的第一个字母,internationalization,i18next,Internationalization,I18next,下一步我用的是i18Next。我希望插值变量前面的单词“A”/“An”根据插值变量的第一个字母进行切换 下面是一个本地化键:值对示例: 错误:“{{tagName}}html标记不能在“p”标记内。” 有两种情况: 1) 标记名可以是“a”(或一些通常以元音开头的标记),在这种情况下,返回的本地化和插值字符串应该是: “h1”html标记不能在“p”标记内 或: 2) 标记名可以是“section”(或一些以辅音开头的标记),在这种情况下,返回的本地化和插值字符串应该是: “section”ht

下一步我用的是i18Next。我希望插值变量前面的单词“A”/“An”根据插值变量的第一个字母进行切换

下面是一个本地化键:值对示例:

错误:“{{tagName}}html标记不能在“p”标记内。”

有两种情况: 1) 标记名可以是“a”(或一些通常以元音开头的标记),在这种情况下,返回的本地化和插值字符串应该是:

“h1”html标记不能在“p”标记内

或:

2) 标记名可以是“section”(或一些以辅音开头的标记),在这种情况下,返回的本地化和插值字符串应该是:

“section”html标记不能位于“p”标记内


关于最好的解决方法的想法?

第一部分是,这个“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;
      }
   }
  });
}