It should be simple. But the docs are not very clear. So here is how to setup your Django site to be in Hebrew (or any other language).
The need: Make my site work in Hebrew, without taking into account Browser's Accept Language and all this stuff.
Ingredients: Working Django
1.5 project on Linux, common sense
Steps:
Install GNU
gettext
(even if you think you have it already)
sudo apt-get install gettext
Change in
projectname/settings.py
# Language code for this installation. All choices can be found here:
# http://www.i18nguy.com/unicode/language-identifiers.html
# LANGUAGE_CODE = 'en-us'
# This will force this installation to be in Hebrew
LANGUAGE_CODE = 'he'
#...
# If you set this to False, Django will make some optimizations so as not
# to load the internationalization machinery.
USE_I18N = True
# If you set this to False, Django will not format dates, numbers and
# calendars according to the current locale.
USE_L10N = True
# If you set this to False, Django will not use timezone-aware datetimes.
USE_TZ = True
Make sure your
MIDDLEWARE_CLASSES
do not have LocaleMiddleware
. If you do have
LocaleMiddleware
than Django will try to guess the right locale from the request context, which we don't want at the moment.
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
#Comment out LocaleMiddleware if it's there to keep in the same locale all the time
#'django.middleware.locale.LocaleMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
# Uncomment the next line for simple clickjacking protection:
# 'django.middleware.clickjacking.XFrameOptionsMiddleware',
)
You may also need to add
django.core.context_processors.i18n
to your
TEMPLATE_CONTEXT_PROCESSORS
. (Don't do that right now, wait and see if everything is working and only add this if stuff is not working)
#add this at the end of settings.py if I18N is not working
from django.conf import global_settings
TEMPLATE_CONTEXT_PROCESSORS = global_settings.TEMPLATE_CONTEXT_PROCESSORS + (
".context_processors.site",
"django.core.context_processors.i18n",
)
In your python code wrap translatable texts with
ugettext_lazy
or
ugettext
(you can and should alias them to some conventional shortcut (I use
_t
for
ugettext
and
_
for
ugettext_lazy
, for example
from django.utils.translation import ugettext_lazy as _
from django.utils.translation import ugettext as _t
class Shirt(models.Model):
COLOR_TYPES = (
('B', _('Blue')),
('G', _('Green')),
)
...
color = models.CharField(max_length=1, choices=COLOR_TYPES)
type(self):
return _t('Shirt')
In your templates you need to use this (ugly and hard to read) method
{% load i18n %}
<!-- Make sure this LANGUAGE_CODE is correct: {{LANGUAGE_CODE}} -->
...
<h1>{%trans "Shirt Store"%}</h1>
...
or you can use {{_("Shirt Store")}} as an alternative method
Remember that you need to
{% load i18n %}
in every template that uses
{%trans%}
.
Now we need to create the tranlsation files themselves:
cd django-project
cd django-app
mkdir locale
django-admin.py makemessages -l he
vi locale/he/LC_MESSAGES/django.po
django-admin.py compilemessages
Rinse, repeat
Run your site and hope for the best.
Sources: