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

 

주의사항

  1. USE_I18N = False로 설정하면 번역 기능이 완전히 비활성화된다
  2. 번역 파일 업데이트 시 항상 compilemessages 실행 필요
  3. Lazy Translation: 모델이나 폼에서는 gettext_lazy 사용
  4. 번역 컨텍스트: 같은 단어라도 문맥에 따라 다른 번역이 필요할 수 있음
# 컨텍스트가 있는 번역
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