美文网首页
国际化-Django REST框架

国际化-Django REST框架

作者: Mead170810 | 来源:发表于2019-11-01 09:25 被阅读0次

国际化-Django REST框架

国际化

支持国际化不是可选的。它一定是一个核心特征。

贾尼斯·莱德尔(Jannis Leidel),2015年在“胡德下的姜戈”(Dj.

REST框架附带了可翻译的错误消息。您可以使这些在您的语言中显示为Django标准翻译机制.

这样做将使你能够:

  • 使用标准选择英语以外的语言作为默认值LANGUAGE_CODEDjango设置
  • 允许客户端使用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."]}}

如果要对响应的某些部分使用不同的字符串,如detailnon_field_errors然后,可以使用自定义异常处理程序.

指定支持的语言集。

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

如果您只希望支持可用语言的子集,请使用Django的标准LANGUAGES背景:

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

增加新的翻译

REST框架翻译是通过以下方式在线管理的过渡费克斯...您可以使用Tranfex服务添加新的翻译语言。然后,维护团队将确保这些转换字符串包含在REST框架包中。

有时,您可能需要在本地项目中添加翻译字符串。如果:

  • 您希望使用REST框架,语言尚未在Tranfex上翻译。
  • 您的项目包括自定义错误消息,这些消息不是REST框架默认转换字符串的一部分。

本地翻译一种新语言

本指南假设您已经熟悉如何翻译Django应用程序。如果你不是,从阅读开始Django翻译文档.

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

  1. 创建要存储国际化资源的新文件夹。将此路径添加到LOCALE_PATHS背景。

  2. 现在为要翻译的语言创建一个子文件夹。应使用地区名称符号。例如:de, pt_BR, es_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过程。

语言是如何决定的

如果希望允许每个请求的语言首选项,则需要包括django.middleware.locale.LocaleMiddleware在你的MIDDLEWARE_CLASSES背景。

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

  1. 首先,它在请求的URL中查找语言前缀。
  2. 如果没有,它会查找LANGUAGE_SESSION_KEY当前用户会话中的键。
  3. 如果做不到这一点,它就会找一块饼干。
  4. 如果不能做到这一点,它就会看到Accept-Languagehttp标头。
  5. 否则,它将使用全局LANGUAGE_CODE背景。

对于API客户端,最合适的方法通常是使用Accept-Language除非使用会话身份验证,否则会话和cookie将不可用,而且通常更好的实践是使用Accept-LanguageAPI客户端的头,而不是使用语言URL前缀。

相关文章

网友评论

      本文标题:国际化-Django REST框架

      本文链接:https://www.haomeiwen.com/subject/jztfbctx.html