Preparing your project for internationalization
We will prepare our project to use different languages. We are going to create an English and a Spanish version for the online shop:
Edit the settings.py
file of your project and add the following LANGUAGES
setting to it. Place it next to the LANGUAGE_CODE
setting:
LANGUAGES = [
('en', 'English'),
('es', 'Spanish'),
]
The LANGUAGES
setting contains two tuples that consist of a language code and a name. Language codes can be locale-specific, such as en-us
or en-gb
, or generic, such as en
. With this setting, you specify that your application will only be available in English and Spanish. If you don’t define a custom LANGUAGES
setting, the site will be available in all the languages that Django is translated into.
Make your LANGUAGE_CODE
setting look like the following:
LANGUAGE_CODE = 'en'
Add 'django.middleware.locale.LocaleMiddleware'
to the MIDDLEWARE
setting. Make sure that this middleware comes after SessionMiddleware
because LocaleMiddleware
needs to use session data. It also has to be placed before CommonMiddleware
because the latter needs an active language to resolve the requested URL. The MIDDLEWARE
setting should now look like the following:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
The order of middleware classes is very important because each middleware can depend on data set by another middleware that was executed previously. Middleware is applied for requests in order of appearance in MIDDLEWARE
, and in reverse order for responses.
Create the following directory structure inside the main project directory, next to the manage.py
file:
locale/
en/
es/
The locale
directory is the place where message files for your application will reside.
Edit the settings.py
file again and add the following setting to it:
LOCALE_PATHS = [
BASE_DIR / 'locale',
]
The LOCALE_PATHS
setting specifies the directories where Django has to look for translation files. Locale paths that appear first have the highest precedence.
When you use the makemessages
command from your project directory, message files will be generated in the locale/
path you created. However, for applications that contain a locale/
directory, message files will be generated in that directory.
Your project is now configured for internationalization. Next, you will learn how to translate strings in your Python code.