在i18n中命名消息属性的正确方法是什么?

时间:2010-12-06 11:53:44

标签: internationalization naming-conventions

我们确实有一个应该翻译成不同语言的网站。一些措辞在消息属性文件中准备好进行翻译。我现在想要将其余文本添加到这些文件中。

命名文本块的好方法是什么?

<view>.<type>.<name>

我们大多数都有网页,有些网站会重复使用某些元素/模块。

4 个答案:

答案 0 :(得分:11)

据我所知,不存在“标准”。因此很难说出什么是正确的以及什么是命名资源键的不正确方法。但是,根据我的经验,我可以这样推荐:

property file name: <module>.properties
resource keys: <view or dialog>[.<sub-context>].<control-type>.<name>

我们可以讨论是否将一个模块中的每个字符串放入一个属性文件的正确方法 - 如果更新不经常发生并且没有那么多消息,那么可能是正确的。否则,您可能会考虑每个视图一个文件。

至于关键命名策略:对于译者来说(听起来像是与尊贵的州长阿诺德的电影不是吗?)有一个上下文是很重要的。翻译实际上可能取决于它,即在波兰语中,如果它是页面/对话框/任何标题,您将以不同的方式翻译消息,如果它是按钮上的文本则以完全不同的方式翻译。

此类资源键的一个示例可能是:

preferences.password_area.label.username=User name

它为译者提供了足够的提示,说明它实际上是什么,这可能导致正确的翻译......

答案 1 :(得分:8)

我们使用点符号和驼峰案例提出了以下关键命名约定(Java,btw):

标签键(表单标签,页面/表单/应用程序标题等...即,不是完整的句子;用于多个UI位置):

如果标签代表Java字段(即表单字段)并与表单标签匹配: label.nameOfField
否则: label.sameAsValue

示例:

  • label.firstName =名字
  • label.lastName =姓氏
  • label.applicationTitle =申请标题
  • label.editADocument =编辑文档

内容密钥:

<强> projectName.uiPath.messageOrContentType.n。*

其中:

  • projectName 是项目的简称(或Java包中的派生名称)
  • uiPath 是内容密钥的UI导航路径
  • 应根据内容类型添加
  • messageOrContentType (例如,添加,删除,更新,信息,警告,错误,标题,内容等)。示例消息:(1)页面已更新。 (2)处理您的请求时出错。
  • n。* 处理以下情况:当单个页面上有多个内容区域时(例如,当内容由图像等分隔时),当内容在多个段落中时或当内容在(非)有序列表中时 - 应附加数字标识符。示例: ... content.1 ... content.2

    当页面上存在多个内容区域并且需要进一步分解一个或多个(基于上面的HTML示例)时,可以将辅助数字标识符附加到该键。示例: ... content.1.1 ... content.1.2

示例:

  • training.mySetup.myInfo.content.1 =这是内容1的第一句。这是内容1的第二句。此内容将被段落标记包围。
  • training.mySetup.myInfo.content.2 =这是内容2的第一句话。这是内容2的第二句。此内容也将被段落标记包围。
  • training.mySetup.myInfo.title =我的信息
  • training.mySetup.myInfo.updated =您的个人信息已更新。

优点/缺点


+标签键可以轻松重复使用;位置无关紧要 +对于未重复使用的内容键,在UI上查找页面将是简单而合理的。

- 标签键位于UI上的翻译者可能不太清楚。对于没有浏览页面的翻译人员来说,这可能不是问题,但对于开发人员来说可能仍然是一个问题 - 如果必须在UI上的多个位置使用内容密钥(很有可能),则在其他位置选择密钥名称是没有意义的。在我们的例子中,管理层并不关心内容区域的重复值,因此在这种情况下我们将使用不同的密钥(以在UI上演示位置)。


对此惯例的反馈 - 特别是将改进它的反馈 - 将非常受欢迎,因为我们正在修改我们的资源包! :)

答案 2 :(得分:2)

我个人使用的方法,到目前为止我更喜欢使用句子作为关键词。例如:(请用可靠的语法替换T取决于语言)

例如:   print(T(“Hello world”))

在这种情况下,T将搜索关键字“Hello world”。如果未找到,则返回密钥,否则返回密钥的值。

通过这种方式,您不需要编辑消息(使用默认语言)至少需要使用参数....它为我节省了大量的开发时间

答案 3 :(得分:1)

我建议采用以下惯例

functionalcontext.subcontext.key
logicalcontext.subcontext.key

通过这种方式,您可以在超级上下文中对所有常见消息进行逻辑分组(以下示例中为id)。很少有东西不是特定于任何功能上下文(比如lastName等),你可以将它们分组到逻辑上下文中。

order.id=Order Id
order.submission.submit=Submit Order
name.last=Last Name