Alterator/translate
Актуально для alterator-4.17-alt3 alterator-fbi-5.26-alt1
25/10/2010
Перевод в alterator-е. Далее краткий обзор того, как организовать перевод для каждого компонента и какими средствами производить отладку.
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html wf="none" po-domain="MySuper-module" >
<body>
<form method="POST">
<table width="100%">
<tr>
<td align="left">
<span translate="_">New Data</span>
</td>
</tr>
<tr>
</table>
</form>
</body>
</html>
В html важны 2-момента:
- указание в теге <html> атрибута po-domain="MySuper-module". Часто модуль состоит из нескольких компонентов, /MySuper-module/submodule1 /MySuper-module/submodule2 и так далее. Чтобы перевод относился к одному po- и mo- (man gettext) файлу с именем MySuper-module.{po,mo} и поиск осуществлялся именно в нём, и необходим этот "загадочный" po-domain.
- необходимо текст, который будет переведен, брать в тег , так же как это сделано с New Data в примере выше.
AJAX
В данном примере мы при нажатии на кнопку "Create/Add", отображается всплывающее сообщение об ошибке. Так же как и в случаи с html, мы указываем второй параметр (domain) в виде MySuper-module функции (_).
(define-module (ui mySuper-module ajax)
:use-module (alterator woo)
:use-module (alterator ajax)
:export (init))
(define (ui-datadd)
(form-error (_ "This is error text" "MySuper-module"))
)
(define (init)
(form-bind "datadd" "click" ui-datadd)
)
BACKEND
Как и в случаи с html
- po-domain="MySuper-module" в начале shell-cкрипта
- и более интересное с тем как передавать во write_error переведенное сообщение. Вызов subshell в переменной str необходимо делать именно таким образом. По крайней мере на RHEL gettext-0.14.6-4.el5, разобрать конструкцию вида str="$(_ "Epic Faile '%s'")" не может.
#!/bin/sh
#turn of auto expansion
set -f
po-domain="MySuper-module"
alterator_api_version=1
. alterator-sh-functions
addMyData()
{
local test="some value"
local str="`_ "Epic Faile '%s'"`"
do_some_action || write_error "`printf "$str" $test`"
}
on_message(){
case "$in_action" in
new)
[ -n "$in_toBackendData" ] && addMyData "$in_toBackendData"
;;
esac
}
message_loop
После того как backend, ajax и html будут подобным образом подготовлены, необходимо в системе, где производится генерация перевода, поставить пакет alterator, положить исходник пакета alterator-l10n, зайти в директорию alterator-l10n и вызвать ./update_module c путем до исходного кода вашего модуля.
как пример
rpm -q alterator alterator-4.17-1.el5 [root@localhost git]# cd alterator-l10n/ [root@localhost alterator-l10n]# ls alterator-l10n alterator-l10n.spec Makefile [root@localhost alterator-l10n]# cd alterator-l10n [root@localhost alterator-l10n]# ls alterator.pot country-po headers join_po Makefile pot update_desktop utils compendium functions help l10n po tzone-po update_module [root@localhost alterator-l10n]# ls ../../MySuper-module MySuper-module MySuper-module.spec Makefile [root@localhost alterator-l10n]# ls ../../MySuper-module/MySuper-module applications backend3 desktop-directories Makefile ui [root@localhost alterator-l10n]# ./update_module ../../MySuper-module/MySuper-module
Результатом этого действа будут файлы pot/MySuper-module.pot po/{ru,es,..}/MySuper-module.po
Файл po/ru/MySuper-module.po правится (обязательно удаляются строки #fuzzy, иначе в конечный mo-файл они не попадут). После чего оба пакета MySuper-module и alterator-l10n собираются и устанавливаются в систему. При входе на соответствующую страницу alterator-а, получаем результат.
Debug Когда что-то идет не так.
- проверить po/ru/MySuper-module.po на наличие fuzzy строк
- убедится что в po/ru/MySuper-module.po имеются строки из backend-а, html-а, ajax-а
- проверить в новь созданном mo-файле (создается в момент сборки rpm-пакета alterator-l10n) MySuper-module.mo наличие оригинальных строк из .po файла. Я это делаю вызовом strings /usr/share/locale/ru/LC_MESSAGES/MySuper-module.mo.
- еще раз проверить наличие po-domain везде, где это должно, вызов (_ "" "") с указанием вторым параметром MySuper-module в .ajax
- если не из backend-а не выбираются строки, то проверить следующей командой
:> temp.po ; LANG=C xgettext --join-existing --add-comments -otemp.po -L Shell --keyword=_ -- backend3/MySuper-module
. Находится надо в директории MySuper-module/MySuper-module, смотри выше содержимое этой директории. - в целом, формирование конечного MySuper-module.po файла, осуществляется вызовом make-cкрипта /usr/share/alterator/build/po.mak, который для каждого компонента (ajax,html,backend и т.д.) вызывает соответствующий xgettext-cкрипт из /usr/share/alterator/build/xgettext/