gettext — 다국어 서비스

gettext — 다국어 서비스 (GNU gettext)

gettext 모듈은 GNU gettext 메시지 카탈로그 API에 대한 국제화(I18N)와 지역화(L10N) 서비스를 제공해요. 이 모듈은 프로그램 메시지의 자연어 번역을 제공할 뿐 아니라, 프로그램이 번역 가능한 문자열을 조회할 때 올바른 번역을 돌려줍니다.

이 모듈의 API는 전통적으로 두 가지로 나뉘어요. 하나는 GNU gettext CATALOG 메서드의 모듈 수준 함수이고, 다른 하나는 효율적인 번역을 위해 GNU gettext 도구 체인이 생성하는 .mo 카탈로그 파일을 기반으로 동작하는 클래스 기반 API예요.

출처: Python 표준 라이브러리

함수

  • gettext.gettext(message) — 현재 전역 도메인에서 message의 번역을 반환해요. 번역 항목이 없으면 원래 문자열을 반환합니다.
  • gettext.dgettext(domain, message)domain에서 message의 번역을 반환해요.
  • gettext.ngettext(singular, plural, n) — 복수형 처리 로직으로 단수형·복수형 변형을 구분해 번역해요.
  • gettext.dngettext(domain, singular, plural, n) — 지정한 domain에 대해 복수형 처리를 하는 ngettext()예요.
  • gettext.pgettext(context, message) — 문맥(컨텍스트) 기반 번역 함수예요.
  • gettext.npgettext(context, singular, plural, n) — 문맥 기반 복수형 번역 함수예요.

bindtextdomain()

  • gettext.bindtextdomain(domain, localedir=None)

번역 카탈로그가 위치할 디렉터리를 domain에 바인딩해요. 파일 시스템의 권한 문제가 있을 때 유용한데, 일반적으로 GNU gettext는 메시지를 찾을 기본 디렉터리 집합을 갖고 있어요. localedir를 지정하면 그 디렉터리에서 카탈로그를 찾습니다.

textdomain()

  • gettext.textdomain(domain=None)

전역 도메인을 변경하거나 조회해요. domain=None이면 현재 전역 도메인 이름을 반환하고, 도메인 이름을 주면 현재 전역 도메인을 그것으로 바꿉니다.

translation()

  • gettext.translation(domain, localedir=None, languages=None, class_=None, fallback=False, codeset=None)

domain에 대한 번역 카탈로그를 나타내는 *class_*의 인스턴스를 반환해요. class_가 주어지지 않으면 GNUTranslations가 사용됩니다. languages는 카탈로그를 찾을 언어 코드의 리스트예요. 번역을 찾을 수 없으면(또는 fallback=True이면) NullTranslations 인스턴스가 반환될 수 있습니다.

install()

  • gettext.install(domain, localedir=None, *, add_locale_to_fields=False, names=None)

내장 _() 함수를 domain에 대한 번역자로 설치해요. names로 추가로 설치할 함수 이름을 지정할 수 있어요. 이 함수를 호출한 뒤엔 전역에서 _()를 써서 번역을 얻을 수 있습니다.

클래스

NullTranslations

  • class gettext.NullTranslations(fp=None)

번역 카탈로그를 읽지 않는 기본 번역 구현이에요. gettext()는 인자를 그대로 반환하고, ngettext()는 단수/복수 규칙에 따라 반환합니다. 서브클래싱의 기반이 되며, add_fallback(), install(), gettext(), ngettext() 등의 메서드를 제공해요.

GNUTranslations

  • class gettext.GNUTranslations(fp)

NullTranslations의 확장으로, GNU mo 파일 형식으로 저장된 번역 카탈로그를 읽어요. mo 카탈로그를 찾을 수 없으면 OSError를 발생시킵니다.

유용한 추가 메서드:

  • GNUTranslations.info() — mo 카탈로그 헤더의 메타데이터 사전을 반환.
  • GNUTranslations.gettext(message)message의 번역을 반환.

예제

프로그램에 다국어 지원을 추가하는 일반적인 패턴입니다. 먼저 도메인을 설정하고 _() 함수를 가져와서 쓰는 방식이에요:

import gettext

gettext.bindtextdomain('myapplication', '/path/to/my/language/directory')
gettext.textdomain('myapplication')
_ = gettext.gettext

print(_('This is a translatable string.'))

install()을 쓰면 어디서든 _()를 바로 쓸 수 있어요:

import gettext
gettext.install('myapplication')
print(_('This is a translatable string.'))

복수형은 ngettext으로 처리합니다:

import gettext
gettext.install('myapplication')
n = 2
print(gettext.ngettext('You have %d item.', 'You have %d items.', n) % n)

더 알아보기