Форум сайта python.su
Еще один пример велосипеда :),
модуль tran4ini
import dict4ini # http://code.google.com/p/dict4ini/ хоррошая библиотека для ini, рекомедую
import locale
ini = dict4ini.DictIni('myProgram.ini') #здесь читаем установку языка
if ini.common.lang:
lang=ini.common.lang
else:
ini.common.lang=lang='en'
ini.save()
encoding = locale.getdefaultlocale()
x=dict4ini.DictIni('translate.ini') # наш файл переводов в кодировке UTF - 8 (создается автоматом при 1 вызове)
def _(s,lang=lang):
if lang!='en': # здесь собственно выбираем из словаря перевод
if x:
#st=x
st=x.decode('utf8').encode(encoding) # если translate.ini в utf8
else:
st=s
elif not x: # основной язык, строиться автоматически
x=s
x.save()
st=s
else: # если нет перевода то и английский подойдет
st=x
return st
Пример использования:
from tran4ini import _
print _(“Нello word”)
- все строки для перевода обертываем в функцию аля gettext: _('Hello word')
- при первоначальных вызовах этой функции строиться translate.ini с секцией основного языка
- затем копируем содержимое этой секции в и переводим (кодировка Utf8 !)
- переключаем язык в myProgram.ini на ‘ru’
все
ps.
ini для примера
myProgram.ini
lang='ru'
translate.ini
Hello word = ‘Hello word’
Hello word = ‘Привет солнышко’
pss.
Внимательные заметят неявную связку названия языка с локалью пользователя.
Офлайн
йо.
ишо один велосипедоизобретатель.
Вот скажите мне – господа изобретатели – думали ли вы о поддержке падежа для единственного/множественного числа, как это сделано в gettext: функция ngettext? а? шо? не знаете шо это такое?
это когда вам надо вывести строку типа:
“N files found”
и в зависимости от N перевести слово file/files корректной формой, а-ля:
1 файл найден
2 файла найдено
5 файлов найдено
ну? опять будем изобретать велосипеды?
эххххххххххххх
Отредактировано (Окт. 8, 2007 14:21:32)
Офлайн
gettext: функция ngettext?
хм… и это все что может предложить gettext из лингвистических возможностей ? поддержку числа как раз легко добавить.
еще вспомните про падежи, времена, род, контекст слова в фразе и т.д. и т.п. так что ngettext решает далеко не все проблемы перевода. gettext - пока один из велосипедов, и далеко не идеальный. например для перевода динамического текста, а не статически вписанного в текст программы.
Офлайн
umupngettext как раз элегантно решает определенную задачу.
gettext: функция ngettext?
хм… и это все что может предложить gettext из лингвистических возможностей ? поддержку числа как раз легко добавить.
еще вспомните про падежи, времена, род, контекст слова в фразе и т.д. и т.п. так что ngettext решает далеко не все проблемы перевода. gettext - пока один из велосипедов, и далеко не идеальный. например для перевода динамического текста, а не статически вписанного в текст программы.
Отредактировано (Окт. 9, 2007 06:41:10)
Офлайн
bialixчто вы :), изобретали велосипед, а не мерседес. Конечно, это просто пример, как попытаться обойтись без файлов .mo .po
о поддержке падежа для единственного/множественного числа
Офлайн
NbushМеня всегда мучает вопрос: ЗАЧЕМ?bialixчто вы :), изобретали велосипед, а не мерседес. Конечно, это просто пример, как попытаться обойтись без файлов .mo .po
о поддержке падежа для единственного/множественного числа
Отредактировано (Окт. 9, 2007 09:05:56)
Офлайн
bialixМожет кому - то не нужна эта ифраструктура,
ЗАЧЕМ?
bialixбоюсь это не малость :) - это “двигатель внутреннего сгорания” , который, как известно, на велосипеды не ставят.
не хватает самой малости
Офлайн
Похоже вы не поняли мой главный посыл: инфраструктура gettext позволяет простыми методами извлекать из исходников строки для перевода, обновлять уже готовые переводы и переводить эти строки, используя удобный GUI или web-интерфейс.
Простые велосипеды по определению лишены всей этой инфраструктуры. В особенности самой первой части: простое извлечение из исходников строк для перевода. Т.е. вы серьезно полагаете, что юзер (== переводчик) предпочтет руками переписывать из запущеной программы все сообщения? а те которые он не увидит (сообщения о фатальных ошибках и т.п.)?
Отредактировано (Окт. 9, 2007 11:10:25)
Офлайн
Nbushкогда человек не знает нужна или не нужна, то да, человек склонен выбирать не нужна.bialixМожет кому - то не нужна эта ифраструктура,
ЗАЧЕМ?
может кому - то хочеться изменить самому файлы перевода (согласитесь, для простого пользователя не всегда понятно, откуда беруться и как создаются файлы в языковой папке)после генерации pot-шаблона вы вольны менять po-файл перевода как угодно. Это простой текстовый файл. По большому вселенскому счету мало чем отличающийся от вашего INI-файла.
может кто - то ищет компромисс между простотой и функциональностьюесли вы считате, что использование стандартной библиотеки питона – это сложно и нефункционально, то у меня дальше нет аргументов.
может кому то нравиться что есть возможность альтернативыда, но как правило это ведет к зоопарку и не нужным религиозным войнам. от стандартизации обычно все только выигрывают.
да, нет, не слишком образно. нормально. я знаю какое удобство ехать на велике под дождем по сельской дороге.bialixбоюсь это не малость :) - это “двигатель внутреннего сгорания” , который, как известно, на велосипеды не ставят.
не хватает самой малости
Но задачу “передвижения” - выполняет и мерседес и велосипед (с разным удобством).
Надеюсь, не слишком образно.
Офлайн
bialixкажется мы говорим о разном - был показан пример, который работает без этой инфраструктуры.
вы не поняли мой главный посыл
bialixкак раз это частично реализовано, в упомянутом примере, при первом обращении к _() в ini записывается таки строка для перевода. Таким образом и получается заготовка.
простое извлечение из исходников строк для перевода
bialixсчитаю что функционально, но мы говорим о заимствованной технологии, которая была просто адаптирована
если вы считате, что использование стандартной библиотеки питона – это сложно и нефункционально, то у меня дальше нет аргументов.
bialixСогласен, поэтому предлагаю завершить эту тему.
и не нужным религиозным войнам. от стандартизации обычно все только выигрывают.
Офлайн