国际化

支持国际化不是可选的。它必须是一个核心功能。

Jannis Leidel,2015 年在 Django Under the Hood 上发表讲话

REST 框架附带可翻译的错误消息。你可以通过启用 Django 的标准翻译机制 来让这些消息显示为你的语言。

这样做将允许你

  • 使用标准的 Django 设置 LANGUAGE_CODE 选择除英语之外的语言作为默认语言。
  • 允许客户端使用 Django 附带的 LocaleMiddleware 自行选择语言。API 客户端的典型用法是包含一个 Accept-Language 请求头。

启用国际化 API

你可以使用标准的 Django 设置 LANGUAGE_CODE 更改默认语言

LANGUAGE_CODE = "es-es"

你可以通过将 LocalMiddleware 添加到你的 MIDDLEWARE 设置来开启每个请求的语言请求

MIDDLEWARE = [
    ...
    'django.middleware.locale.LocaleMiddleware'
]

启用每个请求的国际化后,客户端请求将尽可能尊重 Accept-Language 头。例如,让我们对一个不受支持的媒体类型发出请求

请求

GET /api/users HTTP/1.1
Accept: application/xml
Accept-Language: es-es
Host: example.org

响应

HTTP/1.0 406 NOT ACCEPTABLE

{"detail": "No se ha podido satisfacer la solicitud de cabecera de Accept."}

REST 框架包括这些内置翻译,既适用于标准异常情况,也适用于序列化器验证错误。

请注意,翻译仅适用于错误字符串本身。错误消息的格式和字段名称的键将保持不变。一个示例 400 Bad Request 响应主体可能如下所示

{"detail": {"username": ["Esse campo deve ser único."]}}

如果你想对响应的某些部分(如 detailnon_field_errors)使用不同的字符串,那么你可以通过使用 自定义异常处理程序 来修改此行为。

指定受支持语言的集合。

默认情况下,将支持所有可用语言。

如果你只想支持可用语言的一个子集,请使用 Django 的标准 LANGUAGES 设置

LANGUAGES = [
    ('de', _('German')),
    ('en', _('English')),
]

添加新翻译

REST 框架翻译使用 Transifex 在线管理。你可以使用 Transifex 服务添加新的翻译语言。然后,维护团队将确保这些翻译字符串包含在 REST 框架包中。

有时你可能需要在本地向你的项目添加翻译字符串。你可能需要这样做,如果

  • 你想在 Transifex 上尚未翻译的语言中使用 REST Framework。
  • 你的项目包含自定义错误消息,这些消息不属于 REST 框架的默认翻译字符串。

在本地翻译新语言

本指南假设您已熟悉如何翻译 Django 应用程序。如果您不熟悉,请先阅读 Django 翻译文档

如果您要翻译一种新语言,则需要翻译现有的 REST 框架错误消息

  1. 创建一个新文件夹,用于存储国际化资源。将此路径添加到您的 LOCALE_PATHS 设置中。

  2. 现在,为您要翻译的语言创建一个子文件夹。该文件夹应使用 区域设置名称 符号进行命名。例如:dept_BRes_AR

  3. 现在,将 基本翻译文件 从 REST 框架源代码复制到您的翻译文件夹中。

  4. 编辑您刚刚复制的 django.po 文件,翻译所有错误消息。

  5. 运行 manage.py compilemessages -l pt_BR 以使翻译可供 Django 使用。您应该会看到类似于 processing file django.po in <...>/locale/pt_BR/LC_MESSAGES 的消息。

  6. 重新启动您的开发服务器以查看更改生效。

如果您仅翻译项目代码库中存在的自定义错误消息,则无需将 REST 框架源 django.po 文件复制到 LOCALE_PATHS 文件夹中,而只需运行 Django 的标准 makemessages 进程。

如何确定语言

如果您希望允许每个请求的语言首选项,则需要在 MIDDLEWARE 设置中包含 django.middleware.locale.LocaleMiddleware

您可以在 Django 文档 中找到有关如何确定语言首选项的更多信息。供参考,该方法是

  1. 首先,它在请求的 URL 中查找语言前缀。
  2. 如果失败,它将在当前用户的会话中查找 LANGUAGE_SESSION_KEY 键。
  3. 如果失败,它将查找 cookie。
  4. 如果失败,它将查看 Accept-Language HTTP 标头。
  5. 如果失败,它将使用全局 LANGUAGE_CODE 设置。

对于 API 客户端,最合适的方法通常是使用 Accept-Language 标头;会话和 cookie 在不使用会话身份验证的情况下不可用,并且通常更好的做法是为 API 客户端首选 Accept-Language 标头,而不是使用语言 URL 前缀。