Gettext и lua: не подерёмся?

Итак, я вожусь над сайтом для загрузки пакетов (http://git.vallua.ru, сейчас не работает). А куда без локализации? Можно и велосипед изобрести, но зачем? Ведь есть gettext!

Итак, сегодня пойдёт речь о интеграции lua и gettext — системы перевода.

Коротко о gettext. Имеет форматы .pot, .po, .mo. Первый — шаблон переводов, второй — собственно переводы, третий — копилированый вариант, итог1)Файлы .pot и .po удаляются из релиза. Руководства по созданию .po файлов из исходников поищите в интернете.

Теперь скачайте и распакуйте архив с примером и разберитесь со структурой папок. Спойлер: 😉 она такая:

Как видите, этот тест лежит в test.lua. В locale хранятся папки с названиями кодов языков, каждая из них содержит одну директорию под названием LC_MESSAGES , а в ней файлы перевода на этот язык для приложения/приложений.

А теперь разбор кода. Шапка #!/usr/bin/lua пояснений не требует. В

 

тоже всё ясно2)Для обычной луа ffi (обязателен) тут: https://github.com/facebook/luaffifb3)Gettext порт взять отсюда: https://raw.githubusercontent.com/bungle/lua-resty-gettext/master/lib/resty/gettext.lua.

Идём дальше, видим код:

ВАЖНО: если вам не нужно менять тек. локаль, не пишите.
Что тут происходит?  Грузим ffi4)Кто не знает, читаем тут: http://luajit.org/ext_ffi.html, пробрасываем функцию putenv (как забавно, os.getenv есть, а os.putenv нет! 🙂 ), меняем локаль на ru_RU.utf8. Поменять на нужную или закомментировать весь кусок кода, ежели не надо и оно работает 🙂 .
Вминание! Внимание! Теперь ОЧЕНЬ ВАЖНО, без этого не пашет!

Не поняли? И я тоже, это задача для бубна… Ну, вообще-то, это активирует ядерные детонаторы системную локаль из LANG, без этого не работает gettext.

Теперь, собственно, наконец-то пошёл сам gettext. Посмотрим-с:

По строкам:
Первая строка: сообщаем, что файлы переводов для домена test лежат в locale 5)По умолчанию искать будет в /usr/share/locale.
Вторая строка: сообщаем, что работать мы с gettext доменом test (только что мы сообщили, где его искать).
Третья: добавляем классический алиас для gettext.gettext.

Итак, далее тестовый код:

a — переменная, берётся из первого аргумента или равно 1, число в виде строки.
Далее классический перевод («простой», как зовёт Википедия).
Потом то, что делает gettext gettext’ом: множественное число! Формат этой функции видно здесь: ед. ч., мн. ч., собственно ч.. Освоения формата переводов я оставлю вам.

Итак, базовый код для работы таков:

Кратко основной синтаксис:

Задать директорию directory, в которой будут искать перевод домена domian.

Загрузить перевод из домена domian.

(алиасим как _) Перевести текст из text.

Работа с множественным числом из gettext: one и many — строки типа «%d apple» и «%d apples», number — число. В нашем примере без аргументов вернёт «%d animal here», так что подстановкой занимается string.format.

Пока что всё.

Примечания   [ + ]

1. Файлы .pot и .po удаляются из релиза
2. Для обычной луа ffi (обязателен) тут: https://github.com/facebook/luaffifb
3. Gettext порт взять отсюда: https://raw.githubusercontent.com/bungle/lua-resty-gettext/master/lib/resty/gettext.lua
4. Кто не знает, читаем тут: http://luajit.org/ext_ffi.html
5. По умолчанию искать будет в /usr/share/locale

Добавить комментарий