본문 바로가기
Dev Log/Django

[Django] 국제화, 현지화. 각국의 언어로 번역되는 웹사이트를 만들려면?

by 삽질하는큐 2017. 3. 13.

다양한 언어에 대응이 되는 웹사이트를 장고에서는 손쉽게 만들 수 있다. 물론, 사용자가 쓴 내용을 번역하려면 DB에 각각 내용마다 번역을 할 수 있게끔 설계해야 하겠지만, DB이외의 메뉴라든가 Form이라든가 공통적으로 보여지게 되는 페이지의 텍스트 들을 각각 번역하여 Django에서 관리할 수 있게 되어있다.


공식 문서는 https://docs.djangoproject.com/en/1.10/topics/i18n/translation/ 를 참조하면 된다.



1) 우선 po file을 만들자.

project folder에서 다음과 같이 입력한다.

mkdir locale

(혹시 GNU gettext가 없다고 나올 경우에는 이렇게 한다.)

sudo apt-get install gettext


locale폴더가 만들어졌으면, 같은 project folder에서 이렇게 입력한다.

django-admin makemessages -l ja

ja는 일본어에 해당하는 언어코드이며, 다른 언어를 하고 싶으면 해당 언어 코드로 하면 된다.



2) 내가 바꾸고 싶은 코드를 ugettext로 감싼다.

from django.utils.translation import ugettext as _

GENDER_CHOICES = [
    ('M', _('male')),
    ('F', _('female')),
    ('U', _('do not specify')),
]


만약 위와 같이 select widget에 들어갈 내용을 여러가지 언어로 바꾸고 싶다면, _('something')의 형태로 바꾼다. ugettext나 ugettext_lazy가 설정되어 있는 텍스트는 장고가 locale에서 설정한 언어로 바꾸게 된다.

** 번역해야 할 대상이 view.py, models.py, forms.py등에 있다면, ugettext_lazy로 하는 것이 좋다. 


3) project/settings.py

import os BASE_DIR = os.path.dirname(os.path.dirname(__file__)) ... MIDDLEWARE = [ 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.locale.LocaleMiddleware', # translation 'django.middleware.common.CommonMiddleware', ] ... USE_I18N = True LOCALE_PATHS = ( os.path.join(BASE_DIR, 'locale'),
) LANGUAGES = ( ('ko_kr', '한국어'), ('ja', 'Japanese'), )

Middleware에 django.middleware.locale.LocaleMiddleware를 추가한다. 이때, 중요한건 SessionMiddleware 다음에, CommonMiddleware 앞에 있어야 한다는 점이다. LOCALE_PATHS가 정확하게 되어있어야 감지를 할 수 있으며, 가능한 언어를 정확하게 나열한다.


4) mo파일로 컴파일하기

python manage.py compilemessages

실행하면 po파일을 기준으로 mo파일이 만들어질 것이고, 서버를 다시 실행시키면 정상적으로 작동할 것이다.