通译之第十九章:国际化

来源:互联网 发布:淘宝女童装店铺最火 编辑:程序博客网 时间:2024/05/18 02:38

 The Django Book:第19章 国际化

Django在代码和模板中对文我国际化有完整的支持,这边解释了它怎么工作

统观
国际化的目标是容许独自的Web程序以多种语言提供内容和效能
你,Django开发人员,可以透过平添小量的钩子到你的Python代码和模板中来达到此目的,这些钩子号称通译字符串,它们
告诉Django:"如其此文本可以用那种语言通译失去,这些文本应当被通译成终极用户的语言"
Django依据用户的语言选择采取这些钩子来通译Web apps
本质上,Django作两件事儿:
一,它闪开发者和模板撰稿人指定他们apps的哪一部分应当被通译
二,它施用这些钩子来依据用户的语言选择为不一般的用户通译Web apps

怎的国际化你的app:分三步
一,在你Python代码和模板中嵌入通译字符串
二,用你想支持的语言失去那些字符串的通译
三,在你的Django设立中激活位置当中件
在幕后,Django的翻译机器应用基准的Python自带的gettext模块

如若你不需要国际化
Django的国际化钩子默许打开,这象征在构架的某些地方有一些i18n有关的过渡,如其你不应用国际化,你应当花两秒钟
来在你的settings资料钟设立USE_I18N = False,如若USE_I18N设立为False,则Django将做一些优化而不是载入国际化机器
你或者将也想从你的TEMPLATE_CONTEXT_PROCESSORS设立中剔除'django.core.context_processors.i18n'

怎么指定通译字符串
通译字符串指定了"该文本应当被通译",这些字符串可以在你的Python代码和模板中出现,标记通译字符串是你的责任,系
统只好通译它晓得的字符串

用Python代码

基准通译
经过使用方法_()指定通译字符串(是的,步骤名是下划线字符),该步骤可以在任何Python模块大局失去,你不需要import它
在这个事例中,文本"Welcome to my site."标记为通译字符串:

Java代码
一.def my_view(request):
2. output = _("Welcome to my site.")
3. return HttpResponse(output)
def my_view(request):
output = _("Welcome to my site.")
return HttpResponse(output)

步骤django.utils.translation.gettext()相当于_(),这个事例和前边的同样:

Java代码
一.from django.utils.translation import gettext
二.def my_view(request):
3. output = gettext("Welcome to my site.")
4. return HttpResponse(output)
from django.utils.translation import gettext
def my_view(request):
output = gettext("Welcome to my site.")
return HttpResponse(output)

通译可以在计算后的值上班作,这个例证和前方的两个同样:

Java代码
一.def my_view(request):
2. words = ['Welcome', 'to', 'my', 'site.']
3. output = _(' '.join(words))
4. return HttpResponse(output)
def my_view(request):
words = ['Welcome', 'to', 'my', 'site.']
output = _(' '.join(words))
return HttpResponse(output)

通译可以在变量上班作,这边的事例和上边的也同样:

Java代码
一.def my_view(request):
2. sentence = 'Welcome to my site.'
3. output = _(sentence)
4. return HttpResponse(output)
def my_view(request):
sentence = 'Welcome to my site.'
output = _(sentence)
return HttpResponse(output)

(上边两个例证中施用变量或计算值的警告是Django的通译-字符串-检测工具make-messages.py不能找出这些字符串,等会介
绍make-messages更多的内容)
你传送给_()或gettext()的字符串可以透过Python基准定名字符串插补语法指定来采取placeholders,比如:

Java代码
一.def my_view(request, n):
2. output = _('%(name)s is my name.') % {'name': n}
3. return HttpResponse(output)
def my_view(request, n):
output = _('%(name)s is my name.') % {'name': n}
return HttpResponse(output)

该技术让语言专有的通译对placeholder文本从新排序,比如,一个英语通译或者为"Adrian is my name.",而西班牙通译可
能为"Me llamo Adrian."--在通译文本后头置放placeholder(名字)而不是在它预先
鉴于这个缘故,你应当运用定名字符串插补(比如%(name)s) 而不是位置插补(比如%s可能%d),如若你施用位置插补,通译将
不能重排placeholder文本

标记字符串为不操作
施用django.utils.translation.gettext_noop()步骤来标记字符串为通译字符串而不通译它,字符串在后面从一个变量通译
如若你有恒量字符串而且应当将其用源语言储存由于他们在系统或用户上缴换的话则运用它--比如数据库中的字符串--但是
应该在最后的也许点被即时通译,比如当字符串展示给用户时

迟通译
施用django.utils.translation.gettext_lazy()步骤来迟通译字符串--当值被访问而不是应gettext_lazy()步骤被调用时
比如,为了通译模型的help_text,干下部的事儿:

Java代码
一.from django.utils.translation import gettext_lazy
2.
三.class MyThing(models.Model):
4. name = models.CharField(help_text=gettext_lazy('This is the help text'))
from django.utils.translation import gettext_lazy

class MyThing(models.Model):
name = models.CharField(help_text=gettext_lazy('This is the help text'))

这个例证中,gettext_lazy()储存了该字符串的迟摘引--而不是真实的通译,通译自身将当字符串用来字符串context时完成
比如模板在Django的admin站点点染时
如若你不喜欢冗长的名字gettext_lazy,你可以像这么给它别号为_(下划线):

Java代码
一.from django.utils.translation import gettext_lazy as _
2.
三.class MyThing(models.Model):
4. name = models.CharField(help_text=_('This is the help text'))
from django.utils.translation import gettext_lazy as _

class MyThing(models.Model):
name = models.CharField(help_text=_('This is the help text'))

在Django模型中一直应用迟通译,为域名和表名平添通译也是个好主意,这意味在Meta种中显式的写verbose_name和verbo
se_name_plural选项,经过:

Java代码
一.from django.utils.translation import gettext_lazy as _
2.
三.class MyThing(models.Model):
4. name = models.CharField(_('name'), help_text=_('This is the help text'))
5. class Meta:
6. verbose_name = _('my thing')
7. verbose_name_plural = _('mythings')
from django.utils.translation import gettext_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.ngettext()步骤来指定复数的讯息,比如:

Java代码
一.from django.utils.translation import ngettext
二.def hello_world(request, count):
3. page = ngettext('there is %(count)d object', 'there are %(count)d objects', count) % {
4. 'count': count,
5. }
6. return HttpResponse(page)
from django.utils.translation import ngettext
def hello_world(request, count):
page = ngettext('there is %(count)d object', 'there are %(count)d objects', count) % {
'count': count,
}
return HttpResponse(page)

ngettext应用三个参数:单调的通译字符串,复数方式的通译字符串和对象的数量(它作为count变量被传接给通译语言)

用模板代码
在Django模板中应用通译运用两个模板标签和一个与Python代码中略微不同的语法,为了让你的模板访问这些标签,把
{% load i18n %}安放在你的模板的上端
{% trans %}模板标签通译恒量字符串可能变量内容:

Java代码
1.


如若你只想为通译标记一个值,但是稍后从一个变量通译它,可以运用noop选项:

Java代码
1.


在{% trans %}中施用模板变量式不可1的--惟独单引号或双引号的恒量字符串是容许的,如其你的通译急需变量(placehold
ers),应用{% blocktrans %},比如:

Java代码
1.{% blocktrans %}This will have {{ value }} inside. {% endblocktrans %}
{% blocktrans %}This will have {{ value }} inside. {% endblocktrans %}

为了通译模板表达式--例如运用模板过滤器--你亟需在通译块中绑定表达式到本土变量来应用:

Java代码
1.{% blocktrans with value|filter as myvar %}
二.This will have {{ myvar }} inside.
3.{% endblocktrans %}
{% blocktrans with value|filter as myvar %}
This will have {{ myvar }} inside.
{% endblocktrans %}

如若你亟需在一个blocktrans标签里绑定多于一个表达式,用and分隔:

Java代码
1.{% blocktrans with book|title as book_t and author|title as author_t %}
二.This is {{ book_t }} by {{ author_t }}
3.{% endblocktrans %}
{% blocktrans with book|title as book_t and author|title as author_t %}
This is {{ book_t }} by {{ author_t }}
{% endblocktrans %}

至于复数,用{% plural %}标签指定奇数和复数方式并在{% blocktrans %}和{% endblocktrans %}中展示,比如:

Java代码
1.{% blocktrans count list|count as counter %}
二.There is only one {{ name }} object.
3.{% plural %}
四.There are {{ counter }} {{ name }} objects.
5.{% endblocktrans %}
{% blocktrans count list|count as counter %}
There is only one {{ name }} object.
{% plural %}
There are {{ counter }} {{ name }} objects.
{% endblocktrans %}

内部全部的块和内嵌通译运用适宜的gettext/ngettext调用
每个RequestContext可以访问两个通译专有的变量:
一,LANGUAGES是元组的列表,内中第一个元素为语言代码,第二个元素为语言名(用该语言)
二,LANGUAGE_CODE是目前用户抉择的语言,作为字符串,比如:en-us(参照下头的"怎的发现语言选择")
三,LANGUAGE_BIDI是目前语言的方向,如其为True,它为从右到左的语言,比如希伯来和阿拉伯语,如若为False则它是从左
到右的语言,比如英语,法语,德语之类
如若你不施用RequestContex扩充,你可以用三个标签失去这些值:
{% get_current_language as LANGUAGE_CODE %}
{% get_available_languages as LANGUAGES %}
{% get_current_language_bidi as LANGUAGE_BIDI %}
这些标签也亟需{% load i18n %}
通译钩子也可以在任何接受恒量字符串的模板块标签中失去,这种情况下,只需运用_()语法来指定通译字符串,比如:

Java代码
1.{% some_special_tag _("Page not found") value|yesno:_("yes,no") %}
{% some_special_tag _("Page not found") value|yesno:_("yes,no") %}

这种情况下,标签和过滤器将看到已经通译的字符串,之所以它们不需要知道通译

怎的创设语言资料
万一你标记你的字符串来稍后通译,你急需写(也许取得)语言通译自身,这边解释了它怎么工作

讯息资料
第一步是为一个新语言创设一个讯息资料,讯息资料是普普通通文本文件,它示意一个独自的语言,保护全部可得到的通译字符
串以及它们应当怎的用给定语言展现,讯息资料有一个.po资料扩展名
Django自带一个工具bin/make-messages.py,它自动创设和维护这些资料
为了创办或更新消息资料,运作这个下令:
bin/make-messages.py -l de
这边的de是关于讯息资料你想创设的语言代码,这边的语言代码为位置格式,比如,对巴西为pt_BR对奥地利德国则为de_AT
该步伐应当运作于下部三个地方中的一个:
一,django源目录(不是Subversion检出,但是透过$PYTHONPATH链接的或许座落该途径其余位置的地方)
二,你的Django项目的源目录
三,你的Django app的源目录
该步履运作于整个Django源代码树并挤出全部标记为通译的字符串,它在索引conf/locale创办(或更新)讯息资料,在de事例
中,资料则为conf/locale/de/LC_MESSAGES/django.po
它运作于你的项目源代码树或你的程序源代码树,它将做一样的事儿,但是位置索引的位置为locale/LANG/LC_MESSAGES(注
意缺少conf前缀)
没gettext?
如其你没装配gettext工具,make-messages.py将创办一纸空文件,如果是这种状况,装配gettext工具可能只是复制英语讯息
资料(conf/locale/en/LC_MESSAGES/django.po)并施用它作为开始点,它只是一个空的通译资料
.po资料格式是直接的,每个.po资料保护一些元速据,比如通译支持者的联系信息,但是资料的多数内容是讯息列表--简
单的通译字符串和非一般语言的真实的通译文本照射
比如,如其你的Django app包孕文本"Welcome to my site."的通译字符串,像这么:

Java代码
1._("Welcome to my site.")
_("Welcome to my site.")

其后make-messages.py将创造一个包孕下头讯息片段的.po资料:

Java代码
1.#: path/to/python/module.py:23
二.msgid "Welcome to my site."
三.msgstr ""
#: path/to/python/module.py:23
msgid "Welcome to my site."
msgstr ""

一个高速的解释:
一,msgid是通译字符串,它以源展示,不用更动它
二,msgstr你安放语言专有的通译,它以空开始,之所以改动它是你的责任,确认你在你的通译中护持引号
三,便利起见,每个讯息包孕通译字符串搜集的文件名和行号
长讯息是特殊情况,这边msgstr(或msgid)后边的第一个字符串是空字符串,内容自身则鄙人几行以每行一个字符串来写,这
些字符串直一连接,不用忘了字符串中扫尾的空格,不然,它们会没空格连在一起
注意你的字符集
当用你最喜欢的文本编辑器创设.po资料时,第一编者字符集行(搜寻"CHARSET")并设立它为你将施用来编者内容的字符集
一般utf-八应当为多数语言工作,但是gettext应当处置任何你给它的字符集
运作下边的下令来为新的通译字符串从新稽查全部源代码和模板并为全部语言更新全部的讯息资料:
make-messages.py -a

编译讯息资料
在你创办你的讯息资料以后--而且次次你更动它时--你将急需编译它成更有效的方式,经过gettext应用,透过bin/compile
-messages.py工具完成这个
该工具对全部可得到的.po资料运作并创办.mo资料,.mo资料是优化的二进制资料来让gettext应用,在同一索引你可以运作
make-messages.py,像这么运作compile-messages.py:
bin/compile-messages.py
就这样,你的通译已经可以施用

Django怎么发现语言选择
万一你预备了你的通译--或许,如其你只想应用Django自带的通译--你将只需要为你的app激活通译
在幕后,Django有一个十分灵便的模型来决议哪个语言应当施用--装配宽度,为非一般的用户,或许两者
为了设立装配宽度的语言选择,在你的settings资料设立LANGUAGE_CODE,Django应用该语言作为默许通译--如其没其余
翻译者找出通译则作该终极尝试
如其全部你想做的只是用你的本土语言运作Django,而且一个语言资料对你的语言可得到,全部你急需做的只是设立LANGUA
GE_CODE
如若你想让每个独自的用户指定哪个语言他想取舍,应用LocaleMiddleware,LocaleMiddleware容许基于从请求的数据做语
言抉择,它为每个用户自定义内容
为了运用LocaleMiddleware,平添'django.middleware.locale.LocaleMddleware'到你的MIDDLEWARE_CLASSES设立,由于中
间件的顺序相关系,你应当遵从下列指示:
一,确认它是第一装配的当中件中的一个
二,它应该在SessionMiddleware后边,由于LocaleMiddleware应用session数据
三,如其你应用CacheMiddleware,把LocaleMiddleware放在它后头
比如,你的MIDDLEWARE_CLASSES或许看上去像这么:

Java代码
一.MIDDLEWARE_CLASSES = (
2. 'django.contrib.sessions.middleware.SessionMiddleware',
3. 'django.middleware.locale.LocaleMiddleware',
4. 'django.middleware.common.CommonMiddleware',
5.)
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.common.CommonMiddleware',
)

LocaleMiddleware透过该算法尝试决议用户的语言选择:
一,第一,它在现阶段用户的session中寻觅django_language键
二,失败的话,它寻觅叫django_language的cookie
三,失败的话,它找寻Accept-Language HTTP脑袋,该脑袋经过你的浏览器发送而且告诉服务器你取舍哪个语言,经过优先级
排序,Django尝试脑袋中的每个语言直到它找出一个可以失去通译的语言
四,失败的话,它施用大局的LANGUAGE_CODE设立
注意:
一,在这些地方中的每一个,语言选择被期待为标准语言格式,作为一个字符抹,比如,巴西为pt-br
二,如若根本语言可以失去但是指定的子语言不能,Django施用根本语言,比如,用户指定de-at(奥地利德国)但是Django只
有de可得到,则Django应用de
三,惟独在LANGUAGES设立中列出的语言可以被抉择,如其你想限制语言选择为提供的语言的子集(由于你的程序不提供所有这
些语言),设立LANGUAGS为一个语言列表,比如:

Java代码
一.LANGUAGES = (
2. ('de', _('German')),
3. ('en', _('English')),
4.)
LANGUAGES = (
('de', _('German')),
('en', _('English')),
)

这个例证限制可得到语言为取舍德语和英语(已经任何子语言,如de-ch或en-us)
四,如其你定义一个自定义LANGUAGES设立,和前方解释的同样,标记语言为通译字符串是可以的--但是施用"假的"gettext()
步骤,而不是django.utils.translation中的,你应当从不在你的settings资料中import django.utils.translation,由于
该模块自身依赖于settings,而且它不会罗致循环import
解决方案是运用"假的"gettext()步骤,这里是一个settings资料的事例:

Java代码
一.gettext = lambda s: s
2.
三.LANGUAGES = (
4. ('de', gettext('German')),
5. ('en', gettext('English')),
6.)
gettext = lambda s: s

LANGUAGES = (
('de', gettext('German')),
('en', gettext('English')),
)

应用该排列,make-messages.py将依然为通译找寻和标记这些字符串,但是通译不会在运行时发作--之所以你将急需记住在真
实的gettext()中在运行时用运用LANGUAGES的代码包装语言
五,LocaleMiddleware只得取舍有Django提供的根本通译的语言,如其你想为你的没Django的源代码树中的通译集的程序
提供通译,你将想最少提供该语言的根本的通译,比如,Django施用技术上的讯息IDs来通译日期和时间格式--之所以你将起码
急需那些让系统准确工作的通译
一个好的开始点是复制英语的.po资料并起码通译技术讯息--也许也有证验讯息
技术讯息IDs很简略分辨,它们都是大写的,你不像其余讯息同样通译讯息ID,你对提供的英语值提供准确的当地变量,比如
应用DATETIME_FORMAT(或许DATE_FORMAT也许TIME_FORMAT),它将为你想用你的语言应用的格式字符串,格式无异于now模板
标签施用的格式字符串
万一LocaleMiddleware决议了用户的取舍,它使该取舍可认为每个请求对象作为request.LANGUAGE_CODE失去,在你的视图
代码中免费渡却该值,这里是一个容易的例证:

Java代码
一.def hello_world(request, count):
2. if request.LANGUAGE_CODE == 'de-at':
3. return HttpResponse("You prefer to read Austrian German.")
4. else:
5. return HttpResponse("You prefer to read another language.")
def hello_world(request, count):
if request.LANGUAGE_CODE == 'de-at':
return HttpResponse("You prefer to read Austrian German.")
else:
return HttpResponse("You prefer to read another language.")

注意,至于静态(无当中件)通译,语言座落settings.LANGUAGE_CODE,关于动态(当中件)通译它座落request.LANGUAGE_CODE

set_language重定向视图
便利起见,Django自带一个视图django.views.i18n.set_language,它设立用户的语言选择并重定向回来前一页面
透过增添下列行到你的URL配备来激活该视图:

Java代码
1.(r'^i18n/', include('django.conf.urls.i18n')),
(r'^i18n/', include('django.conf.urls.i18n')),

(注意该事例使视图可以在/i18n/setlang/失去)
该视图期待经过GET步骤失去,并有一个language参数设置在查询字符串里,如若session支持是容许的,该视图在用户的ses
sion中封存语言选择,不然,它在django_language cookie里封存语言选择
在设立了语言选择以后,Django按底下的算法重定向用户:
一,Django在查询字符串里查寻next参数
二,如若它不存在,或许为空,Django尝试Referer脑袋中的URL
三,如若它为空--比方说如其用户浏览器禁止了该脑袋--其后用户将被重定向到/(站点的根)作为后手
这里是HTML模板代码的事例:

Java代码
1.


2.
3.
8.
9.








在你自个儿的项目中应用通译
Django按下边的算法查寻通译:
一,第一,它在被调用的视图的程序索引查寻locale索引,如其它找出抉择语言的通译,则通译将被装配
二,其后,它在项目索引查寻locale索引,如它找出一个通译,则该通译将被装配
三,最后,它在django/conf/locale检察根本的通译
这种形式停,你可以写包孕自个儿的通译的程序,而且你可以在你的项目途径中覆盖根本通译,或许你可以构建一个包孕一些
apps的大型项目并把全部的通译安放于一个硕大的项目讯息资料,选择权在你手中
注意
如若你在应用手动配备的settings,因为Django得到计算项目索引位置的能力,项目索引中的locale索引将不被检测(Django
一般应用settings资料的位置来决议这点,如其你手动配备你的settings则settings资料不存在)
全部的讯息资料仓库以一样的形式机关,它们是:
一,$APPPATH/locale/(language)/LC_MESSAGES/django.(po|mo)
二,$PROJECTPATH/locale/(language)/LC_MESSAGES/django.(po|mo)
三,在你的settings资料中全部的在LOCALE_PATHS中列出的途径以该顺序搜索(language)/LC_MESSAGES/django.(po|mo)
四,$PYTHONPATH/django/conf/locale/(language)/LC_MESSAGES/django.(po|mo)
为了创办讯息资料,你和Django讯息资料运用雷同的make-messages.py工具,你只需在准确的地方--在conf/locale(源代码
树的情况下)或许locale/(app讯息或项目讯息情况下)索引所在的位置,你应用雷同的compile-messages.py来世成gettext
应用的二进制django.mo资料
程序讯息资料有点难以发现--它们急需LocaleMiddleware,如若你不应用该当中件,则惟独Django讯息资料和项目讯息资料
将被处置
最后,你应当思忖一下子你的通译资料的构造,如若你的程序亟需投递给其余用户而且将在其余项目里施用,你或者像运用app
专有的通译,但是运用app专有的通译和项目通译也许发作奇异的make-messages问题:make-messages将穿梭目前途径下全部
的索引这么或者把讯息IDs置放到已经在程序讯息资料的项目讯息资料中
最简略的形式是把不是项目的部分的程序储存在项目树外边(这么则随带它们自个儿的通译),这种模式停,项目级别的make-
messages将只通译联接到你的外在项目的字符串而不是独自公布的字符串

通译和JavaScript
增添通译到JavaScript发作一些问题:
一,JavaScript代码不能访问gettext兑现
二,JavaScript代码不能访问.po或许.mo资料,它们急需透过服务器投递
三,JavaScript的通译索引应当尽量小
Django提供这些问题的一个集验方案:它传接通译给JavaScript,之所以你可以在JavaScript里调用gettext之类

javascript_catalog视图
这些问题的重要解决方案是javascript_catalog视图,它施用仿照gettext接口的模式发送JavaScript代码库,加上一个通译
字符串数组,这些通译字符串来自于程序,项目可能Django代码,依据你在info_dict或URL里指定的货色
你像这么来运用它:

Java代码
一.js_info_dict = {
2. 'packages': ('your.app.package',),
3.}
4.
五.urlpatterns = patterns('',
6. (r'^jsi18n/$', 'django.views.i18n.javascript_catalog', js_info_dict),
7.)
js_info_dict = {
'packages': ('your.app.package',),
}

urlpatterns = patterns('',
(r'^jsi18n/$', 'django.views.i18n.javascript_catalog', js_info_dict),
)

在packages里的每个字符串应当为Python小数点包语法(和在INSTALLED_APPS里的字符串格式同样)而且应当引述包孕locale
索引的包,如其你指定多个包,所有这些索引合拢为一个索引,如若你有施用不同程序的字符串的JavaScript的话这很有用
你可以经过把包放在URL方式里来让该视图变得动态:

Java代码
一.urlpatterns = patterns('',
2. (r'^jsi18n/(?P/S+?)/$, 'django.views.i18n.javascript_catalog'),
3.)
urlpatterns = patterns('',
(r'^jsi18n/(?P/S+?)/$, 'django.views.i18n.javascript_catalog'),
)

经过这个,你在URL里指定了经过'+'号分隔的包名列表,如若你的页面运用来自于不同apps的代码而且它常常改变而且你不
想将其放在一个大的索引资料里的话这十分有用,鉴于保险思考,这些值不得不为django.conf可能INSTALLED_APPS设立中的


施用JavaScript通译索引
为了应用该索引,只需像这么抽取动态生成的脚本:

Java代码
1.

这解释了admin怎的失去从服务器失去通译索引,应索引载入时,你的JavaScript代码可以施用基准的gettext接口来访问它

Java代码
一.document.write(gettext('this is to be translated'));
document.write(gettext('this is to be translated'));

甚至有一个ngettext接口和一个字符串插补步骤:

Java代码
一.d = {
2. count: 十
3.};
四.s = interpolate(ngettext('this is %(count)s object', 'this are %(count)s objects', d.count), d);
d = {
count: 十
};
s = interpolate(ngettext('this is %(count)s object', 'this are %(count)s objects', d.count), d);

该interpolate步骤支持位置插补和定名插补,之所以上边的内容可以这么写:

Java代码
一.s = interpolate(ngettext('this is %s object', 'this are %s objects', 11), [11]);
s = interpolate(ngettext('this is %s object', 'this are %s objects', 11), [11]);

插补语法赖以Python,你不应该总施用字符串插补:它仍然是JavaScript,之所以代码将只得做反复的正则表达式轮换,这
不像在Python中做字符串插补那么快,之所以当你真个需要它时才运用它(比如,与ngettext工作下辈子成准确的复数方式)

创造JavaScript通译索引
你施用其余Django通译索引一样的模式来创办和更新通译索引--运用make-messages.py工具,独一的差异是你急需像这么提
供一个-d djangojs参数:

Java代码
一.make-messages.py -d djangojs -l de
make-messages.py -d djangojs -l de

这将为德语的JavaScript创造或更新通译索引,在更新通译索引以后,像普普通通Django通译索引同样运作compile-messages.py

相熟gettext的用户注意
如若你懂得gettext,你也许注意到Django作通译的这些特点:
一,字符串领域为django可能djangojs,字符串领域用于界别不同的储存数据于通用讯息资料库(通常在/usr/share/locale/)
的程序,django领域被python和模板通译字符串施用而且载入到大局通译索引,djangojs领域只被JavaScript通译索引用于
确认它们尽量小
二,Django只运用gettext和gettext_noop,这是由于Django内部一直施用DEFAULT_CHARSET字符串,对ugettext没很多施用
由于你一直急需生成utf-八
三,Django不仅独应用xgettext,它施用xgettext和msgfmt的Python包装器,这重要是为了便利
本文来源:
我的异常网
Java Exception