2012-12-18 49 views
2

我嘗試使用i18n本地化,但是我卡住了。CQ 5.5 i18n和accept-lanugage標頭

如果我使用:

I18n i18n = new I18n(slingRequest); 
i18n.get("myMessage"); 

我總是得到英語消息鍵:myMessage。

在accept-language頭我可以看到這些值:DE,EN; Q = 0.5

但:

  • request.getLocale()返回:EN

  • 請求。 getLocales()返回:en

如果我使用下面的代碼,一切都很好:

Locale myLocale = new Locale("de");  
ResourceBundle resourceBundle = slingRequest.getResourceBundle(myLocale); 
I18n i18n = new I18n(resourceBundle); 

爲什麼cq不能讀取「accept-language」請求頭?

ps:我用獨立的cq罐子......

在此先感謝!

回答

2

CQ /吊帶(如5.6)不讀取Accept-Language頭爲你通過slingRequest.getLocale()(或slingRequest.getResourceBundle(null)這隱含使用該區域)獲得的語言環境,而是使用用戶的語言設置(~/preferences/@language在JCR)或可配置的默認值(1)。

其原因是固定設置更穩定,在跨設備使用不同瀏覽器時也比猜測語言標題更穩定。

但它擴展:您可以在自定義org.apache.sling.i18n.RequestLocaleResolver服務掛鉤(具有更高的服務級別),這是爲slingRequest.getLocale()價值服務(2)。這也可以考慮接受的語言;它可以訪問底層的servlet請求對象,它應該爲您提供getLocale()getLocales()中的Accept-Language頭部值(至少CQ中的內置servlet引擎自5.4開始)。

(1)本服務配置默認的語言環境:http://localhost:4502/system/console/configMgr/org.apache.sling.i18n.impl.JcrResourceBundleProvider

(2)吊帶的I18nFilter,你可能已經在堆棧跟蹤看到已經完成了所有的魔法和包裝提供使用的slingRequest.getLocale()slingRequest.getResourceBundle()實現請求RequestLocaleResolverResourceBundleProvider服務

0

粘貼的第一個代碼示例副本?如果從您的代碼中粘貼了樣本,那麼您的密鑰中的拼寫錯誤可能是問題,因爲您的示例中的語言鍵是「myMesage」而不是「myMessage」,稍後會在您的文章中指出。

+0

對不起,我在這裏複製了代碼(只有消息鍵)。所以這只是一個錯字......我現在已經修復了這個問題。但問題依然存在。我不明白爲什麼CQ不使用接受語言頭文件... – nerd

+1

我能夠重現相同的行爲,這不是預期的行爲,而是可解釋的,因爲SlingHttpServletRequests getLocale()方法通過評估Accept-Language請求標頭或服務器的默認區域設置來解析主Locale,具體取決於基礎Servlet容器的實現。 我想它不會評估Accept-Header,而是服務器的默認語言環境,這可能是一個錯誤,因爲CQ API描述了DefaultLocaleResolver的不同行爲。 http://dev.day.com/docs/en/cq/current/javadoc/org/apache/sling/i18n/DefaultLocaleResolver.html – Thomas