Opened 11 years ago

Closed 10 years ago

#21055 closed Bug (fixed)

Error when implementing unknown language

Reported by: Doug Beck Owned by: nobody
Component: Translations Version: dev
Severity: Normal Keywords:
Cc: Triage Stage: Unreviewed
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

When trying to implement a language unknown to django (say Inuktitut, ISO 639-1 lang code "iu") an error is encountered.

Discovered while trying to answer:
https://groups.google.com/forum/#!msg/django-users/tc0asF6iFBo/u3cBN0SlUl0J
https://code.djangoproject.com/ticket/18192

Tests to and patch in comments.

Change History (9)

comment:2 by Bouke Haarsma, 10 years ago

How can I reproduce the problem? I've tried with the example below, but that seems to be working allright.

from django.conf import settings
settings.configure(
    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
        }
    }
)

from django.utils.translation.trans_real import activate, gettext
activate('iu-ca')
print(gettext('Hello, world.'))

comment:3 by fernando.gutierrez@…, 10 years ago

I think it is not related to one unknown language, probably related to two unknown languages and the way django tries to avoid sharing the translation object? This script fails for me in the third activate, it basically replicates what I am trying to do for a language chooser, were in one template I try to show the language name in it's own language:

from django.conf import settings
gettext = lambda s: s
settings.configure(
    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
        }
    },
    LANGUAGES = (
        ('en', gettext('English')),
        ('zh-sg', gettext('Traditional Chinese (Singapore)')),
        ('zh-hk', gettext('Traditional Chinese (Hong Kong)')),
    )
)

from django.utils.translation.trans_real import activate, gettext
activate('en')
print(gettext('Hello, world.'))
activate('zh-sg')
print(gettext('Hello, world.'))
activate('zh-hk')
print(gettext('Hello, world.'))

Fails with:

$ python script.py 
Hello, world.
Hello, world.
Traceback (most recent call last):
  File "script.py", line 21, in <module>
    activate('zh-hk')
  File "/Users/***/.virtualenvs/cumutmp/lib/python2.7/site-packages/django/utils/translation/trans_real.py", line 194, in activate
    _active.value = translation(language)
  File "/Users/***/.virtualenvs/cumutmp/lib/python2.7/site-packages/django/utils/translation/trans_real.py", line 184, in translation
    current_translation = _fetch(language, fallback=default_translation)
  File "/Users/***/.virtualenvs/cumutmp/lib/python2.7/site-packages/django/utils/translation/trans_real.py", line 147, in _fetch
    res._info = res._info.copy()
AttributeError: 'NoneType' object has no attribute '_info'

This is django 1.4.10 btw. (I've replaced my username with *)

comment:4 by anonymous, 10 years ago

Looks about right. The core issue is that an inappropriate IOError exception in trans_real.translation() that results in downstream failure.

This section of code is difficult to debug and write fixes for. I've closed my old pull in favor of a rewrite:
https://github.com/django/django/pull/2237

Some of this code hasn't been touched in ages.
I hope this pull is reviewed and merged so core django translations dev can happen without hours of trying to untangle what is happening.

in reply to:  4 comment:5 by Doug Beck, 10 years ago

Replying to anonymous:

Errr... didn't mean to post as anon

comment:6 by Tim Graham, 10 years ago

Easy pickings: unset

comment:7 by Tim Graham, 10 years ago

#22409 was a duplicate.

comment:8 by Tim Graham, 10 years ago

Is #18192 a duplicate?

comment:9 by Claude Paroz <claude@…>, 10 years ago

Resolution: fixed
Status: newclosed

In a5f6cbce07b5f3ab48d931e3fd1883c757fb9b45:

Refactored DjangoTranslation class

Also fixes #18192 and #21055.

Note: See TracTickets for help on using tickets.
Back to Top