weekly learning2019. 6. 22. 12:17

장고에서의 번역 기능인 I18N(Internationalization)을 사용해보자.


기본 언어를 변경하는 방법은 settings.py에서 다음과 같이 설정해준다.

LANGUAGE_CODE = 'ko-kr'

TIME_ZONE = 'Asia/Seoul'


TIME_ZONE을 'asia/seoul'로 해줘도 되지만 나는 에러가 나길래 첫 글자만 대문자로 변경하였다.


다국어 지원을 하려면 LocaleMiddleware를 추가한다. 여기서 주의할 점은 Session과 Common 사이에 위치시켜야 한다.

MIDDLEWARE = [
    # ...
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.common.CommonMiddleware',
    # ...
]


이 부분도 생각없이 MIDDLEWARE 가장 아래에 작성했다가 제대로 동작이 안되는 문제가 발생했다.


이어서 지원하고 싶은 언어 목록을 작성한다.

from django.utils.translation import ugettext_lazy as _
LANGUAGES = [
    ('ko', _('Korean')),
    ('en', _('English')),
    ('jp', '日本語'),
]


다음으로 뷰에서 사용할 번역 대상 텍스트에 대한 번역 파일을 만든다. 

LOCALE_PATHS = [
    os.path.join(BASE_DIR, 'locale')
]


그리고 프로젝트 최상단에 'locale' 디렉토리를 생성한다.

$ mkdir locale


번역할 텍스트가 있는 간단한 뷰를 작성한다.

from django.utils.translation import ugettext_lazy as _
from django.http import HttpResponse
def index(request):
    msg = _('안녕하세요')
    return HttpResponse(msg)


이제 번역할 텍스트 목록 파일을 만들어야 한다.

$ python manage.py makemessages -a
$ python manage.py makemessages -l ko
$ python manage.py makemessages -l en
$ python manage.py makemessages -l jp


만약 gettext가 없다는 오류 메시지가 나타나면 아래 명령어를 실행해서 해결한다.

Mac

$ brew install gettext
$ brew link gettext --force


Ubuntu

$ sudo apt-get install gettext


위 명령어를 실행하면 아래와 같은 디렉토리와 파일들이 생성된다.


django.po 파일들을 열어서 #, fuzzy 라고 씌여진 코드를 삭제한다.


그리고 msgid와 msgstr에 아래처럼 적당한 번역 내용을 작성한다. (아래는 ko의 django.po)


en의 po 파일도 수정한다.


이제 번역한 내용을 장고에서 처리할 수 있도록 mo 파일을 아래 명령어로 만든다.

$ python manage.py compilemessages


만약 언어 파일별로 컴파일을 하고 싶다면 다음과 같이 작성한다.

$ python manage.py compilemessages -l ko


번역이 정상 동작하는지 확인하기 위해 views.py 에서 강제로 언어 설정을 변경해보자.

def index(request):
    if translation.LANGUAGE_SESSION_KEY in request.session:
        del(request.session[translation.LANGUAGE_SESSION_KEY])
    translation.activate('en')
    request.session[translation.LANGUAGE_SESSION_KEY] = 'en'

    msg = _("안녕하세요")
    return HttpResponse(msg)


설정 후 template을 확인해보면 '안녕하세요'가 en의 django.po 파일을 수정했던 내용대로 'Hello'가 출력된 것을 확인할 수 있다.


다음으로는 언어설정을 사용자가 선택해서 변경할 수 있도록 하는 뷰를 만들어보자.


쿼리스트링으로 language code 받기

def index(request):
    if request.method == "GET":
        lan = request.GET.get('language')
        if lan == 'ko' or lan == 'en' or lan == 'jp':
            if translation.LANGUAGE_SESSION_KEY in request.session:
                del (request.session[translation.LANGUAGE_SESSION_KEY])

            translation.activate(lan)
            request.session[translation.LANGUAGE_SESSION_KEY] = f'{lan}'
        else:
            if translation.LANGUAGE_SESSION_KEY in request.session:
                del (request.session[translation.LANGUAGE_SESSION_KEY])

            translation.activate('ko')
            request.session[translation.LANGUAGE_SESSION_KEY] = 'ko'

    msg = _("안녕하세요")
    return HttpResponse(msg)


쿼리스트링을 다음과 같이 받았을 때


영어로 번역된 것을 볼 수 있다.


다음은 템플릿에서의 번역 기능도 사용해보자.


템플릿에서 번역 기능을 사용하려면 아래 처럼 사용한다.

{% load i18n %}
{% trans '안녕하세요' %}


또 템플릿에서는 여러 줄이 들어가 있는 번역 블록을 설정할 수도 있다.


{% blocktrans %}
블록번역 테스트
블록번역 태그의 번역 테스트
{% endblocktrans %}

{% blocktrans %}
블록번역 테스트 {{value}}입니다
블록번역 태그의 번역 테스트
{% endblocktrans %}


일반 번역뿐 아니라 context를 가진 번역을 진행할 수 있다.

from django.utils.translation import pgettext_lazy as _
def index(request):
    msg = _("구어", "안녕하세요")
    return HttpResponse(msg)


context가 있는 번역을 템플릿에서 사용하려면 blocktrans를 사용한다.

{% blocktrans context "구어" %} 안녕하세요 {% endblocktrans %}


url을 사용해서 언어를 선택하고 싶다면 config/urls.py에

from django.conf.urls.i18n import i18n_patterns
urlpatterns += i18n_patterns(
    path('', include('sample.urls'))
)


기본 언어에 대한 url 인자를 제거하고 싶다면 마찬가지로 config/urls.py에

from django.conf.urls.i18n import i18n_patterns
urlpattenrs += i18n_patterns(
    path('', include('sample.urls')),
    prefix_default_language=false


이상으로 장고에 번역 기능을 추가하는 방법을 간단하게 포스팅해보았다.


이로써 이번 주를 끝으로 장고 수업은 끝이 났는데, 길다면 길고 짧다면 짧은 시간이였던 것 같다.


장고에 대해서 전체적으로 배웠는데, 포스팅에 올리지 못한 것들이 더 많은 것 같다.


머리로는 어느정도 알아도 글로 작성하려니 조금 힘든 부분도 없지않아 있기도 하고..


공부한 내용을 정리한다는게 참 쉽지 않은 것 같다.


장고 막바지에 들면서 느낀 것은 배우는 기간을 좀 더 해서 하나하나 좀 더 깊이 있게 배웠으면 좋았을텐데 하는 아쉬움이 남는다.


나머지 부족한 부분들은 개인적인 공부를 통해 채워나가야 할 것 같다. 또 너무 이론적인 것에 치우치지 않게 수업이 진행되는 동안 개인적으로 만들고 있던 포트폴리오를 꾸준히 만들어 나가는 것도 잊지 말아야 하고 말이다.


이제 앞으로 타 스쿨 분들과의 팀 프로젝트가 남았는데, 예전 부터 기대하고 있던 것이지만 역시나 막상 하려고하니 기대보단 걱정이 앞서는 것 같다.



Posted by gawain