Django2.2国际化设定

最近用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,现在再去访问你的网站,不同的国家地区,已经自动变成的了对应的语言的现实内容。


除非标明,否则皆为<IT民工の在日生活 - 神户印象>原创之作,转载必须以明文链接标明出处。
本文链接:https://www.lifeinjp.net/share/399

发表评论