【问题标题】:Django REST Framework translation does not workDjango REST Framework 翻译不起作用
【发布时间】:2018-09-05 10:01:48
【问题描述】:

我在翻译 Django rest 中的自定义异常时遇到问题,问题是当我更改设置中的 LANGUAGE_CODE 时,一切正常,并且我的两种语言都得到了正确的翻译,但是当我尝试使用 Accept-标题中的语言更改翻译,它不能正常工作! 我的设置是:

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'core.middleware.auth_middleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'core.middleware.dates_middleware',
    'core.middleware.translation_middleware',
]
#LANGUAGE_CODE = 'fa-ir'
LANGUAGE_CODE = 'en-us'

LANGUAGES = [
    ('fa', _('Farsi')),
    ('en', _('English')),
]

TIME_ZONE = 'UTC'


USE_I18N = True

USE_L10N = True

我的例外:

from rest_framework.exceptions import APIException
from django.utils.translation import ugettext as _
class WrongUsernamePassword(APIException):
    status_code = 401
    default_detail = _('username or password is wrong')
    default_code = '401'

我的看法:

class UserViewSet(viewsets.ModelViewSet):
    ...

    @list_route(methods=['POST'], permission_classes=[AllowAny])
    def app_login(self, request):
        lang = translation.get_language() # here the value is fa
        raise WrongUsernamePassword

当我使用此标头 (Accept-Language=fa-ir) 发送请求时,我可以看到 lang 变量值为 fa,因此框架知道我更改了语言,但响应仍然是英文:

{
    "detail": "username or password is wrong"
}

有什么想法吗?

【问题讨论】:

  • 您是否运行过 makemessages/compilemessages 命令?
  • 正如我所说,如果我在设置中更改语言,两种语言都可以正常翻译!所以我当然会运行编译消息等。
  • 啊,对不起。试试Accept-Language=fa, 'fa' 作为标头值。
  • 不,和以前一样

标签: django django-rest-framework translation


【解决方案1】:

今天我处理了同样的问题。找到这个帖子,发现没有解决。

这是因为这些错误消息是在类变量中定义的,因此,它们是在加载服务器时定义的。因此,此时,标头中没有Accept-Language,因为没有请求。

为了解决这个问题,我使用了gettext_lazy 而不是gettext,因为该函数以惰性方式转换字符串。您应该使用 gettext_lazy。在ugettext() vs. ugettext_lazy() 中有一个关于ugettextugettext_lazy 的很好的解释,这让我理解了这个问题:

对于您的代码示例:

from rest_framework.exceptions import APIException
from django.utils.translation import ugettext_lazy as _
class WrongUsernamePassword(APIException):
    status_code = 401
    default_detail = _('username or password is wrong')
    default_code = '401'

【讨论】:

  • 如果您能描述在什么情况下应该使用“gettext_lazy”而不是“gettext”,则可以为论坛的其他用户改进答案。是否可以添加一些仍然需要使用“gettext”的情况?使用“gettext_lazy”有什么限制吗?
猜你喜欢
  • 1970-01-01
  • 2015-06-23
  • 2019-12-10
  • 2019-09-15
  • 2019-08-10
  • 2013-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多