Concise run book on I18N to get things started
Prerequisite
Know the difference between locale name and language name:
- Locale name:
<language code>_<COUNTRY CODE>(examples: “en_US“, “fr_CA“), case sensitive. - Language name:
<language subtag>-<range subtag>(examples: “en-us“, “fr-ca“), case insensitive.
They usually look alike EXCEPT locale names use the underscore (“_”) character to separate the language and country while the language names use the dash (“-“) to separate the subtags.
Creating a .po file for translation
- Install the prerequisite gettext library. See gettext on Windows.
- Create a “
locale” subdirectory in the project’s base directory1. - Run
python manage.py makemessages -l <locale name>[-l <locale name> ...]and provide locale names
E.g.python manage.py makemessages -l en_US -l fr_CA
Translate each .po file
This can be done manually by editing the *.po file and fill in the msgstr values or by sending the file to a translation service.
Compile the translated .po file
- Run
python manage.py compilemessages - This will produce a .mo (e.g. django.mo) file next to the .po (e.g. django.po) file
Configure the Django settings file
Adding the LocaleMiddleware
Adding the middleware “django.middleware.locale.LocaleMiddleware” in the list MIDDLEWARE.
IMPORTANT: it must follow “django.contrib.sessions.middleware.SessionMiddleware” and precede “django.middleware.common.CommonMiddleware“.
For example:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware', # Order is important
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
Set the languages supported
Add/edit the setting LANGUAGES, listing all the languages supported. The value should be a list of tuples (language name, description). For example:
LANGUAGES = [
('en', 'English'),
('es-419', 'Spanish Latin America'), # NOTE: language name, not locale name
]
Set the path(s) to locale subdirs
Add the path to the “locale” subdirectory where the *.mo files can be found. For example:
LOCALE_PATHS = [
BASE_DIR / "locale",
]
- NOTE that it is also possible to create additional “
locale” subdirs under individual apps’ subdirs, as long as they are configured in setting’sLOCALE_PATHS.