Справочный центр

Локализация приложений Python. Подготовка к локализации приложений Python

Как подготовить к локализации проект, разработанный в среде Python
Локализация Python приложений возможна 2 способами. Рассмотрим достоинства и недостатки обоих:
  • С помощью ini файлов
    • Достоинства:
      • Простота
      • Доступность
    • Недостатки:
      • Открытость – любой сторонний пользователь или приложение может внести изменения в эти файлы
  • С помощью утилиты gettext
    • Достоинства:
      • Закрытость
    • Недостатки:
      • Дополнительные трудозатраты:
        • приложение нужно сначала написать для снятия шаблона, а потом переписать на основании применения файлов локализации
        • после перевода, текстовые файлы надо преобразовать в бинарные, что можно сделать вручную, либо настроив средства автоматизации
С помощью ini файлов
При проектировании и разработке приложения с учетом его последующей локализации нужно следовать правилам, указанным ниже.
  1. Даже если вы разрабатываете приложение, которое предназначено для одной культуры или региона, необходимо использовать файлы для хранения строк и других ресурсов, отображаемых в пользовательском интерфейсе. Никогда не следует добавлять их непосредственно в код. При размещении текстовых ресурсов (и не только, бинарные данные можно хранить, к примеру, в виде base64 кода в тех же текстовых файлах) в отдельных ini-файлах у вас есть возможность выбрать соответствующий языку и региональным параметрам ресурс (с помощью экземпляра объекта ConfigParser можно разбирать такие файлы).
from ConfigParser import ConfigParser

config = ConfigParser()
config.read("local.ini")
language = config.get("LOCALE", "language") # устанавливаем локаль
section = language.upper()
config.read("{}.ini".format(language)) # читаем файл строковых данных

# Таким образом получаем строковые значения для приложения
program_title = config.get(section, "program_title")
2. Пример содержимого ini-файла приложения locale.ini (файл настроек локализации приложения):
[LOCALE]
language = English
3. Пример содержимого ini-файла для английского языка english.ini (файл с локализованными ресурсами):
[ENGLISH]
program_title = Clean Master
4. Теперь, скажем, если вам нужно сменить язык на русский, то вам необходимо добавить файл russian.ini со строками русской локализации, а в файле locale.ini установить значение "language" в "russian". Файл настроек локализации приложения (locale.ini) будет выглядеть так:

[LOCALE]
language = russian
Файл с локализованными ресурсами (russian.ini) будет выглядеть так:
[RUSSIAN]
program_title = Мастер Очистки
5. При выводе строк, дат, чисел необходимо применять соответствующий текущей культуре формат вывода.
6. Все остальные параметры, такие как номера телефонов, адреса, единицы измерения (длины, веса, площади, объема и температуры и т.д.), а также специфические характеристики региона (такие как размеры (форматы) бумаги, используемой в стране и т.д.), вам надо уже рассчитывать программно вручную, т.е. написав соответствующий код для преобразования.
7. Готовое к локализации приложение разделяется на два логических блока. Один из них (ini-файлы и бинарные файлы) содержит все элементы пользовательского интерфейса, а другой — исполняемый код. Блок пользовательского интерфейса содержит только локализуемые элементы, например строки, сообщения об ошибках, текст в диалоговых окнах, пункты меню и т. д. для нейтрального языка и региональных параметров (английский по умолчанию, к примеру). Блок кода содержит только код приложения, который будет одинаковым для всех поддерживаемых языков и региональных параметров.
8. Для каждой локализованной версии приложения добавьте новый ini-файл, который содержит локализованный блок пользовательского интерфейса, учитывающий все требования целевого языка и региональных параметров. Подготовьте отдельно бинарные файлы, такие как файлы аудио, изображения и видео. Блок кода должен оставаться одинаковым для всех языков и региональных параметров. Объединение локализованной версии блока пользовательского интерфейса с блоком кода создает новую локализованную версию приложения.
9. Формат ini-файлов текстовый – это позволяет очень просто экспортировать и импортировать текстовые строки в эти файлы. Соответственно на перевод отдаются ini файлы. Для перевода уже можно использовать специализированные приложения, например, наш сервис alingvo. Как загрузить файлы на перевод в CLOUDGN можно прочитать тут. Также можно настроить т.н. непрерывную локализацию, когда файлы из проекта передаются на перевод и собираются обратно по определенному расписанию.
10. После перевода ini-файлы раскладываются по нужным папкам это также можно сделать вручную или автоматически.
app/
   locale.ini
   locales/
        en_US/
            en_US.ini
            ImageHello.jpg
            AudioHello.wav
            VideoHello.mpg
        ru_RU/
            ru_RU.ini
            ImageHello.jpg
            AudioHello.wav
            VideoHello.mpg
11. Проект собирается и подготавливается к распространению, и вы получаете интернациональное приложение со встроенными функциями локализации и всеми необходимыми локализованными артефактами.
С помощью утилиты gettext
При проектировании и разработке приложения с учетом его последующей локализации нужно следовать правилам, указанным ниже.
  1. Даже если вы разрабатываете приложение, которое предназначено для одной культуры или региона, необходимо использовать файлы для хранения строк и других ресурсов, отображаемых в пользовательском интерфейсе. Никогда не следует добавлять их непосредственно в код. При размещении текстовых ресурсов в отдельных файлах у вас есть возможность выбрать соответствующий языку и региональным параметрам текстовый ресурс.
2. Все строки, подлежащие переводу оборачиваются в вызов специальной функции _().
#!/usr/bin/python

name = _("Mary")
animal = _("lamb")

print _ ("%s had a little %s") % (name, animal)
Далее, программа обрабатывается утилитой pygettext, вытаскивающей все необходимые к переводу строки, в результате получается файл .pot (шаблон перевода), в который в дальнейшем можно добавить перевод. Это текстовый файл с относительно простой внутренней структурой, его можно редактировать любым текстовым редактором, но есть и специализированные утилиты, например, poedit.
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR ORGANIZATION
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2009-10-28 01:12+MSK\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADRESS>\n"
"Language-Team: LANGUAGE <LL@LI.org\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: ENCODING\n"
"Generated-By: pygettext.py 1.5\n"

#: mary.py:6
msgid "Mary"
msgstr ""

#: mary.py:7
msgid "lamb"
msgstr ""

#: mary.py:10
msgid "%s had a little %s"
msgstr ""
3.Теперь, на базе шаблона (pot файл) вам нужно подготовить файлы переводов под конкретный язык – сохранить соответствующий текст в нужных строках и сохранить файл с расширением .po. Из файла .pot получается файл .po (по сути тот же .pot, но с заполненным переводом строк на нужный язык), который потом компилируется в файл .mo (бинарный файл, хотя тоже с довольно простой внутренней структурой) с помощью утилиты msgfmt из пакета gettext или утилиты msgfmt.py из пакета Python.
msgfmt.py mary.po 
4. Далее, перевод импортируется в переводимую программу при помощи команды gettext.install('mary', './locale', unicode=True).
#!/usr/bin/python
import gettext
gettext.install('mary', './locale', unicode=True)

name = _("Mary")
animal = _("lamb")

print _("%s had a little %s") % (name, animal)
5. При выводе строк, дат, чисел необходимо применять соответствующий текущей культуре формат вывода.
6. Все остальные параметры, такие как номера телефонов, адреса, единицы измерения (длины, веса, площади, объема и температуры и т.д.), а также специфические характеристики региона (такие как размеры (форматы) бумаги, используемой в стране и т.д.), вам надо уже рассчитывать программно вручную, т.е. написав соответствующий код для преобразования, или же также хранить в po/mo файлах. Все бинарные файлы, такие как аудио, изображения, видео вы можете хранить как в отдельных папках локалей, так и в виде текстовых данных с использованием алгоритма base64 (но данный способ хранения бинарных данных рекомендуется использовать только при малом размере бинарных файлов, при больших размерах файлов время на динамическую конвертацию будет затрачено много, что может привести к эффекту «подвисания» вашего приложения).
7. Готовое к локализации приложение разделяется на два логических блока. Один из них (mo файлы и бинарные файлы) содержит все элементы пользовательского интерфейса, а другой — исполняемый код. Блок пользовательского интерфейса содержит только локализуемые элементы, например строки, сообщения об ошибках, текст в диалоговых окнах, пункты меню, внедренные объектные ресурсы и т. д. для нейтрального языка и региональных параметров (английский по умолчанию, к примеру). Блок кода содержит только код приложения, который будет одинаковым для всех поддерживаемых языков и региональных параметров.
8. Для каждой локализованной версии приложения добавьте новый mo-файл, который содержит локализованный блок пользовательского интерфейса, учитывающий все требования целевого языка и региональных параметров. Блок кода должен оставаться одинаковым для всех языков и региональных параметров. Объединение локализованной версии блока пользовательского интерфейса с блоком кода создает новую локализованную версию приложения.
9. Формат po-файлов текстовый – это позволяет очень просто экспортировать и импортировать текстовые строки в эти файлы. Соответственно на перевод отдаются po файлы. Про правила разбора файлов *.po можно прочитать тут
10. После перевода po-файлы раскладываются по нужным папкам. Это также можно сделать вручную или автоматически.

app/
   lang/
        en_US/
            ImageHello.jpg
            AudioHello.wav
            VideoHello.mpg
            LC_MESSAGES/
                strings.mo
        ru_RU/
            ImageHello.jpg
            AudioHello.wav
            VideoHello.mpg
            LC_MESSAGES/
                strings.mo
11. Теперь po файлы компилируются в бинарные mo файлы, которые также раскладываются по нужным папкам. Это также можно сделать вручную или автоматически. Проект собирается и подготавливается к распространению, и вы получаете интернациональное приложение со встроенными функциями локализации и всеми необходимыми локализованными артефактами.
Предлагаем вам для локализации использовать наш сервис alingvo (войти можно по кнопке ниже).

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

После перевода файлы раскладываются по нужным проектам (сборкам) это также можно сделать вручную или автоматически.

Проект компилируется и вы получаете интернациональное приложение со встроенными функциями локализации и всеми необходимыми локализованными артефактами.