reactjs - 如何使用 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."
但是翻译者不会对所有的嵌套和传递计数感到困惑吗?以及 thescheduledMeetingWithCount
和actionDeadlinesWithCount
键,它们应该在哪个命名空间中?glossary
? 每个都在自己的相关命名空间中,如 inmeeting
和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
和no scheduled meetings
?我要为我在整个系统中使用的每个关键字执行此操作吗?
2️⃣如何格式化嵌套键?
假设我有一个带有 value 的键,我有一个带有 value的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
所以我最终使用
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吗?
我发现ICU
比i18next
默认格式更好地处理复数,因为en
我可以添加一个特定条件0
而不是限制为key
andkey_plural
并且ICU
也有select
这就像一个 switch 语句,它解决了我遇到的一些问题,为什么没有i18next
类似的东西select
? context
应该处理处理的用例select
?
8️⃣有没有人对他们以前使用过并喜欢的 TMS 有任何个人推荐?
我想要一个能够i18next
很好地支持功能的产品,我研究过 locize 但发现它们的定价很难预测 我宁愿有固定价格的东西
9️⃣是否有资源可以让我学习最佳实践并学习如何扩展 i18n?
我搜索了 i18n 资源,但发现社区有点缺乏深入的指导或端到端的工作流程指南,我主要是通过反复试验来尝试,但不确定我是否会正在使用的当前实施面临障碍或遇到成长的烦恼
解决方案
推荐阅读
- google-sheets - Google 表格中的 NORMDIST 给了我一个指数分布
- logging - 尝试将通用 CEF 日志转发到 Azure Sentinel
- php - 检查 Zip 文件是否使用 PHP 加密或密码保护
- python - 如何更好地理解“最长有效括号”问题的解决方案?
- javascript - Woocommerce 重定向到已添加产品的购物车
- f# - 如何将需要操作的初始化代码转换为 F#
- powershell - powershell Receive-Job 查找状态是否失败
- mysql - mysql GROUP BY 太慢了。有什么帮助让它更快吗?
- sql - 按键比较行中的两个值,然后有条件地向表中添加一些东西?
- node.js - 扩展请求类型以添加 Redis 客户端