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
可以看到项目的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
django.po同目录下生成了编译文件django.mo
至此所有工作做完了,开始切换浏览器语言进行验证。
访问http://127.0.0.1:8000/admin/demo/internatioalization/add/
浏览器设置为英文时,文字都为默认的英文。
浏览器切换中文时:
name对应的help text成功被翻译成了我们指定的"帮助文字一"。langue的没被翻译是因为使用的ugettext,不是懒加载,只会django启动时执行一次,因为django默认设置的英文,所以langue这里只会显示英文。
如果把默认语言设置成中文
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
其他类似于在请求过程中调用的代码