Django 다국어 지원
9404 단어 Today I learnedToday I learned
다국어 지원
용어 정리
- 국제화 (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 전역 설정
- 개발자가 지역화 지원을 위해 소프트웨어적으로 준비하는 것
- 번역가가 번역하고 지역 형식에 맞게 변환하는 것
Tip!
- 국제화와 지역화는 출판물이나 하드웨어 또는 소프트웨어 등의 제품을 언어 및 문화권 등이 다른 여러 환경에 대해 사용할 수 있도록 지원하는 것을 의미
- 이때 국제화는 제품 자체가 여러 환경을 지원할 수 있도록 제품을 설계하는 것을 의미하며, 지역화는 제품을 각 환경에 대해 지원하는 것을 의미
- 브라우저가
HTTP 헤더
Accept-Language
로 보내는 값으로언어-국가
형식이며ko-kr
같이 쓰는데 모두 소문자로 되어 있음 - Django 설정 파일에서 쓰이는 값
ko_KR
은 대한민국 한국어이고ko_KP
는 북한 한국어 의미로언어_국가
형식
Tip!
- 로케일(locale)은 세계 각 국에서 사용하는 언어, 문자, 화폐 표시, 시간 등에 대해 국제화(i18n; Internationalization)와 지역화(l10n; localization)를 통해 어떻게 표시할 지 정의한 매개 변수의 모음
- 로케일이 필요한 이유는 동일한 데이타라도 문화권마다 표시하고 처리하는 방법이 다르기 때문
- 로케일을 활용하면 언어권에 맞게 프로그램마다 데이타의 입력과 출력을 수정하지 않고도 사용하는 언어별에 맞는 데이타를 처리할 수 있는 장점 존재
.po 파일
: 번역가가 직접 번역하는 메시지 파일.mo 파일
: Django가 인식할 수 있도록 개발자가 .po
번역 메시지 파일을 컴파일해 만든 파일: settings.py
파일의 내용을 수정 및 추가
- 미들웨어 설정
settings.py
파일에서 아래와 같이SessionMiddleware
와CommonMiddleware
사이에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 서버를 재기동해야 메시지 번역 결과가 반영
- 생성한 번역 파일을 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
- 단순히 설치만 하고 링크하지 않으면 명령행에서 실행할 수 없음
Author And Source
이 문제에 관하여(Django 다국어 지원), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@hwaya2828/Django-다국어-지원저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)