자리 표시 자와 함께 지연 번역 개체를 반환하는 방법은 무엇입니까?

Mkoistinen

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

이것은 다음 시나리오에서 잘 작동하는 것 같습니다.

  1. 정적 문자열 : (위 참조)-작동합니다!
  2. 문자열 연결 : 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를 사용하고 있습니다.

Mkoistinen

여기에서 해결책은 게으름의 추가 레이어를 제공하는 것입니다 (고맙습니다, 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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

openpyxl 조건부 서식과 함께 자리 표시자를 사용하는 방법은 무엇입니까?

분류에서Dev

오류 메시지와 HTTP 상태 코드를 함께 반환하는 방법은 무엇입니까?

분류에서Dev

구조와 함께 C ++ 체인 해시를 사용하는 동안 C2676 연산자 오류를 해결하는 방법은 무엇입니까?

분류에서Dev

함수가 true를 반환하지 않으면 문자열 값을 올바르게 반환하고 표시하는 방법은 무엇입니까?

분류에서Dev

JSON 개체에 null을 자리 표시 자로 포함하는 방법은 무엇입니까?

분류에서Dev

Boost.Python의 map_indexing_suite를 std가 아닌 사용자 지정 개체와 함께 사용하는 방법은 무엇입니까?

분류에서Dev

숨김 (cli) 도구와 함께 사용자 지정 ssh 키를 사용하는 방법은 무엇입니까?

분류에서Dev

메시지와 함께 bash 함수에서 반환하는 방법은 무엇입니까?

분류에서Dev

사용자 지정 항목 대리자와 함께 작업 할 사용자 지정 QCompleter를 얻는 방법은 무엇입니까?

분류에서Dev

정규 표현식 / 특수 문자와 함께 lstlisting 패키지를 사용하는 방법은 무엇입니까?

분류에서Dev

정규 표현식 / 특수 문자와 함께 lstlisting 패키지를 사용하는 방법은 무엇입니까?

분류에서Dev

MVC에서 페이지로드시 텍스트 상자를 채우기 위해 @ Html.EditorFor와 함께 ViewData를 사용하는 방법은 무엇입니까?

분류에서Dev

MVC에서 페이지로드시 텍스트 상자를 채우기 위해 @ Html.EditorFor와 함께 ViewData를 사용하는 방법은 무엇입니까?

분류에서Dev

이미지의 영역 좌표와 numpy의 치수를 반환하는 방법은 무엇입니까?

분류에서Dev

대체 인 텐트에서 사용자 메시지를 반환하는 방법은 무엇입니까?

분류에서Dev

지정된 형식 문자열로 교리 2와 함께 CURRENT_DATE () 함수를 사용하는 방법은 무엇입니까?

분류에서Dev

문자열에서 한 번만 나타나는 구를 표시하지 않는 방법은 무엇입니까?

분류에서Dev

사용자를 변경할 때 비밀번호를 표시하지 않는 방법은 무엇입니까?

분류에서Dev

golang / echo의 사용자 지정 HTTP 오류 처리기와 함께 BasicAuth 프롬프트를 트리거하는 방법은 무엇입니까?

분류에서Dev

Nix 패키지 관리자를 사용하여 Observer와 함께 Erlang 또는 Elixir를 설치하는 방법은 무엇입니까?

분류에서Dev

select_time에 자리 표시 자 텍스트를 포함하는 방법은 무엇입니까?

분류에서Dev

첫 번째 숫자를 확보하고 마지막 3 자리를 표시하는 방법은 무엇입니까?

분류에서Dev

typescript와 함께 반응 구성 요소의 jsx 내에서 삼항 연산자를 사용하는 방법은 무엇입니까?

분류에서Dev

지정된 연도와 일치하는 모든 개체의 평균 마력을 반환하는 방법은 무엇입니까? 자바

분류에서Dev

가변 개수의 인수와 함께 토큰 붙여 넣기 연산자를 사용하는 방법은 무엇입니까?

분류에서Dev

TVML의 img 태그에 자리 표시 자 이미지를 추가하는 방법은 무엇입니까?

분류에서Dev

함수 매개 변수에 번역 가능한 문자열을 추가하는 방법은 무엇입니까?

분류에서Dev

| = 연산자를 JavaScript에서 Delphi로 번역하는 방법은 무엇입니까?

분류에서Dev

변수 + 문자열 연결로 나뭇 가지 안에 img를 표시하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    openpyxl 조건부 서식과 함께 자리 표시자를 사용하는 방법은 무엇입니까?

  2. 2

    오류 메시지와 HTTP 상태 코드를 함께 반환하는 방법은 무엇입니까?

  3. 3

    구조와 함께 C ++ 체인 해시를 사용하는 동안 C2676 연산자 오류를 해결하는 방법은 무엇입니까?

  4. 4

    함수가 true를 반환하지 않으면 문자열 값을 올바르게 반환하고 표시하는 방법은 무엇입니까?

  5. 5

    JSON 개체에 null을 자리 표시 자로 포함하는 방법은 무엇입니까?

  6. 6

    Boost.Python의 map_indexing_suite를 std가 아닌 사용자 지정 개체와 함께 사용하는 방법은 무엇입니까?

  7. 7

    숨김 (cli) 도구와 함께 사용자 지정 ssh 키를 사용하는 방법은 무엇입니까?

  8. 8

    메시지와 함께 bash 함수에서 반환하는 방법은 무엇입니까?

  9. 9

    사용자 지정 항목 대리자와 함께 작업 할 사용자 지정 QCompleter를 얻는 방법은 무엇입니까?

  10. 10

    정규 표현식 / 특수 문자와 함께 lstlisting 패키지를 사용하는 방법은 무엇입니까?

  11. 11

    정규 표현식 / 특수 문자와 함께 lstlisting 패키지를 사용하는 방법은 무엇입니까?

  12. 12

    MVC에서 페이지로드시 텍스트 상자를 채우기 위해 @ Html.EditorFor와 함께 ViewData를 사용하는 방법은 무엇입니까?

  13. 13

    MVC에서 페이지로드시 텍스트 상자를 채우기 위해 @ Html.EditorFor와 함께 ViewData를 사용하는 방법은 무엇입니까?

  14. 14

    이미지의 영역 좌표와 numpy의 치수를 반환하는 방법은 무엇입니까?

  15. 15

    대체 인 텐트에서 사용자 메시지를 반환하는 방법은 무엇입니까?

  16. 16

    지정된 형식 문자열로 교리 2와 함께 CURRENT_DATE () 함수를 사용하는 방법은 무엇입니까?

  17. 17

    문자열에서 한 번만 나타나는 구를 표시하지 않는 방법은 무엇입니까?

  18. 18

    사용자를 변경할 때 비밀번호를 표시하지 않는 방법은 무엇입니까?

  19. 19

    golang / echo의 사용자 지정 HTTP 오류 처리기와 함께 BasicAuth 프롬프트를 트리거하는 방법은 무엇입니까?

  20. 20

    Nix 패키지 관리자를 사용하여 Observer와 함께 Erlang 또는 Elixir를 설치하는 방법은 무엇입니까?

  21. 21

    select_time에 자리 표시 자 텍스트를 포함하는 방법은 무엇입니까?

  22. 22

    첫 번째 숫자를 확보하고 마지막 3 자리를 표시하는 방법은 무엇입니까?

  23. 23

    typescript와 함께 반응 구성 요소의 jsx 내에서 삼항 연산자를 사용하는 방법은 무엇입니까?

  24. 24

    지정된 연도와 일치하는 모든 개체의 평균 마력을 반환하는 방법은 무엇입니까? 자바

  25. 25

    가변 개수의 인수와 함께 토큰 붙여 넣기 연산자를 사용하는 방법은 무엇입니까?

  26. 26

    TVML의 img 태그에 자리 표시 자 이미지를 추가하는 방법은 무엇입니까?

  27. 27

    함수 매개 변수에 번역 가능한 문자열을 추가하는 방법은 무엇입니까?

  28. 28

    | = 연산자를 JavaScript에서 Delphi로 번역하는 방법은 무엇입니까?

  29. 29

    변수 + 문자열 연결로 나뭇 가지 안에 img를 표시하는 방법은 무엇입니까?

뜨겁다태그

보관