当前位置:K88软件开发文章中心网站服务器框架django → 文章内容

Django 国际化

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-25 14:19:31

code string.u"Hello %s" % ugettext_lazy("people")# This will not work, since you cannot insert a unicode object# into a bytestring (nor can you insert our unicode proxy there)"Hello %s" % ugettext_lazy("people")如果你曾经见到到像"hello"这样的输出,你就可能在一个字节串中插入了ugettext_lazy()的结果。 在您的代码中,那是一个漏洞。如果觉得 gettextlazy 太过冗长,可以用  (下划线)作为别名,就像这样:from django.utils.translation import ugettext_lazy as _class MyThing(models.Model): name = models.CharField(help_text=_('This is the help text'))在Django模型中总是无一例外的使用惰性翻译。 为了翻译,字段名和表名应该被标记。(否则的话,在管理界面中它们将不会被翻译) 这意味着在Meta类中显式地编写verbose_nane和verbose_name_plural选项,而不是依赖于Django默认的verbose_name和verbose_name_plural(通过检查model的类名得到)。from django.utils.translation import ugettext_lazy as _class MyThing(models.Model): name = models.CharField(_('name'), help_text=_('This is the help text')) class Meta: verbose_name = _('my thing') verbose_name_plural = _('mythings')复数的处理使用django.utils.translation.ungettext()来指定以复数形式表示的消息。 例如:from django.utils.translation import ungettextdef hello_world(request, count): page = ungettext('there is %(count)d object', 'there are %(count)d objects', count) % { 'count': count, } return HttpResponse(page)ngettext 函数包括三个参数: 单数形式的翻译字符串,复数形式的翻译字符串,和对象的个数(将以 count 变量传递给需要翻译的语言)。模板代码Django模板使用两种模板标签,且语法格式与Python代码有些许不同。 为了使得模板访问到标签,需要将{% load i18n %} 放在模板最前面。这个{% trans %}模板标记翻译一个常量字符串 (括以单或双引号) 或 可变内容:{% trans "This is the title." %}{% trans myvar %}如果有noop 选项,变量查询还是有效但翻译会跳过。 当空缺内容要求将来再翻译时,这很有用。{% trans "myvar" noop %}在一个带 {% trans %} 的字符串中,混进一个模板变量是不可能的。如果你的译文要求字符串带有变量(占位符placeholders),请使用 {% blocktrans %} :{% blocktrans %}This string will have {{ value }} inside.{% endblocktrans %}使用模板过滤器来翻译一个模板表达式,需要在翻译的这段文本中将表达式绑定到一个本地变量中:{% blocktrans with value|filter as myvar %}This will have {{ myvar }} inside.{% endblocktrans %}如果需要在 blocktrans 标签内绑定多个表达式,可以用 and 来分隔:{% blocktrans with book|title as book_t and author|title as author_t %}This is {{ book_t }} by {{ author_t }}{% endblocktrans %}为了表示单复数相关的内容,需要在 {% blocktrans %} 和 {% endblocktrans %} 之间使用 {% plural %} 标签来指定单复数形式,例如:{% blocktrans count list|length as counter %}There is only one {{ name }} object.{% plural %}There are {{ counter }} {{ name }} objects.{% endblocktrans %}其内在机制是,所有的块和内嵌翻译调用相应的 gettext 或 ngettext 。每一个RequestContext可以访问三个指定翻译变量:{{ LANGUAGES }} 是一系列元组组成的列表,每个元组的第一个元素是语言代码,第二个元素是用该语言表示的语言名称。作为一二字符串,LANGUAGE_CODE是当前用户的优先语言。 例如: en-us。(请参见下面的Django如何发现语言偏好)LANGUAGE_BIDI就是当前地域的说明。 如果为真(True),它就是从右向左书写的语言,例如: 希伯来语,阿拉伯语。 如果为假(False),它就是从左到右书写的语言,如: 英语,法语,德语等。如果你不用这个RequestContext扩展,你可以用3个标记到那些值:{% get_current_language as LANGUAGE_CODE %}{% get_available_languages as LANGUAGES %}{% get_current_language_bidi as LANGUAGE_BIDI %}这些标记亦要求一个 {% load i18n %} 。翻译的hook在任何接受常量字符串的模板块标签内也是可以使用的。 此时,使用 _() 表达式来指定翻译字符串,例如:{% some_special_tag _("Page not found") value|yesno:_("yes,no") %}在这种情况下,标记和过滤器两个都会看到已经翻译的字符串,所有它们并不需要提防翻译操作。备注:在这个例子中,翻译结构将放过字符串"yes,no",而不是单独的字符串"yes"和"no"。翻译的字符串将需要包括逗号以便过滤器解析代码明白如何分割参数。 例如, 一个德语翻译器可能会翻译字符串 "yes,no" 为"ja,nein" (保持逗号原封不动)。与惰性翻译对象一道工作在模型和公用函数中,使用ugettext_lazy()和ungettext_lazy()来标记字符串是很普遍的操作。 当你在你的代码中其它地方使用这些对象时,你应当确定你不会意外地转换它们成一个字符串,因为它们应被尽量晚地转换(以便正确的地域生效) 这需要使用及个帮助函数。拼接字符串: string_concat()标准Python字符串拼接(''.join([...]) ) 将不会工作在包括惰性翻译对象的列表上。 作为替代,你可以使用django.utils.translation.string_concat(), 这个函数创建了一个惰性对象,其连接起它的内容 并且 仅当结果被包括在一个字符串中时转换它们为字符串 。 例如:from django.utils.translation import string_concat# ...name = ugettext_lazy(u'John Lennon')instrument = ugettext_lazy(u'guitar')result = string_concat([name, ': ', instrument])在这种情况下,当result 自己被用与一个字符串时, result 中的惰性翻译将仅被转换为字符串(通常在模板渲染时间)。allow_lazy() 修饰符Django提供很多功能函数(如:取一个字符串作为他们的第一个参数并且对那个字符串做些什么)。(尤其在django.utils 中) 这些函数被模板过滤器像在其他代码中一样直接使用。如果你写你自己的类似函数并且与翻译打交道,当第一个参数是惰性翻译对象时,你会面临“做什么”的难题。 因为你可能在视图之外使用这个函数(并且因此当前线程的本地

上一页  [1] [2] [3] [4] [5]  下一页


Django 国际化