Python v2.7.x에서 실행되는 Django v1.6.5 프로젝트에는 구성을 문자열로 반환하는 모델이 있습니다. 반환 된 문자열이 gettext_lazy 객체가되어야하므로 나중에 필요한 모든 언어로 평가할 수 있습니다.
from __future__ import unicode_literals
from django.utils.translation import ugettext_lazy as _, string_concat
...
class MyModel(models.Model):
key = models.CharField(...)
value = models.CharField(...)
@property
def config_str(self):
return _('some configuration')
이것은 다음 시나리오에서 잘 작동하는 것 같습니다.
return string_concat(self.key, _(' equals '), self.value)
-작동합니다!무엇이되어 있지 자리로 gettext_lazy을 사용하고, 작업, 라 :
return _('“%(key)s” equals “%(value)s”' % {key: self.key, value: self.value})
또는 .format () 메커니즘 사용 :
return _('“{key}” equals “{value}”').format(key=self.key, value=self.value)
이렇게하면 .po 파일에 다음 이 포함됩니다.
#, python-format
msgid "“%(key)s” equals “%(value)s”" or
msgid "«{key}» equals «{value}»"
그러나이 예를 채울 때도 :
msgstr "«%(key)s» est égal à «%(value)s»" or
msgstr "«{key}» est égal à «{value}»"
compilemessages를 실행하면 번역이 무시되는 것 같습니다. 모델 인스턴스가 반환 한 promise를 번역 할 때 항상 자리 표시자가 채워진 EN 문자열을 얻습니다. 예를 들어 ' "foo"는 "bar"'와 같습니다. 첫 번째 호출 컨텍스트가 FR (예를 들어) 인 경우에도 EN 문자열을 얻습니다. 이것은 번역이 일어나지 않는다는 것을 말해줍니다. 게으른 객체를 평가할 때 gettext는 자리 표시 자와 이름이 지정된 값이있는 것이 아니라 번역 카탈로그에서 문자 문자열 ""foo "가"bar ""(예를 들어)와 같음을 찾는다는 것이 내 이론입니다.
이를 염두에두고 다음과 같이 전체 format ()을 lazy 객체로 래핑하려고 시도했습니다.
return _('“{key}” equals “{value}”'.format(key=self.key, value=self.value))
그러나 그것은 전혀 차이가없는 것 같습니다. = /
지금은 string_concat ()을 사용할 수 있지만 때로는 일부 번역에서 자리 표시자를 이동해야 할 필요가 있으므로이 문제를 해결하고 싶습니다.
gettext_lazy와 함께 자리 표시자를 사용할 수 없다고 생각하기 시작했습니다.
참고 : 나는 django : Translation with variables inside를 검토 했지만 a) 대답이 허용되지 않고 b) gettext_lazy가 아닌 gettext를 사용하고 있습니다.
여기에서 해결책은 게으름의 추가 레이어를 제공하는 것입니다 (고맙습니다, Django 핵심 개발자 : Florian Apolloner AKA "apollo13").
작동하는 수정 된 기능은 다음과 같습니다.
from django.utils import six
from django.utils.functional import lazy
class MyModel(models.Model):
key = models.CharField(...)
value = models.CharField(...)
@property
def configuration_string(self):
def wrapper():
return _('“{key}” equals “{value}”').format(
key=self.key,
value=self.value
)
return lazy(
wrapper,
six.text_type
)
유일한 것은 이것을 사용하는 곳에서 다음과 같이 래퍼 함수를 평가하는 것을 기억해야한다는 것입니다.
from django.utils.encoding import force_text
config = my_model_instance.configuration_string
# NOTE: Evaluate the lazy function wrapper inside the force_text()
config_str = force_text(config())
이제 제 경우에는 타사 개발자 configuration_string
가 지연 함수 래퍼, 지연 평가 된 번역 문자열 또는 일반 문자열을 반환 하는 함수를 작성하는 경우를 지원해야 하므로 다음을 사용합니다.
import types
from django.utils.encoding import force_text
from django.functional import Promise
config = my_model_instance.configuration_string
if isinstance(config, types.FunctionType):
config_str = force_text(config())
elif isinstance(config, Promise):
config_str = force_text(config)
else:
config_str = config
Apollo13에게 다시 한 번 감사드립니다!
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다