国际化
支持国际化不是可选的。它必须是一个核心功能。
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."]}}
如果你想对响应的某些部分(如 detail
和 non_field_errors
)使用不同的字符串,那么你可以通过使用 自定义异常处理程序 来修改此行为。
指定受支持语言的集合。
默认情况下,将支持所有可用语言。
如果你只想支持可用语言的一个子集,请使用 Django 的标准 LANGUAGES
设置
LANGUAGES = [
('de', _('German')),
('en', _('English')),
]
添加新翻译
REST 框架翻译使用 Transifex 在线管理。你可以使用 Transifex 服务添加新的翻译语言。然后,维护团队将确保这些翻译字符串包含在 REST 框架包中。
有时你可能需要在本地向你的项目添加翻译字符串。你可能需要这样做,如果
- 你想在 Transifex 上尚未翻译的语言中使用 REST Framework。
- 你的项目包含自定义错误消息,这些消息不属于 REST 框架的默认翻译字符串。
在本地翻译新语言
本指南假设您已熟悉如何翻译 Django 应用程序。如果您不熟悉,请先阅读 Django 翻译文档。
如果您要翻译一种新语言,则需要翻译现有的 REST 框架错误消息
-
创建一个新文件夹,用于存储国际化资源。将此路径添加到您的
LOCALE_PATHS
设置中。 -
现在,为您要翻译的语言创建一个子文件夹。该文件夹应使用 区域设置名称 符号进行命名。例如:
de
、pt_BR
、es_AR
。 -
现在,将 基本翻译文件 从 REST 框架源代码复制到您的翻译文件夹中。
-
编辑您刚刚复制的
django.po
文件,翻译所有错误消息。 -
运行
manage.py compilemessages -l pt_BR
以使翻译可供 Django 使用。您应该会看到类似于processing file django.po in <...>/locale/pt_BR/LC_MESSAGES
的消息。 -
重新启动您的开发服务器以查看更改生效。
如果您仅翻译项目代码库中存在的自定义错误消息,则无需将 REST 框架源 django.po
文件复制到 LOCALE_PATHS
文件夹中,而只需运行 Django 的标准 makemessages
进程。
如何确定语言
如果您希望允许每个请求的语言首选项,则需要在 MIDDLEWARE
设置中包含 django.middleware.locale.LocaleMiddleware
。
您可以在 Django 文档 中找到有关如何确定语言首选项的更多信息。供参考,该方法是
- 首先,它在请求的 URL 中查找语言前缀。
- 如果失败,它将在当前用户的会话中查找
LANGUAGE_SESSION_KEY
键。 - 如果失败,它将查找 cookie。
- 如果失败,它将查看
Accept-Language
HTTP 标头。 - 如果失败,它将使用全局
LANGUAGE_CODE
设置。
对于 API 客户端,最合适的方法通常是使用 Accept-Language
标头;会话和 cookie 在不使用会话身份验证的情况下不可用,并且通常更好的做法是为 API 客户端首选 Accept-Language
标头,而不是使用语言 URL 前缀。