The goal of internationalization and localization is to allow a single Web
application to offer its content in languages and formats tailored to the
Django has full support for translation of text, formatting of dates, times and numbers, and time zones.
Essentially, Django does two things:
- It allows developers and template authors to specify which parts of their apps
should be translated or formatted for local languages and cultures.
- It uses these hooks to localize Web apps for particular users according to
Obviously, translation depends on the target language, and formatting usually
depends on the target country. These informations are provided by browsers in
the Accept-Language header. However, the time zone isn’t readily available.
The words “internationalization” and “localization” often cause confusion;
here’s a simplified definition:
- Preparing the software for localization. Usually done by developers.
- Writing the translations and local formats. Usually done by translators.
More details can be found in the W3C Web Internationalization FAQ, the Wikipedia article or the GNU gettext documentation.
Translation and formatting are controlled by USE_I18N and
USE_L10N settings respectively. However, both features involve
internationalization and localization. The names of the settings are an
unfortunate result of Django’s history.
Here are some other terms that will help us to handle a common language:
- locale name
- A locale name, either a language specification of the form ll or a
combined language and country specification of the form ll_CC.
Examples: it, de_AT, es, pt_BR. The language part is
always is lower case and the country part in upper case. The separator
is an underscore.
- language code
- Represents the name of a language. Browsers send the names of the
languages they accept in the Accept-Language HTTP header using this
format. Examples: it, de-at, es, pt-br. Both the language
and the country parts are in lower case. The separator is a dash.
- message file
- A message file is a plain-text file, representing a single language,
that contains all available translation strings and how they should be represented in the given
language. Message files have a .po file extension.
- translation string
- A literal that can be translated.
- format file
- A format file is a Python module that defines the data formats for a given