Программа для перевода файлов po
Несмотря на то, что мировая культура в лице Википедии и Пола Маккартни уверяет нас, что Mary had a little lamb, на территории одной восьмой части суши продолжают считать, что на самом деле «У Мэри был ягнёнок». Кто же на самом деле был у Мэри, и как записать это на разных языках мира? Попробуем выяснить это (а также понять, что думают по этому поводу японцы) вместе с нашим любимым Python-ом и встроенным в него модулем поддержки многоязычных переводов gettext.
Приступим
Начнём с того, что напомним, что библиотека gettext используется для перевода не только программ на Python, а на многих различных языках. Он позволяет использовать в нашей программе шаблоны фраз, которые можно переводить с помощью отдельных и независимых файлов перевода. В самой программе мы, как и прежде, выводим текст сразу на экран, на диск, в логи или ещё куда-нибудь, всего лишь пометив переводимые строки особым образом; библиотека gettext же позволяет взять эти переводимые строки, наборы файлов перевода, и, при наличии подходящего для текущего языка файла перевода, подставить нужную строку.
В Python доступ к механизмам библиотеки gettext осуществляется с помощью идущего в комплекте с Python-ом модуля gettext. Так что не будем путать систему gettext как таковую (внешнюю по отношению к Python-у и совершенно не требующуюся ему для работы сущность; тем не менее, в комплект которой входят удобные утилиты для работы с файлами gettext) и встроенный в Python модуль gettext.
name = _("Mary")
animal = _("lamb")
print _("%s had a little %s") % (name, animal)
При использовании модуля gettext принято помечать переводимые строки вызовом функции _() . Пока эта функция не определена (впрочем, никто не мешает нам временно определить что-нибудь наподобие _ = lambda x: x ), поэтому программа даже наверняка не сможет запуститься… но нам пока и не надо.
Вы уже, наверное, подумали, что сейчас мы будем создавать новый текстовый файл с ассоциациями, в котором надо будет не забыть указать все переводимые строки из программы? В нашем случае таких строк всего 3, но в серьёзной программе их может быть намного больше…
Шаблон перевода: .pot
… вы почти угадали. Создавать файл мы будем. Но при этом воспользуемся приятной возможностью системы gettext — анализом файлов с исходниками на предмет переводимых строк. Поскольку мы их благоразумно пометили вызовом функции _() ещё до того, как этот вызов стал всерьёз использовать gettext, теперь синтаксический анализатор может их быстро собрать.
Что это такое? Это шаблон для перевода всей нашей программы. Если у нас есть большая команда переводчиков, то мы можем дать этот шаблон каждому переводчику для каждого целевого языка, и он должен нам будет вернуть заполненный шаблон для его языка. Обычно шаблоны имеют расширение .pot, а заполненные файлы имеют расширение .po.
Синтаксис у файла достаточно прозрачный. Комментарии, пометки авторских прав на перевод, пары из оригинальных строк и переводов. Выкинем из файла всё лишнее, кроме строчки с «Content-Type:» и необходимых для перевода строк, укажем кодировку UTF-8 и напишем переводы:
Файл перевода: .po
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
msgid "Mary"
msgstr "Мэри"
msgid "lamb"
msgstr "ягнёнок"
msgid "%s had a little %s"
msgstr "У %s был маленький %s"
В нашем случае файл достаточно маленький и простой; будь он посложнее, было бы удобнее использовать специализированные редакторы .po-файлов, наподобие Poedit, или «специализированного редактора всего» Emacs.
Скомпилированный файл перевода: .mo
Итак, строки в нашей программе мы перевели. Зря, кстати. gettext направлен исключительно на перевод законченных готовых предложений, и перевод отдельных слов и шаблонов предложений в нём делать опасно… (например, gettext совершенно не поддерживает падежи и рода и кое-как поддерживает разве что различение единственного и множественного числа; так что, чтобы подставить вместо Мэри «Таню» или «Свету», придётся учитывать падеж для каждого возможного употребления исходного имени.) Ну да ладно — в нашем случае это не принципиально. Сейчас у нас задача в другом: подготовить файл перевода к использованию.
Использовать исходный текстовый файл было бы неудобно по соображениям производительности (для программ, в которых много переводимого текста), поэтому система gettext использует скомпилированные в специальный формат файлы. Для компиляции мы можем воспользоваться либо тулой msgfmt из комплекта gettext, либо msgfmt.py из комплекта Python (в дебианоподобных дистрибутивах она входит в состав пакета python2.5-examples). Воспользуемся второй:
Ага, видим файл mary.mo. В отличие от mary.po он уже явно не предназначен для ручного редактирования.
Структура каталогов и запуск программы
Если бы мы подготавливали программу к инсталляции в служебные директории, то мы бы создали примерно такую иерархию (в случае Debian linux): системный каталог /usr/share/locale, в нём подкаталоги для разных языков — ru, en и т.п.; в них — по каталогу LC_MESSAGES, а там уже — файл наподобие mary.mo (с максимально уникальным именем, чтобы не пересечься с другими программами). Но в нашем учебном случае мы просто сделаем подкаталог locale в нашем каталоге, создадим в нём подкаталоги ru/LC_MESSAGES, а в последний уже положим mary.mo.
Теперь наконец добавим в нашу программу поддержку gettext:
gettext.install('mary', './locale', unicode=True)
name = _("Mary")
animal = _("lamb")
print _("%s had a little %s") % (name, animal)
Что изменилось? Мы проимпортировали модуль gettext (ну, это очевидно). А ещё мы проинсталлировали в глобальное пространство программы функцию _(), которая для перевода строк в подкаталоге ./locale (второй аргумент) найдёт каталог с нашей текущей локалью (тот самый подкаталог ru), а в его подкаталоге LC_MESSAGES будет искать юникодный (третий аргумент) файл mary.mo перевода программы mary (первый аргумент).
Что имеется в виду под словом «проинсталлировали»? А то, что, после этого действия, мы можем импортировать другие модули нашей программы, и функция _() в них будет уже определена.
Запускаем нашу программу…
1:/tmp/mary> ./mary.py
У Мэри был маленький ягнёнок
Бонус
Согласно Google Translate, .po-файл для японского языка будет выглядеть примерно так:
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
msgid "Mary"
msgstr "メアリー"
msgid "lamb"
msgstr "子羊"
msgid "%s had a little %s"
msgstr "%sの%sいた"
И для нормальной поддержки японского языка (помимо русского) нам придётся поменять последнюю строку кода на
print (_("%s had a little %s") % (name, animal)).encode('UTF-8')
Проверим в работе:
1:/tmp/mary> LANG=ja_JP.UTF-8 ./mary.py
メアリーの子羊いた
Easy translation of apps & sites with gettext and XLIFF
Full gettext support. And then some.
Poedit was built to handle translation using gettext (PO), which is used by many PHP projects (Drupal, WordPress), Python projects (Django), or virtually anything running on Linux.
Lost in translation? Not with Poedit.
With comprehensive safety checks, a minimal and intuitive interface and easy management of files and templates, Poedit lets you focus on what matters most: getting the work done.
Teamwork. Simplified.
Poedit’s built in support for Crowdin, a great localisation management platform, makes collaboration a breeze. Access to all your projects and translate directly from the app.
I’ve just discovered @PoeditApp You guys just saved tons of my time. HUGE THANKS!
Łukasz Pojezierski (@lpojez)
Supercharge your workflow Pro
Save time with accurate pre-translation and intelligent suggestions, powered by machine translation and shared translation memory from the community.
Translate WordPress with ease Pro
Whether local or remote, Poedit understands WordPress, its themes and plugins, and will help you translate them whether they are stored remotely, or locally on your drive.
Программа для перевода файлов PoEdit. Что такое файл .po.
Продолжение Урока 6. Перевод тем wordpress Создание файла po. с помощью генерирования или программы для перевода файлов PoEdit. Способы редактирования и перевода файлов тем и плагинов wordpress. В ru_RU.po. содержится список всех фраз.
Редактирование файлов po.
Мы выбрали тему wp для перевода. Первым делом проверяем наличие файла локализации *.po в папке locales. Если ru_RU.po нет, то скопируем default.po в папку locales, и переименовываем в ru_RU.po.
Можно по-другому: открыть любой языковой файл .po и поменять слова на русский язык, сохранив при этом как … ru_RU.po.
При переводе шаблонов и плагинов вордпресс часто необходимо создавать его с нуля. В этом случае существует два варианта наших действий.
Если, в папке темы есть другие, кроме русского языка, языковые файлы, то мы переводим с помощью файлового редактора PoEdit любой из них на родной и переименовываем в ru_RU.po.
Этот способ быстрый и легкий, но не всегда срабатывает. Или же создать в программе PoEdit.
Создание файла po. с помощью генерации на он-лайн сервисе.
]]> ]]> Сначала рассмотрим сервис генерации языковых файлов.
При успешности этого действия, мы получаем для скачивания архив с файлом .po.
Теперь нам понадобится программа poedit, в которой и будет переводиться языковой файл. Открываем его в программе и переводим каждую строку.
Сохраняем как… ru_RU.po
Вот здесь таинство: сохраняя, программа автоматически создаст бинарный файл с тем же самым названием, но с другим расширением .mo - ru_RU.mo.
Именно его - ru_RU.mo и заливаем в корневую папку переводимой темы.
Создание файла po. с помощью программы PoEdit.
Если в шаблоне нет языковых файлов, то создаем его.
Скопируем все .php файлы темы, которые нужно перевести на русский язык в любую вновь созданную папку.
Открываем программу Poedit.exe. Далее идем в меню Файл - Создать каталог.
Заполняем 3 закладки.
1 закладка. В первое поле формы «Множественного числа» на примере офиц. темы можно попробовать вставить: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10=20) ? 1 : 2
2 закладка. Закладка «Пути» - точка и две точки. Это путь, где лежит ваш файл .po и другие файлы темы для перевода.
3 Закладка «Ключевые слова» - здесь вписываем символы, после которых будет переводиться текст.
Жмем «ок». Сохранить ru_RU.po в той же папке, где все .php файлы.
Если все прошло успешно, видим сводку об обновлении и найденные программой строки для перевода. Жмем опять «ок». Сохранить.
Теперь непосредственно перевод:
Жмем на исходную для перевода строку правой кнопкой мышки и выбираем «Скопировать исходный текст в поле перевода». Ниже в программе есть еще 2 поля. В первом исходный текст, во втором ваш перевод, который можно менять по смыслу.
Когда все строки будут переведены, сохраним. Скомпилированный бинарный файл ru_RU.mo заливаем в папку с темой.
Примечание. Для того, чтобы вордпресс увидел русификацию темы измените в файле wp-config.php следующую строку на: define ('WPLANG', 'ru_RU');.
Преимущество локализации шаблонов с помощью файла .po: при обновлении тем и плагинов проведенная работа не пропадет и все останется на русском языке.
Дополнение. В темах wordpress могут быть и изображения со словами не на русском языке. Это логотип, кнопочки и прочее. Открываем фотошоп или свой любимый графический редактор и меняем текст на картинках.
Имеется большой .pot файл темы WordPress, который нужно перевести на русский каким-нибудь машинным переводом.
В Интернете ничего бесплатного и рабочего по данной теме не нашел. Может что-то упустил из виду?
Леонид: есть частичный перевод автоматический. Все остальное переводите сами. Народ уже совсем обленился сам что либо делать, хочет на автомате бесплатно.
Леонид: забудьте про автоматические переводы, если не хотите чтобы люди плевались от них) Ломаную версию PoEdit можно легко нагуглить, уверен справитесь. И программа подбирает уже переведённые фразы автоматом, а вот если будут специфические фразы, то придётся вписывать вручную.
Александр Власов: "Народ уже совсем обленился сам что либо делать, хочет на автомате бесплатно." - а разве не в этом весь смысл прогресса? техника и программы должны освобождать нас от рутинных операций )
Леонид: ок. Самое элементарное, посмотрите мультфильм "Валли" так конкретно для людей указано к чему приведет прогресс того автоматизации, когда люди перестанут вообще сами что либо делать. Да и в чем интерес что-то делать, если все будет автоматизированно.
У вас 2 варианта:
1. Сделать самому
2. Платить тем кто сделает это за вас
Александр Власов: не будем здесь рассуждать о том к чему ведет прогресс, мультик Валли я конечно же смотрел. Но если мы работаем в IT, мы не должны об этом говорить - иначе это не профессионально с нашей стороны ) Я не люблю рутину, потому всегда старался её избегать - как тупой труд ) В общем, я понял что готовых 100% решений нет, потому придется мне потратить время на написание простенького скрипта переводящего .po-файл с помощью Google Translate API или Яндекс.Перевод )
В любом случае, спасибо вам за советы!
Леонид, кхм-кхм, написали ли вы такой скрипт?) Сохранился ли он у вас?) Нашёл несколько таких в интернете, но какие-то устарели, какие-то не поддерживаются.
OldSoldier, я всё-таки остановился на PoEdit.
Насколько я знаю для Loco Translate есть доп. плагин умеющий переводить с помощью Яндекс и Google
Универсальный редактор "PO" файлов (файлов локализации).
Gtranslator — универсальный GTK / Gnome графический редактор "PO" файлов.
PO-файл — тип файла используемый для интернационализации и локализации автономных приложений, веб-страниц и веб-приложений. Состоит файл локализации из строк или сегментов (отдельных слов, фраз или абзацев), которые является частью графического пользовательского интерфейса.
При первом запуске Gtranslator автоматически откроется окно "Мастера", который поможет создать настройки основного профиля. "Профилем" является группа особых настроек, хранящаяся в заголовке PO-файла (язык перевода и информация о переводчике). Можно создавать отдельные профили для каждого языка и/или команды перевода.
Gtranslator имеет частично настраиваемый пользовательский интерфейс и модульную архитектуру. Основные функции обеспечиваются gettext (утилиты интернационализации, среда для редактирования "PO" файлов), дополнительный функционал добавляется активацией модулей.
Gtranslator поддерживает использование памяти переводов, позволяющую использовать уже переведённые PO-файлы для создания собственной "базы данных переводов", используя которую приложением будут предлагаться варианты перевода текущей строки, фразы или абзаца.
В Gtranslator неограниченно поддерживается функция повтора/отмены, имеется проверка синтаксиса и орфографии, реализована общая интеграция с рабочим окружением Gnome.
Читайте также: