Django 템플릿의 복수 표시 및 국제화

Django 템플릿의 복수 표시 및 국제화
  • Django 템플릿의 복수 디스플레이 및 국제화
  • pluralize 필터 사용
  • Blocktrans 블록 태그plural 태그
  • Blocktrans 국제화 용법
  • Blocktrans 복수화용법plural 라벨


  • Django 개발에서 물체의 단수와 복수에 따라 서로 다른 표현 방식을 바꾸어야 하는데 특히 영어에서 단복수의 표시와 같다.다음과 같이 하십시오.
    #       
    There are 5 VMs
    #       
    There is 1 VM

    Django 템플릿에서는 두 가지 방법으로 비슷한 문제를 해결할 수 있습니다.
  • pluralize 필터
  • Blocktrans 블록 라벨과plural 라벨
  • pluralize 필터 사용
    pluralize 필터는 접미사 형식을 되돌려줍니다. 기본적으로 복수일 때 's' 접미사를 추가합니다.예:
    You have {{ num_messages }} message{{ num_messages|pluralize }}.

    만약num메시지는 1이고 출력은 You have 1 메시지입니다.5인 경우 "You have 5 messages."
    또한 복수 상황에서 추가할 접미사를 지정할 수도 있습니다. 예를 들어,
    You have {{ num_walruses }} walrus{{ num_walruses|pluralize:"es" }}.

    더 깊이 들어가면 단수와 복수 형식의 접미사를 완전히 동시에 지정할 수 있다. 예를 들어
    You have {{ num_cherries }} cherr{{ num_cherries|pluralize:"y,ies" }}.

    위의 문제로 돌아가면pluralize 필터를 사용하면 다음과 같은 형식이 됩니다.
    There {{ amount|pluralize:"is,are" }} {{ amount }} VM{{ amount|pluralize }}

    주의해야 할 것은 0은 영어에서 복수로 간주된다.
    그러나 주의해야 할 것은 위의 이런 방법은 사용이 매우 편리하지만 이를 국제화할 수 없다는 것이다.국제화를 지원해야 한다면 다음과 같은 방법이 필요하다.
    Blocktrans 블록 태그 + plural 태그
    Blocktrans 국제화 용법trans 라벨과 달리 blocktrans 템플릿 라벨에 대해서는 자리 차지 문자를 통해 복잡한 문장 (문자열과 변수를 동시에 포함) 을 국제화할 수 있습니다.다음과 같습니다.
    {% blocktrans %}This string will have {{ value }} inside.{% endblocktrans %}

    또한 템플릿 표현식, 즉 접근 대상의 속성이나 필터를 사용해야 한다면 이 표현식의 값을 국부 변수에 부여하여 Blocktrans 내부에서 사용해야 한다.원인은 뒤의 주의 설명을 보십시오.
    #       
    {% blocktrans with amount=article.price %}
    That will cost $ {{ amount }}.
    {% endblocktrans %}
    
    #      
    {% blocktrans with myvar=value|filter %}
    This will have {{ myvar }} inside.
    {% endblocktrans %}
    
    #         
    {% blocktrans with book_t=book|title author_t=author|title %}
    This is {{ book_t }} by {{ author_t }}
    {% endblocktrans %}
    django.po 파일에 대응하는 번역은 이렇게 써야 한다
    msgid "That will cost $ %(amount)s."
    msgstr "     $ %(amount)s ."
    
  • with =를 통해 값을 부여하는 방식은 후의django버전에서 지원되고 물론 새 버전은 with as의 값을 부여하는 방식을 지원한다. 예를 들어 python
    {% blocktrans with book|titleas book_t and author|title as author_t %}
  • Blocktrans 블록 탭에 더 이상 다른 블록 탭을 끼워 넣을 수 없습니다. 예를 들어 {% for%} or {% if%} 등입니다.

  • blocktrans 복수화 사용 – plural 라벨
    또한 blocktrans 태그는 복수화(pluralization)도 지원하며 다음 단계를 수행합니다.
  • count =를 통해 판단할 수량 변수를 지정하면 이counter는 단수 형식인지 복수 형식인지 판단하는 데 사용될 것이다
  • {%blocktrans%}와 {%endblocktrans%} 사이에 {%plural%} 탭을 통해 표시할 복수 형식을 지정합니다.

  • 다음 예제에서 설명하십시오.
    {% blocktrans count counter=list|length %}
    #       
    There is only one {{ name }} object.
    {% plural %}
    #       
    There are {{ counter }} {{ name }} objects.
    {% endblocktrans %}
    
    #              
    {% blocktrans with amount=article.price count years=i.length %}
    That will cost $ {{ amount }} per year.
    {% plural %}
    That will cost $ {{ amount }} per {{ years }} years.
    {% endblocktrans %}

    주의: blocktrans 내부에서 ungettext 방법을 호출하여 국제화를 지원하기 때문에 ungettext를 사용하는 것과 같이 Blocktrans 블록 라벨에서 단일 변수 이름으로만 데이터를 렌더링할 수 있기 때문에 표현식과 필터의 사용에 대해 단일 국부 변수로 미리 값을 부여하여 Blocktrans에서 데이터를 렌더링할 수 있도록 해야 한다.
    위에서 논의한 후에 최초의 문제로 돌아가면 blocktrans로 복수화된 문제를 해결할 수 있을 뿐만 아니라 우아하게 국제화를 지원할 수 있다.
    # template
    {% blocktrans count amount=amount %}
       There is {{ amount }} VM.
    {% plural %}
       There are {{ amount }} VMs.
    {% endblocktrans %}
    
    # django.po
    msgid ""
    "
    "
    " There is %(amount)s VM.
    "
    msgid_plural "" "
    "
    " There are %(amount)s VMs.
    "
    msgstr[0] "" "
    "
    " %(amount)s
    "

    여기서 특히 포 파일에서 번역을 할 때 조판은 반드시template의 격식에 따라 엄격히 해야 한다. 특히 줄과 빈칸을 바꾸고 절대적인 일치를 유지해야 한다. 다음에 비교 분석을 하기 위해 몇 가지 모델을 제시한다.
    # example 1
    # -----template------
    
    {% blocktrans count amount=amount %} There is {{ amount }} VM. {% plural %} There are {{ amount }} VMs. {% endblocktrans %}
    # -----django.po------- msgid "" # `blocktrans` "
    "
    # `blocktrans` " There is %(amount)s VM.
    "
    # , " " # `plural` ( )` msgid_plural "" # `plural` "
    "
    # `plural` " There are %(amount)s VMs.
    "
    # , " " # `endblocktrans` ( ) msgstr[0] "" "
    "
    " %(amount)s " # ,msgstr[0] msgid "
    " ,
    # msgstr[0] "
    %(amount)s "
    # example 2 # -----template------ {% blocktrans count amount=amount %}There is {{ amount }} VM.{% plural %}There are {{ amount }} VMs.{% endblocktrans %} # -----django.po------- msgid "There is %(amount)s VM." msgid_plural "There are %(amount)s VMs." msgstr[0] " %(amount)s "

    위의 코드 분석을 비교해 보면 일반적으로 프론트 데스크톱에서 미리 처리 형식의 레이아웃이 필요하지 않으면 두 번째 방식으로 표시하는 것을 권장한다.
    또한 msgstr[0], msgstr[1],......에 대해 나중에 깊이 연구하면 이곳을 참고할 수 있습니다.
    참조 1.Built-in template tags and filters | Django documentation | Django 2. Translation | Django documentation | Django

    좋은 웹페이지 즐겨찾기