我尝试使用i18n本地化但我已经卡住了。
如果我使用:
I18n i18n = new I18n(slingRequest);
i18n.get("myMessage");
我总是收到关键字的英文消息:myMessage。
在accept-language标题中,我可以看到这些值:de,en; q = 0.5
但:
request.getLocale()返回:en
request.getLocales()返回:en
如果我使用下面的代码,一切都很好:
Locale myLocale = new Locale("de");
ResourceBundle resourceBundle = slingRequest.getResourceBundle(myLocale);
I18n i18n = new I18n(resourceBundle);
为什么cq不读取“accept-language”请求标头?
ps:我使用独立的cq jar ......
提前致谢!
答案 0 :(得分:2)
CQ / Sling(自5.6起)不读取您通过slingRequest.getLocale()
(或slingRequest.getResourceBundle(null)
隐式使用该区域设置)获得的区域设置的Accept-Language标头而是使用用户的语言设置(JCR中的~/preferences/@language
)或可配置的默认值(1)。
原因是固定设置在使用跨设备的不同浏览器时要比猜测语言标题更稳定。
但它是可扩展的:您可以挂钩自定义org.apache.sling.i18n.RequestLocaleResolver服务(具有更高的服务等级),这是为slingRequest.getLocale()
提供值的服务(2 )。这也可以考虑接受语言;它可以访问底层的servlet请求对象,它应该在getLocale()
和getLocales()
中为您提供Accept-Language标头值(至少自从5.4以来,CQ中的内置servlet引擎就是这样)。 / p>
(1)在此服务上配置默认语言环境:http://localhost:4502/system/console/configMgr/org.apache.sling.i18n.impl.JcrResourceBundleProvider
(2)您可能在堆栈跟踪中看到的Sling I18nFilter
已经完成了所有魔法,并使用{{1}包装请求以提供slingRequest.getLocale()
和slingRequest.getResourceBundle()
实现}和RequestLocaleResolver
服务
答案 1 :(得分:0)
是否粘贴了第一个代码示例副本?如果样本是从您的代码中粘贴的,那么您的密钥中的拼写错误可能就是问题,因为您的示例中的语言键是“myMesage”而不是后面在帖子中指出的“myMessage”。