做项目的时候需要做多语言版本,记录一下一面后续忘记
首先,修改settings和url
1、增加一个中间件 :
'django.middleware.locale.LocaleMiddleware',
2、添加增加LANGUAGES和LOCAL_PATHS
LANGUAGES = (
('zh-hans', '中文简体'),
('en', 'English'),
)
LOCALE_PATHS = (
os.path.join(BASE_DIR, 'locale'),
)
注意:这里具体支持的语言需要去你对应的Django版本中查找locale文件夹 对应的文件名就是支持的语言
我Django包路径如下:
/Users/apple/Desktop/work_py3/env1/lib/python3.7/site-packages/django/conf/locale
找到虚拟环境目录下/lib/pythonxxx/site-package/django/conf/locale就是你的路径
3、添加一条url
path('i18n/', include('django.conf.urls.i18n')),
其次,生成翻译文件
在这前,需要安装gettext:
linux : sudo apt-get install gettext
mac os: brew install gettext
然后在views中找个函数存放你需要翻译的字符串,_('xxxxxxx'),如果有多个字符串
from django.utils.translation import ugettext as _
_('testString1')
_('testString2')
然后执行命令
python3 manage.py makemessages -l zh_hans
然后去项目目录下的locale文件夹下找到zh_Hans/LC_MESSAGES可以看到如下两个文件:django.mo django.po
打开django.mo后发现有这么几行
#: backend/settings.py:139
msgid "test"
msgstr ""
在msgstr填上test的译文
然后执行命令生成翻译:
python3 manage.py compilemessages
最后:在HTML中替换需要翻译的字符串,选择语言
修改template,在html的{% extends 'xxx' %}后(如果有)加上{% load i18n %},也就是注册{% trans %}标签,否则会报错; 把需要翻译的字符串放在trans标签里 {% tans 'xxxxx' %},如果需要翻译的文本含有变量,放在teans标签里{% block teans %} xxxxx {% endblocktrans %}。
注意这些字符串必须与views中注册的和django.mo中的一模一样
附选择语言HTML一份:
{% load i18n %}
<!DOCTYPE html>
<html lang="en"> <!-- 选择语言(与settings对应)-->
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<form name="testform" id="testform" method='post'>{% csrf_token %}
<select id="language" name="language" onchange="selectdb(this)">
<option value="1">please select Languages</option>
{% for lang in LANGUAGES %}
<option value="{{ lang.0 }}" > {{ lang.1 }}</option>
{% endfor %}
</select>
</form>
<p>{% trans 'Welcome to my site.' %}</p>
<script>
function selectdb(obj) {
str="/i18n/setlang/"; // action必须是这个
myform = document.getElementById('testform');
myform.method = "POST";
myform.action = str;
myform.submit();
}
</script>
</body>
</html>
大功告成