django-I18n-国际化语言

上一篇文章提到了django 的语言问题,查阅资料后发现刚才的解释不是十分准确,看到一篇介绍相关内容的博客感觉不错,节选部分全文

先来看两个概念:

  • 国际化:是指为了该软件在任何地区的潜在使用而进行程序设计的过程。 它包括了为将来翻译而标记的文本(比如用户界面要素和错误信息等)、日期和时间的抽象显示以便保证不同地区的标准得到遵循、为不同时区提供支持,并且一般 确保代码中不会存在关于使用者所在地区的假设。 您会经常看到国际化被缩写为“I18N” (18表示Internationlization这个单词首字母I和结尾字母N之间的字母有18个)。
  • 本地化: 是指使一个国际化的程序为了在某个特定地区使用而进行实际翻译的过程。 有时,本地化缩写为L10N 。

使用Django 国际化

  1. 第一步:在你的Python代码和模板中嵌入待翻译的字符串。
  2. 第二步:把那些字符串翻译成你要支持的语言。
  3. 第三步:在你的Django settings文件中激活本地中间件。

如何嵌入待翻译的字符串

使用函数django.utils.translation.ugettext() 来指定一个翻译字符串。 作为惯例,使用短别名_来引入这个函数以节省键入时间.

from django.utils.translation import ugettext as _
def my_view(request):
    output = _("Welcome to my site.")
    return HttpResponse(output)

小注意:

  1. _ugettext()函数的参数可以是变量,但检测工具make_messages.py将找不到这些字符串。
  2. _占位符:特定语言的译文可能对翻译字符串重新排序,使用位置占位符可能达不到预期效果,建议使用命名字符串插入,如_('today is %(day)s'%{'day':'monday'})
  3. 本人补充——把ugettext函数重命名为下划线不是强制要求,但这样更符合惯例。

扩展知识:

  1. 使用 django.utils.translation.gettext_noop() 函数来标记一个不需要立即翻译的字符串。 这个串会稍后从变量翻译。使用这种方法的环境是,有字符串必须以原始语言的形式存储(如储存在数据库中的字符串)而在最后需要被翻译出来(如显示给用户时)。
  2. 使用 django.utils.translation.gettext_lazy() 函数,使得其中的值只有在访问时才会被翻译,而不是在gettext_lazy() 被调用时翻译。
  3. 使用django.utils.translation.ungettext()来指定以复数形式表示的消息。

模块中嵌入翻译字符串

Django模板使用两种模板标签,为了使得模板访问到标签,需要将

{% load i18n %}

放在模板最前面。这个

{% trans %}

模板标记翻译一个常量字符串 或 可变内容:

{%load i18n%}
<title>{%trans 'this is a title' %}</title>
<title>{%trans strvar %}</title>

小注意:

在一个带

{% trans %}

的字符串中,混进一个模板变量是不可能的。如果译文要求字符串带有变量,使用

{%blocktrans%}
{%endblocktrans%}