Alterator/translate

Материал из ALT Linux Wiki

Актуально для 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/