Интернационализация Python (gettext) - PullRequest
0 голосов
/ 18 июля 2011

Я экспериментирую с интернационализацией в Python. Я начал с простого сценария «Hello, World» и теперь я понял основы использования gettext. Я прочитал в документации, что конкатенация строк вместе так:

msg = _('Start of message')
msg += _(' end of message')

не рекомендуется, так как он разбивает строки для перевода и может привести к ошибкам (в любом случае это я понял из документации).

Мне стало интересно, как лучше всего использовать динамически генерируемые строки - например, 99 бутылок пива. Как вы все знаете, вы можете довольно мило написать 99 бутылок пивных программ, но вы вкладываете в структуру такую ​​программу, чтобы она могла быть интернационализирована? Из прочтения документов я пришел к следующему. Это довольно многословно - я хотел бы знать, есть ли у вас какие-либо комментарии о том, как улучшить код (в отношении интернационализации, а не создания песни!)

#self._ is gettext.ugettext
#self._s is gettext.ungettext
def bottles(self):
    for bottles in xrange(99, 1, -1):
        lyric =self._s('%(bottles)d bottle of beer on the wall, %(bottles)d bottles of beer.', '%(bottles)d bottles of beer on the wall, %(bottles)d bottles of beer.', bottles)
        lyric += "\n"
        lyric += self._s('Take one down and pass it around, no more bottles of beer on the wall.', 'Take one down and pass it around, %(bottles-1)d bottles of beer on the wall.', bottles - 1)
        lyric += '\n'
        print lyric % {'bottles' : bottles, 'bottles-1' : bottles -1}
    print self._('1 bottle of beer on the wall, 1 bottle of beer.')
    print self._('Take one down and pass it around, no more bottles of beer on the wall.\n')
    print self._('No more bottles of beer on the wall, no more bottles of beer.')
    print self._('Go to the store and buy some more, 99 bottles of beer on the wall.')

Ответы [ 2 ]

0 голосов
/ 18 июля 2011

Честно говоря, я очень мало знаю о Python, и я использовал только Gettext с C ++.

Кажется, что вы используете заполнители и форматирование строк для внешней строки.Это определенно хорошо.Если вы сделали это правильно (как кажется в некоторой степени, об этом позже), переводчики смогут принести более одной формы множественного числа - в зависимости от количества бутылка будет иметь разные переводы на некоторые языки (включая польский - 1 бутелка), 2 бутелки, 5 бутелек ...).

Теперь, почему я думаю, вы могли бы сделать лучше.Ну, проблема в том, что вы соединяете строку.В этом случае это не имеет значения, но в реальных предложениях даже для довольно длинного текста лучше не разбивать его, как вы, и желательно, чтобы в предложение были вставлены новые строки.Это происходит по двум причинам:

  1. Перевод текста обычно длиннее оригинала, поэтому вам нужен способ управления переносом текста (разрывы строк).
  2. Часто при переводе текста требуется переупорядочить предложение, чтобы оно звучало лучше (или просто потому, что грамматика целевого языка полностью отличается от английского).
0 голосов
/ 18 июля 2011

Я использую только функции gettext через Django, поэтому я не знаю, все ли в вашем коде нормально для gettext-API, но сам метод выглядит хорошо для меня. Лично я часто использую такие заполнители в непереведенных строках и заполняю их после получения переведенных версий от gettext.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...