(contributing_translations)= # 번역 Wagtail은 관리자 인터페이스의 콘텐츠를 번역하기 위해 [Transifex](https://www.transifex.com/)를 사용합니다. 우리의 목표는 Wagtail을 다양한 언어를 사용하는 사람들이 사용할 수 있도록 보장하는 것입니다. 관리자 콘텐츠의 번역은 코드를 작성하는 방법을 몰라도 기여할 수 있는 좋은 방법입니다. ```{note} Wagtail로 만든 콘텐츠의 번역 및 국제화에 대해서는 [](internationalisation)를 참조하세요. ``` ## 번역 워크플로 Wagtail은 Django의 [번역 시스템](inv:django#topics/i18n/translation)을 사용하여 현지화(번역)되며, 번역은 조직이 번역 프로젝트를 조정하는 데 도움이 되는 웹 플랫폼인 [Transifex](https://www.transifex.com/)에 제공되고 관리됩니다. Transifex의 번역은 새 릴리스 시점에만 저장소에 통합됩니다. 릴리스가 거의 준비되면 다음 버전에 대한 RC(릴리스 후보)가 있을 것이며 번역이 Transifex로 내보내집니다. 이 RC 기간 동안(보통 약 2주), 모든 번역가가 번역을 업데이트하고 추가할 기회가 있습니다. 이때 Wagtail Slack 그룹의 `#translators` 채널에도 공지할 것입니다. 이 새로운 번역은 후속 RC 및 최종 릴리스를 위해 Wagtail로 가져옵니다. 번역이 약 80%의 임계값에 도달하면, 해당 언어는 사용자가 선택할 수 있는 기본 언어 목록에 추가됩니다. ### 번역에 도움을 주는 방법 - [Slack](https://wagtail.org/slack/)에서 Wagtail 커뮤니티에 참여하세요. - 채널을 검색하여 `#translator` 채널에 가입하고 자신을 소개하세요. - [Transifex](https://www.transifex.com/)로 이동하세요. - 무료로 시작하기를 클릭하세요. - 사용자 이름, 이메일, 비밀번호를 입력하세요. - 이용 약관에 동의하세요. - 무료 평가판을 클릭하거나 기존 조직에 가입하세요. - [Wagtail](https://app.transifex.com/torchbox/wagtail/dashboard/)에 가입하고 대시보드에서 언어 목록을 확인하세요. - Slack에서 함께 작업하고 싶은 언어 팀의 일원이 되기 위해 접근 권한을 요청하세요 (Transifex 사용자 이름 언급). - 페이지 오른쪽의 '사용 준비 완료' 부분에 마우스를 올리면 리소스 보기 버튼이 나타납니다. - 버튼을 클릭하여 사용 가능한 리소스에 접근하세요. - 그러면 언어 섹션으로 이동합니다. - 이 페이지에는 오른쪽에 번역 패널이 있고 왼쪽에 번역할 문자열 목록이 있습니다. - 프로젝트를 번역하려면, 프로젝트를 선택하고 번역 패널에 번역을 입력하세요. - 패널의 번역 버튼을 사용하여 번역을 저장하세요. ## 번역을 위한 문자열 표시 코드에서 문자열은 Django의 [번역 시스템](inv:django#topics/i18n/translation)을 사용하여 번역 대상으로 표시할 수 있으며, Python에서는 `gettext` 또는 `gettext_lazy` 를 사용하고 템플릿에서는 `blocktranslate`, `translate`, `_(" ")` 를 사용합니다. Python과 템플릿 모두에서 항상 명명된 플레이스홀더를 사용해야 합니다. 또한 Python에서는 printf 스타일 포맷팅만 사용해야 합니다. 이는 Transifex와의 호환성을 보장하고 번역가의 작업을 돕기 위함입니다. ### Python 내 번역 ```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` 템플릿 태그로 번역할 수 있습니다. 익숙한 `_()` 구문을 사용하여 태그와 필터에 인수로 전달되는 문자열 리터럴도 번역할 수 있습니다. ```html+django {% extends "wagtailadmin/base.html" %} {% load i18n %} {% translate "원하는 모든 문자열" %} {% 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에서 대체되었습니다](https://docs.djangoproject.com/en/stable/releases/3.1/#templates). ## 추가 자료 - [](inv:django#topics/i18n/translation) - Transifex를 단계별로 안내하는 스크린 공유 [Wagtail Space US 2020 라이트닝 토크](https://www.youtube.com/watch?v=sLI_AuOMUQw&t=17s) - [Wagtail 번역을 Transifex와 동기화하기 위한 핵심 개발 지침](https://github.com/wagtail/wagtail/wiki/Managing-Wagtail-translations) - [Django 문서](inv:django#topics/i18n/translation)