3

我尝试使用 i18n 本地化,但我卡住了。

如果我使用:

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

我总是收到关于密钥的英文消息:myMessage。

在接受语言标题中,我可以看到这些值: 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 不读取“接受语言”请求标头?

ps:我使用独立的cq jar ...

提前致谢!

4

2 回答 2

4

CQ/Sling(从 5.6 开始)不会读取您通过slingRequest.getLocale()(或slingRequest.getResourceBundle(null)隐式使用该语言环境)获得的语言环境的 Accept-Language 标头,而是使用用户的语言设置(~/preferences/@language在 JCR 中)或可配置的默认值 (1) .

原因是固定设置比猜测语言标头要稳定得多,即使在跨设备使用不同浏览器时也是如此。

但它是可扩展的:您可以挂钩自定义org.apache.sling.i18n.RequestLocaleResolver服务(具有更高的服务等级),该服务提供slingRequest.getLocale()(2) 的值。这也可以考虑接受语言;它可以访问底层的 servlet 请求对象,该对象应该为您提供 Accept-Language 标头值,getLocale()并且getLocales()(至少 CQ 中的内置 servlet 引擎从 5.4 开始就是这样做的)。

(1) 在此服务上配置默认语言环境:http://localhost:4502/system/console/configMgr/org.apache.sling.i18n.impl.JcrResourceBundleProvider

I18nFilter(2)您可能在堆栈跟踪中看到的Sling已经完成了所有的魔法并包装了请求以使用和服务提供slingRequest.getLocale()slingRequest.getResourceBundle()实现RequestLocaleResolverResourceBundleProvider

于 2013-05-23T16:35:42.003 回答
0

第一个代码示例复制粘贴了吗?如果示例是从您的代码中粘贴的,那么您的密钥中的拼写错误可能是问题所在,因为您的示例中的语言密钥是“myMessage”而不是“myMessage”,如您的帖子后面所述。

于 2012-12-20T20:47:19.370 回答