7

A python newbie here. I wanna my website support English and Chinese. So I just follow django book, chapter 19 internationalization. But it seems doesn't work for me, string I hope to be displayed as chinese, still english there. My code and settin is as following.

[settings.py]

LANGUAGE_CODE = 'zh-cn'
USE_I18N = True
USE_L10N = True
LANGUAGES = (
    ('en', 'English'),
    ('zh-cn', 'Chinese')
)

TEMPLATE_CONTEXT_PROCESSORS = {
        'django.core.context_processors.i18n',
}
    MIDDLEWARE_CLASSES = (
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
)

In my app views.py, I forcely set language code as 'zh-cn' in index

def index( request ):
    response= render_to_response( 'index.htm' )
    response.set_cookie('django_language','zh-cn')
    return response

then I'd hope annother page that will be loaded after index.htm, will display a chinese string.

Annother page is renderred by upload.html

{% load i18n %}
<html>
<head>
{% block head %}

{% endblock %}
</head>
<body>
{% block body %}
<h1>{% trans 'Upload Demo' %}</h1>
{% endblock %}
</body>
</html>

After then, I do

django-admin.py makemessages -l zh-cn -e htm

in my django project folder, and I got django.po at locale/zh-cn/LC_MESSAGES/django.po which content is like

#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-05-10 18:33+0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

#: uploader/template/base.htm:10
msgid "Upload Demo"
msgstr "上传文件"

Thereafter, I call following command to compile message django-admin.py compilemessages

I got django.mo file at some folder with django.po

Fistly I access the index page, then I access another page, which has 'Upload Demo' string id. Actually I still see english string there.

And tried debug via printing language code, find that language has been set correctly.

context = RequestContext(request) print context translation.activate('zh-cn')

Lastly, I use

gettext locale/zh-cn/LC_MESSAGES/django.mo "Upload Demo"

really got 'Upload Demo'. So I think problem is here. But why this happen? I really confused. Can any body help me.

Deeply appreciated any comment or help.


gettext locale/zh-cn/LC_MESSAGES/django.mo "Upload Demo"

I think I made a mistake. Above command return a string that is same as string you typed as string ID rather than translated string. In above command, it is "Upload Demo", That is if your change "Upload Demo" in above command as "bla bla", you will "bla bla".

Bill the Lizard
  • 398,270
  • 210
  • 566
  • 880
Leo Hwang
  • 171
  • 1
  • 3
  • 7

6 Answers6

9

Maybe it's too late, but I bet your problem probably was due to missing LOCALE_PATHS tuple in your project's settings.

After an hour of pulling my hair out, I solved the same problem by simply adding this to the settings.py file in my project:

LOCALE_PATHS = (
    '/home/myuser/Projects/Some_project_root/My_django_project_root/locale',
)

And this is how that directory looks:

locale/
├── de
│   └── LC_MESSAGES
│       ├── django.mo
│       └── django.po
├── en
│   └── LC_MESSAGES
│       ├── django.mo
│       └── django.po
└── es
    └── LC_MESSAGES
        ├── django.mo
        └── django.po
dschulz
  • 4,666
  • 1
  • 31
  • 31
  • 1
    The `LOCALE_PATHS` tuple accepts relative paths, too, at least when running the Django dev server. I just gave it the path 'locale' in my project with only one app and compiled translation files, and translations seem to work as expected. – Jarno Lamberg Jun 23 '14 at 15:24
3

Your codeblocks are a bit messy so it is quite hard to read it all. But you might want to start with your .mo file. It contains a #, fuzzy annotation. Fuzzy means that the build script was not sure about the translation and therefore requires attention of the translator (=you). Start by checking all #, fuzzy marked translations. If the translation is correct (or after you have corrected the wrong translation) remove the #, fuzzy annotation. Next run compile messages again. This could fix your problem.

#, fuzzy
msgid "" 
msgstr "" 
"Project-Id-Version: PACKAGE VERSION\n" 
"Report-Msgid-Bugs-To: \n" 
"POT-Creation-Date: 2012-05-10 18:33+0800\n" 
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 
"Last-Translator: FULL NAME \n" 
"Language-Team: LANGUAGE \n" 
"Language: \n" 
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

See also: django fuzzy string translation not showing up

Friendly regards, Wout

Community
  • 1
  • 1
  • Thanks for your suggestion. Translation string is correct actually. I delete #, fuzzy annotation, but still got English string display there. – Leo Hwang May 10 '12 at 13:51
  • Thanks for your suggestion. Translation string is correct actually. I delete #, fuzzy annotation, but still got English string display there. – Leo Hwang May 10 '12 at 13:51
  • gettext locale/zh-cn/LC_MESSAGES/django.mo "Upload Demo" I think I made a mistake. Above command return a string that is same as string you typed as string ID rather than translated string. In above command, it is "Upload Demo", That is if your change "Upload Demo" in above command as "bla bla", you will "bla bla". – Leo Hwang May 10 '12 at 13:57
3

You can see LANGUAGE_CODE is not the same as django_language. I think get_language in utils.py does not handle underscore LANGUAGES correctly. get_language will return zh-cn but it should not be cut into cn. Instead, zh-cn should be converted to zh_CN.

So you should use below code in setting.py

LANGUAGES = (
  ('en', _('English')),
  ('zh-cn', _('Simplified Chinese')),
)

and run the following command from terminal

django-admin.py makemessages -l zh_CN
django-admin.py compilemessages

This is working perfectly for me

Vishnu
  • 3,899
  • 2
  • 18
  • 19
1

I have experienced a similar problem: compilemessagesseems to be working only on locale in the current directory. This was a remedy:

find . -name "locale" | while read VAR1; do CURR="``pwd``";cd $VAR1/..; echo "in $VAR1";django-admin.py compilemessages ; cd $CURR; done`
Guillaume Algis
  • 10,705
  • 6
  • 44
  • 72
K.Karamazen
  • 176
  • 1
  • 8
1

I believe the issue lies within the makemessages and compilemessages arguments that you are passing. @Vishnu's answer above is correct.

TLDR

Don't use zh-cn for the locale. Use zh_CN.

django-admin.py makemessages -l zh_CN
django-admin.py compilemessages -l zh_CN

Explanation

The "locale name" as defined in the Django Docs is:

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 in lower case and the country part in upper case. The separator is an underscore.

In the makemessages example (found at the bottom of the makemessages documentation), you will notice the use of the locale name convention:

django-admin makemessages --locale=pt_BR
django-admin makemessages --locale=pt_BR --locale=fr
django-admin makemessages -l pt_BR
django-admin makemessages -l pt_BR -l fr
django-admin makemessages --exclude=pt_BR
django-admin makemessages --exclude=pt_BR --exclude=fr
django-admin makemessages -x pt_BR
django-admin makemessages -x pt_BR -x fr

You will notice the same in the compilemessages example:

django-admin compilemessages --locale=pt_BR
django-admin compilemessages --locale=pt_BR --locale=fr -f
django-admin compilemessages -l pt_BR
django-admin compilemessages -l pt_BR -l fr --use-fuzzy
django-admin compilemessages --exclude=pt_BR
django-admin compilemessages --exclude=pt_BR --exclude=fr
django-admin compilemessages -x pt_BR
django-admin compilemessages -x pt_BR -x fr
Michael B
  • 5,148
  • 1
  • 28
  • 32
1

There is an outstanding problem in this code which is as follow: In settings.py Make sure django.middleware.locale.LocaleMiddleware in the MIDDLEWARE setting comes after SessionMiddleware and CacheMiddleware and before CommonMiddleware if those other middlewares are used.

# settings.py

 MIDDLEWARE = [
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.cache',
# ...
'django.middleware.locale.LocaleMiddleware',
# ...
'django.middleware.common.CommonMiddleware',
]

for more information see: 1 , 2