在Plone 4中返回语言的国际化名称列表

时间:2011-07-07 09:27:14

标签: plone

通过查询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 个答案:

答案 0 :(得分:3)

如果您想要多种语言的翻译语言名称,请安装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是你最好的选择。

答案 1 :(得分:2)

请改用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模块提供翻译语言;但该列表非常不完整,因此大多数UI语言都没有翻译语言列表。显然意大利语是这种 翻译的一种语言。

您可以通过请求或@@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,正如Hanno所说,因为它实际上有更多的现有信息,而不仅仅是少数语言。

答案 2 :(得分:1)

感谢Martijn的帮助,我能够解决这个问题。这是生成翻译语言名称字典的最终工作代码。如果要创建本地化选择字段(例如语言控制面板中的字段),则非常有用。

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]
    )