Skip to content
0

Django

国际化

参考文档

  1. settings.py配置中间件和语言

    python
    MIDDLEWARE = [
       'django.contrib.sessions.middleware.SessionMiddleware',
       'django.middleware.locale.LocaleMiddleware',  # 需要在 SessionMiddleware 之后
    ]
    
    # 设置支持的语言
    LANGUAGES = [
       ('zh', '中文'),
       ('en', 'English'),
    ]
    LANGUAGE_CODE = 'zh' # 默认语言
  2. 在根URL中配置i18n路由

    python
    from 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
  3. 进入到应用目录(Django会检索这个目录下所有需要翻译的内容),创建一个 locale 文件夹。

  4. 创建语言文件,在应用目录下执行命令:

    shell
    django-admin makemessages -l en -e py

    这表示对 py 文件生成 en 语言文件(本项目为将中文转为英文),会在目录下生成一个.po文件。你需要翻译里面的内容。

  5. 编译.po文件

    shell
    django-admin compilemessages

    会在.po相同位置生成一个 .mo 文件。

  6. 如何获取对应语言的响应

    LocaleMiddleware中间件处理的优先级是:url > cookie > 请求头的Accept-Language > 默认的LANGUAGE_CODE。

    • url路径中直接带语言:/en/api/v1/system, /zh/api/v1/system
    • 请求头中设置Accept-Language
    • 通过重定向返回默认的语言响应

注意事项:

  1. 修改语言文件后,记得重新编译语言文件,并重启django服务。
  2. 特别注意.po文件中的 fuzzy ,这表示此文本在生成时可能存在错误,Django会忽略翻译此文本。
    #: .\applications\handler.py:404
    #, fuzzy, python-brace-format
    msgid "无效路径:{p}"
    msgstr "Invalid path:{p}"
  3. 多线程中使用时需要重新激活语言环境(子线程是默认的语言环境)。可以在主线程中获取语言,通过参数传给子线程。
    python
    from django.utils import translation
    
    Thread(target=func, args=(arg, translation.get_language())).start()
    
    def func(arg, language):
       translation.activate(language)