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

django国际化多语言以及gettext, gettext_lazy, ugettext , ugettext_lazy_第1张图片

可以看到项目的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国际化多语言以及gettext, gettext_lazy, ugettext , ugettext_lazy_第2张图片

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


至此所有工作做完了,开始切换浏览器语言进行验证。

访问http://127.0.0.1:8000/admin/demo/internatioalization/add/

浏览器设置为英文时,文字都为默认的英文。

django国际化多语言以及gettext, gettext_lazy, ugettext , ugettext_lazy_第3张图片

浏览器切换中文时:

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

django国际化多语言以及gettext, gettext_lazy, ugettext , ugettext_lazy_第4张图片

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

LANGUAGE_CODE = 'zh-hans'

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

 

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