Python国际化(gettext)

时间:2011-07-17 22:22:24

标签: python internationalization

我正在尝试使用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 :(得分:0)

我只通过Django使用gettext函数,所以我不知道代码中的所有内容是否都是正确的gettext-API,但方法本身对我来说还不错。就个人而言,我经常在非翻译字符串中使用这些占位符,并在从gettext获取翻译版本后填写它们。

答案 1 :(得分:0)

老实说,我对Python知之甚少,而且我只使用了带有C ++的Gettext。

您似乎正在使用占位符和外部化字符串的字符串格式。这绝对是好的。如果你做得正确(因为它似乎在某种程度上,稍后会更多),翻译人员将能够带来多个复数形式 - 根据数量,瓶子在某些语言中会有不同的翻译(包括波兰语 - 1 butelka ,2 butelki,5 butelek ......)。

现在,为什么我认为你本可以做得更好。好吧,问题是你是连接字符串。在这种情况下,它应该无关紧要,但在真实的句子中,即使对于相当长的文本,最好不要像你那样分割它,并且希望在句子中嵌入新的线标记。这是因为两个原因:

  1. 翻译的文本通常比原始文本长,因此您需要一种方法来控制文本换行(换行符)。
  2. 在翻译文本时经常需要对句子进行重新排序以使其听起来更好(或者仅仅是因为目标语言的语法与英语完全不同)。