最近用Django2.2写了个小网站,想做多语言支持,让不同地方的用户访问显示对应的语言。网上很多关于Django国际化的资料都是旧版本的,照着做根本就不对,于是我自己一边读Django2.2版本的文档,一边测试,终于搞定。
第一步,确保你的系统安装了gettext,linux好说,windows到这里下载https://mlocati.github.io/articles/gettext-iconv-windows.html
第一步,修改django的设定文件setting.py,在MIDDLEWARE里添加一个设定,开启国际化,最好是添加到关于session这句设定的后边。
MIDDLEWARE = [
......
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware',
......
]
第三步,修改django的设定文件setting.py,添加需要支持的国际化语言,我们网站本身是英文,我要让它支持中文和日语:
#这两行设定改成True
USE_I18N = True
USE_L10N = True
#下面是添加的设定
#设置语言文件的主目录
LOCALE_PATHS = (
os.path.join(BASE_DIR, 'locale'),
)
#支持的语言
LANGUAGES = (
('zh-hans', ('中文简体')),
('ja', ('日本語')),
)
第四步,在网站内容中把需要翻译的内容按照规则标识出来,分两大类,在静态模板里和Python文件里的内容。
1.标识模板里需要翻译的内容
首先在模板第一行加入如下一句:
{% load i18n %}
用{% trans %}来标识直接显示的内容或者变量
{% trans "Home" %} #直接翻译Home这个单词
{% trans Home %} #翻译变量Home,后台传过来的Home的值是什么,就翻译那个值
用{% blocktrans %}和{% endblocktrans %}来表示整段内容,可以是直接内容和变量的混合体。
{% blocktrans %}
Welcome to our site,you are from {{ Country }}
{% endblocktrans %}
2.在view里标识翻译内容(Python文件里):
from django.utils.translation import ugettext
def test(request):
err_msg = ugettext("Please login first") #括号内的内容就是要翻译的内容
......
翻译的内容多,每次写ugettext麻烦,可以像下边这样来:
from django.utils.translation import ugettext as _
def test(request):
err_msg = _("Please login first") #括号内的内容就是要翻译的内容
......
第五步,从命令行进入工程目录,生成对应翻译文件(如果步骤顺序弄错,就算执行了命令,也不会生成本地化翻译文件):
python manage.py makemessages -l zh_Hans python manage.py makemessages -l ja
!!注意,生成中文翻译文件这里,必须是zh_Hans,其他的都不正确,zh-hans完全不正确,zh_hans在windows下的服务器可以正常(因为windows系统默认不区分大小写),Linux服务器上就不正常了。
当上面的文件执行后,就会自动在你的项目比如mysite的目录下创建以下目录和文件:
locale\zh_Hans\LC_MESSAGES\django.po locale\ja\LC_MESSAGES\django.po
.po文件里就是自动收集的标识出来需要翻译的内容,比如类似如下:
#: .\cart\views.py:55 msgid "Out of stock" msgstr "" #: .\shop\templates\shop\index.html:78 msgid "Home" msgstr ""
msgid 要翻译的字符串,自动收集的你就不要修改了,但是你可以添加
msgstr 翻译后的文本,比如我翻译成中文:
#: .\cart\views.py:55 msgid "Out of stock" msgstr "脱销" #: .\shop\templates\shop\index.html:78 msgid "Home" msgstr "主页" #下面这个是我手动添加的 msgid "China" msgstr "中国"
第六部,编译第五步生成的翻译文件
python manage.py compilemessages
OK,现在再去访问你的网站,不同的国家地区,已经自动变成的了对应的语言的现实内容。