【问题标题】:How to get default language if requested translation unavailable如果请求的翻译不可用,如何获取默认语言
【发布时间】:2016-03-17 18:25:00
【问题描述】:

我正在使用 django-hvad 进行模型翻译,并不是所有的模型都会有翻译。我希望默认为en-us

如果针对特定语言提出请求,并且模型提供该翻译,则响应应该使用该语言。如果翻译不可用,我希望返回en-us

现在发生的情况是我收到错误 500:'HttpResponse' object has no attribute '_meta'。当翻译不可用和LANGUAGES 中未定义语言代码时,都会发生这种情况。

例如,当我请求 en-us 时,我得到了状态为 200 的正确响应:

GET http://localhost:5000/survey/surveys/2/?language=en-us

如果我请求 en-US,我会收到 500 错误(注意大写从 en-usen-US 的变化):

GET http://localhost:5000/survey/surveys/2/?language=en-US

在请求 LANGUAGES 中定义但没有翻译的语言时,我收到相同的 500 错误:

GET http://localhost:5000/survey/surveys/2/?language=af

这是我的 settings.py 文件的语言部分:

settings.py

​​>
from django.utils.translation import ugettext_lazy as _

...
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True

LANGUAGES = [
    ('en-us', _('English')),
    ('af', _('Afrikaans')),
    ('ar', _('Arabic')),
    ...
    ]

如果您想知道如何处理此请求,请查看该 URL 的视图:

views.py

​​>
class SurveyDetail(APIView):
    def get_object(self, pk):
        try:
            user_language = self.request.GET.get('language')
            return models.Survey.objects.language(user_language).get(pk=pk)
        except models.Survey.DoesNotExist:
            return HttpResponse(status=status.HTTP_404_NOT_FOUND)

    def get_related_questions(self, pk):
        try:
            user_language = self.request.GET.get('language')
            return models.SurveyQuestion.objects.language(user_language).all().filter(survey=pk)
        except models.SurveyAnswer.DoesNotExist:
            return HttpResponse(status=status.HTTP_404_NOT_FOUND)

    def get_related_answers(self, pk):
        try:
            user_language = self.request.GET.get('language')
            return models.SurveyAnswer.objects.language(user_language).all().filter(question=pk)
        except models.SurveyAnswer.DoesNotExist:
            return HttpResponse(status=status.HTTP_404_NOT_FOUND)

    def get(self, request, pk, format=None):
        survey = self.get_object(pk)
        questions = self.get_related_questions(pk)
        questions_serialized = []
        for q in questions:
            questions_serialized.append(SurveyQuestionSerializer(q).data)
            questions_serialized[-1]['answers']  = SurveyAnswerSerializer(self.get_related_answers(q.pk), many=True).data

        resp_obj = SurveySerializer(survey).data
        resp_obj['questions'] = questions_serialized

        return JSONResponse(resp_obj)

【问题讨论】:

    标签: python django internationalization django-hvad


    【解决方案1】:

    https://github.com/spectras 找到这个解决方案

    https://github.com/KristianOellegaard/django-hvad/issues/136

    class MyFallbackQueryset(FallbackQueryset):
        translation_fallbacks = (None, 'en', 'de', 'fr')  
    
    class MyModel(TranslatableModel):
        objects = TranslationManager(fallback_class=MyFallbackQueryset)
    

    在评估查询时,不会将任何内容解析为当前语言。不会重新排序,但由于查询的工作方式,相同的语言出现两次并不重要。 此外,现在可以以相同的方式覆盖默认查询集(在没有调用任何语言、未翻译……时使用)。例如,只需传递 default_class=MyFallbackQueryset 就可以了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-20
      • 2015-03-29
      • 2016-07-13
      • 2016-08-10
      • 2018-03-03
      • 1970-01-01
      相关资源
      最近更新 更多