Create Locale Path for .po
and .mo
files
Configure Django settings
Add middleware between session and common
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware', # add this line
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
Defind local path directory
create a local files directory where django will try to find the .po
and .mo
files. Usually it is the locale
directory onder the project root.
LOCALE_PATHS = [
os.path.join(BASE_DIR, 'locale'),
]
Defind available languages
Make sure to only select the languages that available for the site, we can also tell django which languages are available by adding those lines to the django settings:
LANGUAGES = [
('ru', _('Russian')),
('en', _('English')),
('kk', _('Kazakh')),
]
Configure project URLs
Configure project urls to use django i18n patters.
from django.conf.urls.i18n import i18n_patterns #import this
from django.contrib import admin
from django.urls import path, include
from django.views.generic import TemplateView
from django.utils.translation import gettext_lazy as _ #and import this
and then use the i18n patterns to the urls that we want to use translations:
urlpatterns = i18n_patterns(
path('', home_view, name='home'),
path(_('base/'), base_view, name='base'),
path(_('about/'), about_view, name='about'),
path(_('events/'), events_view, name='events'),
path(_('fishing/'), fish_view, name='fishing'),
path(_('bath/'), bath_view, name='bath'),
path(_('team-building/'), team_view, name='team-building'),
path(_('horse-riding/'), horse_view, name='horse-riding'),
path(_('restaurant/'), restaurant_view, name='restaurant'),
path(_('cottage/'), cottage_view, name='cottage'),
path(_('contact/'), contact_view, name='contact'),
path(_('admin/'), admin.site.urls),
path(_('nurlytau/'), include('nurlytau.urls')),
prefix_default_language=False,
)
Configure language switch
Usually I do not use such complicated way for language switching and always the simplest is the best for me. So it’s quite easy for me to setup the language switch. There are several things to notice before that.
In the language swtich menu, we can use trics like this:
Indicate contents that should be translated
the templates (html files)
To indicate contents in the templates to be translated, it is only two steps:
Load the django i18n
tag in html files.
Use trans
template tag or blocktrans
template tag to indicate the content that should be trnslated
- ` trans `
Use trans
tag for short and one line contents.
blocktrans
use blocktrans
for multiline contents.
the Python scripts (view e.t.c)
Indecate languages for translation
We have choosen ru,en,kk
those three languages for translation, then we should create po files for each of them (except the default lang)
to do those, we run the command:
manage.py@backend > makemessages -l kk
and manage.py@backend > makemessages -l en
Then we can find that there are two new directory created inside the locale
path:
Each of them contains a django.po
file to perform translation.
Translate the content using IDE’s or Poedit and compile translations
After translating the content, there is another final step, that is to compile the translations:
python3 manage.py compilemessages
Demo
We have already hided the default language (here is russian)’s language prefix.
addding /en/ to the url will change the langugae from russian to the English.