Простий приклад інтернаціоналізації програм на Python з використанням gettext
В один чудовий момент вам, можливо, доведеться зіткнутися з необхідністю перекладу вашої програми на декілька мов. В цій статті, ми розглянемо переклад простої програми, типу «hello, world». Я выддаю превагу операційній системі Linux, тож наведені приклади вивірені в саме в цій системі, використовуване кодування koi8-u.
Створимо програму під назвою test_gettext.py. Для початку вона буде складатись лише з одного рядка
print 'Hello, world'
Припустимо, нам потрібно перекласти програму на українську мову. Під цим мається на увазі тільки переклад рядків (string) в коді. Щоб використовувати gettext для інтернаціоналізації програм вам потрібно буде модифікувати усі скрипти вашого проекту, але це необхідно буде зробити лише раз. Вам потрібно буде модифікувати всі рядки подібним чином:
'Your string' – первинний варіант.
_('Your string') – модифікований варіант.
Стандартний gettext вміє оперувати лише з рядокми в стилі С, тобто обмеженими подвійними лапками «"This string in C stile"». Але в Python існує 3 варіанта позначення рядків, тож стандартний gettext не підійде. В комплект поставки python входить утиліта pygettex, яка, під Windows знаходиться в PythonDir\Tools\i18n\pygettext.py, а під Linux достатньо просто набрати команду pygettext. Утиліта pygettext вибере з вашого файлу всі рядки, що знаходяться в «_()»
Модифікуйте test_gettext.py таким чином:
import gettext
print _('Hello, world')+' string without translate'
та збережіть його. Тепер настав час скористатися утилітою pygettext. Визвіть pygettext з параметром test_gettext.py. Під Linux це виглядає таким чином:
$ pygettext
pygettext відпрацює і на виході ви матимете файл messages.pot, який має таку структуру.
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR ORGANIZATION
# FIRST AUTHOR , YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2006-06-02 07:20+Греция, Турция (зима)\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \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"
#: test_gettext.py:3
msgid "Hello, world"
msgstr ""
И так далі. Тепер ви маєте "майстер" .po файл для всіх "обернутих" рядків в ваших скриптах. Якщо ви будете використовувати gettext для не перекладених рядків, тоді в результаті буде видаватися рядок з msgid, що є дуже доброю властивістю системи.
З цим файлом ви повинні працювати при перекладі, тож розглянемо його структуру:
"Project-Id-Version: PACKAGE VERSION\n" Замініть PACKAGE VERSION назвою свого продукту.
"Last-Translator: FULL NAME \n" - Змініть FULL NAME на ім'я,
прізвище перекладача та його e-mail.
"Language-Team: LANGUAGE \n" - Змініть LANGUAGE на назву мови,
на яку перекладається проект (наприклад, Ukrainian).
"Content-Type: text/plain; charset=CHARSET\n" - Змініть CHARSET на точну назву кодування,
в якому будуть перекладені рядки, наприклад charset=koi8-u
Перекладач повинен буде дати значення всім msgstr для конкретної мови. Ви можете зробити в файлі коментарі, щоб дати перекладачу контекст або які-небудь пояснення. Для цього використовуйте знак #.
Створення .mo файлів
.mo файл - це скомпільований для використання з GetText .po файл. Ви повинні створити .mo файл для кожної, підтримуваної вашою системою, мови, за допомогою утиліти msgfmt. Під Windows вона є в PythonDir\Tools\i18n\msgfmt.py, а під Linux достатньо просто набрати команду msgfmt. Робиться він таким чином:
$ msgfmt messages.po -o messages.mo
Створення каталогів
Найкращий спосіб для використання gettext - це створення в кореневій директорії вашого проекту директорії locale. В цій директорії необхідно створити піддиректорії для всіх підтримуваних системою мов. В них необхідно створити директорію LC_MESSAGES, куди, власне ви й помістите, ваші .mo файли. Наведу приклад дерева каталогів
./locale/ua/LC_MESSAGES/messages.po
Літерні сполучення для всіх мов ви знайдете тут https://www.loc.gov/standards/iso639-2/langcodes.html або в документації до GetText. Всі файли з перекладом повинні мати назву виду file.mo, в іншому разі gettext їх не побачить.
Тепер у нас все готово для основних змін в нашій программі.
#!/usr/bin/python
# -*- coding: koi8-u -*-
import gettext, traceback
#Support internationalisation
try:
fp = open('./locale/uk/LC_MESSAGES/messages.mo', "rb")
messages = gettext.GNUTranslations(fp)
fp.close()
except:
traceback.print_exc()
messages = gettext.NullTranslations()
messages.install(unicode=True)
domain = 'test' # Назва поточного домену (їх може
# бути декілька).
gettext.bindtextdomain(domain)# Прив'язуємо домен до каталогу з
# перекладом
gettext.textdomain(domain) #Встановлюємо поточний домен
_ = messages.ugettext #Перекладаємо текст
print _('Hello, world')+' string without translate'
Перевіряємо
$ chmod 744 test_gettext.py
$ test_gettext.py
Привiт, свiт string without translate
$
Источники:
michael.kazarian.googlepages.com
автор:Казарян Михаил
|
ПОМОЩЬ САЙТУ :
|
|
|