Найти - Пользователи
Полная версия: Локализация на основе INI файлов
Начало » Python для экспертов » Локализация на основе INI файлов
1
Nbush
Еще один пример велосипеда :),

модуль 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.
Внимательные заметят неявную связку названия языка с локалью пользователя.
bialix
йо.
ишо один велосипедоизобретатель.

Вот скажите мне – господа изобретатели – думали ли вы о поддержке падежа для единственного/множественного числа, как это сделано в gettext: функция ngettext? а? шо? не знаете шо это такое?

это когда вам надо вывести строку типа:
“N files found”
и в зависимости от N перевести слово file/files корректной формой, а-ля:

1 файл найден
2 файла найдено
5 файлов найдено

ну? опять будем изобретать велосипеды?
эххххххххххххх
umup
gettext: функция ngettext?

хм… и это все что может предложить gettext из лингвистических возможностей ? поддержку числа как раз легко добавить.
еще вспомните про падежи, времена, род, контекст слова в фразе и т.д. и т.п. так что ngettext решает далеко не все проблемы перевода. gettext - пока один из велосипедов, и далеко не идеальный. например для перевода динамического текста, а не статически вписанного в текст программы.
bialix
umup
gettext: функция ngettext?

хм… и это все что может предложить gettext из лингвистических возможностей ? поддержку числа как раз легко добавить.
еще вспомните про падежи, времена, род, контекст слова в фразе и т.д. и т.п. так что ngettext решает далеко не все проблемы перевода. gettext - пока один из велосипедов, и далеко не идеальный. например для перевода динамического текста, а не статически вписанного в текст программы.
ngettext как раз элегантно решает определенную задачу.
а про динамический текст… ну давайте Prompt вспомним, что ли?
Nbush
bialix
о поддержке падежа для единственного/множественного числа
что вы :), изобретали велосипед, а не мерседес. Конечно, это просто пример, как попытаться обойтись без файлов .mo .po
Не так уж сложно и добавить функциональность и ngettext, хотя, положа руку на сердце, так ли часто используется данная возможность? полагаю это 2-5%.
Я вовсе не призываю отказываться от gettext, тем более, что в других библиотеках заложена замечательная его поддержка, например, в wxPython.

PS.
Автоматический перевод пока не дорос еще. Хотя такой возможности не стоит упускать в будущем.
bialix
Nbush
bialix
о поддержке падежа для единственного/множественного числа
что вы :), изобретали велосипед, а не мерседес. Конечно, это просто пример, как попытаться обойтись без файлов .mo .po
Меня всегда мучает вопрос: ЗАЧЕМ?
объясните мне, я не тупой, я попытаюсь понять.
я просто не могу придумать сам ответа на этот вопрос.

gettext – это ведь не просто файлы po и mo (манга какая-то получается), это ведь еще и целая инфраструктура по их созданию, редактированию, объединению и т.д. и т.п.
В ваших велосипедах не хватает самой малости – функциональности xgettext, msgmerge, poedit/pootling…
Nbush
bialix
ЗАЧЕМ?
Может кому - то не нужна эта ифраструктура,
может кому - то хочеться изменить самому файлы перевода (согласитесь, для простого пользователя не всегда понятно, откуда беруться и как создаются файлы в языковой папке)
может кто - то ищет компромисс между простотой и функциональностью
может кому то нравиться что есть возможность альтернативы
bialix
не хватает самой малости
боюсь это не малость :) - это “двигатель внутреннего сгорания” , который, как известно, на велосипеды не ставят.
Но задачу “передвижения” - выполняет и мерседес и велосипед (с разным удобством).
Надеюсь, не слишком образно.
bialix
Похоже вы не поняли мой главный посыл: инфраструктура gettext позволяет простыми методами извлекать из исходников строки для перевода, обновлять уже готовые переводы и переводить эти строки, используя удобный GUI или web-интерфейс.

Простые велосипеды по определению лишены всей этой инфраструктуры. В особенности самой первой части: простое извлечение из исходников строк для перевода. Т.е. вы серьезно полагаете, что юзер (== переводчик) предпочтет руками переписывать из запущеной программы все сообщения? а те которые он не увидит (сообщения о фатальных ошибках и т.п.)?
bialix
Nbush
bialix
ЗАЧЕМ?
Может кому - то не нужна эта ифраструктура,
когда человек не знает нужна или не нужна, то да, человек склонен выбирать не нужна.

может кому - то хочеться изменить самому файлы перевода (согласитесь, для простого пользователя не всегда понятно, откуда беруться и как создаются файлы в языковой папке)
после генерации pot-шаблона вы вольны менять po-файл перевода как угодно. Это простой текстовый файл. По большому вселенскому счету мало чем отличающийся от вашего INI-файла.
“Откуда берутся и как создаются” – это не вопрос переводчика, это не вопрос конечного пользователя (если конечно не брать клинический случай – халтурный перевод от надмозгов). Это вопрос разработчика программы, который должен позаботиться, чтобы переводчику было удобно и просто.

может кто - то ищет компромисс между простотой и функциональностью
если вы считате, что использование стандартной библиотеки питона – это сложно и нефункционально, то у меня дальше нет аргументов.

может кому то нравиться что есть возможность альтернативы
да, но как правило это ведет к зоопарку и не нужным религиозным войнам. от стандартизации обычно все только выигрывают.


bialix
не хватает самой малости
боюсь это не малость :) - это “двигатель внутреннего сгорания” , который, как известно, на велосипеды не ставят.
Но задачу “передвижения” - выполняет и мерседес и велосипед (с разным удобством).
Надеюсь, не слишком образно.
да, нет, не слишком образно. нормально. я знаю какое удобство ехать на велике под дождем по сельской дороге.
Nbush
bialix
вы не поняли мой главный посыл
кажется мы говорим о разном - был показан пример, который работает без этой инфраструктуры.
bialix
простое извлечение из исходников строк для перевода
как раз это частично реализовано, в упомянутом примере, при первом обращении к _() в ini записывается таки строка для перевода. Таким образом и получается заготовка.
bialix
если вы считате, что использование стандартной библиотеки питона – это сложно и нефункционально, то у меня дальше нет аргументов.
считаю что функционально, но мы говорим о заимствованной технологии, которая была просто адаптирована
bialix
и не нужным религиозным войнам. от стандартизации обычно все только выигрывают.
Согласен, поэтому предлагаю завершить эту тему.
PS.
gettext и его “окружение” я хорошо представляю и работаю (может конечно не так эффективно, иначе не родился бы этот тред). ngettext не использую
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB