django国际化多语言以及gettext, gettext_lazy, ugettext , ugettext_lazy

django国际化,根据浏览器请求头的Accept-Language来显示不同的语言。

一、首先做一些设置:
1、LOCALE_PATHS :存放翻译文件的目录

LOCALE_PATHS = [ os.path.join(BASE_DIR, 'locale')]

2、开启国际化和本地化支持,这是django默认的

USE_I18N = True
USE_L10N = True

3、设置LocaleMiddleware中间件,注意顺序在,SessionMiddleware后,在CommonMiddleware前。

MIDDLEWARE = [
   'django.contrib.sessions.middleware.SessionMiddleware',
   'django.middleware.locale.LocaleMiddleware',
   'django.middleware.common.CommonMiddleware',
]

二、指定要翻译的文字

from django.db import models
from django.utils.translation import  gettext, gettext_lazy, ugettext , ugettext_lazy as _
# Create your models here.
 
class Demo(models.Model):
    name  = models.CharField(max_length=50,help_text=_('This is the help text'))
    langue  = models.CharField(max_length=50,help_text=ugettext('This is the help text'))
    class Meta:
        verbose_name = 'Demo'
        db_table = 'demo'

三、生成翻译文件
因为django默认语言设置是英文,所以我们加一个中文翻译,然后运行makemessages命令,makemessages会检测代码中所有需要翻译的字符串。

django-admin makemessages -l zh-hans

语言国家的格式可以参考/django/conf/global_settings.py这个文件或者
https://blog.csdn.net/u011519550/article/details/105037667

图片.png

可以看到项目的locale目录下生了一个django.po文件,我们手动编辑这个文件,把'This is the help text' 翻译成我们想要的语言,
原始文件

#: demo/models.py:6
msgid "This is the help text 1"
msgstr ""
 
#: demo/models.py:7
msgid "This is the help text 2"
msgstr ""

编辑后:

#: demo/models.py:6
msgid "This is the help text 1"
msgstr "帮助文字一"
 
#: demo/models.py:7
msgid "This is the help text 2"
msgstr "帮助文字二"

四、 编译翻译文件
利用compilemessages命令将生成的django.po文件进行编译。

django-admin compilemessages
图片.png

django.po同目录下生成了编译文件django.mo


至此所有工作做完了,开始切换浏览器语言进行验证。
访问http://127.0.0.1:8000/admin/demo/internatioalization/add/
浏览器设置为英文时,文字都为默认的英文。

图片.png

浏览器切换中文时:
name对应的help text成功被翻译成了我们指定的"帮助文字一"。langue的没被翻译是因为使用的ugettext,不是懒加载,只会django启动时执行一次,因为django默认设置的英文,所以langue这里只会显示英文。
图片.png

如果把默认语言设置成中文

LANGUAGE_CODE = 'zh-hans'

在把浏览器调成中文,再次访问浏览器时langue字段对应的help text就会显示中文。但是切换浏览器语言时,name字段会变,langue字段仍然不变。


Django API 提供了几个有用的模块来帮助你翻译你的应用程序. 它们都在django.utils.translation中使用,大多数情况下, 我们会使用到ugettext()和ugettext_lazy().

「u」前缀代表「unicode」, 因为大多数情况下,我们经常使用 Unicode, 所以使用ugettext()代替gettext(), 使用ugettext_lazy()代替gettext_lazy().

顾名思义, lazy该函数是对翻译字符串的引用, 而不是实际翻译的文本. 因此在访问值的时候会进行转换, 而不是调用的时候.

注意这个特性,Django 启动的时候一些特定的代码只执行一次, 比如在models, forms和model forms.

那么, 我们假设在模型定义的时候使用ugettext(), 而不是ugettext_lazy()会怎么样?

1. Django 启动, 默认语言是英文.
2. Django 选择了英文版的field labels
3. 用户将网站语言改为简体中文.
4. field labels依然是英文显示. 

  因为models的字段定义仅仅被执行一次,并且在执行定义代码的时候语言不是简体中文(一般是英文).

要避免这种行为,要必须正确的使用ugettext()和ugettext_lazy()

下面总结了, 在合适的地方使用合适的函数:

ugettext_lazy(): 
    models.py (fields, verbose_name, help_text, methods short_description);
    forms.py (labels, help_text, empty_label);
    apps.py (verbose_name).
ugettext(): 
    views.py
    其他类似于在请求过程中调用的代码

你可能感兴趣的:(django国际化多语言以及gettext, gettext_lazy, ugettext , ugettext_lazy)