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
|
---
title: Lokalizacja
slug: Mozilla/Tech/XUL/Kurs_XUL/Lokalizacja
tags:
- Kurs_XUL
- Lokalizacja
- Przewodniki
- XUL
translation_of: Archive/Mozilla/XUL/Tutorial/Localization
---
<p></p><div class="prevnext" style="text-align: right;">
<p><a href="/pl/docs/Kurs_XUL:Tworzenie_motywów" style="float: left;">« Poprzedni</a><a href="/pl/docs/Kurs_XUL:Plik_własności">Następny »</a></p>
</div><p></p>
<p>XUL i XML dostarczają encje, które są wygodnym sposobem stosowanym w plikach lokalizacji.</p>
<h2 id="Encje" name="Encje">Encje</h2>
<p>Wiele aplikacji jest budowana w sposób określony i umożliwiający łatwe przetłumaczenie interfejsu aplikacji na inny język. Zazwyczaj, tabele wraz ze stringami są tworzone dla każdego języka. Zamiast trudnego tekstu kodu, w każdej części tekstu aplikacji, jest referencja do tabeli typu string. <a href="pl/XML">XML</a> dostarcza encje, które możemy zastosować dla wspomnianego celu.</p>
<p>Powinieneś już dobrze znać encje, jeśli piszesz w <a href="pl/HTML">HTML</a>. Kody <code>&lt;</code> i <code>&gt;</code> są przykładami encji, które możemy użyć w miejsce znaku mniejszości (<) lub większości (>), zamiast jego formy w postaci tekstowej. Składnia języka XML, pozwala nam na deklaracje własnych encji. Możemy ich użyć, w taki sposób, że encja jest zamieniana z tą wartością, która jest prostym tekstem. Encje możemy używać zawsze, kiedy są tekstem, który zawiera wartość atrybutów. Przykład poniżej demonstruje użycie encji w przycisku.</p>
<pre><button label="&findLabel;"/>
</pre>
<p>Tekst, który pojawi się jako etykieta (<code>label</code>), będzie wyświetlała wartość, jaka jest zawarta w encji <code>&findLabel</code>. Plik jest tworzony z powstrzymanej encji zadeklarowanej dla każdego obsługiwanego języka. W języku angielskim zadeklarowanej encji <code>&findLabel</code> będzie przydzielony tekst <code>Znajdź</code>.</p>
<h2 id="Pliki_DTD" name="Pliki_DTD">Pliki DTD</h2>
<p>Encje są zadeklarowane w plikach DTD (
<i>Document Type Declaration</i>
). Zazwyczaj tego typu pliki są używane do deklaracji składni i semantyki poszczególnych plików XML, lecz także umożliwiają deklarację encji. W Mozilli w systemie chrome, możesz zmaleźć pliki DTD są umieszczone w podkatalogu <tt>locales</tt>. Normalnie będzie tam jeden plik DTD (z rozszerzeniem <tt>.dtd</tt>) na jeden plik XUL.</p>
<p>Jeśli widzisz katalog chrome, powinieneś się przyjrzeć archiwum w Twoim języku (en-US.jar jest domyślnym językiem dla angielskiego). Mamy pliki lokalizacji w kilku językach (jak w przykładzie) m.in. w angielskim (en-US) i francuskim (fr). Wewnątrz tych archiwów, będą się znajdowały pliki, które trzymają zlokalizowany tekst dla każdego okna. Struktura archiwów jest bardzo podobna do struktury katalogów dla <a href="pl/Kurs_XUL/Tworzenie_motyw%c3%b3w">motywu</a>.</p>
<p>Wewnątrz archiwów, połóż swój plik DTD, w którym zadeklarujesz encje. Zazwyczaj tworzymy jeden plik DTD dla każdego pliku XUL. Posiadają one taką samą nazwę pliku, jedynie rozszerzenie pliku jest inne (<code>.dtd</code>), czyli w naszym przykładowym oknie <code>Znajdź pliki</code>, będzie potrzebny plik o nazwie <code>findfile.dtd</code>.</p>
<p>Dla plików nieinstalowanych w chrome, możemy tylko umieścić plik DTD do tego samego katalogu co plik XUL.</p>
<p>Raz możesz utworzyć plik DTD dla twojego XUL, będziesz potrzebował dodać do plik XUL, który sygnalizuje, co chcesz do użycia pliku DTD. W przeciwnym razie błędy będą się zdarzać jako, że nie można znaleźć encji. Zrób to, dodaj linię pochodzącą z najbliższego miejsca pliku XUL:</p>
<pre><!DOCTYPE window SYSTEM "chrome://findfile/locale/findfile.dtd">
</pre>
<p>Linia określa, co mamy zasygnalizować w użyciu DTD dla pliku. W tym przypadku, deklarujemy co chcemy użyć w pliku DTD <code>findfile.dtd</code>. Linię tą umieszczamy zawsze za elementem <code><code><a href="/pl/docs/Mozilla/Tech/XUL/window" title="window">window</a></code></code>.</p>
<h2 id="Deklaracja_encji" name="Deklaracja_encji">Deklaracja encji</h2>
<p>Encję możemy zadeklarować przy użyciu prostej składni, przykład znajduje się poniżej:</p>
<pre><!ENTITY findLabel "Znajdź">
</pre>
<p>Przykład tworzy encję o nazwie <code>findLabel</code> i wartości <code>Znajdź</code>. Oznacza to, że gdziekolwiek zawarty zostanie tekst <code>&findLabel</code> w pliku XUL, to będzie on zastąpiony tekstem <code>Znajdź</code>. W pliku DTD dla innych wersji językowych, możemy określić wpis w naszym języku, co pozwoli na użycie go zamiast tu zdefiniowanego. Uwaga, jest to deklaracja encji, w której nie ma kończącego znaku slash.</p>
<p>Na przykład, następny tekst:</p>
<pre><description value="&findLabel;"/>
</pre>
<p>Jest tłumaczony jako:</p>
<pre><description value="Znajdź"/>
</pre>
<p>Możesz zadeklarować encje dla każdej etykiety (<code>label</code>) lub łańcucha znakowego, które zostaną zadeklarowane w Twoim interfejsie. Powinieneś nie mieć bezpośrednio wyświetlonego tekstu w pliku XUL dla wszystkich.</p>
<p>Nadając encji użycie tekstu etykiety, powinieneś użyć dla niej wartość, która byłaby inna w innym języku. Przykład <a href="pl/Kurs_XUL/Skr%c3%b3ty_klawiaturowe">kluczy dostępu i skrótów klawiaturowych</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>W przykładzie powyżej użyto dwóch encji, jednej dla etykiety 'Undo' dla pozycji znajdującej się w menu i drugiej dla klucza dostępu.</p>
<div class="highlight">
<h2 id="Zmieniamy_przyk.C5.82ad_.22Znajd.C5.BA_pliki.22" name="Zmieniamy_przyk.C5.82ad_.22Znajd.C5.BA_pliki.22">Zmieniamy przykład "<code>Znajdź pliki</code>"</h2>
<p>Zastanówmy się w jaki sposób możemy wszystko ułożyć w oknie dialogowym <code>Znajdź pliki</code>, tak aby został zastosowany plik DTD dla wszystkich łańcuchów znakowych. Encje w pliku XUL są pokazane poniżej w kolorze czerwonym.</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>
<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="<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>Każdy łańcuch tekstowy został zastąpiony poprzez odwołanie się do odpowiedniej encji. Plik DTD został umieszczony zaraz na początku pliku XUL. Każdą encję, którą dodamy, powinniśmy zadeklarować w pliku DTD. Okno nie powinno zostać wyświetlone, jeśli encja będzie umieszczona w pliku XUL, a nie została zadeklarowana.</p>
<p>Uwaga: nazwa encji nie jest ważna. W przykładzie powyżej, słowa w encjach zostały oddzielone kropką. Nie musimy tego robić. Nazwy encji tutaj, są podobne do przyjętej konwencji kodu jakiej używa Mozilla.</p>
<p>Zwróć uwagę, że tekst o rozmiarze '2520 bajtów' zastąpiliśmy poprzez dwie encje. Dzieje się tak, ponieważ struktura wyrażenia może być inna w następnym miejscu. Na przykład, numer może potrzebować stać się równoważnym ilości bajtów, przed zamiast po. Oczywiście może to być bardziej skomplikowane do zrealizowania, aby wyświetlać rozmiar w KB lub potrzebne bardziej będą już Ci MB.</p>
<p>Klucze dostępu, jak i skróty klawiaturowe także będziemy tłumaczyli jako encje, ponieważ będą one prawdopodobnie inne oraz w innych miejscach będą się znajdowały.</p>
<p>Następnie, plik 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>Wszystko czego potrzeba do zmiany wersji językowej, to utworzenie następnego pliku DTD. Używając systemu chrome dodaj plik DTD dla innych lokalizacji, ten sam plik możemy zastosować w każdym języku.</p>
<p>Przykład <code>Znajdź pliki</code>: <a href="https://developer.mozilla.org/samples/xultu/examples//findfile/findfile-locale.xul.txt">Źródła</a></p>
</div>
<p>W następnym artykule, zobaczymy jak wyglądają <a href="pl/Kurs_XUL/Plik_w%c5%82asno%c5%9bci">pliki własności</a>.</p>
<p></p><div class="prevnext" style="text-align: right;">
<p><a href="/pl/docs/Kurs_XUL:Tworzenie_motywów" style="float: left;">« Poprzedni</a><a href="/pl/docs/Kurs_XUL:Plik_własności">Następny »</a></p>
</div><p></p>
<div class="noinclude"> </div>
<p> </p>
|