장고에서의 번역 기능인 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
이상으로 장고에 번역 기능을 추가하는 방법을 간단하게 포스팅해보았다.
이로써 이번 주를 끝으로 장고 수업은 끝이 났는데, 길다면 길고 짧다면 짧은 시간이였던 것 같다.
장고에 대해서 전체적으로 배웠는데, 포스팅에 올리지 못한 것들이 더 많은 것 같다.
머리로는 어느정도 알아도 글로 작성하려니 조금 힘든 부분도 없지않아 있기도 하고..
공부한 내용을 정리한다는게 참 쉽지 않은 것 같다.
장고 막바지에 들면서 느낀 것은 배우는 기간을 좀 더 해서 하나하나 좀 더 깊이 있게 배웠으면 좋았을텐데 하는 아쉬움이 남는다.
나머지 부족한 부분들은 개인적인 공부를 통해 채워나가야 할 것 같다. 또 너무 이론적인 것에 치우치지 않게 수업이 진행되는 동안 개인적으로 만들고 있던 포트폴리오를 꾸준히 만들어 나가는 것도 잊지 말아야 하고 말이다.
이제 앞으로 타 스쿨 분들과의 팀 프로젝트가 남았는데, 예전 부터 기대하고 있던 것이지만 역시나 막상 하려고하니 기대보단 걱정이 앞서는 것 같다.
'weekly learning' 카테고리의 다른 글
웹 프로그래밍 스쿨 18주차 (0) | 2019.07.07 |
---|---|
[웹 프로그래밍 스쿨 17주차] 쉬어가는 주 (0) | 2019.06.29 |
[웹 프로그래밍 스쿨 15주차] 장고 8주차 (0) | 2019.06.15 |
[웹 프로그래밍 스쿨 14주차] 장고 7주차 (0) | 2019.06.09 |
[웹 프로그래밍 스쿨 13주차] 장고 6주차 (0) | 2019.06.01 |