번역

Wagtail은 관리자 인터페이스의 콘텐츠를 번역하기 위해 Transifex를 사용합니다. 우리의 목표는 Wagtail을 다양한 언어를 사용하는 사람들이 사용할 수 있도록 보장하는 것입니다. 관리자 콘텐츠의 번역은 코드를 작성하는 방법을 몰라도 기여할 수 있는 좋은 방법입니다.

참고

Wagtail로 만든 콘텐츠의 번역 및 국제화에 대해서는 국제화를 참조하세요.

번역 워크플로

Wagtail은 Django의 번역 시스템을 사용하여 현지화(번역)되며, 번역은 조직이 번역 프로젝트를 조정하는 데 도움이 되는 웹 플랫폼인 Transifex에 제공되고 관리됩니다.

Transifex의 번역은 새 릴리스 시점에만 저장소에 통합됩니다. 릴리스가 거의 준비되면 다음 버전에 대한 RC(릴리스 후보)가 있을 것이며 번역이 Transifex로 내보내집니다.

이 RC 기간 동안(보통 약 2주), 모든 번역가가 번역을 업데이트하고 추가할 기회가 있습니다. 이때 Wagtail Slack 그룹의 #translators 채널에도 공지할 것입니다.

이 새로운 번역은 후속 RC 및 최종 릴리스를 위해 Wagtail로 가져옵니다. 번역이 약 80%의 임계값에 도달하면, 해당 언어는 사용자가 선택할 수 있는 기본 언어 목록에 추가됩니다.

번역에 도움을 주는 방법

  • Slack에서 Wagtail 커뮤니티에 참여하세요.

  • 채널을 검색하여 #translator 채널에 가입하고 자신을 소개하세요.

  • Transifex로 이동하세요.

  • 무료로 시작하기를 클릭하세요.

  • 사용자 이름, 이메일, 비밀번호를 입력하세요.

  • 이용 약관에 동의하세요.

  • 무료 평가판을 클릭하거나 기존 조직에 가입하세요.

  • Wagtail에 가입하고 대시보드에서 언어 목록을 확인하세요.

  • Slack에서 함께 작업하고 싶은 언어 팀의 일원이 되기 위해 접근 권한을 요청하세요 (Transifex 사용자 이름 언급).

  • 페이지 오른쪽의 ‘사용 준비 완료’ 부분에 마우스를 올리면 리소스 보기 버튼이 나타납니다.

  • 버튼을 클릭하여 사용 가능한 리소스에 접근하세요.

  • 그러면 언어 섹션으로 이동합니다.

  • 이 페이지에는 오른쪽에 번역 패널이 있고 왼쪽에 번역할 문자열 목록이 있습니다.

  • 프로젝트를 번역하려면, 프로젝트를 선택하고 번역 패널에 번역을 입력하세요.

  • 패널의 번역 버튼을 사용하여 번역을 저장하세요.

번역을 위한 문자열 표시

코드에서 문자열은 Django의 번역 시스템을 사용하여 번역 대상으로 표시할 수 있으며, Python에서는 gettext 또는 gettext_lazy 를 사용하고 템플릿에서는 blocktranslate, translate, _(" ") 를 사용합니다.

Python과 템플릿 모두에서 항상 명명된 플레이스홀더를 사용해야 합니다. 또한 Python에서는 printf 스타일 포맷팅만 사용해야 합니다. 이는 Transifex와의 호환성을 보장하고 번역가의 작업을 돕기 위함입니다.

Python 내 번역

from django.utils.translation import gettext_lazy as _

# 이렇게 하세요: printf 스타일 + 명명된 플레이스홀더
_("Page %(page_title)s with status %(status)s") % {"page_title": page.title, "status": page.status_string}

# 익명 플레이스홀더를 사용하지 마세요
_("Page %s with status %s") % (page.title, page.status_string)
_("Page {} with status {}").format(page.title, page.status_string)

# 위치 플레이스홀더를 사용하지 마세요
_("Page {0} with status {1}").format(page.title, page.status_string)

# 새 스타일을 사용하지 마세요
_("Page {page_title} with status {status}").format(page_title=page.title, status=page.status_string)

# gettext 호출 내에서 보간하지 마세요
_("Page %(page_title)s with status %(status)s" % {"page_title": page.title, "status": page.status_string})
_("Page {page_title} with status {status}".format(page_title=page.title, status=page.status_string))

# f-string을 사용하지 마세요
_(f"Page {page.title} with status {page.status_string}")

템플릿 번역

i18n 을 가져온 다음 translate/blocktranslate 템플릿 태그로 번역할 수 있습니다. 익숙한 _() 구문을 사용하여 태그와 필터에 인수로 전달되는 문자열 리터럴도 번역할 수 있습니다.

{% extends "wagtailadmin/base.html" %}
{% load i18n %}
<!-- 예비 코드 라인 -->

<!-- translate 태그를 사용하려면 이렇게 하세요. -->
{% translate "원하는 모든 문자열" %}

<!-- blocktranslate 태그를 사용하려면 이렇게 하세요. -->
{% blocktranslate %}
    여러 줄로 된 번역 가능한 리터럴.
{% endblocktranslate %}

<!-- 태그와 필터에 전달되는 문자열 리터럴을 번역하려면 이렇게 하세요. -->

{% some_tag _("원하는 모든 문자열") %}
{% some_tag arg_of_some_tag=_("원하는 모든 문자열") %}
{% some_tag value_of_some_tag|filter=_("원하는 모든 문자열") value|yesno:_("예,아니오") %}

<!-- 문자열 리터럴 번역을 사용하는 일반적인 예시는 다음과 같습니다 -->
{% translate "리터럴이 있는 예시" as var_name %}
{% some_tag arg_of_some_tag=var_name %}

<!-- 변수가 한 번만 사용되는 경우, 대신 이렇게 할 수 있습니다 -->
{% some_tag arg_of_some_tag=_("리터럴이 있는 예시") %}

참고: Wagtail 코드에서 translateblocktranslate 대신 transblocktrans 를 볼 수 있습니다. 이것도 잘 작동합니다. transblocktrans 는 Django 초기의 태그였지만, Django 3.1에서 대체되었습니다.

추가 자료