通过查询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
答案 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]
)