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"
Скомпилируйте сообщения и серверы снова.