Локализация Firefox-дополнений (XUL, Java Script, install.rdf)

Локализация Firefox-дополнений (XUL, Java Script, install.rdf)

iSergium

Локализация Firefox-дополнений - это способ научить их разговаривать на разных языках. Её мы частично разобрали в одной из прошлых статей здесь. Пришло время разобрать её подробней.

Известить дополнение о наличии локализаций необходимо в файле chrome.manifest правилом locale. Пример подключения локализации:

locale 4pdainspector ru-RU locale/ru-RU/
locale 4pdainspector en-US locale/en-US/

Эта запись говорит о том, что русская (ru-RU) локализация для пакета 4pdainspector находится в папке locale/ru-RU/, английская (en-US) - в папке locale/en-US/. Соответственно, если язык браузера русский - срабатывает первое условие, если английский (или любой иной) - второе. Полный список поддерживаемых языков и их коды можно подсмотреть в настройках Firefox во вкладке "Содержимое" в пункте "Языки".

Называть папки можно как угодно, лишь бы на латинице, но для своего же удобства советую придерживаться вышеуказанного формата. Слэши в конце пути папок обязательны. Сам путь до папки должен быть относительным к файлу chrome.manifest.

Локализация XUL

Сам файл локализации XUL хранится в папке локализации (например, locale/ru-RU/), имеет разрешение *.dtd и подобный этому синтаксис:

...
<!ENTITY Messages "Сообщения">
<!ENTITY Favorites "Избранные темы">
<!ENTITY Settings "Настройки">
...

Всё просто - <!ENTITY текстовая_константа "перевод">

В XUL-файле прежде чем использовать переводы нужно подключить файл локализации, желательно ближе к началу, например в самом начале:

<?xml version="1.0"?>
<!DOCTYPE overlay SYSTEM "chrome://4pdainspector/locale/overlay.dtd">
...

Указывать язык не надо, Firefox всё сделает сам - заменит locale/ на путь, указанный в chrome.manifest. Сами переводы в тексте используются так: &текстовая_константа;

Например:

<vbox class="menuItem" tooltiptext="&Settings;" id="inspector_openSettings">

В vbox устанавливается всплывающий текст из константы Settings, в русской локализации она имеет значение "Настройки".

Локализация XUL

Локализация Java Script

Файлы локализации JavaScript имеют другое разрешение и другой формат. Хранить их надо в тех же папках локализации, что и *.dtd. Сам файл имеет разрешение *.properties и имеет формат попроще:

Unread Topics=Непрочитанных тем
New Messages=Новых сообщений
You Are Not Authorized=Вы не авторизованы

Всё предельно просто: текстовая_константа=перевод.

Вариаций на подключение локализации в Java Script несколько, приведу самый простой (и даже рабочий) вариант:

var stringBundle = Services.strings.createBundle("chrome://4pdainspector/locale/strings.properties")

Замечания относительно пути уместны и здесь. Слова из переменной stringBundle берутся так:

stringBundle.GetStringFromName("Unread Topics")

Возвращается строка, не требующая каких-либо преобразований - взял и сразу используй.

Локализация install.rdf

Для локализации описания используется свойство <em:localized>, за выбор локали отвечается свойство <em:locale>. Например, с учетом переводов install.rdf у дополнения "4PDA Инспектор" стал таким (неинтересное заменено многоточиями):

<?xml version="1.0"?>
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:em="http://www.mozilla.org/2004/em-rdf#">
<Description about="urn:mozilla:install-manifest">

    ...

    <em:localized>
        <Description>
            <em:locale>ru-RU</em:locale>
            <em:name>4PDA Инспектор</em:name>
            <em:description>Мониторинг изменений на форуме 4pda.ru</em:description>
        </Description>
    </em:localized>
    <em:localized>
        <Description>
            <em:locale>uk</em:locale>
            <em:name>4PDA інспектор</em:name>
            <em:description>Моніторинг змін на форумі 4pda.ru</em:description>
        </Description>
    </em:localized>
    <em:name>4PDA Inspector</em:name>
    <em:description>Monitoring of changes on the forum 4pda.ru</em:description>

    ...

</Description>
</RDF>

То есть, описаны русская и украинская локали, а также локаль по умолчанию - английская. Для добавления еще одной локали достаточно просто написать еще один <em:localized> блок.

4PDA інспектор

Немного дополнительных сведений

1. Как выбирается локаль?

По приоритетам. Для удобства предположим, что у нас заданы локали en-US, ru-RU, uk. Итак, приоритеты:

  1. Локаль с точным совпадением
    Например, язык браузера русский (ru-RU) - какую локаль брать сомнений не возникает - ru-RU.
  2. Локаль совпадает с первой частью языка
    Например, язык браузера указан как украинский (uk-UK) - в данном случае выбирается локаль uk
  3. Локаль с частичным совпадением
    Например, язык браузера указан как английский (Великобритания) (en-GB) - в данном случае выбирается локаль en-US
  4. Ни одно правило не сработало
    При наличии локали по умолчанию (для install.rdf) берется она. В противном случае берется английская локаль, если же её нет, то берется первая по списку.

2. Как добавить новую локализацию?

Допустим, у нас задача добавить корейский язык. Его буквенное обозначение ko (разделение на Северную и Южную нас сейчас не интересует). Наши действия:

Для XUL и JavaScript:

  1. Создать папку locale/ko/ (название может быть любым, но для удобства пожертвуем креативностью)
  2. Скопировать туда ВСЕ файлы из какой-либо другой локализации (или, для неленивых, написать их заново)
  3. Перевести все строки
  4. Добавить строку в chrome.manifest:
    locale 4pdainspector ko locale/ko/
  5. ???
  6. PROFIT!

Для install.rdf:

Просто добавить блок

    <em:localized>
        <Description>
            <em:locale>ko</em:locale>
            <em:name>4PDA 검사기</em:name>
            <em:description>우리 4pda.ru의 모니터링 변경</em:description>
        </Description>
    </em:localized>

Переведено с помощью Переводчика Google

4PDA 검사기

P.S.

Вместо "4pdainspector" следует использовать название вашего пакета.