2010-03-03 83 views
1

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

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

这实际上做的工作,但也算不上什么,我会叫一个很好的办法做到这一点。更不用说,例如,某些语言会要求在姓名之前显示姓氏。

有没有更好的办法做到这一点?我想过在翻译字符串中放置{{fn}}或{{ln}}这样的自定义标签,并在显示字符串之前将其替换为实际值。但它似乎不是更令人愉快。

感谢,

皮埃尔

+0

“”“要求在名字”“”显示相当程度的术语混淆之前显示姓氏。也许“给定名称”和“姓氏”可能会更好。你如何处理名字中只有一个单词的人?哦,顺便说一下,考虑参数化称呼; “亲爱的用户,您好”会在我的语言环境中遇到嘲笑的笑声:-) – 2010-03-03 13:36:45

+0

对不起。我还没有真正走入英语的高级班:)这个例子确实不是最好的,但很简单。例如,问题与HTML文本中间的链接相同。但是,当我看着......哼哼...让我们说Facebook,他们的注册表格要求我输入我的名字和姓氏。我认为他们的英语水平可能比我的要好。 :) – Pierre 2010-03-03 15:52:04

回答

3

我建议

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

按预期做这项工作。我的解决方案看起来更像是“pythonic”。我很高兴在下次我不得不将自己的代码展示给其他开发人员时,我不会在地狱中腐烂。 :) – Pierre 2010-03-03 10:45:26

0

我想过把自定义的标签,如{{FN}}或{{LN}}在翻译字符串,并显示它们之前的实际值替换它们。

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

有一点要提的是,在一些语言民族名称必须修改依赖于所使用的地方在一个句子,以及他们如何。您需要了解每种特定语言才能正确执行。

一个可能的解决方案:保留“中的一个句子中间的”案件降到最低。保持可分离的本地化资源。

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

使用User name: {{UserName}}

+0

谢谢你的精确度。我会照顾你的建议。 但有时,当客户需要这样的事情要做,我是一个好男孩,我只是做:) 和其他一些时候,你真的没有选择。例如,在生成带有指向文本中间的动态URI的链接的HTML时。 – Pierre 2010-03-03 10:39:47

1

像这样的东西应该做的伎俩:

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

如果参数的顺序需要改变,这将会失败。 – 2010-03-03 10:39:05

+0

刚试过解决方案。事实上,我无法改变字符串的顺序。但是谢谢你的解决方案。我将在应用程序的其他部分使用它。 – Pierre 2010-03-03 10:43:35

1

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

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)) 
+0

是的,谢谢。我从来没有听说过这个解决方案,它也会很有用。 但在我的情况下,由于'模板'已经由i18n模块和gettext函数提供,并且执行这个技巧,所以我并不真正了解增益。 – Pierre 2010-03-03 10:56:41