Как я и обещал, продолжаем рассказ про локализацию браузера.
Это будет довольно длинный текст, поэтому я сразу скажу, что внимательно прочитавшие его целиком получат в награду:
Но сперва надо сказать пару слов о структуре локали в целом.
Ввиду изначальной "гибридности" интерфейса (движок Gecko + собственная оболочка на "родных" библиотеках Windows) и файлы локализации K-Meleon также разнородны.
Это будет довольно длинный текст, поэтому я сразу скажу, что внимательно прочитавшие его целиком получат в награду:
- архив с расширением OpenDir - оно добавляет в меню пункты открытия в Проводнике каталогов сохранения загружаемых файлов и веб-страниц (если Вы настроили такие папки для K-Meleon);
- архив новейшего и максимально адаптированного к КМ AdBlockPlus, с возможностью блокировки отдельных элементов на странице, а также с встроенной легкой подпиской, благодаря которой реклама режется почти так же эффективно, как со стандартными подписками, но без повышения расхода оперативной памяти, характерного для АдБлока в стандартной конфигурации;
- собственно, архив со свежайшей русской локалью для всех сборок K-Meleon 75.
Но сперва надо сказать пару слов о структуре локали в целом.
Ввиду изначальной "гибридности" интерфейса (движок Gecko + собственная оболочка на "родных" библиотеках Windows) и файлы локализации K-Meleon также разнородны.
Их всего 3 типа:
"Родная" локаль браузера
Она, конечно, английская (хотя разработчик K-Meleon француз).
Exe- и dll-файлы содержат все необходимые строковые переменные (strings) внутри себя.
Локаль "хрома" находится вместе с собственным xul-инструментарием K-Meleon в файле browser\omni.ja (соблюдается архитектурный стандарт Firefox) в подпапке en-US.
Собственный интерфейс КМ изначально нативно англифицирован - все меню, диалоги, подписи и сообщения, определяемые файлами конфигурации, вписаны в них сразу на английском языке.
Далее же мы опишем собственно способы перевода всего этого добра на другие языки.
Локализация библиотек и k-meleon.exe
Dll-библиотеки локализуются с помощью редакторов ресурсов исполняемых файлов и библиотек, и об этом мы расскажем в отдельном посте. Сейчас скажу лишь, что необходимость править библиотеки возникает крайне редко, и на самом деле это гораздо проще, чем кажется. Я использую для этой работы программу ResourceHackerFX.
Локализация "хрома" Gecko
Традиционно chrome в Gecko-браузерах пишется на XUL и пакуется в jar-файлы (фактически это zip-архивы с расширением jar).
При создании jar-пакетов соблюдаются определенные конвенции - правила формирования файловой структуры пакета. Составляющие XUL-приложения - собственно элементы интерфейса в формате xul (напомню, что это частный случай XML-разметки), используемые скрипты (js-файлы) и, если нужны, модули (jsm-файлы) - раскладываются в папки по разумению разработчика, но все это вместе помещается в каталог 'content', рядом с которым помещается каталог локали, т.е. набор необходимых файлов с текстовыми переменными, собственно и являющимися теми сообщениями (пунктами меню, подписями, подсказками), что пользователь видит на той или иной странице или в интерфейсе управления.
Файлы текстовой локализации имеют расширения .dtd или .properties для текстовых записей xul- и js-файлов соответственно. Подробнее прочитать об этом можно здесь.
Это все была присказка. Сказка заключается в том, что K-Meleon, в отличие от Firefox - многоязычное приложение. Т.е. язык браузера может быть изменен в любой момент простым переключением в Настройках (Firefox изначально одноязычен, и, хотя к нему можно скачать отдельные локали, переключать их можно только правкой скрытых параметров в about:config).
В коробке у КМ всего несколько языков (покрывающих практически всех пользователей мира - ведь трудно в наше время найти человека, не знающего одновременно английского, русского, немецкого, испанского, французского и китайского языков).
Для поддержки многоязычности КМ, собственно и запрограммирован на интеграцию дополнительных локалей из папки locales.
"Хром" локализуется довольно просто - jar-файлом, в котором есть только нужная нам локаль.
Что нам важно знать о ее создании:
K-Meleon75\browser\omni.ja\chrome\en-US\locale\kmprefs\pref-kfullscreen.dtd :
<!ENTITY fullscreen.header "Full Screen Plugin">
K-Meleon75\locales\ru\ru.jar\kmprefs\pref-kfullscreen.dtd :
<!ENTITY fullscreen.header "Модуль полноэкранного режима">
(особо внимательный читатель заметит, что приведенный пример вроде бы локализует k-плагин fullscreen.dll, однако на самом деле, как я и говорил, библиотеки локализуются внутри самих себя - в корневой папке русской локали лежит локализованный файл fullscreen.dll, а приведенный dtd-файл отвечает за описание k-плагина в XUL-модуле Настроек, т.е. как раз в "хроме").
На этом с локализацией "хрома" можно закончить (все равно, надо пробовать проделать все это самому, ибо "проста запомнытэ это, дэты, ибо панят эта нэвазможна" ©)
Локализация родного интерфейса K-Meleon и макрорасширений
На самом деле отделить сторонние макросы от "встроенных" по формальным признакам принципиально невозможно, да и незачем: сила КМ как раз в модульной структуре, в результате чего любой достаточно удобный и полезный сторонний макрос может со временем стать частью "браузера из коробки". Формально, main.kmm ничем не отличается от какого-нибудь скромного downloads.kmm из одной функции, добавляющей ровно 1 пункт меню.
Но это еще и облегчает перевод.
Т.е., как вы догадались, можно было тупо создать копии всех файлов конфигурации с "прописанными" внутри стрингами на нужном языке, но тогда теряется возможность быстрой смены языка (технически можно создать наборы необходимых конфигов для каждого языка, но менять их пришлось бы копированием всей этой банды файлов поверх имеющихся и перезагрузкой браузера). А так мы просто переводим только сами стринги. Это и легче, и удобнее, чем "хардкодить" перевод прямо в конфигах.
Текстовые выражения из файлов конфигурации K-Meleon переводятся с помощью kml-файлов. В принципе, нет никакой технической ошибки в том, чтобы соорудить весь перевод этой части в одном файле kmeleon.kml - собственно, там и так переведена основная часть всего массива требующих перевода строк.
Но архитектурно правильнее иметь для каждого отдельно распространяемого макроса свой файл локализации. (для примера скачайте свежеобновленное расширение OpenDir и загляните внутрь архива).
Теперь о том, как локализовывать нелокализованное.
Это могут быть новые текстовые строки, появляющиеся в интерфейсе браузера по мере его развития - но это бывает нечасто, и обычно это работа майнтейнера, т.е. моя ;-). Гораздо актуальнее для пользователя ситуация, когда он скачал расширение, а оно нелокализовано (нас мало, и руки дошли пока до перевода примерно 20-30 расширений из всего массива в несколько сот макросов).
Так вот, можно очень легко сделать это самому (если, конечно, знаете английский). Совсем просто, если в архиве расширения, как в
OpenDir, есть заготовка для локализации (обычно это файл locales\others\имямакроса.kml). Тогда надо просто перевести уже отобранные строки.
Если же такой заготовки нет, вам придется немного попотеть - просмотреть код макроса и выбрать оттуда подлежащие переводу строки (обычно это - "закавыченные предложения, вполне связные и осмысленные")
Дальше эти строки собираются в отдельный файл - уже без всяких кавычек (но с амперсандами, если таковые присутствуют в оригинале, ибо эти символы помечают букву, которая будет использоваться для клавиатурной навигации по меню с клавишей Alt) - и через знак равенства (без пробелов вокруг него) мы пишем русский перевод текстового выражения. По 1 строке в файле на каждый string. В общем, просто посмотрите содержимое любого готового kml - например, из того же OpenDir :
# LANGUAGE DEFINITION FILE
#--------------------------------------------------------
# Added by OpenDir Extension (don't edit this comment)
#--------------------------------------------------------
Open Sa&ved Pages Dir=Открыть каталог сохранения страни&ц
Open Do&wnload Dir=Открыть каталог сохранения &загрузок
#--------------------------------------------------------
Здесь строки, начинающиеся с решетки # - это комментарии (неактивные строки, использующиеся для пояснений, примечаний или оформления файла для лучшей читабельности).
Собственно, переводимых строк в этом примере всего 2, как мы видим:
Open Sa&ved Pages Dir
и
Open Do&wnload Dir
В интерфейсе пользователя это будут 2 пункта меню, выглядящие так:
- Локализованные dll-файлы – используются для перевода исполняемого файла браузера k-meleon.exe и собственных k-плагинов (kplugins\*.dll).
- Локализация "внутренностей" движка - той части chrome (не путать с гуглобраузером), что КМ наследует от движка. "Хром" - это все, что составляет интерфейс управления браузером - в нашем случае это "служебные" страницы (протокол about:), информационые сообщения и диалоги, определяемые движком (например, "Ошибка соединения с сетью" или "Управление сертификатами").
- Локализация собственного интерфейса управления K-Meleon - меню, панелей инструментов, макросов (встроенных в "коробку" и сторонних расширений).
"Родная" локаль браузера
Она, конечно, английская (хотя разработчик K-Meleon француз).
Exe- и dll-файлы содержат все необходимые строковые переменные (strings) внутри себя.
Локаль "хрома" находится вместе с собственным xul-инструментарием K-Meleon в файле browser\omni.ja (соблюдается архитектурный стандарт Firefox) в подпапке en-US.
Собственный интерфейс КМ изначально нативно англифицирован - все меню, диалоги, подписи и сообщения, определяемые файлами конфигурации, вписаны в них сразу на английском языке.
Далее же мы опишем собственно способы перевода всего этого добра на другие языки.
Локализация библиотек и k-meleon.exe
Dll-библиотеки локализуются с помощью редакторов ресурсов исполняемых файлов и библиотек, и об этом мы расскажем в отдельном посте. Сейчас скажу лишь, что необходимость править библиотеки возникает крайне редко, и на самом деле это гораздо проще, чем кажется. Я использую для этой работы программу ResourceHackerFX.
Локализация "хрома" Gecko
Традиционно chrome в Gecko-браузерах пишется на XUL и пакуется в jar-файлы (фактически это zip-архивы с расширением jar).
При создании jar-пакетов соблюдаются определенные конвенции - правила формирования файловой структуры пакета. Составляющие XUL-приложения - собственно элементы интерфейса в формате xul (напомню, что это частный случай XML-разметки), используемые скрипты (js-файлы) и, если нужны, модули (jsm-файлы) - раскладываются в папки по разумению разработчика, но все это вместе помещается в каталог 'content', рядом с которым помещается каталог локали, т.е. набор необходимых файлов с текстовыми переменными, собственно и являющимися теми сообщениями (пунктами меню, подписями, подсказками), что пользователь видит на той или иной странице или в интерфейсе управления.
Файлы текстовой локализации имеют расширения .dtd или .properties для текстовых записей xul- и js-файлов соответственно. Подробнее прочитать об этом можно здесь.
Это все была присказка. Сказка заключается в том, что K-Meleon, в отличие от Firefox - многоязычное приложение. Т.е. язык браузера может быть изменен в любой момент простым переключением в Настройках (Firefox изначально одноязычен, и, хотя к нему можно скачать отдельные локали, переключать их можно только правкой скрытых параметров в about:config).
В коробке у КМ всего несколько языков (покрывающих практически всех пользователей мира - ведь трудно в наше время найти человека, не знающего одновременно английского, русского, немецкого, испанского, французского и китайского языков).
Для поддержки многоязычности КМ, собственно и запрограммирован на интеграцию дополнительных локалей из папки locales.
"Хром" локализуется довольно просто - jar-файлом, в котором есть только нужная нам локаль.
Что нам важно знать о ее создании:
- стандартные названия большинства локалей в современных Gecko переведены в короткий формат - ru вместо ru-RU, de вместо de-DE и т.п. Исключение составляют некоторые локали, отвечающие за языки, имеющие несколько диалектов - это и сама основная локаль en-US (в списке локалей Firefox есть британский вариант en-GB), и, к примеру, испанская локаль es-ES (в испанском, кроме общепринятого "кастильского" есть каталонский и другие диалекты);
знать это важно на случай обновления старых chrome-расширений, где уже может быть сделана вся локализация, но из-за старого названия папки локали браузер не "подхватит" ее; - основная часть локализации "хрома" берется из пакета локализации соответствующей версии Firefox (для КМ 75 это Firefox 31 ESR) - внутри xpi-архива нас интересует папка chrome\ru\locale\ru\
- взяв все ее содержимое, мы должны добавить туда переводы для собственного "хрома" K-Meleon - проще всего взять готовую русскую локаль внизу этого поста, залезть внутрь ru.jar (напоминаю, что это простой zip-архив, открываемый почти любым архиватором, но удобнее всего работать с jar-файлами в Total Commander по Ctrl+PgDown) - и сравнить его содержимое с вышеописанной папкой из пакета локализации Firefox.
Определить, что должно быть добавлено для локализации собственного хрома, относительно просто - надо заглянуть в английскую локаль внутри browser\omni.ja и убедиться, что внутренняя структура тамошней папки chrome\en-US\locale точно скопирована в вашей локали внутри jar, и все dtd- и properties-файлы построчно переведены на русский.
K-Meleon75\browser\omni.ja\chrome\en-US\locale\kmprefs\pref-kfullscreen.dtd :
<!ENTITY fullscreen.header "Full Screen Plugin">
K-Meleon75\locales\ru\ru.jar\kmprefs\pref-kfullscreen.dtd :
<!ENTITY fullscreen.header "Модуль полноэкранного режима">
(особо внимательный читатель заметит, что приведенный пример вроде бы локализует k-плагин fullscreen.dll, однако на самом деле, как я и говорил, библиотеки локализуются внутри самих себя - в корневой папке русской локали лежит локализованный файл fullscreen.dll, а приведенный dtd-файл отвечает за описание k-плагина в XUL-модуле Настроек, т.е. как раз в "хроме").
На этом с локализацией "хрома" можно закончить (все равно, надо пробовать проделать все это самому, ибо "проста запомнытэ это, дэты, ибо панят эта нэвазможна" ©)
Локализация родного интерфейса K-Meleon и макрорасширений
На самом деле отделить сторонние макросы от "встроенных" по формальным признакам принципиально невозможно, да и незачем: сила КМ как раз в модульной структуре, в результате чего любой достаточно удобный и полезный сторонний макрос может со временем стать частью "браузера из коробки". Формально, main.kmm ничем не отличается от какого-нибудь скромного downloads.kmm из одной функции, добавляющей ровно 1 пункт меню.
Но это еще и облегчает перевод.
Т.е., как вы догадались, можно было тупо создать копии всех файлов конфигурации с "прописанными" внутри стрингами на нужном языке, но тогда теряется возможность быстрой смены языка (технически можно создать наборы необходимых конфигов для каждого языка, но менять их пришлось бы копированием всей этой банды файлов поверх имеющихся и перезагрузкой браузера). А так мы просто переводим только сами стринги. Это и легче, и удобнее, чем "хардкодить" перевод прямо в конфигах.
Текстовые выражения из файлов конфигурации K-Meleon переводятся с помощью kml-файлов. В принципе, нет никакой технической ошибки в том, чтобы соорудить весь перевод этой части в одном файле kmeleon.kml - собственно, там и так переведена основная часть всего массива требующих перевода строк.
Но архитектурно правильнее иметь для каждого отдельно распространяемого макроса свой файл локализации. (для примера скачайте свежеобновленное расширение OpenDir и загляните внутрь архива).
Теперь о том, как локализовывать нелокализованное.
Это могут быть новые текстовые строки, появляющиеся в интерфейсе браузера по мере его развития - но это бывает нечасто, и обычно это работа майнтейнера, т.е. моя ;-). Гораздо актуальнее для пользователя ситуация, когда он скачал расширение, а оно нелокализовано (нас мало, и руки дошли пока до перевода примерно 20-30 расширений из всего массива в несколько сот макросов).
Так вот, можно очень легко сделать это самому (если, конечно, знаете английский). Совсем просто, если в архиве расширения, как в
OpenDir, есть заготовка для локализации (обычно это файл locales\others\имямакроса.kml). Тогда надо просто перевести уже отобранные строки.
Если же такой заготовки нет, вам придется немного попотеть - просмотреть код макроса и выбрать оттуда подлежащие переводу строки (обычно это - "закавыченные предложения, вполне связные и осмысленные")
Дальше эти строки собираются в отдельный файл - уже без всяких кавычек (но с амперсандами, если таковые присутствуют в оригинале, ибо эти символы помечают букву, которая будет использоваться для клавиатурной навигации по меню с клавишей Alt) - и через знак равенства (без пробелов вокруг него) мы пишем русский перевод текстового выражения. По 1 строке в файле на каждый string. В общем, просто посмотрите содержимое любого готового kml - например, из того же OpenDir :
# LANGUAGE DEFINITION FILE
#--------------------------------------------------------
# Added by OpenDir Extension (don't edit this comment)
#--------------------------------------------------------
Open Sa&ved Pages Dir=Открыть каталог сохранения страни&ц
Open Do&wnload Dir=Открыть каталог сохранения &загрузок
#--------------------------------------------------------
Здесь строки, начинающиеся с решетки # - это комментарии (неактивные строки, использующиеся для пояснений, примечаний или оформления файла для лучшей читабельности).
Собственно, переводимых строк в этом примере всего 2, как мы видим:
Open Sa&ved Pages Dir
и
Open Do&wnload Dir
В интерфейсе пользователя это будут 2 пункта меню, выглядящие так:
А их русские эквиваленты выглядят так (обратите внимание на подчеркнутые буквы - именно они с модификатором Alt обеспечат выбор нужного пункта меню с клавиатуры.
Ровно эту самую работу я проделал, локализуя совсем новый макрос, входящий в состав свежего расширения, адаптирующего для K-Meleon последнюю версию AdBlock Plus 2.6.9. В составе расширения предлагается "легкая подписка" - лучший на сегодняшний день компромисс между качественной фильтрацией и малым расходом памяти. Наш набор фильтров (взятый с Хабрахабра) прекрасно решает обе задачи - вы можете легко проверить это сами - просто скачайте расширение и установите простой распаковкой в свой K-Meleon 75 (годится для всех версий, начиная с 75b3).
Новые профили автоматом будут создаваться с новой подпиской, а вот в существующий профиль надо вручную распаковать этот архив
(если у вас уже стояла другая версия ABP, а вы хотите использовать только легкую подписку, то папку adblockplus в профиле надо очистить).
Для первого раза хватит пока. Пора вознаградить терпеливых читателей тем, ради чего они и пришли в этот пост - новейшей русской локалью из доступных на данный момент.
Скачать локаль для K-Meleon 75 RC2
Новые профили автоматом будут создаваться с новой подпиской, а вот в существующий профиль надо вручную распаковать этот архив
(если у вас уже стояла другая версия ABP, а вы хотите использовать только легкую подписку, то папку adblockplus в профиле надо очистить).
Для первого раза хватит пока. Пора вознаградить терпеливых читателей тем, ради чего они и пришли в этот пост - новейшей русской локалью из доступных на данный момент.
Скачать локаль для K-Meleon 75 RC2