2011-07-07 55 views
2

通過查詢portal_languages工具,我可以得到語言的名稱列表:返回的語言國際化的名單在Plone 4

>>> 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', (...) 

但我怎麼能返回本地化語言名列表?

[編輯]我要的是在當前用戶的語言語言名稱的列表,如@@語言ControlPanel控制顯示參見:http://i.imgur.com/rGfjG.png

+0

@@語言控制面板事實上並不翻譯語言名稱。這個列表與SimpleTerms詞彙表中的簡單列表相同。如果有任何翻譯發生,它將是一個簡單的zope.i18n.translate調用('translate(language_name,context = request)')。 –

+0

對不起,如果我很厚,但@@語言控制面板如何實現這一點?這正是我需要的行爲。 – zedr

+0

不確定你的意思,在@@ language-controlpanel中有* nothing *可翻譯語言。 –

回答

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所說的那樣,因爲它實際上有更多的可用信息,而不僅僅是少數幾種語言。

+0

對不起,我不得不改變我的問題。 – zedr

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

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