15 мая 2010

Переводим SliTaz на русский язык. Часть 1

В этой заметке я коснусь перевода мини-дистрибутива SliTaz GNU/Linux на русский язык.

Поддержка русского в SliTaz идет «из коробки», но она неполная и, судя по всему, устаревшая. Попробуем исправить это положение.

Во-первых, что мы пока не можем переводить? Это «самодельные» скрипты (home-made, как они пишут), их ещё называют Box. Это shell-скрипты, использующие Xdialog для отрисовки графических диалогов с кнопками, полями ввода и т.п. Русификация скриптов — особая тема. Так как дистрибутив интернациональный и постоянно развивается, нужно отделить работу программиста (улучшающего работу скриптов) от работы переводчика. Т.е. надо отделить строки, требующие перевода (на любой из языков) от самого скрипта. Этот процесс называется интернационализация (i18n). Всё находится в самом начале и далеко от завершения. Пара скриптов уже «интернационализирована» следующим методом. Создаётся shell-скрипт, в котором определенным переменным присваивается текстовое значение. Таких файлов должно быть несколько — по числу поддерживаемых языков. Они должны соответственно называться и лежать в определенной папке. Дальше, основной скрипт в зависимости от текущей локали подключает («инклудит») необходимый скрипт со строками. Теперь основной скрипт может выводить простые переменные, а пользователь увидит строки на своем языке. К сожалению, в этом методе больше минусов, чем плюсов. Нужно придумать толковые названия для всех переменных, чтобы знать, чем оперировать. Когда таких переменных становится много, начинаешь забывать их содержимое. К тому же, скрипты, переведенные таким методом в SliTaz переведены не полностью...

Замечательный способ перевода bash-скриптов описан в BashFAQ/098 — Greg's Wiki. Плюс в том, что перед строками, требующими перевода, ставится знак доллара, вот так:

echo $"Hello, world!"

Почти всё остальное система делает сама. Код при этом остается очень прозрачным. Минусы в том, что данный метод работает, видимо, только для bash, а он не установлен по умолчанию в SliTaz. Но, даже установив bash, я так и не смог заставить заработать этот метод. А жаль... Вместо этого предлагается громоздкий метод, описанный в I18n — Notes — SliTaz Labs. Это настоящая головная боль для программиста, но разработчики обещают, что хотят видеть свой дистрибутив полностью интернационализированным, в том числе и все скрипты, даже загрузочные. Одного желания мало, но когда скрипты будут интернационализированы, я с удовольствием возьмусь за перевод строк. В общем, откладываем это дело в долгий ящик.

Теперь можно рассказать, что можно русифицировать уже сейчас. Запускаем LiveCD, в строке приглашения (которая пропадет через несколько секунд) вводим ru и нажимаем Enter. Дальше можно ввести еще несколько параметров, а можно еще раз нажать Enter (или подождать несколько секунд) — после загрузки системы у нас будет частичная русификация. Вот, от этой печки мы и будем плясать дальше.

Переводим пункты меню.

В папке /usr/share/desktop-directories/ лежат файлы с расширением «directory», они описывают разделы меню — Мультимедиа, Офис, Система... Русский язык уже есть, но я вношу сюда некоторые изменения.

В папке /usr/share/applications/ лежат файлы с расширением «desktop», они описывают пункты меню. Русского здесь, как говорится, раз-два и обчёлся. Структура desktop-файлов (и directory-файлов) описана в официальном документе Desktop Entry Specification. Рекомендую ознакомиться с этой спецификацией.

Сложного тут нет ничего. Вот, к примеру, содержимое файла epdfview.desktop:

[Desktop Entry]
Encoding=UTF-8
Name=ePDFView PDF Viewer
Name[es]=ePDFView Visor PDF
Name[fr]=ePDFView Visionneur PDF
Name[pt]=ePDFView Visualizador de PDF
Name[zh_CN]=PDF浏览器
Comment=Lightweight PDF document viewer
Comment[es]=Visor de documentos PDF ligero
Comment[fr]=Visionneur de documents PDF léger
Comment[zh_CN]=轻量级PDF浏览器
Exec=epdfview %f
Icon=epdfview.png
MimeType=application/pdf
Terminal=false
Type=Application
Categories=Office;

Кодировка обязательно должна быть UTF-8; даже если это не указано явно, это всё равно подразумевается. Строка Name описывает имя программы по-английски, Comment — всплывающую подсказку при наведении мышки на данный пункт меню. Строки могут идти в любом порядке. Добавляем в соответствующие места наши строки с переводом:

Name[ru]=Программа просмотра PDF ePDFView
Comment[ru]=Легковесная программа просмотра документов PDF

Переводим таким образом все файлы в этой папке и получаем полностью русифицированное меню. При установке новых программ в меню будут появляться новые пункты, и редко какая программа имеет русские строки в меню. Переводим их так же. Кроме того, несколько desktop-файлов можно найти в папках /etc/skel/.local/share/applications/ (не забудьте включить показ скрытых файлов и папок) и /etc/skel/Desktop/. Папка /etc/skel/ — «скелет» папки пользователя, ее содержимое используется как основа для вновь создаваемых пользователей.

Переводим приложения с поддержкой gettext.

Для начала, установим пакет с русской локалью. Там есть уже несколько переведенных приложений.

tazpkg get-install locale-ru

В папке /usr/share/locale/ru/LC_MESSAGES появятся файлы asunder.mo, epdfview.mo, galculator.mo... (всего 13 файлов). Но это не все приложения, установленные в системе (например, французская локаль, как наиболее развитая, включает в себя 38 файлов), да и переводы местами старые и неполные.

Технически, получается, что если в этой папке имеется файл, с таким же именем (обычно), как и программа, то программа автоматически становится русифицированная. Наша задача — поместить туда эти файлы.

Во-первых, стоит поискать файлы «mo» в бинарных пакетах на сайте разработчика. Как узнать этот сайт? Проще простого! Находим возле часов значок в виде открытой коробки, дважды кликаем на нём, запускается SliTaz Packages Manager, в котором мы видим список всех установленных пакетов. Двойной щелчок на нужном пакете выводит информацию о пакете, кроме всего прочего тут есть строчка «Website» (двойной клик для перехода). На сайте находим раздел «Download» и загружаем бинарный пакет или исходники. Очень желательно, чтобы совпадали версии установленной у вас программы и скачанной с сайта, иначе может потребоваться дополнительное «допиливание», зачастую сложное (придется обкатывать программу во всех режимах, открывать все ее окна и допускать все возможные ошибки в поисках непереведенных строк).

Остается «препарировать» скачанный бинарный пакет и вытащить из него «mo» (или вытащить «po» из тарбола с исходниками; что с ним делать дальше, рассмотрим потом). Существует несколько форматов пакетов, и для того, чтобы не заморачиваться с командами для распаковки, я нашел для себя универсальное решение — Universal Extractor. Программа работает в Windows, она автоматически распознаёт формат файлов по их содержимому, понимает большое количество форматов пакетов, архивов, установщиков. В использовании для этих целей Windows я не вижу ничего зазорного — так мне удобнее, быстрее, к тому же, на нетбуке у меня установлена вполне лицензионная Windows с голографической наклейкой.

При переносе файлов из не-linux-разделов следите за правами доступа к файлам, они должны быть rw-r--r-- (читать имеют право все, записывать — владелец, исполнять — нет надобности). Писать (читай — заносить файлы) в папку с локалями позволено только root.

Теперь о файлах «po». Вообще, в чём различие между «mo» и «po» («pot»)? Файлы «mo» больше подходят для машины, они бинарные и позволяют утилите gettext быстро найти перевод необходимой строки. Файлы «po» — текстовые, предназначены для переводчиков. В принципе, их можно править даже в любимом текстовом редакторе. Буква «t» в слове «pot» обозначает «template» — шаблон, файл с пустым переводом, содержит только строки, которые нужно перевести.

Для работы с этими файлами устанавливаем полный пакет gettext (команда tazpkg get-install gettext). Теперь мы можем преобразовывать форматы:

из «po» в «mo»: mgsfmt имя_файла.po -o имя_файла.mo
из «mo» в «po»: mgsunfmt имя_файла.mo -o имя_файла.po

Для правки файлов «po» рекомендую простой текстовый редактор LeafPad, он может понадобиться нам для добавления в файл новых строк, требующих перевода. А, собственно переводом, комфортно заниматься в программе Poedit (устанавливаем — tazpkg get-install poedit acl. Здесь acl — зависимость, которую забыли упомянуть, и которую мы дополнительно устанавливаем).

При первом запуске Poedit пожелает познакомиться с вами — введите ваши имя и фамилию (обычно это пишется транслитом, вот так — Aleksej Bobylev) и адрес электронной почты. Эта информация будет помещаться в каждый переводимый вами файл в строке «Last Translator» (последним этот файл переводил...). Не стесняйтесь, возможно, кто-то захочет связаться с вами по поводу переводов. Изменить эту информацию можно в любое время в Poedit в меню Правка — Установки.

Допустим, к какой-то программе мы не нашли ни 'mo', ни 'po', и будем переводить ее самостоятельно. Такая программа — Sudoku Savant. Выполняем нашу работу от имени root. Заходим в папку с французской локалью /usr/share/locale/fr/LC_MESSAGES/ и видим там файл sudoku-savant.mo. Нажимаем F4, чтобы вызвать терминал в данной папке (если терминал еще не определен, выберите xterm). В окне терминала командуем:

msgunfmt sudoku-savant.mo -o sudoku-savant.po

Не забывайте активно пользоваться клавишей Tab для автоматического дополнения имени файла. Вводим первые три буквы имени «sud» и нажимаем Tab. Получившийся «po»-файл переносим в надежное место — в домашнюю папку, на флешку или раздел жесткого диска. Теперь нажатием на этот файл открываем его в Poedit. Сразу заходим в меню Каталог — Настройки, на вкладке «Информация о проекте» исправляем или вводим значения.

  • «Название проекта и версия»: пишем «Sudoku Savant 1.2.1» (версию и название узнаём обычно из Help — About).
  • «Команда» и «E-mail адрес команды» — я переводчик-одиночка, поэтому — пусто.
  • «Язык» — обязательно выбираем «Russian» из списка.
  • «Страна» — я оставляю поле пустым, подразумевая тем, что этот перевод подойдет для русскоговорящих из любой страны.
  • «Кодировка» — utf-8 — хороший выбор, тем более, выбирать-то особо и не из чего.
  • «Кодировка исходного кода» — можно оставить пустой, т.к. исходный код обычно английский, и он одинаков в разных кодировках.
  • «Формы множественного числа» — если переводимая программа использует множественное число (например, 1 минута, 2 минуты, 5 минут), то обязательно введите в это поле такую хитрую строку для русского языка:
    nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 
    && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);
    (набирать в одну строку!)

Теперь можем заняться, собственно, переводом. На верхней панели кнопки «Открыть», «Сохранить», неактивная кнопка «Обновить», кнопка с облаком «Неточный перевод», «Комментарий», «Во весь экран». Основное пространство занимают строки. Непереведенные и неточно переведенные строки Poedit автоматически помещает вверх списка. Слева помещается особый значок для свежих и автоматических правок.

У нас теперь есть небольшое преимущество. Мы можем переводить как с английского, так и с французского языка. Хочу сказать пару слов о кавычках. Англичане используют `такие' кавычки, русские и французы — «такие», а немцы — »такие«. Не будем оригинальничать, и применим наши родные кавычки «лапками», как и положено. Как же их ввести с клавиатуры? Очень просто! Но для этого сначала нам нужно настроить ввод, зато — раз и навсегда. Открываем /etc/X11/xorg.conf в LeafPad, находим раздел, посвященный клавиатуре и переписываем его так, как у меня:

Section "InputDevice"
  Identifier  "Keyboard0"
  Driver      "kbd"
  Option      "XkbRules"    "xorg"
  Option      "XkbModel"    "pc105"
  Option      "XkbLayout"   "us,ru"
  Option      "XkbVariant"  ",winkeys"
  Option      "XkbOptions"  "grp:ctrl_shift_toggle,
                             grp_led:scroll,
                             compose:rwin"
EndSection

(Строку с XkbOption наберите в одну строку!)

Вы можете творчески переделать эти настройки, тем более вариантов сделать одно и то же существует много. Если вы просто скопируете, тогда раскладка клавиатуры будет переключаться одновременным нажатием [Ctrl] и [Shift], при установленной русской раскладке будет гореть светодиод «Scroll Lock», и самое главное — правая клавиша с эмблемой Windows будет включать режим Compose. Сохраняем этот файл. Применяем изменения — у меня SliTaz стоит в режиме LiveUSB, поэтому я открываю меню правой кнопкой на рабочем столе и сохраняю образ со сжатием взамен старого.

Пользоваться режимом Compose легко и приятно! Можно даже добавлять свои комбинации (но это — тема другой статьи). Пока же воспользуемся тем, что уже есть. Нажмем нашу кнопку. Дальше в английской раскладке два раза нажмем символ < (этот симол вводится с [Shift], кто не помнит). Готово! У нас появился символ «. Кроме того >> дает », --- дает —, Oc (латинские буквы!) дает ©. Кроме того существует еще огромное количество других комбинаций, просто представьте себе, из чего можно составить символ, и скомбинируйте его.

Переводим все строки. Сохраняем. В той же папке у нас появится файл с расширением «mo». Копируем его в папку с локалями /usr/share/locale/ru/LC_MESSAGES. Запускаем программу: Меню — Игры — Исследователь судоку. Проверяем качество нашего перевода. Возможно, где-то нужно перевести по-другому. Ведь самое главное при переводе — перевести смысл, а не сделать дословный перевод. При необходимости возвращаемся в Poedit и изменяем перевод. И так до тех пор, пока перевод не удовлетворит нас.

Кроме такого, ручного, перевода, Poedit позволяет производить и автоматический перевод на основе памяти переводов. Для этого перейдите Меню — Правка — Установки — Память переводов. Нужно выбрать русский язык и сгенерировать базу данных. Теперь можно будет нажать правую кнопку мыши на непереведенной строке и Poedit предложит готовые переводы похожих строк из просканированных «mo»-файлов. Также можно выбрать Меню — Каталог — Перевести автоматически, используя ПП.

Вот и вся премудрость в использовании Poedit. Он имеет еще несколько возможностей, но для меня они неактуальны.

Может случиться так, что мы добросовестно перевели все строки, а всё равно непереведенные строки остались в программе. Скорее всего, это говорит о том, что программа у нас новее, чем файл перевода. Можно попробовать добавить эти строки. Открываем «po» в LeafPad и видим простую структуру. После служебных заголовков строки идут попарно — оригинал и перевод. Вот так:

msgid="original"
msgstr="перевод"

Стоит отметить, что строки располагаются по алфавиту — так легче искать, но это не обязательное требование. Аккуратно прописываем нашу строку. Обратите внимание, что кавычка в тексте должна быть «экранирована» символом «бэкслэш», вот так: \", переход на новую строку — комбинация \n, табуляция — \t. Кроме того, в исходных строках могут стоять пробелы в начале или в конце строки. В общем, лучше получить «po» файл у разработчика, и соответствующей версии; но иногда можно обойтись «малой кровью» — решать вам.

На этом тема перевода не заканчивается. Ждите продолжения.

Если есть желающие заняться переводом SliTaz на русский язык, нам стоит объединить усилия. Пишите мне!

В заключение — файлы для загрузки. Перевод еще далек от завершения, вот текущий срез:

Обновление от 29 мая: папка с файлами mo перезалита, т.к. в прошлый раз я не обращал внимания на права доступа, и, как результат, некоторые переводы были доступны только для root:

В первом архиве имеются хорошие, окончательные переводы для программ nano, mtPaint, lxpanel. А galculator — это вообще моя гордость! :) Остальные переводы пока не завершены, хотя могут быть и на 90%.

Второй архив содержит патчи для перевода многих скриптов. Что с этим делать дальше — я научу потом. Но так можно увидеть, какие скрипты уже переведены.

В следующих статьях мы научимся работать с патчами и научимся создавать языковые пакеты из исходных текстов.

Желаю вам удачи!

5 комментариев:

  1. Это все конечно круто, но вопрос в том как переводить скрипты типа tazpkgbox: через gettext, через переменные(как slitaz-installer например) или просто скрипт редактировать(последний проще и раза в 3-4 быстрее)???

    ОтветитьУдалить
  2. А как бы русифицировать консоль?

    ОтветитьУдалить
  3. Перевод через переменные, imho, худший вариант, и от него нужно избавляться. Я для себя решил так. Перевожу скрипты, дальше делаю патч. Потом солью все эти патчи в один скрипт. Там всё очень наглядно - строка оригинала и строка перевода. Если кто-то захочет потом интернационализировать исходные скрипты для поддержки gettext, то проще всего это будет сделать на основе этих же патчей. А потом всё же нужно вливаться в сообщество и продвигать русификацию в cooking.

    Консоль еще не русифицировал, но уже перевел несколько стартовых скриптов. В результате вижу квадраты вместо русских букв. Помнится мне, в сети есть много мануалов по этому вопросу. В иксах у меня работает nano красиво и по-русски. А с консолью обязательно разберемся.

    ОтветитьУдалить
  4. Привет, Алексей!

    Это я писал кусок про "громоздкий метод" на http://labs.slitaz.org/wiki/i18n/Notes и сагитировал Кристофа (pansko) двигать Slitaz в направлении gettext и UTF-8. Со всеми недостатками gettext лучше еще ничего не придумано. Было еще в роадмапе 2.0 запланировано да как-то все откладывалось... Я смотрю в 3.0 уже сразу поддержка gettext и UTF-8 и осталось только скрипты править и делать po-переводы? Отличная новость! Пиши мне на sin@rulinux.net.ru если будут вопросы по переводу скриптов. Я рад что кто-то подхватил эстафету. Так держать!

    Сергей
    http://rulinux.net.ru/

    ОтветитьУдалить
  5. Если Вы заинтересованы в инструменте, который обеспечивает быстрый и эффективный перевод тем и плагинов WordPress, я рекомендую Вам использовать этот инструмент на базе web: https://poeditor.com/ Особенностью данного инструмента является наличие плагина, который Вы можете использовать для интеграции его API в Ваш WordPress. Это позволяет Вам сэкономить значительное время на процессе организации файлов. Пожалуйста, пройдите по этой ссылке: http://wordpress.org/extend/plugins/poeditor/

    ОтветитьУдалить