i18n 다국어 기능 적용하는 방법
윈도우에서 아래와 같이 에러가 발생한다면, gettext/iconv 프로그램을 설치한다.
CommandError: Can't find msguniq. Make sure you have GNU gettext tools 0.15 or newer installed.
- https://mlocati.github.io/articles/gettext-iconv-windows.html
settings.py에 아래와 같이 업데이트를 한다
MIDDLEWARE = [
...
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware', # (중요) 정해진 위치에 삽입해줍니다.
'django.middleware.common.CommonMiddleware',
...
]
LANGUAGE_CODE = 'en-us'
#기본값으로 제공될 언어를 적어줍니다.
LANGUAGES = [ # 사용하고자 하는 언어를 모두 적어줍니다.
('ko', 'Korean'),
('en-us', 'English'),
('es', 'Spanish'),
]
LOCALE_PATHS = [os.path.join(BASE_DIR, 'locale')]
#번역된 파일이 저장될 경로를 설정해 줍니다.
지원되는 언어 코드 확인
http://www.i18nguy.com/unicode/language-identifiers.html
! 중요 ) url에 i18n의 경로를 입력해 준다. 이 설정을 해줘야 나중에 template에서 form 등을 이용한 언어 변환을 수행할 수 있다. 기본으로 제공되는 기능을 사용하지 않을 경우, 직접 view를 통해 수정이 가능하다.
템플릿에 적용하자
{% load i18n %} # i18n을 로드해줍니다.
{{_(" ")}}
<h1> {% trans "Hello World" %} </h1>
혹은
<h1> {% translate "Hello World" %} </h1>
<h1> {% trans "Hello World" as boy="BOY", girl="GIRL"%} </h1>
{% blocktrans %}
{% endblocktrans %}
언어별 번역 용지 생성을 하자
# 전체 메시지 파일 만들기
python manage.py makemessage -a
# 개별적 메시지 파일 만들기
python manage.py makemessages -l 언어코드
예) python manage.py makemessages -l ko
python manage.py makemessages -l en
#, fuzzy 표시가 있으면 해당 부분의 주석을 삭제한다.
번역 결과물을 생성하자 django.po -> django.mo
python manage.py compilemessages
사용자에게 번역어 선택지를 제공
만약 직접 view에서 데이터를 확인하고 수정하고자 한다면
translation.get_language() 함수를 view에서 사용하면 된다.
혹은 다음과 같이 사용할 수도 있다.
from django.utils.translation import activate
def test_uses_index_template(self):
activate('en')
response = self.client.get(reverse("home"))
self.assertTemplateUsed(response, "taskbuster/index.html")
혹은 아래와 같이 session을 이용하여 다양하게 이용할 방법을 모색할 수도 있다.
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)
참고 자료 :
https://kimdoky.github.io/django/2018/08/30/django-taskbuster-5/
https://velog.io/@jewon119/Django-%EA%B8%B0%EC%B4%88-Django-Translation
https://phrase.com/blog/posts/methods-difference-django-templates/
https://runebook.dev/ko/docs/django/topics/i18n/translation?page=7
'Study > django' 카테고리의 다른 글
django MQ 시리즈 1편 - task queue (1) : Asynchronous Tasks With Django and Celery (1) | 2023.03.04 |
---|---|
django에서 redis 사용하기 1편 (캐시 사용: 데이터 / 세션) (1) | 2023.02.16 |
django admin - raw_id_fields, search_fields problem (0) | 2022.12.19 |
devspoon-portfolio-blog 오픈소스에 admin 기능 구현하기 (0) | 2022.12.11 |
Django ORM Cookbook 학습 정리 (0) | 2022.12.07 |
댓글