11 июня 2010

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

Переводим скрипты. Работаем с патчами.

В этой статье мы поговорим о русификации скриптов. Есть несколько разных способов русификации:

  1. Скрипт — текстовый файл, поэтому можно открыть его в текстовом редакторе и изменить необходимые строки.
  2. Кроме того, распространять можно как уже переведенный файл, так и патч-русификацию (об этом мы поговорим дальше).
  3. Можно внедрить в скрипт поддержку интернационализации и дальше переводить так, как описано в предыдущих статьях.
  4. Все строки можно вынести в отдельные, подключаемые скрипты (по числу языков). В подключаемом скрипте строки (на нужном языке) назначаются переменным, а основной скрипт при выдаче сообщений использует эти переменные.

Первый способ — самый простой. Переведя все строки, можно собрать измененные файлы в архив с сохранением исходных путей относительно корня файловой системы. Желающий получить перевод должен будет лишь распаковать получившийся архив в корень файловой системы и согласиться с заменой исходных файлов на переведенные.

Второй способ — модификация первого. Перевод осуществляется так же. Другой лишь подход к собиранию переведенных строк. Этот второй способ может нам здóрово помочь в переходе к третьему способу.

Третий способ — самый правильный для международного дистрибутива. Полностью разделяется работа программиста и переводчика, при этом программист может постоянно улучшать код своих скриптов, которые будут использовать уже существующие переводы (или английский язык при их отсутствии). В SliTaz с этим еще много работы, и непростой работы, если начинать «с нуля».

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

 

Итак, начало. Что и как переводить?

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

Комментарии начинаются с символа «#» и идут до конца строки. Переводить их совсем не обязательно, и даже противопоказано. Программист-француз вряд ли поймет русские комментарии, а вот английские — пожалуйста.

В простых скриптах строки заключены в "двойные" или 'одинарные' кавычки. Кавычки эти имеют разный смысл. Внутри двойных кавычек название переменной заменяется на ее содержимое. Например,

NAME="lexeii"          # Назначаем переменную
echo "Hello, $NAME"    # Выдаст: Hello, lexeii
echo 'Hello, $NAME'    # Выдаст: Hello, $NAME

Если в строку, заключенную в двойные кавычки, требуется вставить символ двойной кавычки, его нужно «экранировать» символом «\»:

echo "Вставляем \"двойные\" кавычки"

Существуют еще `наклонные` кавычки. Внутри них записывается `команда`. Содержимое `команды` заменяется на ее вывод. Например, команда date выдает текущую дату и время:

date

выдаст

Чтв Июн 10 19:31:29 UTC 2010

Следующая команда

echo "Сегодня: `date`. Желаю хорошо провести день"

выдаст

Сегодня: Чтв Июн 10 19:31:29 UTC 2010. Желаю хорошо провести день

Иногда длинные строки (которые не помещаются в окне текстового редактора) программисты разбивают на несколько строк скрипта при помощи символа «\» в конце строки. Пример:

echo "Привет луна\    # не поместилось :)
тикам!"

Выдаст

Привет лунатикам!

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

Во-первых, скрипт может вывести окошко терминала, запустить там какие-то команды и напечатать необходимую информацию. Код выглядит так:

xterm -T "Заголовок терминала" -geometry 80x16 -e "команды"

80x16 — это ширина и высота окна терминала (в символах). Переводить нужно, понятно, заголовок и текстовые строки (при наличии) в командах терминала.

Во-вторых, скрипт может вывести и обычные диалоговые окна, которые ничем не отличаются от окон, выводимых программами, написанными на C. Для этого используются вкрапления в код специального языка описания диалогов — XDialog (GTKDialog), также для консоли может использоваться Dialog.

В скрипте переменной назначается специально сформированная строка, описывающая диалоговое окно, затем эта переменная экспортируется и вызывается соответствующая программа, выдающая диалог. Здесь тоже нужно хоть немного разбираться в коде для того, чтобы вычленять из него структуры, требующие перевода. Диалоги описываются на языке, основанном на XML. Он хорошо подходит для описания древовидной структуры, когда одни элементы вложены в другие. Элементы состоят из открывающего тега, содержимого элемента и закрывающего тега. Элементы могут содержать параметры. Теги ограничены угловыми скобками. Думаю, простой вымышленный пример всё объяснит.

<элемент отображается="да" ширина="10">
    ... содержимое элемента ...
</элемент>

Некоторые элементы могут быть пустыми:

<пустой-элемент тень="10;10" цвет="#334455" />

Теперь о том, что можно переводить.

<window title="Заголовок окна">

<label>текст ярлыка</label> или

<label>"текст ярлыка c <b>разметкой</b>"</label>

<frame заголовок рамки >

Это — самые ходовые элементы, которые можно перевести. Возможно, вы встретите и другие. Обкатайте скрипт со всех сторон, если что-то не переведено, найдите эту строку в скрипте и попробуйте перевести. Чаще всего строки заключены в кавычки.

Вот и всё, что я хотел сказать о, собственно, переводе. Второй этап — создать патч на основе переведенного файла. Обо всём разнообразии патчей вы можете узнать в Википедии. Здесь я расскажу только об одном их виде. Патч — небольшой по размеру текстовый файл, который содержит изменения и правила, по которым эти изменения нужно вносить. Патч применяется к одному, конкретному, файлу и в результате получается другой, конкретно определенный файл. В данном случае, из оригинального скрипта получится русифицированный. Если оригинальный файл будет как-либо изменен, патч применить к нему уже будет нельзя.

Патч создается при помощи команды diff. Команда diff, входящая в состав busybox, несколько урезана в возможностях, но нам этого хватает. Сравнивается оригинал с измененным файлом и создается третий файл, патч:

diff -ad -U 0 файл/оригинала измененный/файл > файл/содержащий/изменения.diff

например:

diff -ad -U 0 /usr/bin/desktopbox ~/translate/usr/bin/desktopbox > ~/diffs/usr/bin/desktopbox.diff

Применяется патч следующей командой:

patch -i файл.diff

В команде указывается только название файла-патча. Информация о том, к какому файлу патч должен применяться, лежит внутри самого патча. Давайте откроем его в текстовом редакторе. В начале файла мы видим две строки, обозначенные минусами (то, что было) и плюсами (то, что будет). Рекомендую вручную исправить так, чтобы эти два адреса были одинаковыми и указывали на исходный файл. Далее в файле (благодаря тому, что мы указали опцию «-U 0») мы видим только правила (номера изменяемых строк), что было (минус — удалить строку) и то, что будет (плюс — добавить). Без этой опции мы бы видели еще парочку окружающих строк, находящихся выше и ниже изменения. Это удобно человеку, желающему разобраться в сути изменений, но не нужно для наших целей.

Кроме того, что этот патч выполняет свои, чисто утилитарные функции, он еще может служить справочником строк скрипта, которые требуют интернационализации. Ведь проще работать, когда нет ничего лишнего. Вот только, для интернационализации совсем не нужно переводить строки; их нужно каким-то образом пометить, например, поставить в начале строки пробел. После этого создать патч, как описано выше. Затем интернационализировать строки и применить патч. Переделанный скрипт (вместе с файлами *.po) можно отослать разработчику SliTaz.

Вопрос, собственно, интернационализации, остается за пределами этой статьи. Но он подробно описан на сайте SliTaz.

1 комментарий:

  1. Не стоит тратить время на перевод скрипта каким-либо отличным от 3 способом. Надо сначала интернационализовать и добиться включения в дистр скрипта с поддержкой gettext, а потом делать перевод. Чесно говоря не понял зачем тут patch/diff, я писал тут как можно делать: http://labs.slitaz.org/wiki/i18n/Notes В скриптах подход такой же как в программах на Си, английские строки оборачиваются вызовом к gettext и дальше как обычно.

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