首页 > 解决方案 > 如何使用 i18next 和 react-i18next 处理嵌套和组织翻译键?和其他最佳实践问题

问题描述

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

例子

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

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

问题:

1️⃣我应该将我在应用程序中经常使用的关键字放入他们自己的键中吗?如果是这样,我如何同时处理复数、格式化和使用上下文?

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

0 meetings, 0 actions         => You have no scheduled meetings and no actions deadlines so far to prepare for.
1 meeting, 1 action           => You have 1 scheduled meeting and 1 action deadline so far to prepare for.
2-inf meetings, 2-inf actions => You have (2-inf) scheduled meetings and (2-inf) action deadlines so far to prepare for.

meetings并且actions可以有不同的计数,我知道我可以使用嵌套,并且像这样将计数传递给每个嵌套键

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

但是翻译者不会对所有的嵌套和传递计数感到困惑吗?以及 thescheduledMeetingWithCountactionDeadlinesWithCount键,它们应该在哪个命名空间中?glossary? 每个都在自己的相关命名空间中,如 inmeetingaction命名空间?以及定义应该如何

"scheduledMeetingWithCount": "1 scheduled meeting",
"scheduledMeetingWithCount_plural": "{{count}} scheduled meeting",
"scheduledMeetingWithCount_0": "no scheduled meetings"  // doesn't i18next not support `_0` for `en`?

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

2️⃣如何格式化嵌套键?

假设我有一个带有 value 的键,我有一个带有 value的Meetings are scheduled for next week 键,但它是小写的,但我有一个格式函数 所以我想使用类似的东西, 但结果 我也试过了meeting_pluralmeetingstitleCase{{$t(glossary:meeting_plural), titleCase}} are scheduled for next weekmeeting_plural), titleCase}} are scheduled for next week

t('{{meeting, titleCase}} are scheduled for next week', {meeting: '$t(glossary:meeting_plural)'})

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

t('{{meeting, titleCase}} are scheduled for next week', { meeting: t('glossary:meeting_plural') })

哪个有效,但这是最佳做法,我应该让翻译人员再次翻译会议吗?当“会议”以标题命名时,我应该添加另一个键吗?

3️⃣如何处理值的变化,我应该使用上下文还是为每个变化添加一个键?如果我使用上下文,如何提取所需的每个上下文?

我有一个句子会根据传递的动作是否具有属性而改变它dueDate是否dueDate存在

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>.

如果dueDate不存在,则显示

Looks like you have a new action to complete: <strong>{{ action.title }}</strong> assigned by <strong> {{ action.creator.name }} </strong>.

我应该如何处理这种情况?他们应该用自己的钥匙分开吗?我试过使用这样的上下文

t('action:action-assigned.content', {
  context: action.dueDate && 'dated'
})

action.json和as 的键

"action-assigned.content": "Looks like you have a new action to complete: <strong>{{ action.title }}</strong> assigned by <strong> {{ action.creator.name }} </strong>.",
"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>."

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

4️⃣我如何组织我的公共密钥?

我是否在common命名空间中抛出任何我将在系统中使用的东西,如果我用它的值命名键是否可以?或者最好给他们一个特定的密钥

5️⃣我应该抽象出相似但有不同名词的值吗?

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

6️⃣有支持 i18next-intervalPlural-postProcessor 的 TMS 吗?

7️⃣我应该改用I18next-icu吗?

我发现ICUi18next默认格式更好地处理复数,因为en我可以添加一个特定条件0而不是限制为keyandkey_plural 并且ICU也有select这就像一个 switch 语句,它解决了我遇到的一些问题,为什么没有i18next类似的东西select? context应该处理处理的用例select

8️⃣有没有人对他们以前使用过并喜欢的 TMS 有任何个人推荐?

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

9️⃣是否有资源可以让我学习最佳实践并学习如何扩展 i18n?

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

标签: reactjslocalizationinternationalizationi18nextreact-i18next

解决方案


推荐阅读