번역¶
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 코드에서 translate 와 blocktranslate 대신 trans 와 blocktrans 를 볼 수 있습니다.
이것도 잘 작동합니다. trans 와 blocktrans 는 Django 초기의 태그였지만, Django 3.1에서 대체되었습니다.
추가 자료¶
Transifex를 단계별로 안내하는 스크린 공유 Wagtail Space US 2020 라이트닝 토크