版权所有,转载请注明出处:http://guangboo.org/2013/03/23/django-i18n-switch-language
当我们在构建具有国际化性的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的定义:
from django.utils.translation import ugettext_lazy as _
from django.db import models
class DemoModel(models.Model):
demofield = models.CharField(_(u'demo field'), help_text = _(u'Help text'), max_length = 10)
或者view的定义:
def index(request):
return HttpResponse(_(u'Welcome to my site.'))
在定义django的模板时,django也提供了国际化的接口,您需要在模板中添加“{% load i18n %}”,然后就可以使用trans标记了,如:
{% trans "This is my site" %}
如果你只想标记字符串而想以后再翻译,可以添加noop选项:
{% trans "This is my site" noop %}
但是trans标记只能翻译字符串,不能使用变量,如果有变量需要翻译,那么需要使用{% blocktrans %}标记。使用方法如下:
{% 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的返回值:
return render_to_response('app/index', RequestContext(request, {'site_name':'My site name'}))
其实还有另一种方式,也能达到在模板中使用上面三个变量的目的,如下代码:
{% load i18n %}
{% get_current_language as LANGUAGE_CODE %}
{% get_available_languages as LANGUAGES %}
{% get_current_language_bidi as LANGUAGE_BIDI %}
上面介绍了如何进行翻译及其国际化相关的内容,但django默认情况下时根据客户端语言的使用偏好来对内容进行翻译的,但是当我们安装的是英文操作系统希望现在中文界面时,或者中文操作系统显示英文界面时,就需要手动的设置了。实现手动设置语言偏好需要我们在web界面中添加一个语言选择的下拉框。如下,采用自定义tag的方式定义该下拉框,在templatetags目录下添加langs.py文件,内容如下:
# -*- coding:utf-8 -*-
from django import template
from django.utils.translation import get_language_info
from django.conf import settings
LANGUAGES = []
for lang_code in settings.LANGUAGES_SUPPORTED:
LANGUAGES.append(get_language_info(lang_code))
register = template.Library()
@register.inclusion_tag('app/parts/languages_select_part.html')
def language_select(default):
return {'languages':LANGUAGES, 'default':default}
方法language_select接收一个参数,该参数表示当前使用的语言代码,我们将支持的语言配置在settings.LANGUAGES_SUPPORTED下,我们只支持英文和中文。值为:
LANGUAGES_SUPPORTED = ('en', 'zh-cn',)
“app/parts/languages_select_part.html”模板的定义如下:
{% if languages %}
<form id="language-select-form" method="post" action="{% url django.views.i18n.set_language %}">{% csrf_token %}
<select class="dropdown" onchange="this.form.submit();" name="language">
{% for lang in languages %}<option value="{{ lang.code }}" {% if lang.code == default %}selected="selected"{% endif %}>{{ lang.name_local }}</option>
{% endfor %}</select>
</form>{% endif %}
模板中action的值,设置为“{% url django.views.i18n.set_language %}”,这是django提高的设置语言的接口。我们需要在urls.py中添加一段代码:
urlpatterns += patterns('',
url(r'^setlang/$', 'django.views.i18n.set_language', name = 'setlang'),
)
那么在网站的模板中,就可以通过如下代码将该下拉框添加到页面中:
{% load langs %}
{% language_select LANGUAGE_CODE %}
当选择语言后,页面会自动刷新,并且根据选择的语言进行翻译。如果您的站点还没有翻译,可以查看admin的界面显示。
分享到:
相关推荐
《PyPI上的Django多语言支持库:django-mult-languages-0.8.0》 在Python的Web开发领域,Django框架以其高效、安全和灵活性备受开发者喜爱。为了满足全球化的网站需求,多语言支持成为了必不可少的功能。PyPI...
以上只是Django框架的基本介绍,实际上,Django的功能远不止这些,还包括缓存系统、国际化、电子邮件支持、管理界面等多个方面。通过深入学习和实践,开发者可以利用Django构建出复杂、高性能的Web应用。
8. **国际化和本地化(i18n & l10n)**:Django提供了全面的国际化和本地化支持,帮助开发者构建面向全球用户的多语言应用。包括字符串翻译、日期和数字格式化等。 9. **测试(Testing)**:Django内置了强大的测试...
Django支持多语言应用,提供了翻译工具和机制,可以轻松地实现应用的国际化和本地化。 7. **缓存机制** 为了提高性能,Django提供了多种缓存策略,如页面级缓存、片段缓存等,可灵活配置缓存后端,如内存、数据库...
Django 的国际化和本地化机制是指 Django 框架中的一系列机制,旨在支持多语言和多地区应用程序。Django 4.0.4 版本引入了新的国际化和本地化功能,如异步翻译等。 性能优化 Django 的性能优化是指 Django 框架中...
Django是Python编程语言中的一款流行且功能强大的Web框架,用于构建高效、可扩展的Web应用程序。在2.2版本中,它提供了许多稳定性和性能的改进,同时也保持了向后兼容性,使得升级变得更加平滑。WHL(Wheel)文件是...
- **3.14 国际化与本地化**:讲述了 Django 支持多语言的能力。 - **3.15 日志记录**:介绍了 Django 的日志记录机制。 - **3.16 分页**:解释了 Django 中分页功能的实现方法。 - **3.17 迁移到 Python 3**:提供了...
Xadmin不仅具有美观的界面,还支持自定义视图、表单、字段、过滤器等,以及多语言支持,使开发者可以更灵活地设计后台管理界面。 3. **安装与使用**: 要在项目中使用Django2-xadmin,首先需要在终端中使用`pip ...
- **国际化支持**:Django完全支持多语言应用,可以方便地进行内容的多语言翻译。 3. Django项目目录结构: - **urls.py**:定义URL路由,将URL映射到views.py中的函数或类视图。 - **views.py**:处理用户请求...
这是一个基于 Django 构建的开源内容管理系统,它专注于用户体验,并为设计人员和开发人员提供精确的控制。 功能特点 为作者提供快速、美观的界面 完全控制前端设计和结构 ...支持多站点和多语言 支持并扩展 Django
- **国际化和本地化**:提供了关于如何使Django应用支持多语言的详细信息。 - **本地化增强包**:讨论了如何使用Django的本地化增强包来支持特定地区的特性。 - **日志记录**:指导如何在Django中设置和使用日志系统...
12. **国际化与本地化**:Django支持多语言,可以通过设置和翻译文件实现网站内容的国际化和本地化。 13. **测试**:Django自带了测试框架,可以帮助开发者编写单元测试和集成测试,确保代码的质量。 14. **部署**...
2. **Django模板语言支持**:Django的模板语言(Django Template Language, DTL)是一种声明式的模板系统,用于生成HTML或其他类型的文本。Atom-unleash-django可能提供了DTL的语法高亮和自动补全功能,帮助开发者更...
5. **国际化和本地化**:Django提供了完善的国际化和本地化支持,可以轻松地创建多语言网站。 6. **静态文件和媒体文件管理**:Django帮助管理项目中的静态文件(如CSS、JavaScript和图片),以及用户上传的媒体...
本篇主要探讨如何通过自定义Field来实现这一目标,特别关注如何扩展Django内置的`models.CharField`和`models.TextField`,使得它们支持多语言内容存储。 首先,自定义Field类`MultilingualField`继承自`models....
9. **国际化与本地化**:Django支持多语言,可以轻松实现应用的国际化和本地化。 10. **中间件(Middleware)**:中间件是Django中的一个独特概念,它是一系列钩子,可以在HTTP请求和响应之间插入自定义逻辑。 11....
- **安全性**:Django内置了多项安全特性,如防止SQL注入、XSS攻击等,确保了Web应用的安全性。 #### 三、实战项目概述 本次实战项目的目标是构建一个简单的博客系统。该博客系统将具备以下主要功能: - 用户注册...
- 国际化:如何使用Django CMS创建支持多语言的网站。 - Sitemap指南:为搜索引擎优化(SEO)提供站点地图的创建和管理。 - 模板标签:自定义和扩展Django CMS的模板系统。 - 命令行接口:通过命令行管理网站内容。 ...
11. 国际化和本地化:Django支持多语言网站的开发,提供了强大的国际化和本地化功能,包括翻译文本、日期和时间格式等。 12. 性能优化:Django 1.11.6在性能方面进行了优化,包括缓存系统、数据库查询效率等方面的...