Django 다국어 지원

다국어 지원

용어 정리

  • 국제화 (i18n; internationalization)
    • 개발자가 지역화 지원을 위해 소프트웨어적으로 준비하는 것
  • 지역화 (l8n; localization)
    • 번역가가 번역하고 지역 형식에 맞게 변환하는 것

Tip!

  • 국제화와 지역화는 출판물이나 하드웨어 또는 소프트웨어 등의 제품을 언어 및 문화권 등이 다른 여러 환경에 대해 사용할 수 있도록 지원하는 것을 의미
  • 이때 국제화는 제품 자체가 여러 환경을 지원할 수 있도록 제품을 설계하는 것을 의미하며, 지역화는 제품을 각 환경에 대해 지원하는 것을 의미
  • 언어 코드
    • 브라우저가 HTTP 헤더 Accept-Language로 보내는 값으로 언어-국가 형식이며 ko-kr 같이 쓰는데 모두 소문자로 되어 있음
    • Django 설정 파일에서 쓰이는 값
  • 로케일 (locale) 이름
    • ko_KR은 대한민국 한국어이고 ko_KP는 북한 한국어 의미로 언어_국가 형식

Tip!

  • 로케일(locale)은 세계 각 국에서 사용하는 언어, 문자, 화폐 표시, 시간 등에 대해 국제화(i18n; Internationalization)와 지역화(l10n; localization)를 통해 어떻게 표시할 지 정의한 매개 변수의 모음
  • 로케일이 필요한 이유는 동일한 데이타라도 문화권마다 표시하고 처리하는 방법이 다르기 때문
  • 로케일을 활용하면 언어권에 맞게 프로그램마다 데이타의 입력과 출력을 수정하지 않고도 사용하는 언어별에 맞는 데이타를 처리할 수 있는 장점 존재
  • .po 파일: 번역가가 직접 번역하는 메시지 파일
  • .mo 파일: Django가 인식할 수 있도록 개발자가 .po 번역 메시지 파일을 컴파일해 만든 파일

다국어 지원 절차

Django 전역 설정

: settings.py 파일의 내용을 수정 및 추가

  • 미들웨어 설정
    • settings.py 파일에서 아래와 같이 SessionMiddlewareCommonMiddleware 사이에 LocaleMiddleware를 추가
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
  • 기본 언어 설정
    • settings.py 파일에서 다음 내용을 수정
      • LANGUAGE_CODE = 'ko-KR'
    • settings.py 파일에서 상단에 다음과 같이 import문을 추가
      • from django.utils.translation import ugettext_lazy as _
    • 프로젝트에서 지원할 다국어 언어값을 설정
    • 번역 파일 들어있는 locale 디렉토리를 지정하고 실제로 디렉토리도 생성
LANGUAGES = [
    ('ko', _('Korean')),
    ('en', _('English')),
]

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

번역 파일 만들기

: 실제로 번역 파일을 만들고 컴파일하는 작업으로 실질적으로 가장 시간이 많이 소요되는 부분

  • 소스 코드 번역 문구 처리
# 모델: models.py 예시
from django.utils.translation import ugettext_lazy as _

class Post(models.Model):
    STATUS_CHOICES = (
        ('draft', _('Draft')),
        ('published', _('Published')),
    )

    title = models.CharField(_('Title'), max_length=250)


# 템플릿: template.html 예시
<li><a href="{% url "blog:post_index" %}">{{ _('Blog') }}</a></li>
  • 번역 메시지 파일 생성
    • 원래는 아래 명령어로 전체 메시지 파일을 만들 수 있음
      • python manage.py makemessage -a
    • 그러나 최초에는 잘 동작하지 않아서 아래와 같이 개별적으로 메시지 파일을 생성
      • python manage.py makemessages -l ko
      • python manage.py makemessages -l en
  • 메시지 파일 컴파일
    • 생성한 번역 파일을 Django가 인식할 수 있도록 컴파일
      • python manage.py compilemessages
    • 컴파일 후에는 Django 서버를 재기동해야 메시지 번역 결과가 반영

문제 해결

번역 처리가 안되는 것처럼 보이는 fuzzy 플래그

  • .po 메시지 파일에 주석으로 #, fuzzy 표시가 있으면 해당 문자열은 번역되지 않음
    • 따라서 번역 문자열 상단에 주석으로 #, fuzzy 표시가 있으면 해당 부분의 주석을 삭제
  • 주석이기 때문에 컴파일 결과에 영향을 미치지 않을 것 같지만 실제로는 번역되지 않아 원인을 찾는데 시간을 많이 소비할 수 있음

MacOS에서 gettext 설치

  • 아래와 같이 gettext 프로그램이 설치되어 있지 않을 경우 이를 설치해야 함
$ python manage.py makemessages
CommandError: Can't find xgettext. Make sure you have GNU gettext tools 0.15 or newer installed.
  • 아래와 같이 brew로 gettext를 설치
$ brew install gettext
$ brew link gettext --force
  • 단순히 설치만 하고 링크하지 않으면 명령행에서 실행할 수 없음

좋은 웹페이지 즐겨찾기