blob: ffa7dd99de3c7091304db60efecd5a49f641f5be (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
|
---
title: 本地化
slug: Mozilla/Tech/XUL/Tutorial/Localization
translation_of: Archive/Mozilla/XUL/Tutorial/Localization
---
<p> </p>
<div class="prevnext">
<p><span style="float: left;">« <a href="../../../../en/XUL_Tutorial/Creating_a_Skin" rel="internal">Previous</a></span> <span style="float: right;"><a href="../../../../en/XUL_Tutorial/Property_Files" rel="internal">Next</a> »</span></p>
</div>
<p> </p>
<p> </p>
<p>XUL 和 XML 提供的实体(entities)是一个本地化的好方法。</p>
<div id="section_1">
<h3 class="editable" id="实体"><span>实体</span></h3>
<div class="editIcon">
<a href="/../../../../en/XUL_Tutorial/Localization#" style="" title="Edit section"><span class="icon"><img alt="Edit section" class="sectionedit" src="../../../../skins/common/icons/icon-trans.gif"></span></a></div>
<p> 不少软件都希望将界面上的语言尽可能简单的翻译为另外的语言。通常他们会为每一种语言创建一份字符串列表,来代替在代码中进行硬编码。代码中的每一段文本都代表字符串列表中的一项, <a href="../../../../en/XML" rel="internal">XML</a> 提供的实体正好实现这一目的。</p>
<p> 如果你写过 <a href="../../../../en/HTML" rel="internal">HTML</a> 代码,你应该对实体很熟悉 , 像这样的代码 <code>&lt;</code> 和 <code>&gt;</code> 是作为“小于”和“大于”在文本中的替代出现的。XML 的语法允许你定义用户实体。你可以使用这些实体代替它实际的值,当然这个值可以是一段文本。实体可以用在任何文本应该出现的地方,包括属性。下面的例子在一个按钮中使用了实体。</p>
<pre><button label="&findLabel;"/>
</pre>
<p> 出现在按钮上的文本将是 <code>&findLabel;</code> 所代表的值。对每一种所要支持的语言需要创建一个文件包含对实体的定义。在英语中,<code>&findLabel;</code> 实体可能代表文本 "Find"。</p>
</div>
<div id="section_2">
<h3 class="editable" id="DTD_文件"><span>DTD 文件 </span></h3>
<div class="editIcon">
<a href="/../../../../en/XUL_Tutorial/Localization#" style="" title="Edit section"><span class="icon"><img alt="Edit section" class="sectionedit" src="../../../../skins/common/icons/icon-trans.gif"></span></a></div>
<p> 实体在 <em>Document Type Definition</em> (DTD) 文件中定义。这类文件往往用于特定 XML 文件的语法和语义的定义,当然也可以用来定义实体。在 Mozilla 的 chrome 体系中,你会在<code> locales</code> 子目录中找到 DTD 文件。对应一个XUL 文件,一般会有一个 DTD 文件 (extension <code>.dtd</code>)。</p>
<p> 如果你查看 chrome 目录,你会看到一个针对你所用语言的压缩包 (<code>en-US.jar</code> 默认是英语的语言包) 。你也可能会找到多种语言的语言包:美式英语 (en-US) 、法语 (fr)等。在这些压缩包中,你会发现它保存着每个窗口的本地化文本。这种压缩包的结构与 <a href="../../../../en/XUL_Tutorial/Creating_a_Skin" rel="internal">skins</a> 是很相似的。</p>
<p> 你可以把你定义实体的 DTD 文件放置到语言包里,一般的,你应该为每一个 XUL 文件建立一个 DTD 文件,通常使用相同的文件名但以 <code>.dtd</code> 作为后缀。因此对应我们的 findfile 对话框,我们需要一个 <code>findfile.dtd</code> 文件。</p>
<p> 对于非安装的 chrome 文件,你可以简单的把 DTD 文件放在与 XUL 相同的目录中。</p>
<div class="note">
<strong>注意:</strong> 你需要将含有非 ASCII 字符的 DTD 文件的字符编码设为 UTF-8。也就是说你应该按照 UTF-8 格式 (<a class="external" href="http://www.mozdev.org/notes/l10n/unicode/editors-en.html" rel="external nofollow" title="http://www.mozdev.org/notes/l10n/unicode/editors-en.html">without BOM</a>)保存。参见 <a class="external" href="http://www.mozilla.org/projects/l10n/mlp_chrome.html#text" rel="external nofollow" title="http://www.mozilla.org/projects/l10n/mlp_chrome.html#text">Mozilla Language Packs</a>.</div>
<p> 一旦为你的 XUL 文件创立 DTD 文件,你应该在 XUL 文件上添加一行以声明使用 DTD 文件。否则会发生找不到实体的错误,在 XUL 文件的头部加如下一行。</p>
<pre><!DOCTYPE window SYSTEM "chrome://findfile/locale/findfile.dtd">
</pre>
<p> 这一行表示这个 URL 被当作一个 DTD 使用。在这个例子中,我们引入了我们需要的 <code>findfile.dtd</code> 文件,这一行通常放在 <code><span class="lang lang-en"><a href="../../../../en/XUL/window" rel="internal">window</a> <span style="font-family: Verdana,Tahoma,sans-serif;">元素之前。</span></span></code></p>
<p> 你同样需要在 <a href="../../../../en/Chrome_Registration#locale" rel="internal">chrome.manifest</a> 文件中添加本地化信息,如下:</p>
<pre class="eval">locale findfile en-US locale/
</pre>
</div>
<div id="section_3">
<h3 class="editable" id="申明实体"><span>申明实体 </span></h3>
<div class="editIcon">
<a href="/../../../../en/XUL_Tutorial/Localization#" title="Edit section"><span class="icon"><img alt="Edit section" class="sectionedit" src="../../../../skins/common/icons/icon-trans.gif"></span></a></div>
<p> 实体的申明使用如下语法:</p>
<pre><!ENTITY findLabel "Find">
</pre>
<p> 上例创建了一个名为 <code>findLabel</code> 值为 "Find" 的实体,这意味着在文本中的任意位置出现的 "&findLabel;" 都将会被 "Find" 替代。注意实体申明无需反斜杠结束。在不同语言的 DTD 文件中,文件使用的不同的语言替代即可。</p>
<pre class="eval"><strong>日文:</strong>
<!ENTITY findLabel "検索">
</pre>
<p> 例如,下面的文字:</p>
<pre><description value="&findLabel;"/>
</pre>
<p>被翻译为:</p>
<pre class="eval"><strong>英文版:</strong>
<description value="Find"/>
<strong>日文版:</strong>
<description value="検索"/>
</pre>
<p> 你应该为你在界面中出现的每一个标签或字符串申明一个实体,在XUL文件中不应出现任何的显示文本。</p>
<p> 补充来说你可以在任何因语言不同而不同的的地方使用实体。以 <a href="../../../../en/XUL_Tutorial/Keyboard_Shortcuts" rel="internal">Access keys 及 keyboard shortcuts </a>为例。</p>
<pre class="eval"> <strong>XUL</strong>
<menuitem label="&undo.label;" accesskey="&undo.key;"/>
<strong>DTD</strong>
<!ENTITY undo.label "Undo">
<!ENTITY undo.key "u">
</pre>
<p> 上面的例子使用了两个实体,一个由于 Undo 菜单项的标签,第二个用于快捷键。</p>
<div class="highlight">
<div id="section_4">
<h3 class="editable" id="改写_Find_Files_的例子"><span>改写 Find Files 的例子</span></h3>
<div class="editIcon">
<a href="/../../../../en/XUL_Tutorial/Localization#" title="Edit section"><span class="icon"><img alt="Edit section" class="sectionedit" src="../../../../skins/common/icons/icon-trans.gif"></span></a></div>
<p> 让我们看一看如何使用DTD文件修改我们的find files 对话框并将所有文本放在一起。整个文件列在下面。</p>
<pre class="eval"><?xml version="1.0"?>
<?xml-stylesheet href="<a class="external" rel="freelink">chrome://global/skin/global.css</a>" type="text/css"?>
<?xml-stylesheet href="findfile.css" type="text/css"?>
<span class="highlightred"><!DOCTYPE window SYSTEM "<a class="external" rel="freelink">chrome://findfile/locale/findfile.dtd</a>"></span>
<window
id="findfile-window"
title="<span class="highlightred">&findWindow.title;</span>"
persist="screenX screenY width height"
orient="horizontal"
onload="initSearchList()"
xmlns="<a class="external" href="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" rel="freelink">http://www.mozilla.org/keymaster/gat...re.is.only.xul</a>">
<script src="findfile.js"/>
<popupset>
<menupopup id="editpopup">
<menuitem label="<span class="highlightred">&cutCmd.label;</span>" accesskey="<span class="highlightred">&cutCmd.accesskey;</span>"/>
<menuitem label="<span class="highlightred">&copyCmd.label;</span>" accesskey="<span class="highlightred">&copyCmd.accesskey;</span>"/>
<menuitem label="<span class="highlightred">&pasteCmd.label;</span>" accesskey="<span class="highlightred">&pasteCmd.accesskey;</span>" disabled="true"/>
</menupopup>
</popupset>
<keyset>
<key id="cut_cmd" modifiers="accel" key="<span class="highlightred">&cutCmd.commandkey;</span>"/>
<key id="copy_cmd" modifiers="accel" key="<span class="highlightred">&copyCmd.commandkey;</span>"/>
<key id="paste_cmd" modifiers="accel" key="<span class="highlightred">&pasteCmd.commandkey;</span>"/>
<key id="close_cmd" keycode="VK_ESCAPE" oncommand="window.close();"/>
</keyset>
<vbox flex="1">
<toolbox>
<menubar id="findfiles-menubar">
<menu id="file-menu" label="<span class="highlightred">&fileMenu.label;</span>"
accesskey="<span class="highlightred">&fileMenu.accesskey;</span>">
<menupopup id="file-popup">
<menuitem label="<span class="highlightred">&openCmd.label;</span>"
accesskey="<span class="highlightred">&openCmd.accesskey;</span>"/>
<menuitem label="<span class="highlightred">&saveCmd.label;</span>"
accesskey="<span class="highlightred">&saveCmd.accesskey;</span>"/>
<menuseparator/>
<menuitem label="<span class="highlightred">&closeCmd.label;</span>"
accesskey="<span class="highlightred">&closeCmd.accesskey;" key="close_cmd" oncommand="window.close();</span>"/>
</menupopup>
</menu>
<menu id="edit-menu" label="<span class="highlightred">&editMenu.label;</span>"
accesskey="<span class="highlightred">&editMenu.accesskey;</span>">
<menupopup id="edit-popup">
<menuitem label="<span class="highlightred">&cutCmd.label;</span>"
accesskey="<span class="highlightred">&cutCmd.accesskey;</span>" key="cut_cmd"/>
<menuitem label="<span class="highlightred">&copyCmd.label;</span>"
accesskey="<span class="highlightred">&copyCmd.accesskey;</span>" key="copy_cmd"/>
<menuitem label="<span class="highlightred">&pasteCmd.label;</span>"
accesskey="<span class="highlightred">&pasteCmd.accesskey;</span>" key="paste_cmd" disabled="true"/>
</menupopup>
</menu>
</menubar>
<toolbar id="findfiles-toolbar">
<toolbarbutton id="opensearch" label="<span class="highlightred">&openCmdToolbar.label;</span>"/>
<toolbarbutton id="savesearch" label="<span class="highlightred">&saveCmdToolbar.label;</span>"/>
</toolbar>
</toolbox>
<tabbox>
<tabs>
<tab label="<span class="highlightred">&searchTab;</span>" selected="true"/>
<tab label="<span class="highlightred">&optionsTab;</span>"/>
</tabs>
<tabpanels>
<tabpanel id="searchpanel" orient="vertical" context="editpopup">
<description>
<span class="highlightred">&findDescription;</span>
</description>
<spacer class="titlespace"/>
<groupbox orient="horizontal">
<caption label="<span class="highlightred">&findCriteria;</span>"/>
<menulist id="searchtype">
<menupopup>
<menuitem label="<span class="highlightred">&type.name;</span>"/>
<menuitem label="<span class="highlightred">&type.size;</span>"/>
<menuitem label="<span class="highlightred">&type.date;</span>"/>
</menupopup>
</menulist>
<spacer class="springspace"/>
<menulist id="searchmode">
<menupopup>
<menuitem label="<span class="highlightred">&mode.is;</span>"/>
<menuitem label="<span class="highlightred">&mode.isnot;</span>"/>
</menupopup>
</menulist>
<spacer class="springspace"/>
<menulist id="find-text" flex="1"
editable="true"
datasources="<a class="external" rel="freelink">file:///mozilla/recents.rdf</a>"
ref="<a class="external" href="http://www.xulplanet.com/rdf/recent/all" rel="freelink">http://www.xulplanet.com/rdf/recent/all</a>">
<template>
<menupopup>
<menuitem label="rdf:<a class="external" href="http://www.xulplanet.com/rdf/recent#Label" rel="freelink">http://www.xulplanet.com/rdf/recent#Label</a>" uri="rdf:*"/>
</menupopup>
</template>
</menulist>
</groupbox>
</tabpanel>
<tabpanel id="optionspanel" orient="vertical">
<checkbox id="casecheck" label="<span class="highlightred">&casesensitive;</span>"/>
<checkbox id="wordscheck" label="<span class="highlightred">&matchfilename;</span>"/>
</tabpanel>
</tabpanels>
</tabbox>
<tree id="results" style="display: none;" flex="1">
<treecols>
<treecol id="name" label="<span class="highlightred">&results.filename;</span>" flex="1"/>
<treecol id="location" label="<span class="highlightred">&results.location;</span>" flex="2"/>
<treecol id="size" label="<span class="highlightred">&results.size;</span>" flex="1"/>
</treecols>
<treechildren>
<treeitem>
<treerow>
<treecell label="mozilla"/>
<treecell label="/usr/local"/>
<treecell label="<span class="highlightred">&bytes.before;</span>2520<span class="highlightred">&bytes.after;</span>"/>
</treerow>
</treeitem>
</treechildren>
</tree>
<splitter id="splitbar" resizeafter="grow" style="display: none;"/>
<spacer class="titlespace"/>
<hbox>
<progressmeter id="progmeter" value="50%" style="display: none;"/>
<spacer flex="1"/>
<button id="find-button" label="<span class="highlightred">&button.find;</span>"
oncommand="doFind()"/>
<button id="cancel-button" label="<span class="highlightred">&button.cancel;</span>"
oncommand="window.close();"/>
</hbox>
</vbox>
</window>
</pre>
<p> 每一个字符串均被实体引用代替。一个 DTD 文件被包含在XUL文件的开头。每一个被引用的实体必须在DTD文件中申明,如果发现引用的实体没有申明,则窗口不会显示。</p>
<p> 注意实体的名字并不重要,在上面的例子里实体的名字被分成几段来写,请你不要这样,请按照其他代码的书写习惯来写实体引用。</p>
<p> 你可能已经注意到里字符串 '2520 bytes' 被两个实体代替。这是因为在别的语言中可能会有不同的语法要求。比如,可能要求数字写在后面而把 'bytes' 写在前面。当然对于 KB 、MB 会有更复杂的顺序要求。</p>
<p> <font>键盘访问键</font>及快捷键也被翻译为实体因为对不同的语言这些也会不同。</p>
<p> 下面是 DTD 文件 - findfile.dtd:</p>
<pre><!ENTITY findWindow.title "Find Files">
<!ENTITY fileMenu.label "File">
<!ENTITY editMenu.label "Edit">
<!ENTITY fileMenu.accesskey "f">
<!ENTITY editMenu.accesskey "e">
<!ENTITY openCmd.label "Open Search...">
<!ENTITY saveCmd.label "Save Search...">
<!ENTITY closeCmd.label "Close">
<!ENTITY openCmd.accesskey "o">
<!ENTITY saveCmd.accesskey "s">
<!ENTITY closeCmd.accesskey "c">
<!ENTITY cutCmd.label "Cut">
<!ENTITY copyCmd.label "Copy">
<!ENTITY pasteCmd.label "Paste">
<!ENTITY cutCmd.accesskey "t">
<!ENTITY copyCmd.accesskey "c">
<!ENTITY pasteCmd.accesskey "p">
<!ENTITY cutCmd.commandkey "X">
<!ENTITY copyCmd.commandkey "C">
<!ENTITY pasteCmd.commandkey "V">
<!ENTITY openCmdToolbar.label "Open">
<!ENTITY saveCmdToolbar.label "Save">
<!ENTITY searchTab "Search">
<!ENTITY optionsTab "Options">
<!ENTITY findDescription "Enter your search criteria below and select the Find button to begin the search.">
<!ENTITY findCriteria "Search Criteria">
<!ENTITY type.name "Name">
<!ENTITY type.size "Size">
<!ENTITY type.date "Date Modified">
<!ENTITY mode.is "Is">
<!ENTITY mode.isnot "Is Not">
<!ENTITY casesensitive "Case Sensitive Search">
<!ENTITY matchfilename "Match Entire Filename">
<!ENTITY results.filename "Filename">
<!ENTITY results.location "Location">
<!ENTITY results.size "Size">
<!ENTITY bytes.before "">
<!ENTITY bytes.after "bytes">
<!ENTITY button.find "Find">
<!ENTITY button.cancel "Cancel">
</pre>
<p> 现在,为一个新语言添加文本仅需创建一个新的DTD文件。使用 chrome 系统把 DTD 文件加到另一个 <code> locales</code> 中,这样同一个 XUL 文件就可以使用不同的语言。</p>
<p>Find files example so far: <span class="lang lang-en"><a class="external" href="http://developer.mozilla.org/samples/xultu/examples//findfile/findfile-locale.xul.txt" rel="external nofollow" title="http://developer.mozilla.org/samples/xultu/examples//findfile/findfile-locale.xul.txt">Source</a> </span></p>
</div>
</div>
<p> </p>
<p> 下一章,看看 <a href="../../../../en/XUL_Tutorial/Property_Files" rel="internal">property files</a>.</p>
<p> </p>
<div class="prevnext">
<p><span style="float: left;">« <a href="../../../../en/XUL_Tutorial/Creating_a_Skin" rel="internal">Previous</a></span> <span style="float: right;"><a href="../../../../en/XUL_Tutorial/Property_Files" rel="internal">Next</a> »</span></p>
</div>
<p> </p>
<p> </p>
</div>
<p> </p>
|