Как да се върна към множество езици в Django по време на изпълнение?

Създавам приложение Django, което използва функциите за превод на Django, за да осигури локализация на множество езици. Но също така използвам функциите за превод на Django, за да превеждам определена терминология в различни индустрии въз основа на текущо влезлите настройки на потребителя.

Например, за англоговорящ потребител, работещ в индустрията за оценяване на обучението, искам следното поведение:

За дадена заявка към страница:

  1. Потърсете естествения език на потребителя (напр. немски)
  2. Потърсете индустрията на потребителя (напр. оценка на обучението)
  3. Активирайте немския/езика за оценка на обучението (напр. translation.activate("learning-assessment-de")

Файлът "learning-assessment-de" .po ще преведе само подмножество от всички низове в проекта, защото е там само за превод на определена специфична за индустрията терминология.

Това е въпросът:

Когато низ липсва, искам Django да се върне към немски (определен в стъпка #1 по-горе), а не към английски (езика по подразбиране в моя settings.py).

Моите .po файлове на английски/немски по подразбиране ще приемат определена индустрия.

Възможно ли е това?


person djsmith    schedule 02.09.2013    source източник
comment
Не разбирам, ако низът не липсва от .po файла, тогава откъде другаде би липсвал?   -  person yuvi    schedule 02.09.2013
comment
Интересно, изглежда, че най-добрият ще направи персонализиран gettext, който получава може би обект на заявка „gettext('Hello world', request)´.   -  person Mario César    schedule 04.09.2013


Отговори (1)


Мисля, че е възможно и един от най-бързите начини да се направи това (дори и да се тества дали работи) би бил модулът за превод на 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