如果对国际化概念不清楚的话,先看这篇 python的国际化gettext模块。
下面直接演示在Django中是怎么个国际化流程。
views.py相关代码
from django.http import HttpResponse
from django.utils.translation import gettext
def index(request):
return HttpResponse(gettext("hello world")) # 标记待翻译字符串
settings.py相关设置
LANGUAGE_CODE = 'zh-hans'
USE_I18N = True
LOCALE_PATHS = [os.path.join(BASE_DIR, 'locale')]
# 并把中间件'django.middleware.locale.LocaleMiddleware'加进去,有先后顺序,要在SessionMiddleware后面,CommonMiddleware前面。
从源码中抽取待翻译字符串生成po文件
python3 manage.py makemessages -l zh_hans # 注意这里是zh_hans,而不是zh-hans
# 会在项目根目录下自动创建目录和文件locale/zh_hans/LC_MESSAGES/django.po。
编辑po文件, 在msgstr输入对应的中文
msgid "hello world"
msgstr "你好世界"
编译成mo文件
python3 manage.py compilemessages
运行server,并浏览器访问这个接口,会看到
你好世界
至此,整个流程就通了。
还可以由客户端自己指定语言,设置http头的Accept-Language就行了,会优先读这个,没有的话才读的settings.py里面全局的LANGUAGE_CODE. 优先读取哪个语言的逻辑在LocaleMiddleware里面。
如果是浏览器的话,一般浏览器设置什么语言,发请求的时候,Accept-Language会自动设置成什么语言。所以如果看到settings.py设置LANGUAGE_CODE=’en-us’,而浏览器访问的时候却显示中文,不要惊讶,是因为Accept-Language优先级高。
下面用Paw演示一下。
更多细节请看文档