Мисля, че е възможно и един от най-бързите начини да се направи това (дори и да се тества дали работи) би бил модулът за превод на Django да се извърши с маймунска корекция, за да се добави поддръжка на резервен език като този (не е тествано):
from django.utils.translation import trans_real
... # Import other things
# Added `fallback_language` parameter
def do_translate(message, translation_function, fallback_language=None):
"""
Translates 'message' using the given 'translation_function' name -- which
will be either gettext or ugettext. It uses the current thread to find the
translation object to use. If no current translation is activated, the
message will be run through the default translation object.
"""
global _default
# str() is allowing a bytestring message to remain bytestring on Python 2
eol_message = message.replace(str('\r\n'), str('\n')).replace(str('\r'), str('\n'))
t = getattr(_active, "value", None)
if t is not None:
result = getattr(t, translation_function)(eol_message)
else:
# Use other language as fallback.
if fallback_language is not None:
fallback = translation(fallback_language)
result = getattr(_default, translation_function)(eol_message)
else:
if _default is None:
from django.conf import settings
_default = translation(settings.LANGUAGE_CODE)
result = getattr(_default, translation_function)(eol_message)
if isinstance(message, SafeData):
return mark_safe(result)
return result
# Added `fallback_language` parameter
def do_ntranslate(singular, plural, number, translation_function, fallback_language=None):
global _default
t = getattr(_active, "value", None)
if t is not None:
return getattr(t, translation_function)(singular, plural, number)
# Use other language as fallback.
if fallback_language is not None:
fallback = translation(fallback_language)
return getattr(fallback, translation_function)(singular, plural, number)
if _default is None:
from django.conf import settings
_default = translation(settings.LANGUAGE_CODE)
return getattr(_default, translation_function)(singular, plural, number)
# Override Django functions with custom ones.
trans_real.do_translate = do_translate
trans_real.do_ntranslate = do_ntranslate
Горните две функции са взети от модула django.utils.translation.trans_real
. Просто добавих няколко реда към тези функции. Вие също ще трябва да промените другите функции (напр. gettext
, ngettext
, pgettext
), за да приемете параметъра fallback_language
и да го предадете на двете по-горе. Моля, опитайте дали този код работи.
Обърнете внимание, че monkey-patch-ът е за целия проект - засяга цялото ви приложение, както и приложенията на трети страни. Като алтернатива можете да вземете изходния код на модула django.utils.translation.trans_real
като основа за създаване на персонализирани функции за превод, които ще се използват само на няколко места във вашето приложение.
person
HankMoody
schedule
06.09.2013