ГЛАВНАЯ      ДОКУМЕНТАЦИЯ      СТАТЬИ      ПРОГРАММЫ      ССЫЛКИ      ФОРУМ      ДРУГОЕ   

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

автор:Казарян Михаил   
ПОМОЩЬ САЙТУ :
sms.Є®ЇЁ«Є  *PythonUA*
Для чего Вы используете Python?
Admin( 46 )
Web( 61 )
GUI( 37 )
Embedding ( 16 )
Другое( 34 )
Какими продуктами Вы пользовались?
Zope( 15 )
Plone( 1 )
TG( 7 )
Django( 15 )
Twisted( 5 )
Другими( 10 )
ДРУЗЬЯ:
LUG.DN.UA
D-FENS.ORG.UA
SLAV0NIC.XSS.RU
CETUS.COM.UA
ENTDEV.ORG
[Python Powered]
Rambler's Top100
Copyright © 2006 python.com.ua