Django: как добавить китайскую поддержку приложения

Я пытаюсь добавить китайский язык в свое приложение, написанное в Django, и мне очень тяжело с этим справиться. Я потратил полдня на разные подходы, без успеха.

Мое приложение поддерживает несколько языков, это часть файла settings.py:

TIME_ZONE = 'Europe/Dublin'
LANGUAGE_CODE = 'en'

LOCALES = (
    #English
    ('en', u'English'),

    #Norwegian
    ('no', u'Norsk'),

    #Finish
    ('fi', u'Suomi'),

    #Simplified Chinese
    ('zh-CN', u'简体中文'),

    #Traditional Chinese
    ('zh-TW', u'繁體中文'),

    #Japanese
    ('ja', u'日本語'),
)

В настоящий момент все (но китайские) языки работают отлично. Это содержимое каталога локали:

$ ls locale/
en
fi
ja
no
zh_CN
zh_TW

В каждом каталоге у меня есть каталог LC_MESSAGES с файлами *.mo и *.po. *.po файлы создаются с помощью script, написанного на Python, который преобразует *.ODS в текстовый файл. *.mo создаются командой python manage.py compilemessages.

Язык может быть выбран пользователем из соответствующей формы в разделе "Настройки" в моем приложении.

Django не загружает китайский перевод. Это проблема. Оба упрощенных и традиционных не работают. Я попробовал различные варианты языковых и языковых кодов в settings.py и в каталоге локалей: zh-CN, zh-cn, zh_CN, zh_cn. Нет успеха.

Возможно, я допустил простую ошибку? Я добавил польский язык только для теста, и все прошло хорошо. В основном я сделал то же самое. Я добавил ('pl', u'Polish ') кортеж к settings.py и "locale/pl" с каталогами *.po и *.mo и LC_MESSAGES...

Знаете ли вы, что может быть неправильно?

Ответ 1

Для правильной работы вам потребуется использовать строчные буквы для кодов языкового стандарта. т.е. использовать

LANGUAGES = (
    ('zh-cn', u'简体中文'), # instead of 'zh-CN'
    ('zh-tw', u'繁體中文'), # instead of 'zh-TW'
)

См. коды языков, указанные в https://code.djangoproject.com/browser/django/trunk/django/conf/global_settings.py. Вы увидите, что вместо zh-TW он использует zh-TW.

Наконец, языковые каталоги, хранящие файлы *.po и *.mo в вашей папке локалей, должны быть названы zh_CN и zh_TW соответственно, чтобы переводы работали правильно.

Ответ 2

Для Django 1.7 и выше вам нужно сделать следующее:

zh-hans в вашей конфигурации и убедитесь, что ваш каталог называется zh_Hans.

И для традиционного китайского:

zh-hant в вашем конфиге, и ваш каталог должен называться zh_Hant.

Вот пример того, как пакет auth contributor размещает свои переводы в каталоге локалей: https://github.com/django/django/tree/master/django/contrib/auth/locale

В принципе, для наших китайских языковых кодов, то - заменяется на _, и первая буква второго работы капитализируются.

Исходный код этой логики находится здесь: https://github.com/django/django/blob/7a42cfcfdc94c1e7cd653f3140b9eb30492bae4f/django/utils/translation/init.py # L272-L285

и просто чтобы быть тщательным, вот метод:

def to_locale(language, to_lower=False):
    """
    Turns a language name (en-us) into a locale name (en_US). If 'to_lower' is
    True, the last component is lower-cased (en_us).
    """
    p = language.find('-')
    if p >= 0:
        if to_lower:
            return language[:p].lower() + '_' + language[p + 1:].lower()
        else:
            # Get correct locale for sr-latn
            if len(language[p + 1:]) > 2:
                return language[:p].lower() + '_' + language[p + 1].upper() + language[p + 2:].lower()
            return language[:p].lower() + '_' + language[p + 1:].upper()
    else:
return language.lower()

Обратите внимание, что en-us превращается в en_US на основе приведенного выше исходного кода, поскольку us составляет 2 символа или менее.

Ответ 3

У меня была та же проблема [Django-1.6.1] и она была решена путем переименования каталогов локалей для китайцев из zh-cn (или zh_cn) в zh_CN (подчеркивание и верхний регистр CN).

Как ни странно, Django требует "zh-cn" как LANGUAGE_CODE или url с i18n_pattern соответственно.

Бездокументарная доброта.

Надеюсь, что это поможет.

Ответ 4

Не уверен, что вы смогли решить эту проблему позже, но проблема связана с именами языковых каталогов в каталоге локали. Это происходит со всеми языками с тире в их коротком коде. Решение состоит в том, чтобы переименовать китайские каталоги, заменив тире на символы подчеркивания:

zh-cn → zh_cn
zh-tw → zh_tw

Надеюсь, что это поможет.

Ответ 5

В файле .po добавьте zh-cn или zh-tw в "Язык:\n", который становится "Язык: zh-en\n" или "Язык: zh-tw\n"

Скомпилируйте сообщения и серверы снова.