blob: 276474926f061ddbe32b356f66ec131b960ab2c7 (
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
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
|
---
title: ローカライズ (地域化)
slug: Archive/Mozilla/XUL/Tutorial/Localization
tags:
- Internationalization
- Localization
- Tutorials
- XUL
- XUL_Tutorial
translation_of: Archive/Mozilla/XUL/Tutorial/Localization
---
<p>
</p><div class="prevnext" style="text-align: right;">
<p><a href="/ja/docs/XUL_Tutorial:Creating_a_Skin" style="float: left;">« 前のページ</a><a href="/ja/docs/XUL_Tutorial:Property_Files">次のページ »</a></p>
</div>
<p>XUL と XML には、実体 (<span style="color: green;">entity</span>)という仕組みがあり、これを利用すればアプリケーションの<span style="border-bottom: 1px dashed green;" title="localization">ローカライズ (地域化)</span>を簡単に行うことができます。
</p>
<h3 id=".E5.AE.9F.E4.BD.93.E5.AE.A3.E8.A8.80.E3.81.A8.E5.AE.9F.E4.BD.93.E5.8F.82.E7.85.A7" name=".E5.AE.9F.E4.BD.93.E5.AE.A3.E8.A8.80.E3.81.A8.E5.AE.9F.E4.BD.93.E5.8F.82.E7.85.A7"> 実体宣言と実体参照 </h3>
<p>一般的に、多くのアプリケーションでは、インターフェイス中の文字列を他の言語に翻訳した版を、可能な限り簡単に構築できるような工夫がされています。
このためには、通常は文字列のテーブルを対応する言語ごとに作成します。
つまり、テキストを直接アプリケーションにハードコーディングする代わりに、
文字列テーブルを参照するために使用する短いテキストだけを置くようにします。 <a href="ja/XML">XML</a> の提供する仕組みである<span style="border-bottom: 1px dashed green;" title="entity">実体</span>も、同様の目的に利用できます。
</p><p><a href="ja/HTML">HTML</a> の利用経験があれば、実体については既にお馴染みのはずです。
例えば、HTML の中に不等号の記号 ('<' と '>') を記述するために使用するコードである <code>&lt;</code> と <code>&gt;</code> は実体を参照する例になります。
XML には、独自の実体を宣言するための構文があり、これを利用してテキストの列を実体として宣言できます。
それらは実体参照を使用して参照され、宣言した値と置換されることになります。
実体参照は、テキストが置ける場所ならば、属性値も含めてどこにでも置くことが可能です。
以下は、ボタンに対して実体参照を使用する例になります。
</p>
<pre><button label="&findLabel;"/>
</pre>
<p>実体参照 <code>&findLabel;</code> に対応する実体の値が、ラベルに表示されるテキストになります。
ローカライズをするためには、サポートする各言語ごとに、その言語によって実体を宣言したファイルを作成します。
例えば、英語の場合は、<code>&findLabel;</code>に対応する実体は、テキスト "Find" が値になるように宣言します。
</p>
<h3 id="DTD_.E3.83.95.E3.82.A1.E3.82.A4.E3.83.AB" name="DTD_.E3.83.95.E3.82.A1.E3.82.A4.E3.83.AB"> DTD ファイル </h3>
<p>実体は、DTD (<i>Document Type Declaration</i>) ファイルで宣言します。
通常、DTD ファイルは、特定 (同じ種類) の XML ファイルに対して構文と意味内容を宣言するために使用されますが、
実体を宣言するためにも利用できます。
Mozilla の chrome システムでは、DTD ファイルは、<tt>locales</tt> サブディレクトリに置かれています。
なお、通常は、1 つの XUL ファイルに対して 1 つの DTD ファイル (拡張子が <tt>.dtd</tt> のファイル) を作成します。
</p><p>chrome ディレクトリの中を探していくと、利用している言語に対応したアーカイブが見つかるはずです (英語の場合は、デフォルトでは <code>en-US.jar</code> です)。
ここには、例えば、 米国英語 (en-US) とフランス語 (fr) といったように、複数の言語に対応するために、複数のロケールファイルが置かれていることもあります。
これらのアーカイブの中には、それぞれのウインドウのためのローカライズされたテキストが入っています。
また、このアーカイブの構造は、<a href="ja/XUL_Tutorial/Creating_a_Skin">スキン</a>で使用しているディレクトリ構造と非常に良く似たものになります。
</p><p>このアーカイブの中は、実体宣言を記述した DTD ファイルを置きます。
また、DTD ファイルは、各 XUL ファイルに対して 1 つずつ作成し、ファイル名は、通常 <tt>.dtd</tt> 拡張子を除いて同じにします。
したがって、ファイル検索ダイアログの場合は、<tt>findfile.dtd</tt> という名前のファイルが必要になります。
</p><p>なお、インストールされていない chrome ファイルに対してなら、
DTD ファイルは単に XUL ファイルと同じディレクトリに置いておいても構いません。
</p>
<div class="note"><b>注意:</b> 非 ASCII 文字を含む DTD ファイルは、UTF-8 でエンコードしなければなりません。言い換えると (<a class="external" href="http://www.mozdev.org/notes/l10n/unicode/editors-en.html">BOM なしの</a>) UTF-8 で保存する必要があります。 詳細は、<a class="external" href="http://www.mozilla-japan.org/projects/l10n/mlp_chrome.html#text">Mozilla の言語パック</a> を参照してください。</div>
<p>XUL に対して DTD ファイルを作成した場合には、 XUL ファイルにその DTD ファイルを利用するよう指示する記述を加える必要があります。
このために、以下の形式の行を XUL ファイルの先頭近くに加えてください。
これを忘れた場合、実体の参照ができないためエラーが発生します。
</p>
<pre><!DOCTYPE window SYSTEM "chrome://findfile/locale/findfile.dtd">
</pre>
<p>この行によって、この XUL ファイルでは、URL で指定したファイルを DTD として利用するように指示します。
この場合は、<tt>findfile.dtd</tt> を DTD ファイルとして利用することを宣言しています。
通常、この行は <code><code><a href="/ja/docs/Mozilla/Tech/XUL/window" title="window">window</a></code></code> 要素の直前に置くことになります。
</p>
<h3 id=".E5.AE.9F.E4.BD.93.E5.AE.A3.E8.A8.80" name=".E5.AE.9F.E4.BD.93.E5.AE.A3.E8.A8.80"> 実体宣言 </h3>
<p>実体は、以下に示すような簡単な構文で宣言します。
</p>
<pre><!ENTITY findLabel "Find">
</pre>
<p>この例では、<code>findLabel</code> という名前の実体を、「Find」という値で宣言しています。
これによって、XUL ファイル中ならばどこであっても「<code>&findLabel;</code>」というテキストが現れた場合は、「Find」というテキストに置き換えられるようになります。
実体宣言の場合は (空要素で行うように) 最後にスラッシュを置かないことに注意してください。
別の言語用の DTD ファイルでは、下記のように、その言語のテキストを代わりに置くことになります。
</p>
<pre class="eval"><b>日本語用:</b>
<!ENTITY findLabel "検索">
</pre>
<p>例えば、以下のテキストは...
</p>
<pre><description value="&findLabel;"/>
</pre>
<p>以下のように変換されます。
</p>
<pre class="eval"><b>英語版:</b>
<description value="Find"/>
<b>日本語版:</b>
<description value="検索"/>
</pre>
<p>上記のように、ローカライズをするためには、インターフェイスに含まれている各ラベルやテキストに対して実体を宣言していくことになります。
このため XUL ファイルには、直接表示されるテキストは、一切含めるべきではありません。
</p><p>また、実体は、テキストラベルに加えて、言語環境が変わると異なる可能性がある任意の値に対して使用しておく必要があります。
具体的には、<a href="ja/XUL_Tutorial/Keyboard_Shortcuts">アクセスキーやキーボードショートカット</a>などが考えられます。
</p>
<pre class="eval"> <b>XUL</b>
<menuitem label="&undo.label;" accesskey="&undo.key;"/>
<b>DTD</b>
<!ENTITY undo.label "Undo">
<!ENTITY undo.key "u">
</pre>
<p>上記の例では、Undo メニュー項目のラベルとアクセスキーの 2 つに実体が使用されています。
</p>
<h3 id=".E3.83.95.E3.82.A1.E3.82.A4.E3.83.AB.E6.A4.9C.E7.B4.A2.E3.83.80.E3.82.A4.E3.82.A2.E3.83.AD.E3.82.B0.E3.82.92.E5.A4.89.E6.9B.B4.E3.81.99.E3.82.8B" name=".E3.83.95.E3.82.A1.E3.82.A4.E3.83.AB.E6.A4.9C.E7.B4.A2.E3.83.80.E3.82.A4.E3.82.A2.E3.83.AD.E3.82.B0.E3.82.92.E5.A4.89.E6.9B.B4.E3.81.99.E3.82.8B"> ファイル検索ダイアログを変更する </h3>
<div class="highlight">
<p>それでは、ここまでの内容をまとめて適用する方法を確認するために、
ファイル検索ダイアログを変更してみることにします。
このために、すべてのテキスト文字列を DTD を使用するように変更します。
変更後の XUL ファイル全体を下記に示します。
今回の変更部分は赤い文字で示されています。
</p>
<pre class="eval"><?xml version="1.0"?>
<?xml-stylesheet href="<a class=" external" rel="freelink">chrome://global/skin/</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="<span class="nowiki">http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul</span>">
<script src="findfile.js"/>
<popupset>
<popup id="editpopup">
<menuitem label="Cut" accesskey="<span class="highlightred">&cutCmd.accesskey;</span>"/>
<menuitem label="Copy" accesskey="<span class="highlightred">&copyCmd.accesskey;</span>"/>
<menuitem label="Paste" accesskey="<span class="highlightred">&pasteCmd.accesskey;</span>" disabled="true"/>
</popup>
</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="<span class="nowiki">http://www.xulplanet.com/rdf/recent/all</span>">
<template>
<menupopup>
<menuitem label="<span class="nowiki">rdf:http://www.xulplanet.com/rdf/recent#Label</span>" 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 ファイルで宣言されている必要があります。
対応する宣言のない実体参照が XUL ファイルで行われていた場合、ウインドウは表示されません。
</p><p>なお、実体の名前は重要でないことを補足しておきます。
上記の例では、実体の名前に単語をピリオドで区切ったものを用いていますが、
特に必要なわけではありません。
上記の実体の命名規則は、Mozilla のコードでの慣例をまねているだけです。
</p><p>「2520 bytes」というテキストが、2 つの実体を使用するように置き換えられていることに気が付いたでしょうか。
これは、この部分のフレーズの組み立てが、ロケールによって異なる可能性があるからです。
例えば、(英語のように) 「数値」「bytes」 の順ではなく、逆の順番で表示する必要がある言語も存在するかもしれません。
もちろん、必要に応じて「KB」や「MB」に表示を変更したい場合は、さらに複雑なコードが必要になります。
</p><p>また、アクセスキーとキーボードショートカットもロケールによって異なる可能性があるため実体参照に変更しています。
</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 ファイルを与えるようにしておけば、
同じ XUL ファイルを任意の言語で利用することが可能です。
</p><p><span id="%E3%81%93%E3%81%93%E3%81%BE%E3%81%A7%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E6%A4%9C%E7%B4%A2%E3%83%80%E3%82%A4%E3%82%A2%E3%83%AD%E3%82%B0%E3%81%AE%E4%BE%8B"><a id="%E3%81%93%E3%81%93%E3%81%BE%E3%81%A7%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E6%A4%9C%E7%B4%A2%E3%83%80%E3%82%A4%E3%82%A2%E3%83%AD%E3%82%B0%E3%81%AE%E4%BE%8B"></a><strong>ここまでのファイル検索ダイアログの例</strong></span> : <a href="https://developer.mozilla.org/samples/xultu/examples//findfile/findfile-locale.xul.txt">ソース</a>
</p>
</div>
<p>次のセクションでは、プロパティ ファイルについて見ていきます。
</p><div class="prevnext" style="text-align: right;">
<p><a href="/ja/docs/XUL_Tutorial:Creating_a_Skin" style="float: left;">« 前のページ</a><a href="/ja/docs/XUL_Tutorial:Property_Files">次のページ »</a></p>
</div>
<div class="noinclude">
</div>
|