Вернуть список интернационализированных названий языков в Plone 4 - PullRequest
2 голосов
/ 07 июля 2011

Запрашивая инструмент portal_languages, я могу получить список названий языков:

>>> from Products.CMFPlone.utils import getToolByName
>>> ltool = getToolByName(context, 'portal_languages')
>>> language_names = [name for code, name in ltool.listAvailableLanguages()]
[u'Abkhazian', u'Afar', u'Afrikaans', u'Albanian', u'Amharic', (...)

Но как я могу вернуть список локализованных названий языков?

[РЕДАКТИРОВАТЬ] Мне нужен список имен языков на языке текущего пользователя, как показано в @@ language-controlpanel См .: http://i.imgur.com/rGfjG.png

Ответы [ 3 ]

3 голосов
/ 07 июля 2011

Если вы хотите перевести названия языков на разные языки, установите Babel (http://pypi.python.org/pypi/Babel). Там есть хорошая документация, например http://packages.python.org/Babel/display.html:

>>> from babel import Locale
>>> locale = Locale('de', 'DE').languages['ja']
u'Japanisch'

Plone включает только названия на родном и английском языках. В пакете zope.i18n есть некоторые из этих данных, но они действительно неполные и устаревшие, так что Babel - ваш лучший выбор.

2 голосов
/ 07 июля 2011

Вместо этого используйте метод 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Как утверждает Ханно, на самом деле он располагает гораздо более актуальной информацией, и не только для нескольких языков.

1 голос
/ 08 июля 2011

Благодаря помощи Мартина я смог решить проблему.Это последний рабочий код, который сгенерирует словарь переведенных названий языков.Очень полезно, если вы хотите создать локализованное поле выбора, такое как поле, найденное на панели управления языком.

from Products.CMFCore.interfaces import ISiteRoot
from zope.component import getMultiAdapter
from zope.site.hooks import getSite
from zope.globalrequest import getRequest

@grok.provider(IContextSourceBinder)
def languages(context):
    """
    Return a vocabulary of language codes and
    translated language names.
    """

    # z3c.form KSS inline validation hack
    if not ISiteRoot.providedBy(context):
        for item in getSite().aq_chain:
            if ISiteRoot.providedBy(item):
                context = item

    # retrieve the localized language names.
    request = getRequest()
    portal_state = getMultiAdapter((context, request), name=u'plone_portal_state')
    lang_items = portal_state.locale().displayNames.languages.items()

    # build the dictionary
    return SimpleVocabulary(
        [SimpleTerm(value=lcode, token=lcode, title=lname)\
          for lcode, lname in lang_items]
    )
...