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字段仍然不变。