[python] 언제 ugettext_lazy를 사용해야합니까?
ugettext 사용과 ugettext_lazy
번역 에 관한 질문이 있습니다 . ugettext_lazy
뷰에서 ugettext를 사용 하는 동안 모델에서 사용해야한다는 것을 배웠습니다 . 그러나 내가 사용해야 할 다른 장소가 ugettext_lazy
있습니까? 양식 정의는 어떻습니까? 그들 사이에 성능 차이가 있습니까?
편집 :
그리고 한 가지 더. 때로는, 대신 ugettext_lazy
, ugettext_noop
사용된다. 설명서에서 알 수 있듯이 ugettext_noop
문자열은 사용자에게 표시하기 전에 번역 용으로 표시되고 최신 가능한 Momment로 번역되지만 여기에 약간 혼란 스럽습니다 ugettext_lazy
. 모델과 양식에 사용해야 할 결정을 내리기가 여전히 어렵습니다.
답변
ugettext()
vs. ugettext_lazy()
양식 또는 모델과 같은 정의에서는 ugettext_lazy
이 정의의 코드가 한 번만 실행되므로 (대부분 django 시작시) 사용해야합니다 . ugettext_lazy
예를 들어 문자열을 게으른 방식으로 번역합니다. 모델에서 속성의 이름에 액세스 할 때마다 문자열이 새로 번역됩니다. 장고가 시작된 이후에 다른 언어로이 모델을 볼 수 있기 때문에 이치에 맞습니다!
ugettext
뷰가 호출 ugettext
될 때마다 새로 실행되므로 뷰 및 유사한 함수 호출에서 문제없이 사용할 수 있으므로 항상 요청에 맞는 올바른 번역을 얻을 수 있습니다!
에 관해서 ugettext_noop()
로 브라이스는 그의 대답에 지적이 기능 마크 번역 추출과 같은 문자열하지만 번역되지 않은 문자열을 반환 않습니다. 이것은 번역과 번역되지 않은 두 곳에서 문자열을 사용하는 데 유용합니다. 다음 예를 참조하십시오.
import logging
from django.http import HttpResponse
from django.utils.translation import ugettext as _, ugettext_noop as _noop
def view(request):
msg = _noop("An error has occurred")
logging.error(msg)
return HttpResponse(_(msg))
답변
_noop의 탁월한 사용법은 개발자를 위해 영어로 메시지를 기록하지만 번역 된 문자열을 뷰어에게 제공하려는 경우입니다. 이것의 예는 http://blog.bessas.me/posts/using-gettext-in-django/에 있습니다.
답변
게으른 버전은 문자열 대신 프록시 객체를 반환하며 어떤 상황에서는 예상대로 작동하지 않습니다. 예를 들면 다음과 같습니다.
def get(self, request, format=None):
search_str = request.GET.get('search', '')
data = self.search(search_str)
lst = []
lst.append({'name': ugettext_lazy('Client'), 'result': data})
return HttpResponse(json.dumps(lst), content_type='application/json')
마지막 줄은 lst 객체를 JSON으로 직렬화하려고 시도 하고 “client”에 대한 문자열 대신 프록시 객체를 갖기 때문에 실패 합니다. 프록시 객체는 json으로 직렬화 할 수 없습니다.