主题
Django
国际化
settings.py配置中间件和语言pythonMIDDLEWARE = [ 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.locale.LocaleMiddleware', # 需要在 SessionMiddleware 之后 ] # 设置支持的语言 LANGUAGES = [ ('zh', '中文'), ('en', 'English'), ] LANGUAGE_CODE = 'zh' # 默认语言在根URL中配置i18n路由
pythonfrom django.urls import path, include from django.conf.urls.i18n import i18n_patterns urlpatterns = [ # 这里放不需要国际化的路由 ] urlpatterns += i18n_patterns( path("api/v1/system", include("system.urls")), # prefix_default_language=False )- i18n_patterns 会给路由添加前缀,如
/api/v1/system会变为/zh/api/v1/system。 - prefix_default_language=False 表示省略
LANGUAGE_CODE设置的语言前缀,如上请求中文只能通过/api/v1/system,请求/zh/api/v1/system将返回404。其它的语言正常请求如/en/api/v1/system。
- i18n_patterns 会给路由添加前缀,如
进入到应用目录(Django会检索这个目录下所有需要翻译的内容),创建一个
locale文件夹。创建语言文件,在应用目录下执行命令:
shelldjango-admin makemessages -l en -e py这表示对
py文件生成en语言文件(本项目为将中文转为英文),会在目录下生成一个.po文件。你需要翻译里面的内容。编译
.po文件shelldjango-admin compilemessages会在
.po相同位置生成一个.mo文件。LocaleMiddleware中间件处理的优先级是:url > cookie > 请求头的Accept-Language> 默认的LANGUAGE_CODE。- url路径中直接带语言:
/en/api/v1/system,/zh/api/v1/system - 请求头中设置
Accept-Language - 通过重定向返回默认的语言响应
- url路径中直接带语言:
注意事项:
- 修改语言文件后,记得重新编译语言文件,并重启django服务。
- 特别注意
.po文件中的fuzzy,这表示此文本在生成时可能存在错误,Django会忽略翻译此文本。#: .\applications\handler.py:404 #, fuzzy, python-brace-format msgid "无效路径:{p}" msgstr "Invalid path:{p}" - 多线程中使用时需要重新激活语言环境(子线程是默认的语言环境)。可以在主线程中获取语言,通过参数传给子线程。python
from django.utils import translation Thread(target=func, args=(arg, translation.get_language())).start() def func(arg, language): translation.activate(language)