장고를 처음 실행하면 영어로 사이트가 보입니다.
사이트에 표시되는 언어를 영어에서 한국어로 변경하고 싶을 경우에는 LANGUAGE_CODE(언어 코드)를 변경하면 됩니다.
Internationalization(국제화) 설정
config 폴더에 있는 settings.py 파일에서 internationalization(국제화) 영역에 있는 LANGUAGE_CODE를 'en-us'에서 'ko-kr'로 변경하면 됩니다.
# 언어 - 한국어
LANGUAGE_CODE = 'ko-kr'
그러면 사이트가 한국어로 표시됩니다.
장고가 제공하는 메인 페이지는 myenv(가상환경) > Lib > site-packages > django > views > templates 폴더에 있는 default_urlconf.html 파일입니다.
메인 페이지(default_urlconf.html)를 보면 상단에 load 템플릿 태그가 있습니다.
{% load i18n %}
이는 internationalization(국제화)를 로드하여 템플릿 페이지에서 번역된 문장열을 사용하겠다는 것입니다.
여기서, i18(또는 대문자로 I18N)이 무슨 단어이기에 국제화라는 걸까요?
i18n은 internationalization의 첫 번째 단어 i부터 끝단어 n사이에 18개의 문자가 있는 것을 합처서 i18n으로 약어를 만든 겁니다.
i nternationalizatio n
------------------
18
i18n
반대로 localization(지역화 또는 현지화)는 무슨 단어일까요?
네, 예상하신 대로 l10n(또는 대문자로 L10N)입니다.
l ocalizatio n
----------
10
l10n
템플릿 페이지에서 internationalization(국제화)로 번역된 문자열을 사용하고 싶을 때는 translate 템플릿 태그를 사용하면 됩니다.
메인 페이지(default_urlconf.html)처럼 번역된 문자열을 사용하고 싶은 문자열마다 translate 템플릿 태그를 사용하면 됩니다.
<title>{% translate "The install worked successfully! Congratulations!" %}</title>
그럼 번역된 문자열들은 어디에 있을까요?
번역된 문자열들은 myenv(가상환경) > Lib > site-packages > django > conf > locale 폴더에 언어 코드별로 있습니다.
한국어로 번역된 문자열들은 myenv(가상환경) > Lib > site-packages > django > conf > locale > ko > LC_MESSAGES 폴더에 있는 django.po 파일입니다.
원문과 번역문은 msgid와 msgstr로 구성되어 있습니다.
msgid "The install worked successfully! Congratulations!"
msgstr "성공적으로 설치되었습니다! 축하합니다!"
msgid는 translate 템플릿 태그에 있는 문자열입니다.
{% translate "The install worked successfully! Congratulations!" %}
-------------------------------------------------
msgid
msgstr은 번역된 문자열입니다.
만약, 국제화를 사용하고 싶지 않을 경우에는 config 폴더에 있는 settings.py 파일에서 internationalization(국제화) 영역에 있는 USE_I18N를 False로 하면 됩니다.
# 국제화를 사용하지 않음
USE_I18N = False
이러면 템플릿 페이지에 있는 문장이 그대로 나옵니다.
우리는 관리자 페이지를 한국어로 표시할 것이기 때문에 USE_I18N은 True로 변경하지 않을 것입니다.
국제화와 번역에 대한 더 자세한 내용 장고 문서 사이트를 참고하시기 바랍니다. (https://docs.djangoproject.com/en/5.1/topics/i18n/, https://docs.djangoproject.com/en/5.1/topics/i18n/translation/)
템플릿 페이지에서 사용할 국제화 생성에 대해서 다음에 앱을 만들고 템플릿 페이지를 만들 때 다시 설명하도록 하겠습니다.
시간 설정
장고는 기본적으로 TIME_ZONE은 UTC(Universal Time Coordinated, 협정 세계시)으로 되어 있습니다.
config 폴더에 있는 settings.py 파일에서 internationalization(국제화) 영역에 있는 TIME_ZONE이 UTC으로 설정되어 있습니다.
TIME_ZONE = 'UTC'
그럼 한국 시간으로 표시하려면 어떻게 해야 할까요?
TIME_ZONE를 Asia/Seoul로 변경하면 됩니다.
# 시간 - 한국
TIME_ZONE = 'Asia/Seoul'
그럼 한국 시간으로 시간이 표시됩니다.
여기서 주의할 점!
데이터베이스에 저장될 때는 UTC로 저장되는 겁니다.
단지 데이터베이스에서 데이터를 가져올 때만 한국 시간으로 변형되는 겁니다.
다음처럼, 현재 한국 시간이 2024년 11월 3일 오후 7시 39분 34초라면 데이터베이스에 저장될 때는 UTC로 변형되어 저장됩니다.
UTC로 저장되는 시간
datetime.datetime(2024, 11, 3, 10, 39, 34, tzinfo=datetime.timezone.utc)
한국 시간으로 처리된 시간
datetime.datetime(2024, 11, 3, 19, 39, 34, tzinfo=<DstTzInfo 'Asia/Seoul' LMT+9:00:00 STD>)
그렇기 때문에 데이터베이스에 저장된 시간은 한국 시간 기준보다 9시간이 느리게 저장이 됩니다.
UTC
Asia/Seoul = UTC + 9
그래서 시스템(서버) 시간이 한국 시간 기준일 경우 데이터베이스에 저장된 시간과 맞지 않아서 서버 프로그램에 개발에 문제가 될 수 도 있습니다.
그럼 데이터베이스에 저장되는 시간을 시스템 시간(한국 시간 기준)으로 하려면 어떻게 해야 할까요?
TIME_ZONE를 사용하지 않으면 됩니다. 그래서 USE_TZ를 False로 변경하면 됩니다.
# TIME_ZONE를 사용하지 않음
USE_TZ = False
TIME_ZONE를 사용하지 않기 때문에 데이터베이스에 저장된 시간은 시스템 시간(한국 시간 기준)이 됩니다.
USE_TZ = True --> UTC 시간으로 저장됩니다.
USE_TZ = False --> 시스템 시간으로 저장됩니다.
만약, 국제화를 사용하지 않고 시스템 시간(한국 시간 기준)을 기준으로 하고 싶을 경우에는 USE_I18N과 USE_TZ를 False로 설정하면 됩니다.
# 국제화를 사용하지 않음
USE_I18N = False
# TIME_ZONE를 사용하지 않음
USE_TZ = False
우리는 시스템 시간(한국 시간 기준)으로 저장할 것이 때문에 USE_TZ를 False로 설정합니다.