Backend study/Django
Django 언어 설정과 국제화(i18n) - LANGUAGE_CODE
adulty22
2025. 7. 11. 16:39
Django로 웹 애플리케이션을 개발할 때, 다국어 지원은 중요한 고려사항이다. 특히 글로벌 서비스를 목표로 한다면 더욱 그렇다. Django는 강력한 국제화(i18n) 기능을 제공하며, 그 시작점이 바로 LANGUAGE_CODE 설정이다.
LANGUAGE_CODE란?
LANGUAGE_CODE는 Django 프로젝트의 기본 언어(로케일)를 설정하는 옵션이다. 웹사이트에서 텍스트, 날짜, 숫자 등의 표시 형식이나 번역된 메시지가 어떤 언어로 보여질지를 결정한다.
# settings.py
LANGUAGE_CODE = 'ko-kr' # 한국어
# LANGUAGE_CODE = 'en-us' # 영어 (기본값)
# LANGUAGE_CODE = 'ja' # 일본어
# LANGUAGE_CODE = 'zh-hans' # 중국어 간체
언어 코드 형식
Django는 표준 언어 코드 형식을 따른다:
- 언어-지역 형식: ko-kr (한국어-한국)
- 언어만 지정: ko (한국어)
주요 언어 코드
# 자주 사용하는 언어 코드
'en-us' # 영어 (미국)
'en-gb' # 영어 (영국)
'ko-kr' # 한국어
'ja' # 일본어
'zh-hans' # 중국어 간체
'zh-hant' # 중국어 번체
'es' # 스페인어
'fr' # 프랑스어
'de' # 독일어
'ru' # 러시아어
관련 설정들
국제화 기능을 제대로 활용하려면 다음 설정들도 함께 이해해야 한다:
# settings.py
# 1. 국제화 기능 활성화
USE_I18N = True # 번역 기능 사용 (Django 5.0부터 기본값 True)
# 2. 로케일 기반 포맷 사용 (Django 5.0에서 deprecated)
# USE_L10N = True # 숫자/날짜를 로케일에 맞게 표시
# 3. 시간대 지원
USE_TZ = True # 시간대 지원 활성화
# 4. 지원 언어 목록
LANGUAGES = [
('ko', '한국어'),
('en', 'English'),
('ja', '日本語'),
]
# 5. 번역 파일 경로
LOCALE_PATHS = [
BASE_DIR / 'locale',
]
LANGUAGE_CODE가 영향을 주는 것들
1. 날짜/시간 표시 형식
# LANGUAGE_CODE = 'ko-kr'일 때
from django.utils import timezone
now = timezone.now()
# 템플릿에서
{{ now|date:"Y년 m월 d일" }} # 2025년 4월 23일
# LANGUAGE_CODE = 'en-us'일 때
{{ now|date:"F j, Y" }} # April 23, 2025
2. 숫자 표시 형식
# LANGUAGE_CODE = 'ko-kr'
{{ 1234567.89|floatformat:2 }} # 1,234,567.89
# LANGUAGE_CODE = 'de' (독일어)
{{ 1234567.89|floatformat:2 }} # 1.234.567,89
3. Django 기본 메시지
# LANGUAGE_CODE = 'ko-kr'일 때
# Django admin, 폼 에러 메시지 등이 한국어로 표시됨
# 예: "이 필드는 필수 항목입니다."
# LANGUAGE_CODE = 'en-us'일 때
# 예: "This field is required."
실전 활용: 다국어 지원 구현
1. 번역 가능한 문자열 표시
# views.py
from django.utils.translation import gettext as _
from django.shortcuts import render
def home(request):
# 번역 가능한 문자열
welcome_message = _("Welcome to our website")
context = {
'message': welcome_message
}
return render(request, 'home.html', context)
2. 모델에서 번역 가능한 필드
# models.py
from django.db import models
from django.utils.translation import gettext_lazy as _
class Product(models.Model):
name = models.CharField(
max_length=100,
verbose_name=_("Product Name") # 관리자 페이지에서 번역됨
)
price = models.DecimalField(
max_digits=10,
decimal_places=2,
verbose_name=_("Price")
)
class Meta:
verbose_name = _("Product")
verbose_name_plural = _("Products")
3. 템플릿에서 번역
<!-- templates/home.html -->
{% load i18n %}
<h1>{% trans "Welcome" %}</h1>
<p>{% trans "Thank you for visiting our site." %}</p>
<!-- 변수가 포함된 번역 -->
{% blocktrans with name=user.name %}
Hello, {{ name }}!
{% endblocktrans %}
4. 폼 필드 번역
# forms.py
from django import forms
from django.utils.translation import gettext_lazy as _
class ContactForm(forms.Form):
name = forms.CharField(
label=_("Your Name"),
help_text=_("Please enter your full name")
)
email = forms.EmailField(
label=_("Email Address"),
error_messages={
'required': _("Email is required"),
'invalid': _("Please enter a valid email address")
}
)
번역 파일 생성 및 관리
1. 번역 파일 생성
# locale 디렉토리 생성
mkdir locale
# 번역할 문자열 추출 (.po 파일 생성)
python manage.py makemessages -l ko
python manage.py makemessages -l ja
# JavaScript 파일의 번역 문자열도 추출
python manage.py makemessages -l ko -d djangojs
2. 번역 파일 구조
locale/
├── ko/
│ └── LC_MESSAGES/
│ ├── django.po # 번역할 문자열과 번역
│ └── django.mo # 컴파일된 번역 파일
├── ja/
│ └── LC_MESSAGES/
│ ├── django.po
│ └── django.mo
3. .po 파일 편집
# locale/ko/LC_MESSAGES/django.po
msgid "Welcome to our website"
msgstr "우리 웹사이트에 오신 것을 환영합니다"
msgid "Product Name"
msgstr "상품명"
msgid "Price"
msgstr "가격"
4. 번역 파일 컴파일
# .po 파일을 .mo 파일로 컴파일
python manage.py compilemessages
동적 언어 전환
1. 미들웨어 설정
# settings.py
MIDDLEWARE = [
# ...
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware', # 언어 감지 미들웨어
'django.middleware.common.CommonMiddleware',
# ...
]
2. URL 패턴에 언어 코드 포함
# urls.py
from django.conf.urls.i18n import i18n_patterns
from django.urls import path, include
urlpatterns = [
path('i18n/', include('django.conf.urls.i18n')),
]
urlpatterns += i18n_patterns(
path('', views.home, name='home'),
path('about/', views.about, name='about'),
# URL이 /ko/, /en/, /ja/ 등으로 시작하게 됨
)
3. 언어 전환 버튼
<!-- 언어 전환 폼 -->
<form action="{% url 'set_language' %}" method="post">
{% csrf_token %}
<select name="language" onchange="this.form.submit()">
{% get_current_language as LANGUAGE_CODE %}
{% get_available_languages as LANGUAGES %}
{% for lang_code, lang_name in LANGUAGES %}
<option value="{{ lang_code }}"
{% if lang_code == LANGUAGE_CODE %}selected{% endif %}>
{{ lang_name }}
</option>
{% endfor %}
</select>
</form>
고급 활용 팁
1. 언어별 다른 템플릿 사용
# views.py
from django.utils import translation
def product_detail(request, pk):
current_language = translation.get_language()
# 언어별 다른 템플릿
if current_language == 'ko':
template_name = 'products/detail_ko.html'
else:
template_name = 'products/detail.html'
return render(request, template_name, context)
2. 모델 필드 번역 (django-modeltranslation 사용)
# 설치: pip install django-modeltranslation
# models.py
class News(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
# translation.py
from modeltranslation.translator import translator, TranslationOptions
from .models import News
class NewsTranslationOptions(TranslationOptions):
fields = ('title', 'content',)
translator.register(News, NewsTranslationOptions)
# 자동으로 title_ko, title_en, content_ko, content_en 필드 생성
3. 언어별 URL 리다이렉션
# middleware.py
from django.utils import translation
from django.shortcuts import redirect
class LanguageRedirectMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
# 브라우저 언어 감지
user_language = request.META.get('HTTP_ACCEPT_LANGUAGE', 'en')[:2]
# 지원하는 언어인지 확인
if user_language in ['ko', 'ja', 'en']:
translation.activate(user_language)
request.LANGUAGE_CODE = user_language
response = self.get_response(request)
return response
주의사항
- USE_I18N = False로 설정하면 번역 기능이 완전히 비활성화된다
- 번역 파일 업데이트 시 항상 compilemessages 실행 필요
- Lazy Translation: 모델이나 폼에서는 gettext_lazy 사용
- 번역 컨텍스트: 같은 단어라도 문맥에 따라 다른 번역이 필요할 수 있음
# 컨텍스트가 있는 번역
from django.utils.translation import pgettext
# "May"가 월 이름인지 동사인지 구분
month = pgettext("month name", "May") # 5월
verb = pgettext("verb", "May") # ~할 수도 있다
Django의 LANGUAGE_CODE 설정은 단순히 언어를 바꾸는 것 이상의 의미를 가진다. 적절한 국제화 설정을 통해:
- 전 세계 사용자에게 친숙한 인터페이스 제공
- 지역별 날짜/숫자 형식 자동 적용
- 확장 가능한 다국어 서비스 구축
특히 한국 서비스의 경우 LANGUAGE_CODE = 'ko-kr'로 설정하는 것만으로도 Django admin을 포함한 많은 부분이 한글화되어 개발 편의성이 크게 향상된다.
728x90