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
|
---
title: Создание расширения
slug: orphaned/Создание_расширения
tags:
- Extensions
original_slug: Создание_расширения
---
<h3 id=".D0.92.D0.B2.D0.B5.D0.B4.D0.B5.D0.BD.D0.B8.D0.B5" name=".D0.92.D0.B2.D0.B5.D0.B4.D0.B5.D0.BD.D0.B8.D0.B5">Введение</h3>
<p>Этот краткий курс касается построения простейшего расширения для Firefox, которое будет добавлять в строку статуса надпись <em>"Hello, World!"</em>.</p>
<div class="note"><strong>Примечание:</strong> Расширение создаваемое в этой статье не будет работать в версиях Firefox в которых нет статичной строки состояния (Firefox 4 и выше). Более релевантную статью вы можете найти в руководстве <a href="/ru/docs/XUL_School">Школьный учебник по XUL</a> в разделе <a href="/ru/docs/XUL_School/Getting_Started_with_Firefox_Extensions">Приступая к работе с расширениями Firefox</a>.</div>
<h4 id=".D0.A7.D1.82.D0.BE_.D0.BD.D1.83.D0.B6.D0.BD.D0.BE_.D0.B7.D0.BD.D0.B0.D1.82.D1.8C_.D0.B4.D0.BB.D1.8F_.D0.BD.D0.B0.D1.87.D0.B0.D0.BB.D0.B0_.D1.80.D0.B0.D0.B1.D0.BE.D1.82.D1.8B" name=".D0.A7.D1.82.D0.BE_.D0.BD.D1.83.D0.B6.D0.BD.D0.BE_.D0.B7.D0.BD.D0.B0.D1.82.D1.8C_.D0.B4.D0.BB.D1.8F_.D0.BD.D0.B0.D1.87.D0.B0.D0.BB.D0.B0_.D1.80.D0.B0.D0.B1.D0.BE.D1.82.D1.8B">Что нужно знать для начала работы</h4>
<p>Система разработки расширений спроектирована таким образом, что для начала разработки собственного расширения не требуется быть профессиональным программистом. Как бы то ни было, это программирование, поэтому желательно иметь некое представление о принципах работы компьютерных программ вообще и, в частности, быть знакомым с XML. Вообще желательно знание также JavaScript и CSS, однако в этой статье оно вам не понадобится.</p>
<h3 id=".D0.A1.D0.BE.D0.B7.D0.B4.D0.B0.D0.BD.D0.B8.D0.B5_.D0.BF.D1.80.D0.BE.D0.B5.D0.BA.D1.82.D0.B0_.D1.80.D0.B0.D1.81.D1.88.D0.B8.D1.80.D0.B5.D0.BD.D0.B8.D1.8F" name=".D0.A1.D0.BE.D0.B7.D0.B4.D0.B0.D0.BD.D0.B8.D0.B5_.D0.BF.D1.80.D0.BE.D0.B5.D0.BA.D1.82.D0.B0_.D1.80.D0.B0.D1.81.D1.88.D0.B8.D1.80.D0.B5.D0.BD.D0.B8.D1.8F">Создание проекта расширения</h3>
<p>Расширения состоят из нескольких файлов и для корректной его работы необходимо придерживаться определенных правил их расположения в директориях. Вот структура типичного расширения:</p>
<pre class="eval">/myExtension:
/install.rdf
/components/*
/defaults/
/defaults/preferences/*.js
/plugins/*
/chrome.manifest
/chrome/icons/default/*
/chrome/
/chrome/content/
</pre>
<p>Впрочем, в вашем расширении необязательно должны быть все эти папки. Сейчас мы создадим схожий каркас для нашего расширения. Для начала создадим папку для его хранения (напр. <code>C:\extensions\my_extension\</code> для Windows или <code>~/extensions/my_extension/ для Unix/Linux</code>). Эта папка будет корневой. Создайте в ней подпапку chrome, а в последней - папку content.</p>
<p>Теперь создайте в корневой папке 2 пустых файла: chrome.manifest и install.rdf.</p>
<p>Итак, сейчас мы имеем такую структуру расширения:</p>
<pre><ext path>/
install.rdf
chrome.manifest
chrome/
content/
</pre>
<p>Для облегчения дальнейшей разработки и тестирования рекомендуем <a href="/en/Setting_up_extension_development_environment">настроить Firefox для разработки расширения</a>.</p>
<h3 id=".D0.A1.D0.BE.D0.B7.D0.B4.D0.B0.D0.BD.D0.B8.D0.B5_.D1.81.D0.BA.D1.80.D0.B8.D0.BF.D1.82.D0.B0_.28.22.D0.BC.D0.B0.D0.BD.D0.B8.D1.84.D0.B5.D1.81.D1.82.D0.B0.22.29_.D1.83.D1.81.D1.82.D0.B0.D0.BD.D0.BE.D0.B2.D0.BA.D0.B8" name=".D0.A1.D0.BE.D0.B7.D0.B4.D0.B0.D0.BD.D0.B8.D0.B5_.D1.81.D0.BA.D1.80.D0.B8.D0.BF.D1.82.D0.B0_.28.22.D0.BC.D0.B0.D0.BD.D0.B8.D1.84.D0.B5.D1.81.D1.82.D0.B0.22.29_.D1.83.D1.81.D1.82.D0.B0.D0.BD.D0.BE.D0.B2.D0.BA.D0.B8">Создание скрипта ("манифеста") установки</h3>
<p>Откройте файл <code><a href="/en/Install_Manifests">install.rdf</a></code> в текстовом редакторе и поместите в него следующее:</p>
<pre class="eval"><?xml version="1.0"?>
<RDF xmlns="<span class="nowiki">http://www.w3.org/1999/02/22-rdf-syntax-ns#</span>"
xmlns:em="<span class="nowiki">http://www.mozilla.org/2004/em-rdf#</span>">
<Description about="urn:mozilla:install-manifest">
<em:id><strong><a class="link-mailto" href="mailto:sample@example.net" rel="freelink">sample@example.net</a></strong></em:id>
<em:version><strong>1.0</strong></em:version>
<em:type>2</em:type>
<!-- Target Application this extension can install into,
with minimum and maximum supported versions. -->
<em:targetApplication>
<Description>
<em:id><strong>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</strong></em:id>
<em:minVersion><strong>1.5</strong></em:minVersion>
<em:maxVersion><strong>2.0.0.*</strong></em:maxVersion>
</Description>
</em:targetApplication>
<!-- Front End MetaData -->
<em:name><strong>sample</strong></em:name>
<em:description><strong>A test extension</strong></em:description>
<em:creator><strong>Your Name Here</strong></em:creator>
<em:homepageURL><strong><span class="nowiki">http://www.example.com/</span></strong></em:homepageURL>
</Description>
</RDF>
</pre>
<p>Как видите, этот файл имеет вид XML-файла. Полное описание необходимых и возможных параметров есть <a href="/en/Install_Manifests">здесь</a>, сейчас же отметим лишь, что этот файл предназначен для общего описания расширения, например, уникальный идентификатор расширения, его версию, имя, автора, информацию о совместимости и т.п. Назначение многих параметров понятно из их названия. Что необходимо знать сейчас:</p>
<ul>
<li><strong><a class="link-mailto" href="mailto:sample@example.net" rel="freelink">sample@example.net</a></strong> - уникальный идентификатор вашего расширения. Это может быть адрес электронной почты (как здесь) или GUID. Обратите внимание, что адрес может быть несуществующим, главное, чтобы он был уникальным.</li>
</ul>
<ul>
<li><strong>2</strong> - указывает, что это именно расширение (связано с тем, что такие же манифесты создаются для тем и плагинов).</li>
</ul>
<ul>
<li><strong>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</strong> - идентификатор Firefox'а (конечно, он одинаковый для всех расширений).</li>
</ul>
<ul>
<li><strong>1.5</strong> - минимальная версия Firefox, с которой будет работать ваше приложение. Обратите внимание, что указать здесь какой-либо номер не значит автоматически сделать расширение работающим с этой версией. Это лишь означает, что вы, как разработчик, утверждаете, что расширение будет работать с ней, а вот будет ли так, зависит только от вас.</li>
</ul>
<ul>
<li><strong>2.0.0.*</strong> - максимальный номер версии Firefox. * означает, что включаются все версии, имеющие вид 2.0.0.x, где x - любое число.</li>
</ul>
<h3 id=".D0.A0.D0.B0.D1.81.D1.88.D0.B8.D1.80.D0.B5.D0.BD.D0.B8.D0.B5_.D0.B1.D1.80.D0.B0.D1.83.D0.B7.D0.B5.D1.80.D0.B0_.D1.81_.D0.BF.D0.BE.D0.BC.D0.BE.D1.89.D1.8C.D1.8E_XUL" name=".D0.A0.D0.B0.D1.81.D1.88.D0.B8.D1.80.D0.B5.D0.BD.D0.B8.D0.B5_.D0.B1.D1.80.D0.B0.D1.83.D0.B7.D0.B5.D1.80.D0.B0_.D1.81_.D0.BF.D0.BE.D0.BC.D0.BE.D1.89.D1.8C.D1.8E_XUL">Расширение браузера с помощью XUL</h3>
<p>Интерфейс Firefox написан на XUL и JavaScript. <a href="/ru/XUL" title="ru/XUL">XUL</a> - это язык, основанный на XML. Он отвечает за визуальную часть интерфейса. JavaScript реализует функциональность через привязку к действиям пользователя.</p>
<p>Так как визуально браузер строится на XUL, то, следовательно, он весь представляется в виде XML-файла. Вы можете посмотреть на него (это будет полезно для четкого понимания своих дальнейших действий). Зайдите в папку установки Firefox, откройте там папку chrome. В ней будет <code>browser.jar</code>. Несмотря на расширение, этот файл - обычный zip-архив. Внутри него вы найдете файл <code>content/browser/browser.xul</code>. Открыв его, можно полюбоваться на общую структуру визуальной части браузера. Пусть вас не смущает большое количество непонятных пока строк - во всем разберетесь позже. Собственно, корневым узлом этого XML-файла является элемент <code>window</code>, содержащиеся в нем узлы - это отдельные элементы интерфейса. Например, вы можете найти кнопку обновления страницы (поищите узел с <code>id="reload-button"</code>) или пункт меню "Правка" (<code>id="edit-menu"</code>).</p>
<p>Так вот, суть расширения интерфейса браузера состоит в том, что мы берем некий узел из браузера, описываем его в своем файле с необходимыми нам изменениями, например, добавляя к нему новые дочерние узлы. Таким образом можно добавить новые кнопки в панель инструментов (или создать новую панель и поместить ее в нужное место), добавить новый пункт меню (как рядом со "Справкой" так и в подменю, скажем, "Инструменты" (Tools)). Это технология называется <a href="/en/XUL_Overlays">en:XUL Overlays</a>.</p>
<p>В нашем случае мы добавим новый элемент в строку статуса. В файле <code>browser.xul</code> можно найти узел с <code>id="status-bar"</code>. Это и есть строка статуса. В этом узле есть несколько дочерних узлов. Добавим к ним наш, который будет описывать новую панель. Создайте файл, назовите его, скажем, <code><strong>sample.xul</strong></code> и поместите в папку <code>chrome/content</code>. Внесите туда такой код:</p>
<pre class="eval"><?xml version="1.0"?>
<overlay id="sample"
xmlns="<span class="nowiki">http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul</span>">
<statusbar id="<strong>status-bar</strong>">
<statusbarpanel id="my-panel" label="Hello, World"/>
</statusbar>
</overlay>
</pre>
<p>Здесь <code><statusbar></code> с <code>id="status-bar"</code> является "точкой склейки" (merge point), т.е. узлом, который мы намереваемся изменить. <code><statusbarpanel></code> - новый виджет, который мы добавляем в <code><statusbar></code>.</p>
<h3 id="URI_Chrome" name="URI_Chrome">URI Chrome</h3>
<p>XUL-файлы (вроде того, который мы только что создали) загружаются через URI протокола chrome://. Вместо того, чтобы каждый раз определять место установки Firefox'а и загружать файлы через <code>file://</code>, можно загружать их через <code>chrome://</code>, не беспокоясь об их истинном положении на диске.</p>
<p>Так, окно браузера, которое мы недавно просматривали, находится по адресу <code><a class="external" rel="freelink">chrome://browser/content/browser.xul</a></code>. Можете попробовать ввести его в адресную строку и посмотреть на результат.</p>
<p>URI хрома состоит из нескольких частей:</p>
<ul>
<li>протокол <code>chrome</code> говорит, что необходимо классифицировать и обработать содержимое файла как хром.</li>
<li>название пакета (в данном случае, это <code>browser</code>), указывающий на "сверток" (bundle) компонентов интерфейса. Это название уникально для каждого приложения/расширения.</li>
<li>тип запрашиваемых данных. Есть три типа: <code>content</code> (XUL, JavaScript, XBL Bindings и др., т.е. компоненты, формирующие вид и поведение интерфейса), <code>locale</code> (DTD, файлы propeties и т.п., производящие локализацию интерфейса) и <code>skin</code> (CSS и изображения для формирования темы интерфейса).</li>
<li>файл для загрузки.</li>
</ul>
<p>Так, например, <code><a class="external" rel="freelink">chrome://foo/skin/bar.png</a></code> загружает файл <code>bar.png</code> из секции <code>skin</code> пакета <code>foo</code>.</p>
<h3 id=".D0.A1.D0.BE.D0.B7.D0.B4.D0.B0.D0.BD.D0.B8.D0.B5_.D0.BC.D0.B0.D0.BD.D0.B8.D1.84.D0.B5.D1.81.D1.82.D0.B0_chrome" name=".D0.A1.D0.BE.D0.B7.D0.B4.D0.B0.D0.BD.D0.B8.D0.B5_.D0.BC.D0.B0.D0.BD.D0.B8.D1.84.D0.B5.D1.81.D1.82.D0.B0_chrome">Создание манифеста chrome</h3>
<p>Для хорошего понимания манифеста просмотрите статью <a href="/en/Chrome_Manifest">en:Chrome Manifest</a></p>
<p>Откройте <code>chrome.manifest</code>, созданный нами ранее и добавьте в него следующее:</p>
<pre class="eval">content sample chrome/content/
</pre>
<p><strong>Не забудьте завершающий слеш.</strong></p>
<p>Эта строка объявляет</p>
<ol>
<li>тип данных в пакете chrome,</li>
<li>название пакета (используйте лишь строчные буквы),</li>
<li>путь к файлам пакета.</li>
</ol>
<p>Таким образом, здесь мы говорим, что файлы типа <code>content</code> для пакета <code>sample</code> можно найти в <code>chrome/content</code> (путь относительно местоположения <code>chrome.manifest</code>).</p>
<p>Сохраните файл. Позже, при запуске Firefox, пакет <code>chrome</code> вашего расширения будет зарегистрирован с помощью этого файла.</p>
<h3 id=".D0.A0.D0.B5.D0.B3.D0.B8.D1.81.D1.82.D1.80.D0.B0.D1.86.D0.B8.D1.8F_.D0.BE.D0.B2.D0.B5.D1.80.D0.BB.D0.B5.D1.8F" name=".D0.A0.D0.B5.D0.B3.D0.B8.D1.81.D1.82.D1.80.D0.B0.D1.86.D0.B8.D1.8F_.D0.BE.D0.B2.D0.B5.D1.80.D0.BB.D0.B5.D1.8F">Регистрация оверлея</h3>
<p>Для того, чтобы Firefox понял, что у нас есть оверлей и мы хотим наложить его на окно браузера, необходимо зарегистрировать оверлей через все тот же chrome.manifest. Добавляем в него строку</p>
<pre class="eval">overlay <a class="external" rel="freelink">chrome://browser/content/browser.xul</a> <a class="external" rel="freelink">chrome://sample/content/sample.xul</a>
</pre>
<p>Это говорит Firefox, что нужно объединить <code>sample.xul</code> и <code>browser.xul</code></p>
<h3 id=".D0.A2.D0.B5.D1.81.D1.82.D0.B8.D1.80.D0.BE.D0.B2.D0.B0.D0.BD.D0.B8.D0.B5" name=".D0.A2.D0.B5.D1.81.D1.82.D0.B8.D1.80.D0.BE.D0.B2.D0.B0.D0.BD.D0.B8.D0.B5">Тестирование</h3>
<p>Для начала необходимо уведомить Firefox о нашем расширении. Раньше (еще во времена Firefox 1.0) необходимо было упаковать расширение как <a href="/en/XPI">en:XPI</a> и установить через интерфейс браузера. Теперь же достаточно просто указать Firefox, где находится папка с вашим расширением - и он будет подключать его каждый раз при загрузке.</p>
<p>Итак, ваши действия:</p>
<ol>
<li>Найдите папку с вашим профилем. Если вы не создавали его специально, браузер использует профиль по умолчанию.<br>
<a class="external" href="http://kb.mozillazine.org/Profile_folder">Как найти папку с профилем.</a></li>
<li>Откройте папку <code>extensions</code>. Если ее нет, создайте ее.</li>
<li>Создайте новый текстовый файл и поместите в него лишь путь к вашему расширению (напр., <code>C:\extensions\my_extension\</code> для Windows или <code>~/extensions/my_extension/</code> для Unix/Linux). Сохраните файл под именем, одинаковым с <code>id</code> вашего расширения.</li>
</ol>
<p><strong>Примечания:</strong></p>
<ul>
<li>Не забудьте завершающий слеш.</li>
<li>Возможно возникновение проблем из-за знаков нижнего подчеркивания в названии; если так вышло измените его.</li>
</ul>
<p>Теперь вы готовы к тестированию вашего расширения. Запустите Firefox. Он увидит ссылку к вашему расширению и установит его. Если все прошло успешно, вы увидите надпись "Hello, World!" в строке статуса справа. Для внесения изменений достаточно править <code>xul</code>-файлы и перезапустить Firefox.</p>
<h3 id=".D0.A3.D0.BF.D0.B0.D0.BA.D0.BE.D0.B2.D0.BA.D0.B0_.D1.80.D0.B0.D1.81.D1.88.D0.B8.D1.80.D0.B5.D0.BD.D0.B8.D1.8F" name=".D0.A3.D0.BF.D0.B0.D0.BA.D0.BE.D0.B2.D0.BA.D0.B0_.D1.80.D0.B0.D1.81.D1.88.D0.B8.D1.80.D0.B5.D0.BD.D0.B8.D1.8F">Упаковка расширения</h3>
<p>Теперь можно упаковать расширение для его дальнейшего распространения и установки.</p>
<p>Создайте zip-архив из содержания корневой папки вашего расширения (но не архивируйте саму папку). Переименуйте файл, чтобы он имел расширение <code>".xpi"</code>. Вот и все. Для установки достаточно перетащить файл на окно браузера.</p>
<h4 id=".D0.A3.D1.81.D1.82.D0.B0.D0.BD.D0.BE.D0.B2.D0.BA.D0.B0_.D1.81_.D0.B2.D0.B5.D0.B1-.D1.81.D1.82.D1.80.D0.B0.D0.BD.D0.B8.D1.86.D1.8B" name=".D0.A3.D1.81.D1.82.D0.B0.D0.BD.D0.BE.D0.B2.D0.BA.D0.B0_.D1.81_.D0.B2.D0.B5.D0.B1-.D1.81.D1.82.D1.80.D0.B0.D0.BD.D0.B8.D1.86.D1.8B">Установка с веб-страницы</h4>
<p>Есть несколько способов это сделать. Можно разместить прямую ссылку на <code>xpi</code>-файл. Однако предпочтительным является <a href="/en/Installing_Extensions_and_Themes_From_Web_Pages">InstallTrigger method</a>, как более удобный для пользователей.</p>
<h4 id=".D0.A1.D0.B0.D0.B9.D1.82_.D1.80.D0.B0.D1.81.D1.88.D0.B8.D1.80.D0.B5.D0.BD.D0.B8.D0.B9_addons.mozilla.org" name=".D0.A1.D0.B0.D0.B9.D1.82_.D1.80.D0.B0.D1.81.D1.88.D0.B8.D1.80.D0.B5.D0.BD.D0.B8.D0.B9_addons.mozilla.org">Сайт расширений addons.mozilla.org</h4>
<p>Сайт расширений Mozilla (<a class="external" href="http://addons.mozilla.org" rel="freelink">http://addons.mozilla.org</a>) является местом, где вы можете бесплатно разместить свое расширение. Сайт является надежным и удобным местом для распространения своих расширений: достаточно лишь зарегистрироваться - и вы сможете загружать свои файлы на сервер.</p>
<h4 id=".D0.A0.D0.B5.D0.B3.D0.B8.D1.81.D1.82.D1.80.D0.B8.D1.80.D0.BE.D0.B2.D0.B0.D0.BD.D0.B8.D0.B5_.D1.80.D0.B0.D1.81.D1.88.D0.B8.D1.80.D0.B5.D0.BD.D0.B8.D1.8F_.D0.B2_.D1.80.D0.B5.D0.B5.D1.81.D1.82.D1.80.D0.B5_Windows" name=".D0.A0.D0.B5.D0.B3.D0.B8.D1.81.D1.82.D1.80.D0.B8.D1.80.D0.BE.D0.B2.D0.B0.D0.BD.D0.B8.D0.B5_.D1.80.D0.B0.D1.81.D1.88.D0.B8.D1.80.D0.B5.D0.BD.D0.B8.D1.8F_.D0.B2_.D1.80.D0.B5.D0.B5.D1.81.D1.82.D1.80.D0.B5_Windows">Регистрирование расширения в реестре Windows</h4>
<p>В Windows информация о расширении может быть добавлена в реестр. Это дает дополнительный возможности при установке расширений. Подробнее об этом читайте здесь.</p>
<h3 id=".D0.A3.D0.B7.D0.BD.D0.B0.D0.B9.D1.82.D0.B5_.D0.B1.D0.BE.D0.BB.D1.8C.D1.88.D0.B5_.D0.BE.D0.B1_.D0.BE.D0.B2.D0.B5.D1.80.D0.BB.D0.B5.D1.8F.D1.85_XUL" name=".D0.A3.D0.B7.D0.BD.D0.B0.D0.B9.D1.82.D0.B5_.D0.B1.D0.BE.D0.BB.D1.8C.D1.88.D0.B5_.D0.BE.D0.B1_.D0.BE.D0.B2.D0.B5.D1.80.D0.BB.D0.B5.D1.8F.D1.85_XUL">Узнайте больше об оверлеях XUL</h3>
<p>В настоящем руководстве была затронута лишь крохотная часть всех возможностей модифицирования интерфейса с помощью XUL. Чтобы узнать больше, смотрите <a href="/ru/XUL" title="ru/XUL"> документацию XUL</a>.</p>
<h3 id=".D0.9B.D0.BE.D0.BA.D0.B0.D0.BB.D0.B8.D0.B7.D0.B0.D1.86.D0.B8.D1.8F" name=".D0.9B.D0.BE.D0.BA.D0.B0.D0.BB.D0.B8.D0.B7.D0.B0.D1.86.D0.B8.D1.8F">Локализация</h3>
<p>Для поддержки более чем одного языка необходимо отделить локализуемые строки от основного содержания с помощью сущностей (entities) и "свертков строк" (string bundles). Гораздо проще делать это в течение разработки расширения, чем после.</p>
<p>Информация о локализации хранится в подпапке <code>locale</code> папки chrome (т.е. рядом с папкой <code>content</code>). В этой папке необходимо разместить столько папок, сколько локализаций вы намерены сделать. Обычной практикой является называть папки стандартными названиями локалей: скажем, папку с английской локализацией - <code>en-US</code>, русской - <code>ru-RU</code> и т.п., что, впрочем, не является обязательным. Теперь создайте в каждой из папок файл <code>somename.ent</code> (или <code>anothername.dtd</code>) (<em>имя одинаково во всех папках локализаций</em>) и заполните его соответствующим образом (показано ниже).</p>
<p>Локализуем наше расширение на русский и английский языки. После создания 2 папок (назовем их <code>ru-RU</code> и <code>en-US</code>), создаем в каждой из них файл (пусть <code>myStatusBar.ent</code>) Поместите в тот файл, который в папке с английской локализацией, следующую строку:</p>
<pre class="eval"><!ENTITY statusbarpanel.label "Hello, World!">
</pre>
<p>А в тот, который будет локализовать на русский язык, соответственно</p>
<pre class="eval"><!ENTITY statusbarpanel.label "Привет, мир!">
</pre>
<p>Сохраните оба файла. Теперь необходимо зарегистрировать локализации. Для этого добавим в <code>chrome.manifest</code> следующие строки:</p>
<pre class="eval">locale sample en-US chrome/locale/en-US/
locale sample ru-RU chrome/locale/ru-RU/
</pre>
<p>Теперь для использования локализации достаточно добавить в начало (однако после <code>xml</code>-объявления) <code>xul</code>-файла строку</p>
<pre class="eval"><!DOCTYPE window SYSTEM "<a class="external" rel="freelink">chrome://sample/locale/myStatusBar.ent</a>">
</pre>
<p>где <code>window</code> - это названия корневого элемента <code>xul</code>-документа (в нашем случае это <code>overlay</code>).</p>
<p>Для использования сущностей измените ваш <code>xul</code>-файл так, чтобы атрибут <code>label</code> у новой <code>statusbarpanel</code> был равен <code>"&statusbarpanel.label;"</code>.</p>
<h3 id=".D0.98.D1.81.D1.81.D0.BB.D0.B5.D0.B4.D0.BE.D0.B2.D0.B0.D0.BD.D0.B8.D0.B5_.D0.B1.D1.80.D0.B0.D1.83.D0.B7.D0.B5.D1.80.D0.B0" name=".D0.98.D1.81.D1.81.D0.BB.D0.B5.D0.B4.D0.BE.D0.B2.D0.B0.D0.BD.D0.B8.D0.B5_.D0.B1.D1.80.D0.B0.D1.83.D0.B7.D0.B5.D1.80.D0.B0">Исследование браузера</h3>
<p>Гораздо более простым (и эффективным) способом исследования браузера является использование <em>DOM Inspector'а</em>. Он позволяет полностью изучить структуру документа, загруженного в браузер. Так, например, можно загрузить вышеописанным способом <code>browser.xul</code>, просмотреть все его узлы и найти подходящий для наложения оверлея. Или же можно просматривать структуру своего расширения.</p>
<h3 id=".D0.9E.D1.82.D0.BB.D0.B0.D0.B4.D0.BA.D0.B0_.D1.80.D0.B0.D1.81.D1.88.D0.B8.D1.80.D0.B5.D0.BD.D0.B8.D0.B9" name=".D0.9E.D1.82.D0.BB.D0.B0.D0.B4.D0.BA.D0.B0_.D1.80.D0.B0.D1.81.D1.88.D0.B8.D1.80.D0.B5.D0.BD.D0.B8.D0.B9">Отладка расширений</h3>
<p><strong>Инструменты для анализа расширений</strong></p>
<ul>
<li><a href="/en/DOM_Inspector">en:DOM Inspector</a></li>
<li><a href="/en/Venkman">en:Venkman</a> - установка точек прерываний и просмотр стеков вызова</li>
<li><code><a href="/en/Core_JavaScript_1.5_Reference/Objects/Function/arguments/callee">arguments.callee</a>.<a href="/en/Core_JavaScript_1.5_Reference/Objects/Function/caller">caller</a></code> в JavaScript - доступ к стеку функций</li>
</ul>
<p><strong>Отладочная распечатка</strong></p>
<ul>
<li><code><a href="/en/DOM/window.dump">dump</a>("string")</code></li>
<li><code><a href="/en/nsIConsoleService">en:nsIConsoleService</a></code></li>
</ul>
<h3 id=".D0.94.D0.BE.D0.BF.D0.BE.D0.BB.D0.BD.D0.B8.D1.82.D0.B5.D0.BB.D1.8C.D0.BD.D0.B0.D1.8F_.D0.B8.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D1.8F" name=".D0.94.D0.BE.D0.BF.D0.BE.D0.BB.D0.BD.D0.B8.D1.82.D0.B5.D0.BB.D1.8C.D0.BD.D0.B0.D1.8F_.D0.B8.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D1.8F">Дополнительная информация</h3>
<ul>
<li><a href="/en/Extension_FAQ">en:Extension FAQ</a></li>
<li><a href="/ru/Расширения" title="ru/Расширения">Extensions</a></li>
</ul>
|