Django: Как добавить поддержку китайского в приложение - PullRequest
10 голосов
/ 11 октября 2011

Я пытаюсь добавить китайский язык в свое приложение, написанное на 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'日本語'),
)

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

$ ls locale/
en
fi
ja
no
zh_CN
zh_TW

В каждом каталоге у меня есть каталог LC_MESSAGES с файлами * .mo и * .po. Файлы * .po создаются скриптом, написанным на 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 ...

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

Ответы [ 5 ]

16 голосов
/ 11 октября 2011

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

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 в папке locales должны иметь имена zh_CN и zh_TW соответственно для правильной работы переводов.

10 голосов
/ 20 ноября 2016

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

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

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

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

Вот пример того, как пакет участника auth предоставляет свои переводы вкаталог локалей: 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 символам или меньше.

2 голосов
/ 16 января 2014

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

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

Неподтвержденная доброта между прочим.

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

1 голос
/ 30 июля 2014

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

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

1 голос
/ 18 января 2012

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

ч-н-н -> ч_чн
ж-тв -> ж_тв

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

...