Интернационализация программ на Python
 

Python

В начало

В статье (на украинском языке)  я описал процедуру интернационализации программ на Python с помощью GNU GetText.

Архив (включает пример)  в doc-формате (7K)

 

Простий приклад інтернаціоналізації програм на 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 <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>\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"


#: 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
Літерні сполучення для всіх мов ви знайдете тут http://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

$