使用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."
但是翻译人员不会对所有嵌套和传递计数感到困惑吗?以及scheduledMeetingWithCount
和actionDeadlinesWithCount
键,它们应该位于哪个名称空间? glossary
?每个都在自己的相关命名空间中,如meeting
和action
命名空间中?
以及应该如何定义
"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 meetings
,1 meeting
和(2-inf) meeting
以及需要添加{与scheduled
,1 scheduled meeting
和{{count}} scheduled meetings
中的会议名称之前的{1}}?我要为整个系统中使用的每个关键字都这样做吗?
2️⃣如何格式化嵌套键?
假设我有一个值为no scheduled meetings
的钥匙
并且我有一个Meetings are scheduled for next week
和值meeting_plural
的键,但是它是小写字母,但是我有一个格式函数meetings
所以我想使用类似titleCase
的东西
但这导致{{$t(glossary:meeting_plural), titleCase}} are scheduled for next week
我也尝试过
meeting_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
有效 但是,这是最佳实践吗,我是否应该让翻译人员再次翻译会议?我应该为“会议”加标题时添加另一个键吗?
3️⃣如何处理值的变化,我应该使用上下文还是为每个变化添加键?如果我使用上下文,该如何提取所需的每个上下文?
我有一个句子,该句子根据传递的动作是否具有属性t('{{meeting, titleCase}} are scheduled for next week', { meeting: t('glossary:meeting_plural') })
而变化
当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>.
,并以{p>键将t('action:action-assigned.content', {
context: action.dueDate && 'dated'
})
action.json
这是对上下文的正确使用吗?我必须手动添加这些密钥,而不是通过提取工具添加这些密钥,并且必须关闭"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
4️⃣如何组织我的公用密钥?
我是否将在系统中使用的所有东西都放在_dated
命名空间中,如果我用键的值命名键,可以吗?还是给他们一个特定的密钥更好
5️⃣我应该提取相似但名词不同的值吗?
我有值common
,View action
,View project
等。我应该使用值为View meeting
的键并为要使用的名词传递View {{item}}
还是应该在键中输入每个值?
6️⃣是否有支持i18next-intervalPlural-postProcessor的TMS?
7️⃣我应该切换到使用I18next-icu吗?
我发现key
比默认格式ICU
更好地处理了复数,因为在i18next
中,我可以向en
添加一个特定条件,而不仅限于{{1} }和0
并且key
也有key_plural
,就像switch语句一样,它解决了我遇到的一些问题,为什么ICU
没有select
这样的东西?应该i18next
处理select
处理的用例吗?
8️⃣任何人对他们以前使用过且喜欢的TMS有任何个人推荐吗?
我想要一个能够很好地支持context
功能的设备,我已经研究过locize,但是发现它们的定价很难预测我宁愿有固定价格的商品
9️⃣是否有可以学习最佳实践并了解如何扩展i18n的资源?
我一直在搜索i18n资源,但发现社区有点缺乏深入的指导或端到端的工作流指南,我主要是通过尝试和尝试来尝试,但不确定是否当前的实施方式正在使用中,我将面临路障或烦恼