언제 ugettext_lazy를 사용해야합니까?


141

ugettext 사용과 ugettext_lazy번역 에 관한 질문이 있습니다 . ugettext_lazy뷰에서 ugettext를 사용 하는 동안 모델에서 사용해야한다는 것을 배웠습니다 . 그러나 내가 사용해야 할 다른 장소가 ugettext_lazy있습니까? 양식 정의는 어떻습니까? 그들 사이에 성능 차이가 있습니까?

편집 : 그리고 한 가지 더. 때로는, 대신 ugettext_lazy, ugettext_noop사용된다. 설명서에서 알 수 있듯이 ugettext_noop문자열은 사용자에게 표시하기 전에 번역 용으로 표시되고 최신 가능한 Momment로 번역되지만 여기에 약간 혼란 스럽습니다 ugettext_lazy. 모델과 양식에 사용해야 할 결정을 내리기가 여전히 어렵습니다.

답변:


197

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))

16
그것은 Django의 문서에 대한 설명보다 이해하기 쉽습니다. 감사합니다 @Bernhard.
Utku

14
감사! "".replace, string concatenation 등의 문자열을 기대하는 것에 전달할 때와 같이 ugettext_lazy를 사용 하지 않을 때 설명하는 것도 도움이됩니다 . 이 경우 게으른 프록시 객체가 작동하지 않습니다. 그렇지 않으면이 대답은 항상 ugettext_lazy를 사용하여 안전하다는 것을 의미합니다.
머니

4
@mrooney는 잘못된 언어 번역을 자동으로 반환하는 대신 오류가 발생하므로 문제가 덜 중요합니다. 또한 ugettext_lazy로 "".replace를 사용할 수 있습니다. 결과에 대해 str ()을 호출하면됩니다 (예 : lazytext = ugettext_lazy ( 'hello'), 나중에 str (lazytext) .replace 사용).
fabspro

1
무엇에 대해 msg = "An error has occurred"; logging.error(msg);return HttpResponse(_(msg))? why need _noop ?이 없으면 _noop, 장고는 문자열을 번역해야합니다 발견되지 않습니다?
WeizhongTu

1
번역은 변수에서 작동합니다. 다시, 동일한 문서 docs가 있습니다 . 왜 그렇습니까 _noop?
WeizhongTu


5

게으른 버전은 문자열 대신 프록시 객체를 반환하며 어떤 상황에서는 예상대로 작동하지 않습니다. 예를 들면 다음과 같습니다.

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으로 직렬화 할 수 없습니다.


2
이 경우 ugettext를 사용해야합니다.
sudip
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.