Форум сайта python.su
Я сделал анонс своей статьи в LJ: http://community.livejournal.com/ru_python/120316.html
LJ-юзер balu (в миру Михаил Казарян) ответил в комментах, что он писал похожее, и оно тоже опубликована на этом же сайте: http://python.com.ua/doc/inter.html
Хочу продолжить дискуссию здесь.
Во-превых, хочу сделать краткий анализ примера из статьи Михаила:
#!/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'
Здесь имеется путаница class-based API и GNU gettext API, которые я упоминал в сворей статье. Однако – это лишь информационный шум, потому что реально работает только class-based API, потому что везде в коде используется экземпляр класса
messages = gettext.GNUTranslations(fp) либо messages = gettext.NullTranslations().
Что здесь делают вызовы GNU gettext API – решительно непонятно, поскольку к тому моменту они уже ни на что не влияют. Предположу, что это артефакты из другого старого кода.
Также видно, что Михаил загружает файл перевода вручную, при помощи намертво прошитого пути к MO-файлу. Это немного отличается от изложенного в моей статье. Михаил обещать найти и показать, как оно на самом деле у него работает в винде, жду с нетерпением.
Здесь в примере: ./locale/ua/LC_MESSAGES/messages.po
должно быть uk вместо ua.
И еще: если статья будет подвергаться коррекциям: слово “выддаю” по-украински пишется как “виддаю”. Плюс ще низка маленьких помилок, якщо є бажання – пройдіться якойсь програмою для перевірки орфографії.
Отредактировано (Фев. 27, 2007 09:17:11)
Офлайн
bialixНу да, есть разница в их использовании. И что из этого? Я описал тот метод, который мне удобнее, вы описали тот метод, который удобнее вам. Работают оба метода. Все рады, все гогочут ;)
Здесь имеется путаница class-based API и GNU gettext API, которые я упоминал в сворей статье.
bialixНа самом деле полный путь к файлу здесь прописан для ясности. В рабочих программах он, разумеется, генерируется в зависимости от языка, выбранного пользователем, независимо от локали.
Также видно, что Михаил загружает файл перевода вручную, при помощи намертво прошитого пути к MO-файлу.
bialixДа, спасибо за замечание. В оригинале исправлю. Хотя приведенный код - работает, и содержит “uk”
Здесь в примере: ./locale/ua/LC_MESSAGES/messages.po
должно быть uk вместо ua.
bialixНі, вірно буде “віддаю”. Винен, не замітив вчасно, що працював з російською розкладкою ;).
если статья будет подвергаться коррекциям: слово “выддаю” по-украински пишется как “виддаю”;)
Отредактировано (Фев. 27, 2007 11:29:07)
Офлайн
baluДа нет, никто не рад, и никто не гогочет. Вы пишите статью, которую будут читать люди и использовать ее как пример. И даете неправильные примеры. Я считаю – что это не есть гут.bialixНу да, есть разница в их использовании. И что из этого? Я описал тот метод, который мне удобнее, вы описали тот метод, который удобнее вам. Работают оба метода. Все рады, все гогочут ;)
Здесь имеется путаница class-based API и GNU gettext API, которые я упоминал в сворей статье.
baluТак почему было не показать в своей статье правильный путь использования, без явного указания имени файла?bialixНа самом деле полный путь к файлу здесь прописан для ясности. В рабочих программах он, разумеется, генерируется в зависимости от языка, выбранного пользователем, независимо от локали.
Также видно, что Михаил загружает файл перевода вручную, при помощи намертво прошитого пути к MO-файлу.
baluСпасибо. Работает. Я готов подправить код в своих примерах, хотя отлавливание русской винды при установленном украинском языке пользователя мне лично очень даже нравится.
В ЖЖ я обещал указать, как определять локаль без использования win32api. Очень просто.
>>> import locale
>>> locale.getdefaultlocale()
('ru_RU', ‘cp1251’)
#Linux code
>>> locale.getdefaultlocale()
Офлайн
bialixЧто тут неправильного?
Вы пишите статью, которую будут читать люди и использовать ее как пример. И даете неправильные примеры. Я считаю – что это не есть гут.
bialixИбо умному - достаточно. И я считал, что это само-собой разумеется ;)
Так почему было не показать в своей статье правильный путь использования, без явного указания имени файла?
Офлайн
baluВы осознаете, что ваш пример содержит лишние строки? И что он эквивалентен следующему коду:bialixЧто тут неправильного?
Вы пишите статью, которую будут читать люди и использовать ее как пример. И даете неправильные примеры. Я считаю – что это не есть гут.
baluSapienti – sat.bialixИбо умному - достаточно. И я считал, что это само-собой разумеется ;)
Так почему было не показать в своей статье правильный путь использования, без явного указания имени файла?
Офлайн
bialixДа, спасибо. Строки
Вы осознаете, что ваш пример содержит лишние строки? И что он эквивалентен следующему коду:
bialixgettext.GNUTranslations и gettext.NullTranslations используются т.к. имеют метод ugettext. Разница между ним и gettext в том, что ugettext возвращает перевод в виде юникода.
Что здесь делают вызовы GNU gettext API – решительно непонятно, поскольку к тому моменту они уже ни на что не влияют.
Отредактировано (Фев. 27, 2007 13:34:55)
Офлайн
bialixЛадно, например, так:
Sapienti – sat.
Известная отмазка.
Отредактировано (Фев. 27, 2007 14:41:49)
Офлайн
baluЗачем вообще руками открывать файл?bialixЛадно, например, так:
Sapienti – sat.
Известная отмазка.
import os, sys
#Для локального варианта
path = lambda x: ‘./locale/’+x+'/LC_MESSAGES/filename.mo'
#Для стабильного релиза:
path = lambda x: os.path.join(sys.prefix+'/share/locale/'+x+'/LC_MESSAGES','filename.mo')
your_path=path('uk')
fp = open(your_path, ‘r’)
Офлайн
bialixДа, можно и так. Плюс locale.setlocale(нужная локаль).
Зачем вообще руками открывать файл?
Я у себя в коде делаю так:
import gettext
d = os.path.join(os.path.realpath(os.path.dirname(sys.argv)), ‘locale’)
if not os.path.isdir(d):
d = None
gettext.install('bzrconf', d, True)
Файл будет открыт самостоятельно во время выполнения gettext.install.
При этом будет выбрана либо локальная папка с MO-файлами, либо sys.prefix/share/locale (по умолчанию, когда d = None)
Офлайн
balu1) locale.setlocale насколько я могу судить не имеет никакого эффекта под windows.bialixДа, можно и так. Плюс locale.setlocale(нужная локаль).
Зачем вообще руками открывать файл?
Я у себя в коде делаю так:
import gettext
d = os.path.join(os.path.realpath(os.path.dirname(sys.argv)), ‘locale’)
if not os.path.isdir(d):
d = None
gettext.install('bzrconf', d, True)
Файл будет открыт самостоятельно во время выполнения gettext.install.
При этом будет выбрана либо локальная папка с MO-файлами, либо sys.prefix/share/locale (по умолчанию, когда d = None)
Остается проблема с перекодированием в юникод, но это из немного другой оперы.
Офлайн