Установить код языка внутри представления в Django - PullRequest
1 голос
/ 03 мая 2010

Как мне установить код языка внутри представления (в django)?

Я отправляю HttpResponse, который содержит python-date.strftime("%A").

%A - это день (например, «понедельник»), но я хочу получить день на шведском, а не на английском языке.

1 Ответ

0 голосов
/ 04 мая 2010

Документация для locale предполагает, что слишком много возиться с языком - плохая идея:

Это вообще плохая идея звонить setlocale () в некоторой библиотечной подпрограмме, поскольку в качестве побочного эффекта это влияет на Вся программа. Сохранение и восстановление это почти так же плохо: это дорого и влияет на другие темы, которые происходят запустить до того, как настройки были восстановлен.

Если все ваше приложение может использовать шведскую локаль, вы должны просто установить ее один раз и быть в пути. С другой стороны, если вы хотите, чтобы на этой странице использовалась только шведская локаль, или вам нужно иметь возможность переключаться на основе запроса, locale и, следовательно, datetime.strftime - не лучший способ. Причина этого ограничения, по-видимому, заключается в том, что python вызывает в среде выполнения C для strftime, что не очень хорошо работает с часто меняющимся языком.

При условии, что ваши потребности относительно ограничены, лучше всего написать свою собственную функцию, которая форматирует даты так, как вы хотите, без использования strftime для какого-либо спецификатора локали {%a, %A, %b, %B, %c, %p}. Это, вероятно, повлечет за собой создание списка региональных названий названий месяцев / дней, но это не так уж сложно.

Вот действительно базовая реализация, которая позволяет переключаться между английским и французским языками (у меня не установлена ​​шведская локаль;), обрабатывает %a и %b и вызывает до datetime.strftime для всего остального:

import datetime

def wrap_strftime(d, fmt, locale = "en"):
    """
    Preprocess a strftime format so we can pass in the locale.

    >>> dt = datetime.datetime(2010, 1, 1)
    >>> wrap_strftime(dt, "%a %b %d, %Y")
    'Fri Jan 01, 2010'
    >>> wrap_strftime(dt, "%a %b %d, %Y", "fr")
    'Ven jan 01, 2010'
    """

    data = {
        "fr": {
            "%a": ['Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam', 'Dim'],
            "%b": [
                'jan', 'f\xc3\xa9v', 'mar', 'avr', 'mai', 'jui',
                'jul', 'ao\xc3\xbb', 'sep', 'oct', 'nov', 'd\xc3\xa9c'
            ],
        },
        "en": {
            "%a": ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
            "%b": [
                'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
                'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'
            ],
        },
    }

    getters = {
        "%a": lambda dt: dt.weekday(),
        "%b": lambda dt: dt.month - 1,
    }


    for pattern in data[locale]:
        getter = getters[pattern]
        fmt = fmt.replace(pattern, data[locale][pattern][getter(d)])

    return d.strftime(fmt)

if __name__ == "__main__":
    import doctest
    doctest.testmod()

Возможно, вы также захотите проверить Babel , который будет гораздо более надежным, чем попытка обернуть strftime, и позволит вам делать такие вещи, как:

>>> from babel.dates import format_datetime
>>> import datetime
>>> format_datetime(datetime.datetime.now(), "EEE dd MMM yyyy", locale="fr")
u'lun. 03 mai 2010'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...