Python Localization

1. Python Localization : gettext

Python에서 다국어를 지원하기 위해 gettext 모듈을 사용할 수 있다. gettext 모듈은 GNU gettext 기능을 지원하는 Python 내장 모듈로서, Internationalization (I18N)과 Localization (L10N) 기능을 제공한다. gettext 모듈은 크게 GNU gettext API를 지원하는 함수 형태의 API와 클래스 형태의 API (Class-base API)을 함께 지원한다.

Python에서 다른 언어를 지원하기 위해서, 아래 예제에서 처럼 gettext.translation(domain, localedir, languages) 를 호출하여 translation 객체를 얻을 후 install() 메서드를 호출하면 된다. 이때, domain은 임의의 명칭을 지정할 수 있는데, 이는 번역된 언어 데이타 파일인 *.mo (*.po) 파일의 이름이 된다. 예를 들어, domain 명이 myapp 이면, Python은 번역된 파일로 myapp.mo 파일을 찾게 된다. localedir은 *.mo 파일의 위치를 찾는 기본 디렉토리인데, 종합하면 Localization은 localedir/{언어}/LC_MESSAGES/{domain}.mo 파일을 찾게 된다. 예를 들어, 아래의 경우 locales/ko/LC_MESSAGES/myapp.mo 파일이 한국어를 위한 Localization 파일의 위치가 된다.

import os
import gettext

lang = "ko"
localedir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'locales/')

translations = gettext.translation('myapp', localedir=localedir, fallback=True, languages=[lang])
translations.install()

_ = translations.gettext

# 아래 문자열 "Hello world"가 번역된 언어로 표현될 것임
s = _("Hello world")
print(s)  

translations.install()은 _() 함수를 Python built-in 네임스페이스에 설치하게 된다. _ = translations.gettext 문장은 _ 을 translations.gettext의 alias로 사용한다는 것을 표시한다. 이러한 기본 셋팅이 완료된 후, Python의 "문자열"을 _("문자열") 와 같이 변경하면, 해당 문자열이 *.mo 파일의 번역 문자열로 변경되어 표시된다. 예를 들어, 위의 _("Hello world") 문장은 영문 텍스트 "Hello world"에 상응하는 한글 텍스트를 locales/ko/LC_MESSAGES/myapp.mo 파일에서 찾아 가져오게 된다.

2. Localization 파일 구조

Localization 파일의 구조는 아래 그림에서 보듯이, localization 루트 폴더 하에 언어(en, ko 등) 폴더를 만들고, 그 안에 LC_MESSAGES 라는 서브폴더를 생성하여, 이 LC_MESSAGES 안에 *.po / *.mo 파일을 넣게 된다.

locales/
    ├── en
    │   └── LC_MESSAGES
    │           └── myapp.po
    └── ko
        └── LC_MESSAGES
                └── myapp.po

*.po 파일은 영어와 번역어를 가지고 있는 텍스트 파일이다. Python 소스코드에서 문자열을 _("문자열") 처럼 코딩한 후, 아래 명령을 실행하면 *.po 파일을 자동으로 생성할 수 있다. 이 명령은 Python 설치시 내장되어 있는 pygettext.py 모듈(파이선 설치 폴더의 Tools\i18n 폴더 있음)을 사용한 것으로, -d 옵션은 domain 이름을 정하는 것이고, -o 옵션을 출력 파일의 위치를 전하는 것이며, 마지막의 . 은 입력 파일들을 정하는 것으로 현재 폴더 밑의 모든 *.py를 검색하여 문자열을 발췌하게 된다. 여기서 myapp.pot는 PO Template 파일을 의미하는 것으로, 이 .pot 파일을 각 언어의 LC_MESSAGES 폴더로 (예: ko/LC_MESSAGES/myapp.po) Copy하여 사용하면 된다.

C> python "C:\Program Files\Python311\Tools\i18n\pygettext.py" -d myapp -o locales/myapp.pot .
C> copy locales\myapp.pot locales\ko\LC_MESSAGES\myapp.po 

*.po 파일에서 실제 영어를 다른 언어로 번역하기 위해서는, Poedit (https://poedit.net/) 등과 같은 번역 도구를 사용하여 번역하면 편리하다. Poedit 등과 같은 번역 도구에서 텍스트를 번역하고 완료 후 저장하면, 바이너리 파일인 *.mo 파일을 자동으로 생성해 준다. 실제 Python 프로그램은 실행시 *.mo 파일을 사용하게 된다.

*.po 파일과 관련하여 한 가지 유용한 명령이 있다. 즉, 만약 Python 소스 코드가 변경되어 문자열이 추가되거 수정되었을 경우, 이러한 변경사항들을 기존에 이미 번역되어진 *.po 파일과 병합(merge)할 필요가 있는데, 이때 아래와 같이 msgmerge 를 사용할 수 있다. msgmerge는 GNU gettext tool 으로서 필요한 경우 웹사이트에서 다운받아 사용한다.

C> python "C:\Program Files\Python311\Tools\i18n\pygettext.py" -d myapp -o locales/myapp.pot .
C> msgmerge --update --no-fuzzy-matching locales\ko\LC_MESSAGES\myapp.po locales\myapp.pot
Python 프로그래밍 실습

본 웹사이트는 광고를 포함하고 있습니다. 광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.