#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 более дружелюбный интерфейс.
Комментариев нет:
Отправить комментарий