国际化-Django REST框架
国际化
支持国际化不是可选的。它一定是一个核心特征。
REST框架附带了可翻译的错误消息。您可以使这些在您的语言中显示为Django标准翻译机制.
这样做将使你能够:
- 使用标准选择英语以外的语言作为默认值
LANGUAGE_CODE
Django设置 - 允许客户端使用
LocaleMiddleware
包括在Django。API客户端的一个典型用法是包括Accept-Language
请求标头。
启用国际化API
可以使用标准Django更改默认语言LANGUAGE_CODE
背景:
LANGUAGE_CODE = "es-es"
您可以通过添加LocalMiddleware
敬你的MIDDLEWARE_CLASSES
背景:
MIDDLEWARE_CLASSES = [
...
'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框架翻译是通过以下方式在线管理的过渡费克斯...您可以使用Tranfex服务添加新的翻译语言。然后,维护团队将确保这些转换字符串包含在REST框架包中。
有时,您可能需要在本地项目中添加翻译字符串。如果:
- 您希望使用REST框架,语言尚未在Tranfex上翻译。
- 您的项目包括自定义错误消息,这些消息不是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
过程。
语言是如何决定的
如果希望允许每个请求的语言首选项,则需要包括django.middleware.locale.LocaleMiddleware
在你的MIDDLEWARE_CLASSES
背景。
中可以找到有关如何确定语言首选项的更多信息。Django文档...供参考的方法是:
- 首先,它在请求的URL中查找语言前缀。
- 如果没有,它会查找
LANGUAGE_SESSION_KEY
当前用户会话中的键。 - 如果做不到这一点,它就会找一块饼干。
- 如果不能做到这一点,它就会看到
Accept-Language
http标头。 - 否则,它将使用全局
LANGUAGE_CODE
背景。
对于API客户端,最合适的方法通常是使用Accept-Language
除非使用会话身份验证,否则会话和cookie将不可用,而且通常更好的实践是使用Accept-Language
API客户端的头,而不是使用语言URL前缀。
网友评论