当我们在构建具有国际化性的web站点时,通常需要满足在不同的国家或地区显示本地的语言。而django提供了强大的翻译机制,并且只需要很少的代码即可完成国际化的需要。django的配置文件settings.py中,默认是开启国际化支持的,USE_I18=True,如果您的站点不需要国际化,那么可以设置USE_I18N=False,这样对于您的站点来说,就不需要加载国际化支持的机制。另外对于django的模板也同样有国际化的支持,如果您不需要,可以将TEMPLATE_CONTEXT_PROCESSORS中的"django.core.context_processors.i18n"去掉。

在python代码中,需要对要翻译的文字进行标记,标记的方法是使用"_"方法。其实是django.utils.translation.gettext方法,类似的方法还有django.utils.translation.gettext,django.utils.translation.gettext_lazy和django.utils.translation.ugettext_lazy方法。通常使用“_”来代替这些名称较长的方法,如“django.utils.translation.ugettext_lazy as _”。以上方法带“u”的表示unicode编码,另外gettext(或ugettext)与gettext_lazy(或ugettext_lazy)有些差异,gettext_lazy使得其值只有在访问时才会被翻译,而不是gettext_lazy调用时翻译。

在编写python代码时,可以这样来标记要翻译的文字,如下model的定义:

[python] view plaincopy
  1. from django.utils.translation import ugettext_lazy as _
  2. from django.db import models
  3. class DemoModel(models.Model):
  4. demofield = models.CharField(_(u'demo field'), help_text = _(u'Help text'), max_length = 10)

或者view的定义:

[python] view plaincopy
  1. def index(request):
  2. return HttpResponse(_(u'Welcome to my site.'))

在定义django的模板时,django也提供了国际化的接口,您需要在模板中添加“{% load i18n %}”,然后就可以使用trans标记了,如:

[xml] view plaincopy
  1. {% trans "This is my site" %}

如果你只想标记字符串而想以后再翻译,可以添加noop选项:

[xml] view plaincopy
  1. {% trans "This is my site" noop %}

但是trans标记只能翻译字符串,不能使用变量,如果有变量需要翻译,那么需要使用{% blocktrans %}标记。使用方法如下:

[xml] view plaincopy
  1. {% blocktrans %}This is my site {{ site_name }}{% endblocktrans %}

另外RequestContext对象有三个针对翻译的变量LANGUAGES,LANGUAGE_CODE和LANGUAGE_BIDI,分别表示语言列表,当前用户语言的偏好,和语言的书写方式:

  • LANGUAGES 是一系列元组组成的列表,每个元组的第一个元素是语言代码,第二个元素是用该语言表示的语言名称。
  • LANGUAGE_CODE是以字符串表示的当前用户偏好语言(例如, en-us )。(详见 Django 如何确定语言偏好。)
  • LANGUAGE_BIDI是当前语言的书写方式。若设为 True,则该语言书写方向为从右到左(如希伯来语和阿拉伯语);若设为 False,则该语言书写方向为从左到右(如英语、法语和德语)。

当然如果想要在模板中使用这三个变量就需要在view中添加该对象。如view的返回值:

[python] view plaincopy
  1. return render_to_response('app/index', RequestContext(request, {'site_name':'My site name'}))

其实还有另一种方式,也能达到在模板中使用上面三个变量的目的,如下代码:

[xml] view plaincopy
  1. {% load i18n %}
  2. {% get_current_language as LANGUAGE_CODE %}
  3. {% get_available_languages as LANGUAGES %}
  4. {% get_current_language_bidi as LANGUAGE_BIDI %}

上面介绍了如何进行翻译及其国际化相关的内容,但django默认情况下时根据客户端语言的使用偏好来对内容进行翻译的,但是当我们安装的是英文操作系统希望现在中文界面时,或者中文操作系统显示英文界面时,就需要手动的设置了。实现手动设置语言偏好需要我们在web界面中添加一个语言选择的下拉框。如下,采用自定义tag的方式定义该下拉框,在templatetags目录下添加langs.py文件,内容如下:

[python] view plaincopy
  1. # -*- coding:utf-8 -*-
  2. from django import template
  3. from django.utils.translation import get_language_info
  4. from django.conf import settings
  5. LANGUAGES = []
  6. for lang_code in settings.LANGUAGES_SUPPORTED:
  7. LANGUAGES.append(get_language_info(lang_code))
  8. register = template.Library()
  9. @register.inclusion_tag('app/parts/languages_select_part.html')
  10. def language_select(default):
  11. return {'languages':LANGUAGES, 'default':default}

方法language_select接收一个参数,该参数表示当前使用的语言代码,我们将支持的语言配置在settings.LANGUAGES_SUPPORTED下,我们只支持英文和中文。值为:

[python] view plaincopy
  1. LANGUAGES_SUPPORTED = ('en', 'zh-cn',)

“app/parts/languages_select_part.html”模板的定义如下:

[xml] view plaincopy
  1. {% if languages %}
  2. <form id="language-select-form" method="post" action="{% url django.views.i18n.set_language %}">{% csrf_token %}
  3. <select class="dropdown" onchange="this.form.submit();" name="language">
  4. {% for lang in languages %}<option value="{{ lang.code }}" {% if lang.code == default %}selected="selected"{% endif %}>{{ lang.name_local }}</option>
  5. {% endfor %}</select>
  6. </form>{% endif %}

模板中action的值,设置为“{% url django.views.i18n.set_language %}”,这是django提高的设置语言的接口。我们需要在urls.py中添加一段代码:

[python] view plaincopy
  1. urlpatterns += patterns('',
  2. url(r'^setlang/$', 'django.views.i18n.set_language', name = 'setlang'),
  3. )

那么在网站的模板中,就可以通过如下代码将该下拉框添加到页面中:

[xml] view plaincopy
  1. {% load langs %}
  2. {% language_select LANGUAGE_CODE %}

当选择语言后,页面会自动刷新,并且根据选择的语言进行翻译。如果您的站点还没有翻译,可以查看admin的界面显示。

django多语言支持相关推荐

  1. django mezzanine添加多语言支持

    在setting.py 添加如下代码 # system time zone. TIME_ZONE = 'UTC'# If you set this to True, Django will use t ...

  2. Django模板语言(译)

    原文地址:https://docs.djangoproject.com/zh-hans/2.1/ref/templates/language/ 翻译日期:2019年3月8日-2019年3月9日 by: ...

  3. Django模板语言相关内容

    Django模板语言相关内容 Django模板系统 官方文档 常用语法 只需要记两种特殊符号: {{  }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 变量 在Django的模板语言 ...

  4. django 1.8 官方文档翻译:4-2-1 Django模版语言

    Django模版语言 本文将介绍Django模版系统的语法.如果您需要更多该系统如何工作的技术细节,以及希望扩展它,请浏览 The Django template language: for Pyth ...

  5. Silverlight 2中多语言支持实现(上)

    引言 最近项目要在Silverlight 2应用程序中实现本地化,原以为这个过程非常简单,却没想到实现的时候一波三折,好在结果还算不错.需求是这样的,用户第一次访问的时候,默认为英文,当用户选择一种显 ...

  6. 您对TOP Server的德语、中文和日语语言支持了解吗?(二)

    2019独角兽企业重金招聘Python工程师标准>>> 下载TOP Server OPC Server最新版本 TOP Server文档支持 除了特定于驱动程序的属性/设置之外,还包 ...

  7. WPF使用X:Static做多语言支持

    原文:WPF使用X:Static做多语言支持 让程序支持多语言,一般把需要显示的字符串保存在一个资源类的static属性中. <!--[if !supportLists]--> <! ...

  8. c语言中 允许函数重载么,简述C++语言支持函数重载问题介绍

    对于C++语言作为一种欲与C兼容的语言,C++语言保留了一部分过程式语言和特点,foo_int_int这样的名字包含了函数名.函数参数数量及类型信息,C++语言就是靠这种机制来实现函数重载的. 因而它 ...

  9. WP7多国语言支持 from:http://blog.csdn.net/lee353086/article/details/6260676

    WP7多国语言支持 Kagula 2011/3/17 前言 本文阅读对象是有一定Visual Studio 2010使用经验的程序员. 这里通过一些示例介绍如何让你的Windows Phone7 Wi ...

最新文章

  1. SLAM精度测评——rpg_trajectory_evaluatio
  2. 云端卫士架构师讲DDoS攻击的智能防御之道
  3. 全球第三大手机操作系统!倒闭!
  4. ZooKeeper典型应用场景一览
  5. python基础常用语句-Python-基础-常用术语对照表
  6. RSA体系 c++/java相互进行加签验签--转
  7. ubuntu下安装极点五笔
  8. 最全的搜索引擎优化(SEO)术语表
  9. select2删除选中项,allowClear设置
  10. Vue服务端配置示例
  11. SQL Server-SQL事务处理(Stransaction)
  12. 基于JAVA+SpringMVC+MYSQL的进销存管理系统
  13. AJax错误WebForm1没有定义的javascript错误的解决方法
  14. Anonymous推荐软件含有恶意***程序
  15. QQ自动发送信息脚本
  16. win10防火墙打不开,设置是灰色的、服务列表更改启动方式也是灰色的,怎么办?
  17. python3安装要钱吗_3b1b/manim数学动画引擎安装教程(2020-8月)
  18. Locating Elements
  19. Airflow2.2.5任务调度工具
  20. html圆圈中间一个感叹号实现,一个圆圈加一个感叹号是什么标识?

热门文章

  1. python 写入csv 文件显示乱码_python 写入csv乱码问题解决方法
  2. 4月1日,正式对全球科学界开放!
  3. 常用的正则化方法总结
  4. 北美程序员面试常见问题
  5. MAC安装chromedriver碰到的问题:mv: rename chromedriver to /usr/bin/chromedriver: Operation not permitted
  6. 百度AI学习:三、文字识别
  7. android开花动画,15款界面最漂亮Android应用程序揭晓
  8. 用rest造句子_rest的用法和短语例句
  9. 这个80后靠王者荣耀赚到93亿身家
  10. 北交所开市工作准备就绪 定于2021年11月15日开市