번역 기능 사용하기

번역 기능 추가하기

  • I18N(Internationalization)

    • I와 N 사이에 18글자의 단어가 있어서 I18N으로 불림
    • 다국어 시스템을 구현하는 환경을 구성하는 것
    • 장고에서 번역 기능을 사용하는 것

    • django에서는 기본 언어를 바꾸는 작업은 settings.py에서 LANGUAGE_CODE를 변경하면 된다.

      1
      2
      3
      4
      5
      6
      7
      8
      9
      LANGUAGE_CODE = 'ko-kr'

      TIME_ZONE = 'Asia/Seoul'

      USE_I18N = True

      USE_L10N = True

      USE_TZ = True
    • 다국어 지원을 하려면 LocaleMiddleware를 추가하고 언어 번역 파일을 준비해야 한다.

    • settings.py의 MIDDLEWARE에 LocaleMiddleware를 추가한다.

      1
      2
      3
      4
      5
      6
      7
      8
      9
      MIDDLEWARE = [
      #...
      'django.contrib.sessions.middleware.SessionMiddleware',
      # 순서를 지켜서 추가해야 한다.
      # CommonMiddleware가 localeMiddleware의 값을 가지고 사용하기 때문이다.
      'django.middleware.locale.LocaleMiddleware',
      'django.middleware.common.CommonMiddleware',
      #...
      ]
    • 지원하고 싶은 언어의 목록도 작성한다.

      1
      2
      3
      4
      5
      6
      from django.utils.translation import ugettext_lazy as _

      LANGUAGES = [
      ('ko', _('Korean')),
      ('en', _('English')),
      ]
    • 번역 파일이 저장될 폴더를 만들고 settings.py에도 경로를 추가한다.

      1
      $ mkdir locale
      1
      2
      3
      LOCALE_PATHS = [
      os.path.join(BASE_DIR, 'locale')
      ]
    • views.py에 번역을 테스트할 뷰를 작성한다.

      1
      2
      3
      4
      5
      6
      7
      from django.shortcuts import render
      from django.http import HttpResponse
      from django.utils.translation import ugettext_lazy as _

      def index(request):
      msg = _("안녕하세요")
      return HttpResponse(msg)
    • 번역할 텍스트 목록 파일을 만들기 위해 아래 명령을 실행한다.

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      # 최초 실행 시에는 언어별로 별도 실행해야 한다.
      $ python manage.py makemessages -l ko
      $ python manage.py makemessages -l en

      # 가상 환경 파일 안에서 문제가 일어난다면 뒤에 -i venv를 붙여서 실행한다.

      # 최초 실행이 아닐 경우
      $ python manage.py makemessages -a

      # gettext가 없다는 오류 메세지가 나타난다면
      # Mac)
      $ brew install gettext
      $ brew link gettext --force

      # Ubuntu)
      $ sudo apt-get install gettext
    • 파일이 만들어지면 django.po 파일에 들어가서 다음 내용을 지워주자.

      1
      2
      아래 내용을 지우지 않으면 동작하지 않는다.
      #, fuzzy
    • django.po 파일을 보면 msgid와 msgstr이 있는데 msgid를 확인하여 번역 내용을 입력한다.

    • 번역 내용을 읽어서 처리할 수 있도록 django.mo 파일을 만들어야 한다.

      1
      2
      3
      4
      5
      $ python manage.py compilemessages

      # 언어별로 실행
      $ python manage.py compilemessages -l ko
      $ python manage.py compilemessages -l en
    • 번역 파일이 동작하는지 살펴보기 위해 강제로 언어 설정을 변경해본다.

      1
      2
      3
      4
      5
      6
      7
      8
      # vievs.py
      def index(request):
      if translation.LANGUAGE_SESSION_KEY in request.session:
      del(request.session[translation.LANGUAGE_SESSION_KEY])
      translation.activate('en')
      request.session[translation.LANGUAGE_SESSION_KEY] = 'en'
      msg = _("안녕하세요")
      return HttpResponse(msg)
    • 사이트에 접속하여 원하는 번역으로 출력되는지 확인한다.

    • views.py에서 언어 설정을 사용자가 선택해서 번경할 수 있도록 해보자.

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      # views.py
      def change_language(request, code):
      # 지원하는 언어 코드 목록을 만듦
      languages = [language[0] for language in settings.LANGUAGES]
      # 기본 언어 설정 가져오기
      default_language = settings.LANGUAGE_CODE[:2]

      if translation.LANGUAGE_SESSION_KEY in request.session:
      del(request.session[translation.LANGUAGE_SESSION_KEY])

      if code in languages and code != default_language:
      translation.activate(code)
      request.session[translation.LANGUAGE_SESSION_KEY] = code
      else:
      request.session[translation.LANGUAGE_SESSION_KEY] = default_language
      code = default_language
      return HttpResponse("Language Change to "+code)


      # urls.py
      urlpatterns = [
      #...
      path('language/<code>/', change_language),
      ]
    • 사이트에 접속하여 주소를 통해 언어를 변경해보자.

    • template에서도 번ㅇ역 기능을 사용할 수 있다.

      1
      2
      3
      4
      5
      6
      7
      8
      9
      <!-- trans 태그 사용-->
      {% load i18n %}
      {% trans '안녕하세요' %}

      <!-- 여러 줄을 번역할 경우 -->
      {% blocktrans %}
      번역 테스트
      번역 테스트
      {% endblocktrans %}
    • url을 사용해서 언어를 선택할 수도 있다.

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      # config.urls.py
      # 하위 urls.py에서는 쓸 수 없다.
      # Root urls.py에만 쓸 수 있다.
      from django.conf.urls.i18n import i18n_patterns

      urlpatterns += i18n_patterns(
      path('', include('app.urls'))
      )

      # url에서 언어에 대한 인자를 제거하고 싶다면
      from django.conf.urls.i18n import i18n_patterns

      urlpatterns += i18n_patterns(
      path('', include('app.urls'))
      # 추가
      prefix_default_language = False
      )
Share