使用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所說的那樣,因爲它實際上有更多的可用信息,而不僅僅是少數幾種語言。
@@語言控制面板事實上並不翻譯語言名稱。這個列表與SimpleTerms詞彙表中的簡單列表相同。如果有任何翻譯發生,它將是一個簡單的zope.i18n.translate調用('translate(language_name,context = request)')。 –
對不起,如果我很厚,但@@語言控制面板如何實現這一點?這正是我需要的行爲。 – zedr
不確定你的意思,在@@ language-controlpanel中有* nothing *可翻譯語言。 –