Show last authors
1 = 如何翻译 =
2
3
4 ➡️ 介绍如何对iTop语言进行本地化
5
6
7 == 原则 ==
8
9
10 在 iTop 和 iTop 模块中,语言由两个要素确定:
11
12 * ISO 639-1 语言代码。例如:pt 表示葡萄牙语。
13 * ISO 国家代码。例如:br 表示巴西。
14
15 本地化依赖于字典文件,这些文件的名称以小写语言代码作为前缀,例如:pt_br.dictionary.itop.core.php。这些文件是数据模型的一部分,因此在每次修改后都需要进行编译(重新运行安装或使用工具包)。
16
17
18 在 iTop 中,嵌入的字典文件位于以下位置:
19
20 * <itop-root>/dictionaries/
21 * <itop-root>/datamodels/2.x/<module>/dictionaries
22
23 在模块中,这些文件位于模块的根目录。
24
25 自 iTop 3.0.0(N°2969)起,模块的字典文件可以位于模块的根文件夹或名为 dictionaries 的子文件夹中。
26
27 出于兼容性原因,作为扩展分发的模块保留了它们的字典文件在根文件夹中的方式,但iTop核心模块(datamodels/2.x)已经进行了修改。
28
29
30 == 字典文件格式 ==
31
32 字典实际上是一个PHP文件。它必须以UTF-8字符集编码(这是必须的)。我们建议像下面的示例一样省略PHP的结束标记:
33
34 (% class="box" %)
35 (((
36 <?php
37 /\*\*
38 \* Localized data
39 \*
40 \* @copyright   Copyright (C) 2015 John Foo Ltd
41 \* @author      John Foo (john@foo.com)
42 \* @license     http:~/~/opensource.org/licenses/AGPL-3.0
43 \*/
44 Dict::Add('PT BR', 'Brazilian', 'Portuguese', array(
45 'Menu:ChangeManagement' => 'Gerenciamento Mudanças',
46 'Menu:Change:Overview' => 'Visão geral',
47 'Menu:NewChange' => 'New Change~~~~',
48 ));
49 )))
50
51
52 注意事项:
53
54 * 函数调用的第一个参数是大写的语言代码。
55 * 函数调用的第二个参数是英语中的语言名称。
56 * 函数调用的第三个参数是目标语言中的语言名称。
57 * Dict::Add 函数的行在所有相同语言的字典文件中必须相同(是的,这里有冗余信息)。
58 * 请注意某些字符串末尾的 ~~~~。这个后缀不会显示给最终用户。它由Combodo在发布新版本时添加,用于显示哪些新字符串需要翻译。
59
60 == 一些通用规则 ==
61
62 一些通用规则:
63
64 * **保持一致性:** 重复使用已经翻译的术语(例如,“经理”是许多关键词中使用的词汇)。
65 * **英文术语:** 如果在上下文中更容易理解,可以保留英文术语。
66 * **避免过于口语化的表述:** iTop是一款既被公司使用又被其客户使用的产品。
67 * **不要硬编码“iTop”名称:** 使用常量(它们在 core/config.class.inc.php 中定义):
68 ** ITOP_APPLICATION:应用程序包的完整名称,例如“iTop Community”或“iTop Professional”。
69 ** ITOP_APPLICATION_SHORT:应用程序的名称,例如“iTop”。
70 * **类名命名方式:** 使用驼峰命名法。
71 * **数据模型项目命名标准:** Class:<classname>、Class:<classname>/Attribute:<fieldname>。例如:Class:Ticket、Class:Ticket/Attribute:ref、Class:UserRequest/Attribute:status/Value:new。
72 * **字段标签翻译:** 请在定义字段的类中进行翻译,而不是在子类中进行。例如,对于 Class:Ticket/Attribute:ref 是可以的,但对于 Class:Change/Attribute:ref 则不应该。如果需要后者,可以使用自定义模块将其添加到您的iTop实例中。
73 * **操作标签中的类别:** 尽量不要在通用用户的操作标签中提及类别。但对于管理员用户可以这样做。如果使用类别标签,请将其大写化,例如将“notification”改为“Notification”。
74 * **特殊条目 Class:<classname>/Attribute:friendlyname:** 在英文中显示为“Full name”,如果没有翻译,它不对应于特定的类字段,而是对应于用作外部键、对象列表和对象详情中的对象标签的魔法属性。
75
76 这些规则有助于维护和确保翻译的一致性。
77
78
79 |=Key syntax|=Purpose|=Example
80 |Class:<classname>|Translating the **name** of a class|Class:Ticket
81 |Class:<classname>/Attribute:<fieldname>|Translating a field **label**|Class:Ticket/Attribute:ref
82 |Class:<classname>/Attribute:<fieldname>/Value:<value>|Translating a **value** of an Enum attribute|Class:UserRequest/Attribute:status/Value:new
83 |Class:<classname>/Attribute|Formatting the friendlyname **value**. (//see example below//)|‘Class:Person/Name’ ⇒ ‘%2$s %1$s’
84
85 //Friendlyname 语法//: 在这个示例中
86
87 {{{'Class:Person/Name' \=> '%2$s, %1$s', /\* example: "Christie, Agatha" \*/
88 }}}
89
90 * %1$s 对应于Person类的命名XML标签中的第一个字段,因此是 first_name。
91 * %2$s 对应于Person类的命名XML标签中的第二个字段,因此是 name。
92
93 这允许指定不同的顺序,并且甚至是一些其他字符和分隔符。
94
95 您可以通过以下链接获取有关 friendlyname 的更多信息:[[friendlyname>>url:https://www.itophub.io/wiki/page?do=export_code&id=3_1_0:customization:translation&codeblock=2]]。
96
97
98 (% class="box" %)
99 (((
100 <classes\>
101 <class id\="Person"\>
102 <properties\>
103 <naming\>
104 <attributes\>
105 <attribute id\="first\_name"/> <!~-~- mapped to %1$s ~-~->
106 <attribute id\="name"/>       <!~-~- mapped to %2$s ~-~->
107 </attributes\>
108 </naming\>
109 )))
110
111 == 字典关键词的命名约定 ==
112
113 新条目的命名应根据其领域和目的,从最不具体的信息开始命名。
114
115 最常用的分隔符是’:’,但也可以找到’/‘和’-’。
116
117 (% class="box" %)
118 (((
119 'Core:BulkExport:TextFormat' \=> 'Text fields containing some HTML markup',
120 'UI:CSVImport:TextQualifierCharacter' \=> 'Text qualifier character',
121 'DayOfWeek-Sunday-Min' \=> 'Su',
122 )))
123
124
125 使用后缀来定义相同标签的变种:
126
127 * + 表示短描述(通常显示在工具提示中)
128 * ? 表示帮助/解释(可以跨多行)
129
130 (% class="box" %)
131 (((
132 'Core:SynchroAtt:update' \=> 'Update ?',
133 'Core:SynchroAtt:update+' \=> 'Used to update the object',
134 'UI:CSVImport:AdvancedMode' \=> 'Advanced mode',
135 'UI:CSVImport:AdvancedMode+' \=>
136 'In advanced mode the "id" (primary key) of the objects can be used to update and rename objects.'
137 .'However the column "id" (if present) can only be used as a search criteria'
138 .' and can not be combined with any other search criteria.',
139 )))
140
141 当建立了命名约定后,标识符应该指定为 :,就像以下示例中的方式:
142
143 (% class="box" %)
144 (((
145 'Class:Event/Attribute:date' \=> 'Date',
146 'Class:Event/Attribute:date+' \=> 'date and time at which the changes have been recorded',
147 )))
148
149 请注意,在这种情况下,分隔符应该是 ‘/’。
150
151 (% class="wikigeneratedid" %)
152 ==== ====
153
154 ==== 枚举值 ====
155
156 枚举或枚举集的值使用自己的语法:
157
158 {{{ 'Class:Action/Attribute:status/Value:test' \=> 'Being tested',
159 'Class:Action/Attribute:status/Value:test+' \=> 'Action has maybe a different behavior than when in production',
160 'Class:Action/Attribute:status/Value:enabled' \=> 'In production',
161 'Class:Action/Attribute:status/Value:enabled+' \=> '',
162 'Class:Action/Attribute:status/Value:disabled' \=> 'Inactive',
163 'Class:Action/Attribute:status/Value:disabled+' \=> 'Action is not effective',
164 }}}
165
166 ==== 实体覆盖 ====
167
168 子类可以覆盖属性(或值)的标签/工具提示,即使该属性已在其父类之一中定义。
169
170 {{{ 'Class:ActionEmail/Attribute:status/Value:test+' \=> 'Only the Test recipient is notified',
171 'Class:ActionEmail/Attribute:status/Value:enabled+' \=> 'All To, Cc and Bcc emails are notified',
172 'Class:ActionEmail/Attribute:status/Value:disabled+' \=> 'The email notification will not be sent',
173 'Class:ActionEmail/Attribute:test\_recipient' \=> 'Test recipient',
174 }}}
175
176 === 关系 ===
177
178 默认链接相关的操作/图标工具提示、弹出窗口标题和确认消息如下所示。
179
180 它们可以根据需要进行自定义,甚至可以根据类别/关联设置属性进行定制化(请参阅下文)。
181
182
深圳市艾拓先锋企业管理咨询有限公司