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
|
---
title: Lokalisierung
slug: Archive/Mozilla/XUL/XUL_Tutorial/Lokalisierung
tags:
- Lokalisierung
- XUL
- XUL_Tutorial
translation_of: Archive/Mozilla/XUL/Tutorial/Localization
---
<p>{{ PreviousNext("XUL_Tutorial/Eine_eigene_Skin_erstellen", "XUL_Tutorial/Property-Dateien") }}</p>
<p>XUL und XML stellen Entities als komfortablen Weg bereit, um Lokalisierungen zu ermöglichen.</p>
<h3 id="Entities">Entities</h3>
<p>Viele Anwendungen sind so gebaut, dass das Interface so einfach wie möglich in verschiedene Sprachen zu übersetzten ist. Üblicherweise wird eine Tabelle aus Strings für jede Sprache erstellt. Anstelle von den Text direkt in die Applikation zu programmieren, stellt jede Textstelle nur eine Referenz zur Stringtabelle dar. <a href="/de/XML" title="de/XML">XML</a> stellt Entities zur Verfügung, welche für den gleichen Zweck verwendet werden können.</p>
<p>Man sollte mit Entities bereits vertraut sein, wenn man schon Erfahrungen mit <a href="/de/HTML" title="de/HTML">HTML</a> sammeln konnte. Der Code <code>&lt;</code> und <code>&gt;</code> sind Beispiele von Entities, welche anstelle von „Größer-als-“ und „Kleiner-als-Zeichen“ im Text verwendet werden können. XML besitzt einen Syntax, welcher dir das deklarieren eigener Entities erlaubt. Du kannst diese so verwenden, dass das Entity durch seinen Wert ersetzt wird, welcher ein Textstring ist. Entities können immer wenn Text auftritt verwendet werden, inklusive den Attributwerten. Das Beispiel unten demonstriert die Verwendung eines Entity in einem Button.</p>
<pre><button label="&findLabel;"/>
</pre>
<p>Der Text der als Label erscheinen wird, wird den Wert des Entity <code>&findLabel;</code> sein. Eine Datei welche die Entity-Deklaration enthält wird für jede unterstützte Sprache erstellt. Für Englisch wird das <code>&findLabel;</code> Entity wahrscheinlich mit dem Text »Find« deklariert sein.</p>
<h3 id="DTD-Dateien">DTD-Dateien</h3>
<p>Entities sind in <em>Document Type Declaration</em> (DTD) Dateien deklariert. Dateien dieses Typs werden normalerweise verwendet um den Syntax und die Semantik einer bestimmten XML-Datei zu deklarieren, aber es können auch Entities deklariert werden. Im Mozilla Chrome-System sind die DTD Dateien im <code>locales</code> Unterordner zu finden. Normalerweise existiert eine DTD Datei (mit der Endung <code>.dtd</code>) pro XUL-Datei.</p>
<p>Wenn man im Chrome-Ordner nachschaut, sollte man ein Archiv für die jeweilige Sprache (<code>de-De.jar</code> ist normalerweise Deutsch) finden. Es ist möglich lokale Dateien in verschiedenen Sprachen, z.B. Deutsch (de-DE) und Englisch (en-US) zu haben. Innerhalb dieser Archive sind die Dateien zu finden, welche den lokalisierten Text für jedes Fenster enthalten. Die Struktur der Archive ist sehr ähnlich derjenigen, die für Skins verwendet wird.</p>
<p>Im Innern der Archive würde man die DTD-Dateien platzieren in welchen die Entities deklariert werden sollen. Normalerweise wird für jede XUL-Datei eine DTD-Datei mit dem gleichen Namen erstellt mit allerdings einer <code>.dtd</code> Endung. Daher werden wir für den Dateisuchdialog eine Datei namens <code>findfile.dtd</code> benötigen.</p>
<p>Für nicht installierte chrome Dateien kann einfach die DTD-Datei ins selbe Verzeichnis wie die XUL-Datei ablegt werden.</p>
<div class="note"><strong>Anmerkung:</strong> Die DTD-Dateien sollten für nicht ASCII Zeichen als UTF-8 kodiert werden. Deswegen sollten die Dateien im UTF-8 Format gespeichert werden. (<a class="external" href="http://www.mozdev.org/notes/l10n/unicode/editors-en.html">ohne BOM</a>). Für mehr Informationen, siehe <a class="external" href="http://www.mozilla.org/projects/l10n/mlp_chrome.html#text">Mozilla Sprachpakete</a>.</div>
<p>Sobald eine DTD-Datei für das XUL erstellt worden ist, muss eine Zeile in die XUL-Datei einfügt werden, welche angibt, dass die DTD-Datei verwendet werden soll. Andernfalls werden Fehler auftreten, weil die Entities nicht gefunden werden. Um dies zu tun, muss die folgende Zeile irgendwo im oberen Bereich der XUL-Datei eingefügt werden:</p>
<pre><!DOCTYPE window SYSTEM "chrome://findfile/locale/findfile.dtd">
</pre>
<p>Diese Zeile legt fest, dass die URL auf eine DTD-Datei verweist. In diesem Fall wurde deklariert, dass die <code>findfile.dtd</code> DTD-Datei verwendet werden soll. Diese Zeile ist typischerweise gerade vor dem <code>window</code> Element platziert.</p>
<h3 id="Entities_deklarieren">Entities deklarieren</h3>
<p>Die Entities werden mit einem einfachen Syntax deklariert:</p>
<pre><!ENTITY findLabel "Find">
</pre>
<p>Dieses Beispiel erstellt ein Entity mit dem Namen <code>findLabel</code> und dem Wert »Find«. Dies bedeutet, dass überall wo der Text „&findLabel;“ in der XUL-Datei auftritt es durch den Text »Find« ersetzt wird. Es sollte beachtet werden, dass die Deklaration kein Slash am Ende besitzt. In der DTD-Datei einer anderen Sprache wird der Text stattdessen in dieser Sprache geschrieben.</p>
<pre class="eval"><strong>für Japanisch:</strong>
<!ENTITY findLabel "検索">
</pre>
<p>Zum Beispiel der folgende Text:</p>
<pre><description value="&findLabel;"/>
</pre>
<p>wird übersetzt als:</p>
<pre class="eval"><strong>Englische Version:</strong>
<description value="Find"/>
<strong>Japanische Version:</strong>
<description value="検索"/>
</pre>
<p>Es wird ein Entity für jede Beschriftung und Textstelle vorhanden sein, die dem Interface verwendet wird. Es sollte kein direkt angezeigter Text in den XUL-Dateien existieren.</p>
<p>Zusätzlich zu der Verwendung in Beschriftungen, sollten Entities für jeden Wert verwendet werden, welcher in einer anderen Sprache abweichen könnte. Access-Keys und Tastatur-Shortcuts zum Beispiel.</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>Das Beispiel oben verwendet zwei Entities, eines für die Beschriftung des Menüpunktes und ein zweiter für den Access-Key.</p>
<p> </p>
<div class="highlight">
<h3 id=".C3.84nderung_des_Dateisuche_Beispiels" name=".C3.84nderung_des_Dateisuche_Beispiels">Änderung des Dateisuche Beispiels</h3>
<p>Werfen wir jetzt einen Blick darauf, wie wir das alles zusammenfügen können, indem wir den Dateisuche-Dialog so modifizieren, so dass eine DTD-Datei für alle seine Textstellen verwendet wird. Die gesamte XUL-Datei mit allen Änderungen in Rot ist unterhalb gezeigt.</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>Jede Textstelle wurde durch eine Entity ersetzt. Eine DTD-Datei wurde nahe am Anfang eingefügt. Jede Entity welche eingefügt wurde, sollte in der DTD-Datei deklariert sein. Das Fenster wird nicht angezeigt, wenn eine Entity in der XUL-Datei gefunden wird, welche nicht deklariert wurde.</p>
<p>Es sollte beachtet werden, dass der Name der Entity nicht wichtig ist. Im Beispiel oben wurden die Wörter der Entities mit Bindestrichen getrennt. Dies ist keine Vorgabe. Die Entity-Namen folgen den selben Konventionen wie der Rest des Mozilla Codes.</p>
<p>Es ist vielleicht aufgefallen, dass der Text '2520 bytes' durch zwei Entities ersetzt wurde. Das kommt daher, weil die Struktur in anderen Sprachen variieren kann. Es könnte z.B. nötig sein, dass die Einheit vor der Zahl steht.</p>
<p>Die Access-Keys und Tastatur-Shortcuts wurden auch in Entities übersetzt, weil sie in anderen Sprachen abweichen können.</p>
<p>Nun die DTD-Datei - 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>Um den Text in einer neuen Sprache hinzuzufügen, genügt es eine weitere DTD-Datei zu erstellen. Durch die Verwendung des Chrome Systems, um die DTD-Datei einer anderen Sprache hinzuzufügen, kann die selbe XUL-Datei für jede Sprache verwendet werden.</p>
<p>Das Dateisuche Beispiel so weit: <a class=" external" href="http://developer.mozilla.org/samples/xultu/examples/findfile/findfile-locale.xul.txt">Quellcode</a></p>
</div>
<p>Als nächstes werden wir einen Blick auf <a href="/de/XUL_Tutorial/Property-Dateien">Property Dateien</a> werfen.</p>
<p>{{ PreviousNext("XUL_Tutorial/Eine_eigene_Skin_erstellen", "XUL_Tutorial/Property-Dateien") }}</p>
<p>{{ languages( { "en": "en/XUL_Tutorial/Localization", "fr": "fr/Tutoriel_XUL/Localisation", "ja": "ja/XUL_Tutorial/Localization", "pl": "pl/Kurs_XUL/Lokalizacja" } ) }}</p>
|