Вместо этого используйте метод listAvailableLanguageInformation()
:
>>> from Products.CMFPlone.utils import getToolByName
>>> ltool = getToolByName(context, 'portal_languages')
>>> native_language_names = [entry[u'native']
... for entry in ltool.listAvailableLanguageInformation()]
[u'Afrikaans', u'Aymara', u'Az\u0259ri T\xfcrk\xe7\u0259si', u'Bahasa Indonesia', ...]
Обратите внимание, что представление @@ language-controlpanel использует модуль zope.i18n.locales
для предоставления переведенных языков;но этот список настолько неполон, что список языков не переведен для большинства языков пользовательского интерфейса.По-видимому, итальянский является одним языком, на который переводится .
Вы можете получить доступ к структуре локалей через запрос или через представление @@plone_state
.Словарь locales.displayNames.languages
отображает код языка (2 буквы) на имя местного языка:
>>> from Products.CMFPlone.utils import getToolByName
>>> ltool = getToolByName(context, 'portal_languages')
>>> languages = request.locales.displayNames.languages
>>> language_names = [languages.get(code, name) for code, name in ltool.listAvailableLanguages()]
[u'abkhazian', u'afar', u'afrikaans', u'albanese', u'amarico', ...]
Как видите, названия языков в нижнем регистре, с заглавными буквами.Кроме того, анализ данных является дорогостоящим (пакет содержит файлы XML, проанализированные при первом доступе), поэтому может потребоваться несколько минут, прежде чем эти данные станут доступны вам при первом доступе.
Лучше всего будет использовать BabelКак утверждает Ханно, на самом деле он располагает гораздо более актуальной информацией, и не только для нескольких языков.