如何使用 i18next 和 react-i18next 处理嵌套和组织翻译键?以及其他最佳实践问题

Haz*_*had 8 localization internationalization i18next reactjs react-i18next

我有几个关于使用 i18n 时的最佳实践和工作流程的问题\n我目前正在使用react-i18next\n我直接使用组件中的默认值定义键,然后使用提取它们babel-plugin-i18next-extract

\n

例子

\n
    <I18nText\n        ns="meeting"\n        i18nKey="meeting-invitation.videoConferenceLink"\n        defaults="You can join the video conference call for {{meeting.name}} when it starts via: <br /> <0>{{meeting.videoConference.link}}</0>"\n        components={[\n            <a\n                href={meeting.videoConference.link}\n                target="_blank"\n                rel="noopener noreferrer"\n            >\n                {meeting.videoConference.link}\n            </a>,\n        ]}\n        values={{ meeting }}\n    />\n
Run Code Online (Sandbox Code Playgroud)\n

注: I18nText 是自定义组件包装Trans组件

\n

问题:

\n

1\xef\xb8\x8f\xe2\x83\xa3我是否应该将在应用程序中经常使用的关键字放入自己的密钥中?如果是这样,我如何同时处理复数、格式化和使用上下文?

\n

假设我在整个应用程序中使用关键字meetingaction并且我有这样的句子

\n
0 meetings, 0 actions         => You have no scheduled meetings and no actions deadlines so far to prepare for.\n1 meeting, 1 action           => You have 1 scheduled meeting and 1 action deadline so far to prepare for.\n2-inf meetings, 2-inf actions => You have (2-inf) scheduled meetings and (2-inf) action deadlines so far to prepare for.\n
Run Code Online (Sandbox Code Playgroud)\n

meetings并且actions可以有不同的计数,我知道我可以使用嵌套并将计数传递给每个嵌套键,如下所示

\n
"key": "You have $t(glossary:scheduledMeetingWithCount, {\\"count\\": {{meetingCount}}}) and $t(glossary:actionDeadlinesWithCount, {\\"count\\": {{actionCount}}}) so far to prepare for."\n
Run Code Online (Sandbox Code Playgroud)\n

但是翻译人员不会对所有的嵌套和传递计数感到困惑吗?和scheduledMeetingWithCountactionDeadlinesWithCount,它们应该位于哪个命名空间中?glossary?每个都在自己的相关命名空间中,如meetingaction命名空间?\n以及定义应该是什么样子

\n
"scheduledMeetingWithCount": "1 scheduled meeting",\n"scheduledMeetingWithCount_plural": "{{count}} scheduled meeting",\n"scheduledMeetingWithCount_0": "no scheduled meetings"  // doesn't i18next not support `_0` for `en`?\n
Run Code Online (Sandbox Code Playgroud)\n

这不会导致密钥meeting需要action 翻译多次吗?当它单独定义时meeting,其复数形式meetings,当有计数时no meetings1 meeting(2-inf) meeting,以及当我需要scheduled在会议名称前添加,如1 scheduled meeting{{count}} scheduled meetingsno scheduled meetings?我要对整个系统中使用的每个关键字执行此操作吗?

\n

2\xef\xb8\x8f\xe2\x83\xa3如何格式化嵌套键?

\n

假设我有一个带有值的键\n并且我有一个带有值Meetings are scheduled for next week的键,但它是小写的,但我有一个格式函数\n所以我想使用类似的东西\n但这会导致\n我也尝试过meeting_pluralmeetingstitleCase{{$t(glossary:meeting_plural), titleCase}} are scheduled for next weekmeeting_plural), titleCase}} are scheduled for next week

\n
t('{{meeting, titleCase}} are scheduled for next week', {meeting: '$t(glossary:meeting_plural)'})\n
Run Code Online (Sandbox Code Playgroud)\n

但这会导致$T(Glossary:Meeting_Plural) are scheduled for next week\n所以我最终使用了

\n
t('{{meeting, titleCase}} are scheduled for next week', { meeting: t('glossary:meeting_plural') })\n
Run Code Online (Sandbox Code Playgroud)\n

这有效\n但这是最佳实践,我应该让翻译人员再次翻译会议吗?当“会议”是标题时,我应该添加另一个键吗?

\n

3\xef\xb8\x8f\xe2\x83\xa3如何处理值的变化,我应该使用上下文还是为每个变化添加一个键?如果我使用上下文,如何提取所需的每个上下文?

\n

我有一个句子根据传递的操作是否具有该属性dueDate而变化\n当dueDate存在时它会显示此

\n
Looks like you have a new action to complete: <strong>{{ action.title }}</strong> assigned by <strong> {{ action.creator.name }} </strong> and to be completed before <strong>{{ action.dueDate, dddd, MMMM Do, YYYY }}</strong>.\n
Run Code Online (Sandbox Code Playgroud)\n

如果dueDate不存在则显示

\n
Looks like you have a new action to complete: <strong>{{ action.title }}</strong> assigned by <strong> {{ action.creator.name }} </strong>.\n
Run Code Online (Sandbox Code Playgroud)\n

我该如何处理这个案子?它们应该用自己的键分开吗?\n我尝试过使用这样的上下文

\n
t('action:action-assigned.content', {\n  context: action.dueDate && 'dated'\n})\n
Run Code Online (Sandbox Code Playgroud)\n

和键action.json作为

\n
"action-assigned.content": "Looks like you have a new action to complete: <strong>{{ action.title }}</strong> assigned by <strong> {{ action.creator.name }} </strong>.",\n"action-assigned.content_dated": "Looks like you have a new action to complete: <strong>{{ action.title }}</strong> assigned by <strong> {{ action.creator.name }} </strong> and to be completed before <strong>{{ action.dueDate, dddd, MMMM Do, YYYY }}</strong>."\n
Run Code Online (Sandbox Code Playgroud)\n

这是上下文的正确使用吗?我必须手动添加这些密钥,而不是通过提取工具,并且必须关闭,discardOldKeys因为它正在删除密钥_dated

\n

4\xef\xb8\x8f\xe2\x83\xa3如何组织我的常用密钥?

\n

我是否要在命名空间中抛出将在整个系统中使用的任何内容common?如果我用它的值命名该键可以吗?或者给他们一个特定的钥匙会更好吗

\n

5\xef\xb8\x8f\xe2\x83\xa3我应该抽象相似但具有不同名词的值吗?

\n

我有价值观View action,,,...等。我应该用该值创建一个键并传递我想要使用的名词,还是应该在它的键中创建每个值?View projectView meetingView {{item}}key

\n

6\xef\xb8\x8f\xe2\x83\xa3是否有支持 i18next-intervalPlural-postProcessor 的 TMS?

\n

7\xef\xb8\x8f\xe2\x83\xa3我应该切换到使用 I18next-icu 吗?

\n

我发现ICU比默认格式更好地处理复数i18next,因为en我可以添加一个特定的条件0而不是被限制为keyand key_plural\nandICU还有select一个类似于 switch 语句,它解决了我遇到的一些问题,为什么没有i18next一些东西喜欢select?应该context处理处理的用例select

\n

8\xef\xb8\x8f\xe2\x83\xa3有没有人对他们以前使用过且喜欢的 TMS 有任何个人推荐?

\n

我想要一个能够i18next很好地支持功能的产品,我研究过locize,但发现他们的定价很难预测,我宁愿拥有固定价格的东西

\n

9\xef\xb8\x8f\xe2\x83\xa3是否有资源可以让我学习最佳实践并学习如何扩展 i18n?

\n

我搜索过 i18n 资源,但发现社区有点缺乏深入的指导或端到端的工作流程指南,我主要是通过反复试验来尝试,但不确定我是否会这样做面临障碍或正在使用当前的实施遇到成长的烦恼

\n