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

Django 国际化

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

 Referer 的值。如果 Referer 也是空的,即该用户的浏览器并不发送 Referer 头信息,则页面将重定向到 / (页面根目录)。这是一个HTML模板代码的例子:<form action="/i18n/setlang/" method="post"><input name="next" type="hidden" value="/next/page/" /><select name="language"> {% for lang in LANGUAGES %} <option value="{{ lang.0 }}">{{ lang.1 }}</option> {% endfor %}</select><input type="submit" value="Go" /></form>翻译与JavaScript将翻译添加到JavaScript会引起一些问题:JavaScript代码无法访问一个 gettext 的实现。JavaScript 代码并不访问 .po或 .mo 文件;它们需要由服务器分发。针对JavaScript的翻译目录应尽量小。Django已经提供了一个集成解决方案: 它会将翻译传递给JavaScript,因此就可以在JavaScript中调用gettext 之类的代码。javascript_catalog视图这些问题的主要解决方案就是 javascript_catalog 视图。该视图生成一个JavaScript代码库,包括模仿 gettext 接口的函数,和翻译字符串的数组。 这些翻译字符串来自于你在info_dict或URl中指定的应用,工程或Django内核。像这样使用:js_info_dict = { 'packages': ('your.app.package',),}urlpatterns = patterns('', (r'^jsi18n//pre>, 'django.views.i18n.javascript_catalog', js_info_dict),)packages 里的每个字符串应该是Python中的点分割的包的表达式形式(和在 INSTALLED_APPS 中的字符串相同的格式),而且应指向包含 locale 目录的包。 如果指定了多个包,所有的目录会合并成一个目录。 如果有用到来自不同应用程序的字符串的JavaScript,这种机制会很有帮助。你可以动态使用视图,将包放在urlpatterns里:urlpatterns = patterns('', (r'^jsi18n/(?P<packages>\S+)/$', 'django.views.i18n.javascript_catalog'),)这样的话,就可以在URL中指定由加号( + )分隔包名的包了。 如果页面使用来自不同应用程序的代码,且经常改变,还不想将其放在一个大的目录文件中,对于这些情况,显然这是很有用的。 出于安全考虑,这些值只能是 django.conf 或 INSTALLED_APPS 设置中的包。使用JavaScript翻译目录要使用这个目录,只要这样引入动态生成的脚本:<script type="text/javascript" src="/path/to/jsi18n/"></script>这就是管理页面如何从服务器获取翻译目录。 当目录加载后,JavaScript代码就能通过标准的 gettext 接口进行访问:document.write(gettext('this is to be translated'));也有一个ngettext接口:var object_cnt = 1 // or 0, or 2, or 3, ...s = ngettext('literal for the singular case', 'literal for the plural case', object_cnt);甚至有一个字符串插入函数:function interpolate(fmt, obj, named);插入句法是从Python借用的,所以interpolate 函数对位置和命名插入均提供支持:位置插入 obj包括一个JavaScript数组对象,元素值在它们对应于fmt的占位符中以它们出现的相同次序顺序插值 。 例如:fmts = ngettext('There is %s object. Remaining: %s', 'There are %s objects. Remaining: %s', 11);s = interpolate(fmts, [11, 20]);// s is 'There are 11 objects. Remaining: 20'命名插入 通过传送为真(TRUE)的布尔参数name来选择这个模式。 obj包括一个 JavaScript 对象或相关数组。 例如:d = { count: 10 total: 50};fmts = ngettext('Total: %(total)s, there is %(count)s object','there are %(count)s of a total of %(total)s objects', d.count);s = interpolate(fmts, d, true);但是,你不应重复编写字符串插值: 这还是JavaScript,所以这段代码不得不重复做正则表达式置换。 它不会和Python中的字符串插补一样快,因此只有真正需要的时候再使用它(例如,利用 ngettext 生成合适的复数形式)。创建JavaScript翻译目录你可以创建和更改翻译目录,就像其他Django翻译目录一样,使用django-admin.py makemessages 工具。 唯一的差别是需要提供一个-d djangojs 的参数,就像这样:django-admin.py makemessages -d djangojs -l de这样来创建或更新JavaScript的德语翻译目录。 和普通的Django翻译目录一样,更新了翻译目录后,运行compile-messages.py 即可。熟悉 gettext 用户的注意事项如果你了解 gettext ,你可能会发现Django进行翻译时的一些特殊的东西:字符串域为 django 或 djangojs 。字符串域是用来区别将数据存储在同一信息文件库(一般是/usr/share/locale/ )的不同程序。django 域是为Python和模板翻译字符串服务的,被加载到全局翻译目录。 djangojs 域只是用来尽可能缩小JavaScript翻译的体积。Django不单独使用 xgettext , 而是经过Python包装后的xgettext和msgfmt。这主要是为了方便。Windows下的gettext对于那些要提取消息或编译消息文件的人们来说,需要的只有这么多。翻译工作本身仅仅包含编辑这个类型的现存文件,但如果你要创建你自己的消息文件,或想要测试或编译一个更改过的消息文件,你将需要这个gettext公用程序。从http://sourceforge.net/projects/gettext下载以下zip文件gettext-runtime-X.bin.woe32.zipgettext-tools-X.bin.woe32.ziplibiconv-X.bin.woe32.zip在同一文件夹下展开这3个文件。(也就是 C:\Program Files\gettext-utils )更新系统路径:控制面板 > 系统> 高级 > 环境变量在系统变量列表中,点击Path,点击Edit把;C:\Program Files\gettext-utils\bin加到变量值字段的末尾。只要xgettext --version命令正常工作,你亦可使用从别处获得的gettext的二进制代码。 有些版本的0.14.4二进制代码被发现不支持这个命令。 不要试图与Django公用程序一起使用一个gettext。在一个windows命令提示窗口输入命令 xgettext --version 将导致出现一个错误弹出窗口–“xgettext.exe产生错误并且将被windows关闭”。System Message: WARNING/2 (, line 1346); backlinkInline literal start-string without end-string.

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


Django 国际化