iTop如何翻译
如何翻译
➡️ 介绍如何对iTop语言进行本地化
原则
在 iTop 和 iTop 模块中,语言由两个要素确定:
- ISO 639-1 语言代码。例如:pt 表示葡萄牙语。
- ISO 国家代码。例如:br 表示巴西。
本地化依赖于字典文件,这些文件的名称以小写语言代码作为前缀,例如:pt_br.dictionary.itop.core.php。这些文件是数据模型的一部分,因此在每次修改后都需要进行编译(重新运行安装或使用工具包)。
在 iTop 中,嵌入的字典文件位于以下位置:
- <itop-root>/dictionaries/
- <itop-root>/datamodels/2.x/<module>/dictionaries
在模块中,这些文件位于模块的根目录。
自 iTop 3.0.0(N°2969)起,模块的字典文件可以位于模块的根文件夹或名为 dictionaries 的子文件夹中。
出于兼容性原因,作为扩展分发的模块保留了它们的字典文件在根文件夹中的方式,但iTop核心模块(datamodels/2.x)已经进行了修改。
字典文件格式
字典实际上是一个PHP文件。它必须以UTF-8字符集编码(这是必须的)。我们建议像下面的示例一样省略PHP的结束标记:
<?php
/\*\*
\* Localized data
\*
\* @copyright Copyright (C) 2015 John Foo Ltd
\* @author John Foo (john@foo.com)
\* @license http://opensource.org/licenses/AGPL-3.0
\*/
Dict::Add('PT BR', 'Brazilian', 'Portuguese', array(
'Menu:ChangeManagement' => 'Gerenciamento Mudanças',
'Menu:Change:Overview' => 'Visão geral',
'Menu:NewChange' => 'New Change~~',
));
注意事项:
- 函数调用的第一个参数是大写的语言代码。
- 函数调用的第二个参数是英语中的语言名称。
- 函数调用的第三个参数是目标语言中的语言名称。
- Dict::Add 函数的行在所有相同语言的字典文件中必须相同(是的,这里有冗余信息)。
- 请注意某些字符串末尾的 ~~。这个后缀不会显示给最终用户。它由Combodo在发布新版本时添加,用于显示哪些新字符串需要翻译。
一些通用规则
一些通用规则:
- 保持一致性: 重复使用已经翻译的术语(例如,“经理”是许多关键词中使用的词汇)。
- 英文术语: 如果在上下文中更容易理解,可以保留英文术语。
- 避免过于口语化的表述: iTop是一款既被公司使用又被其客户使用的产品。
- 不要硬编码“iTop”名称: 使用常量(它们在 core/config.class.inc.php 中定义):
- ITOP_APPLICATION:应用程序包的完整名称,例如“iTop Community”或“iTop Professional”。
- ITOP_APPLICATION_SHORT:应用程序的名称,例如“iTop”。
- 类名命名方式: 使用驼峰命名法。
- 数据模型项目命名标准: Class:<classname>、Class:<classname>/Attribute:<fieldname>。例如:Class:Ticket、Class:Ticket/Attribute:ref、Class:UserRequest/Attribute:status/Value:new。
- 字段标签翻译: 请在定义字段的类中进行翻译,而不是在子类中进行。例如,对于 Class:Ticket/Attribute:ref 是可以的,但对于 Class:Change/Attribute:ref 则不应该。如果需要后者,可以使用自定义模块将其添加到您的iTop实例中。
- 操作标签中的类别: 尽量不要在通用用户的操作标签中提及类别。但对于管理员用户可以这样做。如果使用类别标签,请将其大写化,例如将“notification”改为“Notification”。
- 特殊条目 Class:<classname>/Attribute:friendlyname: 在英文中显示为“Full name”,如果没有翻译,它不对应于特定的类字段,而是对应于用作外部键、对象列表和对象详情中的对象标签的魔法属性。
这些规则有助于维护和确保翻译的一致性。
Key syntax | Purpose | Example |
---|---|---|
Class:<classname> | Translating the name of a class | Class:Ticket |
Class:<classname>/Attribute:<fieldname> | Translating a field label | Class:Ticket/Attribute:ref |
Class:<classname>/Attribute:<fieldname>/Value:<value> | Translating a value of an Enum attribute | Class:UserRequest/Attribute:status/Value:new |
Class:<classname>/Attribute | Formatting the friendlyname value. (see example below) | ‘Class:Person/Name’ ⇒ ‘%2$s %1$s’ |
Friendlyname 语法: 在这个示例中
'Class:Person/Name' \=> '%2$s, %1$s', /\* example: "Christie, Agatha" \*/
- %1$s 对应于Person类的命名XML标签中的第一个字段,因此是 first_name。
- %2$s 对应于Person类的命名XML标签中的第二个字段,因此是 name。
这允许指定不同的顺序,并且甚至是一些其他字符和分隔符。
您可以通过以下链接获取有关 friendlyname 的更多信息:friendlyname。
<classes\>
<class id\="Person"\>
<properties\>
<naming\>
<attributes\>
<attribute id\="first\_name"/> <!-- mapped to %1$s -->
<attribute id\="name"/> <!-- mapped to %2$s -->
</attributes\>
</naming\>
字典关键词的命名约定
新条目的命名应根据其领域和目的,从最不具体的信息开始命名。
最常用的分隔符是’:’,但也可以找到’/‘和’-’。
'Core:BulkExport:TextFormat' \=> 'Text fields containing some HTML markup',
'UI:CSVImport:TextQualifierCharacter' \=> 'Text qualifier character',
'DayOfWeek-Sunday-Min' \=> 'Su',
使用后缀来定义相同标签的变种:
- + 表示短描述(通常显示在工具提示中)
- ? 表示帮助/解释(可以跨多行)
'Core:SynchroAtt:update' \=> 'Update ?',
'Core:SynchroAtt:update+' \=> 'Used to update the object',
'UI:CSVImport:AdvancedMode' \=> 'Advanced mode',
'UI:CSVImport:AdvancedMode+' \=>
'In advanced mode the "id" (primary key) of the objects can be used to update and rename objects.'
.'However the column "id" (if present) can only be used as a search criteria'
.' and can not be combined with any other search criteria.',
当建立了命名约定后,标识符应该指定为 :,就像以下示例中的方式:
'Class:Event/Attribute:date' \=> 'Date',
'Class:Event/Attribute:date+' \=> 'date and time at which the changes have been recorded',
请注意,在这种情况下,分隔符应该是 ‘/’。
枚举值
枚举或枚举集的值使用自己的语法: