Django/Internationalization

[장고] i18n: 다국어 기능 사용법

QUERY 2021. 8. 21. 17:48

 


장고-로고
장고 로고


장고에서 기본적으로 제공하는 다국어 지원 기능인 i18n의 사용법에 대해 알아보겠습니다.

 

 

1. 장고 프로젝트 생성

먼저, 장고 프로젝트를 생성합니다. 

cmd: django-admin startproject 프로젝트명

이해의 편의를 위해, 우리 예시에서는 프로젝트명: django_i18n / 앱 명: i18n_app으로 설정했습니다.

 

* 참고 *

앱 생성 명령어는 python manage.py startapp i18n_app입니다.

 


2. 기본 설정 추가

settings.py 파일에 다국어(현지화) 사용 관련 설정들을 추가해줍니다.

>>> settings.py

import os

INSTALLED_APPS = [
    ...
    'i18n_app',
    ...
]


MIDDLEWARE = [
    ...
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware',        # (중요) 정해진 위치에 삽입해줍니다.
    'django.middleware.common.CommonMiddleware',
    ...
]

LANGUAGE_CODE = 'en-us'       
# 해당 국가의 언어가 지원되지 않을 때, 기본값으로 제공될 언어를 선택합니다.
# 기본값(default)은 'en-us'입니다.

LANGUAGES = [        # 사용하고자 하는 언어를 모두 적어줍니다.
    ('ko', 'Korean'),
    ('en-us', 'English'),

    ('es', 'Spanish'),
]

LOCALE_PATHS = [os.path.join(BASE_DIR, 'locale')]       
# 번역 관련 파일들을 관리할 경로를 설정해줍니다.
# 취향에 따라 앱마다 locale 폴더를 만들기도 하지만, 개인적으론 루트 디렉터리에 locale 폴더를 만들어 한번에 관리하는 것을 선호합니다.

* 참고 *

아래 링크를 참고하시면, 장고에서 지원하는 보다 많은 국가와 다양한 언어 코드를 확인하실 수 있습니다. 

http://www.i18nguy.com/unicode/language-identifiers.html

 

Using Language Identifiers (RFC 3066)

Using Language Identifiers (RFC 3066) Language identifiers as specified by RFC 3066, can have the form language, language-country, language-country-variant and some other specialized forms. The guidelines for choosing between language and language-country

www.i18nguy.com

 


3. locale 폴더 생성

장고 프로젝트의 루트 디렉터리에 locale폴더를 만들어줍니다.

( 경로: django_i18n/locale )

 


4. URL 설정

>>> django_i18n/urls.py    # settings.py와 같은 폴더 안에 있는 urls.py 파일

urlpatterns = [
    ...
    path('i18n/', include('django.conf.urls.i18n')),
    ...
]

 


5. 템플릿 작업

번역을 하고자 하는 단어나 문장에, 번역을 하겠다는 표시를 해줘야 합니다. 먼저 i18n 태그를 로드해주어야 합니다. html 템플릿 파일 제일 상단에 {% load i18n %}을 적어줍니다. 다음으로 기존에 h1 태그로 표기했던 Hellow World를 한국어나 기타 다른 언어로 번역되기를 원한다면, <h1> Hello World </h1> 대신에 <h1> {% trans "Hello World" %} </h1> 혹은 <h1> {% translate "Hello World" %} </h1>으로 적어주시면 됩니다.

>>> 템플릿 이름. html

{% load i18n %}        # i18n을 로드해줍니다.

<h1> {% trans "Hello World" %} </h1>
혹은
<h1> {% translate "Hello World" %} </h1>

번역이 이뤄지길 원하는 모든 단어나 문장을 위와 같은 방식으로 표기해줍니다.

 


 


 

6. 언어별 번역 용지 생성

장고는 언어별로 따로따로 번역 내용을 관리할 수 있도록 각각의 언어별로 폴더와 확장자 po파일들을 만들어줍니다.

cmd: django-admin makemessages -l 언어코드

예를 들어, 한국어를 지원하고자 한다면, 한국어 번역 파일을 관리할 폴더와 파일을 만들어줍니다. 한국어의 언어코드가 ko이기 때문에, 명령어는 django-admin makemessages -l ko입니다.

 

명령어를 입력하면, 장고에서는 웹사이트에서 번역 가능한 모든 단어나 문장을 스캔해서 파일로 정리해줍니다. 3번에서 생성한 locale 폴더 안에, ko 폴더가 생성되고, 그 안에 LC_MESSAGES 폴더가 생성되며, 다시 그 안에 django.po 파일이 생성됩니다. 처음엔 po라는 확장자가 생소해 낯설 수 있으나, 쉽게 생각해서 한국어 번역본을 입력할 장고의 양식이라고 생각하면 됩니다. 만약, 한국어 이외에 스페인어, 프랑스어, 독일어, 중국어, 힌디어, 일본어 등의 언어도 제공하고자 한다면, 각각의 언어마다 명령어를 입력해 개별적인 관리창을 생성해줘야 합니다. 예로 든 언어들마다 전부 명령어를 입력했다면, locale 폴더 안에는 ko를 비롯해 es, fr, de, zh, hi, ja 등의 폴더들이 생성돼 있어야 합니다.

 

* 참고 *

cmd: python manage.py makemessages --all

--all을 사용하면, settings.py에서 LANGUAGE로 규정한 모든 언어 폴더가 한 번에 생성됩니다.

 

* 참고 *

영어는 en, 스페인어는 es, 프랑스어는 fr, 일본어는 ja입니다. 보다 다양한 언어코드는 위에 첨부한 링크를 참고하시면 됩니다.

 


7. 번역하기

기본 영어로 제공되는 템플릿의 내용들을 각국의 언어로 번역하는 작업이 필요합니다. 4번 작업을 통해 만들어진 확장자 po 파일들을 열어보면, 템플릿에서 우리가 사용 중인 영어 문장들이 전부 나열돼 있는 것을 확인하실 수 있습니다. 심지어 어떤 템플릿의 몇 번째 줄에 있는 내용이라는 것까지 상세하게 표시돼 있습니다. 

예시)

#: templates/i18n_app/langswitch.html:18
msgid "I am localized inside the template."
msgstr "저는 템플릿 내에서 현지화되었습니다."

위 예시를 보면, templates라는 폴더 안에 i18n_app 폴더가 있고, 다시 그 폴더 안에 langswitch.html이라는 파일이 있는데, 이 파일의 18번째 줄에서 사용된 문장이라는 의미입니다. msgidMeSsaGe ID의 약자로 현재 langswitch.html 파일의 18번째 줄에서 사용 중인 문장을 의미합니다. 한편, MeSsaGe STRing의 약자인 msgstr는 해당 문장의 번역본을 입력하는 란으로, 처음에는 ""으로 비어있습니다. 만약 제공하고자 하는 언어가 한국어인 경우 django_i18n/locale/ko/LO_MESSAGES/django.po를 선택해 msgstr 란에 한국어를 입력하시면 됩니다. 만약 스페인어를 제공하기 원한다면, django_i18n/locale/es/LO_MESSAGES/django.po 파일을 선택하신 뒤 해당 문장의 스페인어를 입력하시면 됩니다. 이처럼 프로젝트 안에서 사용 중인 단어나 문장들 중, 번역을 제공하고자 하는 것들을 전체적으로 번역하신 뒤 저장하시면 번역 작업은 마무리됩니다.

 


8. 번역 결과물 프로젝트에 적용하기

언어별로 번역을 마무리했다면, 이 결과물을 모아서 실제 프로젝트에 적용시켜주는 단계를 거쳐야 합니다.

cmd: django-admin compilemessages

위 명령어를 입력하시면 각각의 언어 폴더들 안에 있는 LO_MESSAGES 폴더 안에 django.mo라는 파일이 만들어집니다. 방금 전까지 작업한 django.po 파일의 위치와 같은 경로입니다.

 

* 참고 *

만약, 작업 중간에 템플릿에 새로운 단어나 문장이 추가되었고, 이 내용들 역시 번역되어야 한다면, 위에 제시된 일련의 작업들을 반복해주어야 합니다.

1. cmd: django-admin makemessages -l 언어코드

2. 각 언어 폴더별로 존재하는 django.po 파일에- 해당 언어의 번역본을 입력하고

3. cmd: django-admin compilemessages 

 


9. 사용자에게 번역어 선택지 제공

사용자가 원하는 언어를 선택할 수 있도록 장고에서는 기본적으로 set language view를 제공하고 있습니다. 이 번들 view를 활용하면 사용자가 쉽게 언어를 변경할 수 있도록 할 수 있습니다.

{% load i18n %}

<form action="{% url 'set_language' %}" method="post">
    {% csrf_token %}
    <select name="language">
        {% get_current_language as LANGUAGE_CODE %}
        {% get_available_languages as LANGUAGES %}
        {% get_language_info_list for LANGUAGES as languages %}
        {% for language in languages %}
            <option value="{{ language.code }}"{% if language.code == LANGUAGE_CODE %} selected {% endif %}>
                {{ language.name_local }} ({{ language.code }})
            </option>
        {% endfor %}
    </select>
    <input type="submit" value="Switch">
</form>

{% url 'set_language' %}의 set_language view는 반드시 POST 메서드를 사용해야 합니다. 또한 select 폼의 name은 반드시 language여야 합니다. 

 


번외. gettext 모듈

한편, 단순히 몇 단어 혹은 몇 문장만 번역해주면 되는 경우, 위와 같은 과정이 다소 복잡하고 소모적일 수 있습니다. 그럴 땐 gettext를 이용해 views.py에서 원하는 단어, 혹은 문장만 번역해주는 함수를 사용할 수도 있습니다.

>>> i18n_app/views.py


from django.utils.translation import gettext as _


def index(request):
        context_dict = {
                'localize_key': _('I am localized inside the view.')
        }
        return render(request, 'index.html', context_dict)

그럼 index.html 파일에서는 아래와 같이 I am localized inside the view. 의 번역 문장을 확인할 수 있습니다.

{% load i18n %}
<!DOCTYPE html>
<html lang="en">
<head>
        <meta charset="UTF-8">
        <title> Index </title>
</head>
<body>
        {{ localize_key }}
        {% translate "I am localized inside the template." %}
</body>
</html>

위의 경우, localize_key는 문장 원문을, translate이라는 i18n 태그를 이용해- 해당 문장의 번역본을 나타낼 수 있습니다.

 


 

웹사이트를 제작하다 보면 필요에 의해 한국어를 비롯해 영어, 스페인어, 중국어 등 기타 언어도 사용해야 하는 경우가 발생합니다. 장고에서 제공하는 i18n 기능에 대해 보다 자세한 사용방법이 궁금하시다면, 아래 링크를 참고하시기 바랍니다.

장고 i18n 기초 사용법:

https://lokalise.com/blog/django-i18n-beginners-guide/

 

Django i18n: A beginner's guide - Lokalise Blog

In this post, we look at the process of i18n in Django and how you can set up your Django application to interact with your Lokalise account.

lokalise.com

 

장고 i18n 심화 사용법: 

https://lokalise.com/blog/advanced-django-internationalization/

 

Advanced Django Internationalization - Lokalise Blog

This guide covers all advanced i18n/l10n facilities Django ships with. Take a look at Django i18n tricks you'll wish you already knew about.

lokalise.com