#3594: Translation problem in javascript
-------------------------------------------+--------------------------------
Reporter: karsu | Owner: msaelices
Status: reopened | Milestone:
Component: Internationalization | Version: SVN
Resolution: | Keywords:
Stage: Accepted | Has_patch: 1
Needs_docs: 0 | Needs_tests: 0
Needs_better_patch: 1 |
-------------------------------------------+--------------------------------
Changes (by arkx):
* needs_better_patch: 0 => 1
Comment:
I can still reproduce this bug with Django version 1.0.2 final. My
settings.LANGUAGE_CODE is set to fi, and everything works well when I'm
using Finnish. However, when I switch to English, only translations in the
django domain work: Javascript translations stop working due to a bug in
javascript_catalog in django/views/i18n.py.
Replying to [comment:11 msaelices]:
> There are no needs of this patch. It's work for me. I created exactly
the same testing environment ticket author.
I think this is the core of the issue. This works for you because you have
created English translation files. I'm translating from English to
Finnish, thus no English translation files exist. I suspect the original
reporter and the people who created the earlier patches work in the same
way: strings in templates and code are in English and all other languages
are created through makemessages. This way is actually endorsed by
Django's i18n documentation.
This is where the function javascript_catalog in views/i18n.py gets it
wrong. In my case default_locale is 'fi' and 'locale' is 'en-us' in the
following excerpts.
{{{
# first load all english languages files for defaults
for package in packages:
p = importlib.import_module(package)
path = os.path.join(os.path.dirname(p.__file__), 'locale')
paths.append(path)
try:
catalog = gettext_module.translation(domain, path, ['en'])
t.update(catalog._catalog)
except IOError:
# 'en' catalog was missing. This is harmless.
pass
}}}
This part of the code tries to load English language files, which do not
exist. It will raise the IOError and it will be passed on.
{{{
# next load the settings.LANGUAGE_CODE translations if it isn't
english
if default_locale != 'en':
for path in paths:
try:
catalog = gettext_module.translation(domain, path,
[default_locale])
except IOError:
catalog = None
if catalog is not None:
#t.update(catalog._catalog)
t = catalog._catalog
}}}
Now, because my settings.LANGUAGE_CODE and hence default_locale is set to
'fi', django will fetch and use the Finnish translation. At this point the
Javascript catalog will hold Finnish translations.
{{{
# last load the currently selected language, if it isn't identical to
the default.
if locale != default_locale:
for path in paths:
try:
catalog = gettext_module.translation(domain, path,
[locale])
except IOError:
catalog = None
if catalog is not None:
t.update(catalog._catalog)
}}}
This is where the code fails for me, as I still don't have any English
translation files -- the code will fail to overwrite the Finnish
translation files it fetched earlier.
There is a simple workaround for this bug if you can't wait for it to be
fixed: create a translation file in djangojs domain for English language
and fill in the blanks with the original strings. It's tiresome and feels
unnecessary but it works.
As a side note, angelolaub's patch doesn't fix the issue for me. The
earlier patches do (they remove the second part of the function), but they
cause breakage in situations where users want the fallback language to be
other than English.
--
Ticket URL: <http://code.djangoproject.com/ticket/3594#comment:15>
Django <http://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/django-updates?hl=en
-~----------~----~----~----~------~----~------~--~---