Translating safe strings should return a safe result.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@6681 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Malcolm Tredinnick 2007-11-17 12:11:54 +00:00
parent 0928fa5566
commit 64c0bf8677
3 changed files with 28 additions and 7 deletions

View File

@ -4,6 +4,7 @@
from django.conf import settings from django.conf import settings
from django.utils.encoding import force_unicode from django.utils.encoding import force_unicode
from django.utils.safestring import mark_safe, SafeData
def ngettext(singular, plural, number): def ngettext(singular, plural, number):
if number == 1: return singular if number == 1: return singular
@ -31,7 +32,10 @@ TECHNICAL_ID_MAP = {
} }
def gettext(message): def gettext(message):
return TECHNICAL_ID_MAP.get(message, message) result = TECHNICAL_ID_MAP.get(message, message)
if isinstance(message, SafeData):
return mark_safe(result)
return result
def ugettext(message): def ugettext(message):
return force_unicode(gettext(message)) return force_unicode(gettext(message))

View File

@ -8,6 +8,7 @@ import gettext as gettext_module
from cStringIO import StringIO from cStringIO import StringIO
from django.utils.encoding import force_unicode from django.utils.encoding import force_unicode
from django.utils.safestring import mark_safe, SafeData
try: try:
import threading import threading
@ -271,11 +272,15 @@ def do_translate(message, translation_function):
global _default, _active global _default, _active
t = _active.get(currentThread(), None) t = _active.get(currentThread(), None)
if t is not None: if t is not None:
return getattr(t, translation_function)(message) result = getattr(t, translation_function)(message)
else:
if _default is None: if _default is None:
from django.conf import settings from django.conf import settings
_default = translation(settings.LANGUAGE_CODE) _default = translation(settings.LANGUAGE_CODE)
return getattr(_default, translation_function)(message) result = getattr(_default, translation_function)(message)
if isinstance(message, SafeData):
return mark_safe(result)
return result
def gettext(message): def gettext(message):
return do_translate(message, 'gettext') return do_translate(message, 'gettext')

View File

@ -4,7 +4,7 @@ import misc
regressions = ur""" regressions = ur"""
Format string interpolation should work with *_lazy objects. Format string interpolation should work with *_lazy objects.
>>> from django.utils.translation import ugettext_lazy, activate, deactivate, gettext_lazy >>> from django.utils.translation import ugettext, ugettext_lazy, activate, deactivate, gettext_lazy
>>> s = ugettext_lazy('Add %(name)s') >>> s = ugettext_lazy('Add %(name)s')
>>> d = {'name': 'Ringo'} >>> d = {'name': 'Ringo'}
>>> s % d >>> s % d
@ -39,6 +39,18 @@ unicode(string_concat(...)) should not raise a TypeError - #4796
<module 'django.utils.translation' from ...> <module 'django.utils.translation' from ...>
>>> unicode(django.utils.translation.string_concat("dja", "ngo")) >>> unicode(django.utils.translation.string_concat("dja", "ngo"))
u'django' u'django'
Translating a string requiring no auto-escaping shouldn't change the "safe"
status.
>>> from django.utils.safestring import mark_safe
>>> s = mark_safe('Password')
>>> type(s)
<class 'django.utils.safestring.SafeString'>
>>> activate('de')
>>> type(ugettext(s))
<class 'django.utils.safestring.SafeUnicode'>
>>> deactivate()
""" """
__test__ = { __test__ = {