【问题标题】:Arguments in the middle of a string to be localized要本地化的字符串中间的参数
【发布时间】:2010-03-03 10:17:31
【问题描述】:

我是 Python 的初学者。我的问题很简单。我有一个要在包含参数的 python 应用程序中本地化的字符串:

print _('Hello dear user, your name is ') + params['first_name'] + ' ' + params['last_name'] + _(' and blah blah blah')

这实际上完成了工作,但并不是我所说的好方法。更不用说某些语言会要求在名字之前显示姓氏。

有没有更好的方法呢?我考虑在翻译字符串中放置自定义标签,如 {{fn}} 或 {{ln}},并在显示字符串之前用实际值替换它们。但这似乎并不是真的更愉快。

谢谢,

皮埃尔

【问题讨论】:

  • """要求在名字之前显示姓氏""" 表现出相当程度的术语混淆。也许“名字”和“姓氏”可能会更好。对于名字只有一个字的人,你会怎么做?哦,顺便说一下,考虑参数化称呼; “你好亲爱的用户”会在我的语言环境中遭到嘲弄的笑声:-)
  • 对不起。我还没有真正进入高级英语课程:) 这个例子确实可能不是最好的,但很简单。例如,HTML 文本中间的链接也存在同样的问题。但是当我看……嗯……比如说 Facebook,他们的注册表会要求我输入我的名字和姓氏。我认为他们的英语水平可能比我的好。 :)

标签: python internationalization


【解决方案1】:

我建议

print 'Hello dear user, your name is %(first_name)s %(last_name)s' % params

【讨论】:

  • 按预期完成工作。我的解决方案似乎更“pythonic”。我很高兴下次我必须向其他开发人员展示我的代码时,我不必在地狱中腐烂。 :)
【解决方案2】:

这样的事情应该可以解决问题:

print _('Hello dear user, your name is %s %s and blah blah blah') % (params['first_name'], params['last_name'])

【讨论】:

  • 如果需要更改参数的顺序,这将失败。
  • 刚刚尝试了解决方案。确实,我无法更改字符串的顺序。但感谢您的解决方案。我将在应用程序的其他部分使用它。
【解决方案3】:

如果我是你,我会选择模板。这将使您为每种语言都有一个单独的模板。例如:

from string import Template
s_en = Template('Hello dear user, your name is $first_name $last_name and blah blah blah')
s_sco = Template('Hello, $first_name of the clan Mac$last_name...')

user = {'last_name': 'Duncan', 'first_name': 'Leod'}

print(s_en.substitute(user))
print(s_sco.substitute(user))

【讨论】:

  • 好的,谢谢。我从未听说过这种解决方案,它也会很有用。但在我的情况下,由于 i18n 模块和 gettext 函数已经提供了“模板”并且可以解决问题,所以我并不真正了解收益。
【解决方案4】:

我考虑在翻译字符串中放置自定义标签,如 {{fn}} 或 {{ln}},并在显示它们之前将它们替换为实际值。

这就是我会做的。每个语言版本的正确位置的占位符应该可以完成这项工作。

有一点要提一下,在某些语言中,人名必须根据句子中的位置和使用方式进行修改。您需要了解每种特定语言才能正确执行此操作。

一个可能的解决方案:尽量减少“在句子中间”的情况。将可本地化的资源分开。

而不是Hello dear user, your name is {{UserName}}

使用User name: {{UserName}}

【讨论】:

  • 感谢您的精确。我会听从你的建议。但有时,当客户要求完成这样的事情时,我是个好孩子,我只是这样做:) 其他时候,你真的别无选择。例如,在生成带有指向文本中间的动态 URI 链接的 HTML 时。
猜你喜欢
  • 2010-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-10
  • 1970-01-01
  • 1970-01-01
  • 2014-03-21
  • 1970-01-01
相关资源
最近更新 更多