Страницы

Поиск по вопросам

понедельник, 9 марта 2020 г.

Способы мультиязычности программ на Python?

#python #python_2x #локализация


При разработке приложения с поддержкой нескольких языковых локализаций, я использую
файл, в котором храню все строковые данные программы. Раньше я обходился простым -

exec(open("файл/языковой/локолизации").read())


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

Сейчас exec как-то не хочется использовать. Я приспособил для этих целей модуль ConfigParser.
Сейчас это выглядит вот так:

from ConfigParser import ConfigParser


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

# Таким образом я получаю строковые значения для приложеничя.
program_title = config.get(section, "program_title")


locale.ini
(файл текущей локализации приложения):

[LOCALE]
language = english


english.ini
(файл со строковыми данными):

[ENGLISH]
program_title = Clean Master


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

Получается следующее:

locale.ini 
(файл текущей локализации приложения):

[LOCALE]
language = russian


english.ini 
(файл со строковыми данными):

[RUSSIAN]
program_title = Мастер Очистки


Может быть в Python есть другие варианты вышеописанного велосипеда?
    


Ответы

Ответ 1



Вообще, есть довольно стандартный вариант - использовать библиотеку gettext, для которой есть биндинги в том числе и для Python (причем, в стандартной библиотеке, не исключено, что это реализация gettext на Python). Принцип работы примерно такой: все строки, подлежащие переводу оборачиваются в вызов специальной функции _(). Далее, программа обрабатывается утилитой pygettext, вытаскивающей все переводимые строки, в результате получается файл .pot (шаблон перевода), в который в дальнейшем можно добавить перевод. Это текстовый файл с относительно простой внутренней структурой, его можно редактировать чем-то блокнотоподобным, но есть и специализированные утилиты, например, poedit, также его можно загрузить на какой-нибудь из сервисов онлайн-перевода типа crowdin.com или transifex.com, и редактировать там совместно с другими переводчиками. Из файла .pot получается файл .po (по сути тот же .pot, но с заполненным переводом строк на нужный язык), который потом компилируется в файл .mo (бинарный файл, хотя тоже с довольно простой внутренней структурой) с помощью утилиты msgfmt из пакета gettext или утилиты msgfmt.py из пакета Python. Далее, перевод импортируется в переводимую программу при помощи команды gettext.install('mary', './locale', unicode=True) (пример отсюда, реальные параметры могут быть другими). Парочка нагугленных руководств: Международные ягнята / Хабрахабр Локализация Python-скриптов при помощи gettext Если потребуется редактировать перевод онлайн совместно с другими переводчиками, могу сказать, что упомянутые выше crowdin и transifex бесплатны для Opensource продуктов, но в crowdin с этим довольно строго, в то время как в transifex достаточно того, чтобы перевод был доступен публично, и в настройках проекта была ссылка на исходный код. При этом субъективно у crowdin более дружелюбный интерфейс.

Комментариев нет:

Отправить комментарий