[장고] 다국어 지원
장고는 다국어 지원을 위해 강력한 국제화(Internationalization) 및 지역화(Localization) 시스템을 제공합니다. 이를 통해 다양한 언어와 문화권에 맞춘 웹 애플리케이션을 개발할 수 있습니다. 장고의 다국어 지원은 주로 다음과 같은 개념과 도구를 중심으로 이루어집니다:
장고 다국어 시스템
1. 국제화(Internationalization, i18n)
국제화는 소프트웨어를 다양한 언어와 지역 설정에 맞출 수 있도록 준비하는 과정입니다. 장고에서는 이를 위해 몇 가지 주요 도구와 개념을 제공합니다.
- gettext: 장고는 GNU gettext 시스템을 사용하여 문자열을 번역할 수 있도록 합니다. 이를 통해 코드에서 문자열을 번역 가능한 상태로 표시하고, 실제 번역은 별도의 파일에서 관리합니다.
- 번역 함수: 장고는 여러 번역 함수를 제공합니다.
- gettext(), gettext_lazy(): 문자열을 번역할 때 사용합니다.
- ugettext(), ugettext_lazy(): 유니코드 문자열을 번역할 때 사용합니다.
- ngettext(), ngettext_lazy(): 단수와 복수 형태를 지원하는 번역을 위해 사용합니다.
- pgettext(), pgettext_lazy(): 문맥을 제공하는 번역을 위해 사용합니다.
2. 지역화(Localization, l10n)
지역화는 국제화된 소프트웨어를 특정 언어와 문화권에 맞추는 과정입니다. 장고는 이를 위해 다양한 형식의 데이터(날짜, 시간, 숫자, 달력 등)를 현지화하는 기능을 제공합니다.
- 현지화 설정: 장고의 설정 파일(settings.py)에서 LANGUAGE_CODE와 USE_L10N을 설정하여 애플리케이션의 기본 언어와 현지화 기능을 활성화할 수 있습니다.
- 번역 파일: locale 디렉터리 안에 각 언어별 번역 파일(.po 파일)을 생성하여 관리합니다. 이 파일들은 makemessages 명령어를 통해 생성할 수 있으며, compilemessages 명령어를 통해 컴파일됩니다.
3. 다국어 URL
장고는 i18n_patterns 함수를 사용하여 다국어 URL을 지원합니다. 이를 통해 URL에서 언어 코드를 자동으로 인식하고, 해당 언어에 맞는 페이지를 제공합니다.
4. 템플릿에서의 다국어 지원
장고의 템플릿 시스템은 다국어 지원을 위해 다양한 태그와 필터를 제공합니다.
- {% trans "string" %}: 템플릿에서 문자열을 번역할 때 사용합니다.
- {% blocktrans %}...{% endblocktrans %}: 블록 단위로 번역할 때 사용합니다.
5. 미들웨어
장고는 LocaleMiddleware를 제공하여 사용자 요청에 따라 적절한 언어를 선택하고 설정하는 기능을 제공합니다. 이 미들웨어는 요청의 언어 정보를 감지하고, 사용자 세션이나 쿠키에 저장된 언어 설정을 기반으로 콘텐츠를 제공합니다.
6. 언어 선택
사용자는 웹사이트에서 언어를 선택할 수 있어야 합니다. 이를 위해 장고는 set_language 뷰와 LANGUAGES 설정을 제공합니다. set_language 뷰는 사용자가 언어를 변경할 수 있는 URL을 제공하며, LANGUAGES 설정은 애플리케이션에서 지원하는 언어 목록을 정의합니다.
예제
Django에서 다국어 기능을 사용하는 방법에 대해 설명하겠습니다. Django는 다국어 지원을 위해 강력한 번역 시스템을 제공합니다. 이 시스템을 설정하고 사용하는 방법은 다음과 같습니다.
1. 기본 설정
settings.py 파일 수정
다음과 같이 기본 설정을 추가합니다:
# settings.py
# 번역 파일의 위치
LOCALE_PATHS = [
os.path.join(BASE_DIR, 'locale'),
]
# 사용할 언어와 번역 파일 설정
LANGUAGE_CODE = 'en' # 기본 언어 설정
LANGUAGES = [
('en', 'English'),
('ko', 'Korean'),
# 다른 언어를 추가할 수 있습니다.
]
# 시간대 설정
TIME_ZONE = 'UTC'
USE_I18N = True # 국제화 사용 여부
USE_L10N = True # 지역화 사용 여부
USE_TZ = True # 시간대 사용 여부
MIDDLEWARE = [
# 기존 미들웨어
'django.middleware.locale.LocaleMiddleware', # 이 줄을 추가
# 기존 미들웨어
]
2. 번역 메시지 작성
문자열 마크업
번역할 문자열을 마크업해야 합니다. 이를 위해 ugettext_lazy 또는 gettext_lazy를 사용합니다.
from django.utils.translation import gettext_lazy as _
class MyModel(models.Model):
name = models.CharField(_('name'), max_length=100)
템플릿에서도 마찬가지로 {% trans %} 태그를 사용할 수 있습니다:
{% load i18n %}
<p>{% trans "Hello, world!" %}</p>
3. 메시지 파일 생성 및 컴파일
메시지 파일 생성
터미널에서 다음 명령어를 실행하여 메시지 파일을 생성합니다:
django-admin makemessages -l ko
메시지 파일 번역
생성된 locale/ko/LC_MESSAGES/django.po 파일을 열어 번역을 추가합니다:
msgid "Hello, world!"
msgstr "안녕하세요, 세상!"
메시지 파일 컴파일
번역을 완료한 후 다음 명령어를 실행하여 컴파일합니다:
django-admin compilemessages
4. 언어 변경
URL에 언어 코드 추가
언어 변경을 위해 URL에 언어 코드를 추가할 수 있습니다:
{% load i18n %}
<a href="/ko/">{{ _("Korean") }}</a>
<a href="/en/">{{ _("English") }}</a>
뷰에서 언어 변경
뷰에서 set_language 뷰를 사용할 수 있습니다. 이 뷰는 POST 요청을 통해 언어를 변경합니다:
<form action="{% url 'set_language' %}" method="post">
{% csrf_token %}
<input name="next" type="hidden" value="{{ redirect_to }}" />
<select name="language">
{% get_current_language as LANGUAGE_CODE %}
{% get_available_languages as LANGUAGES %}
{% for lang in LANGUAGES %}
<option value="{{ lang.0 }}"{% if lang.0 == LANGUAGE_CODE %} selected{% endif %}>
{{ lang.1 }}
</option>
{% endfor %}
</select>
<input type="submit" value="Go" />
</form>
5. URL 설정
다국어 지원을 위해 URL 설정을 수정합니다:
# urls.py
from django.conf.urls.i18n import i18n_patterns
from django.urls import path, include
urlpatterns = [
# 일반 URL 패턴
]
urlpatterns += i18n_patterns(
path('admin/', admin.site.urls),
# 다국어 지원 URL 패턴
)
위의 단계를 따라 Django 프로젝트에 다국어 지원을 설정할 수 있습니다. 번역 파일을 생성하고, 번역을 추가하며, 언어 변경 기능을 제공하여 다국어 웹사이트를 쉽게 만들 수 있습니다.