Image JSF2.0应用程序中的本地化图像
我有一个JSF2.0应用程序,它允许用户更改站点的语言,这将影响文本和图像 当前,区域设置是在会话bean中设置的,并且每个页面都具有从该会话bean设置的区域设置。它对文本非常有效。但是我在图像方面有困难。目前我们使用的图像如下:Image JSF2.0应用程序中的本地化图像,image,jsf,localization,jsf-2,Image,Jsf,Localization,Jsf 2,我有一个JSF2.0应用程序,它允许用户更改站点的语言,这将影响文本和图像 当前,区域设置是在会话bean中设置的,并且每个页面都具有从该会话bean设置的区域设置。它对文本非常有效。但是我在图像方面有困难。目前我们使用的图像如下: <h:graphicImage name="flag.gif" library="img"> <h:graphicImage library="#{userContext.locale}/img" name="flag.gif" /> &
<h:graphicImage name="flag.gif" library="img">
<h:graphicImage library="#{userContext.locale}/img" name="flag.gif" />
<img alt="#{i18n['some.image.title']}" src="#{localizationController.someImage}" />
这将导致生成返回给用户代理的以下HTML代码:
<img src="/AppRoot/faces/javax.faces.resource/flag.gif?ln=img" .... />
假设用户请求的页面是英文的。上面图像的GET请求由ResourceHandler.HandlerResourceRequest()处理。它使用ViewHandler.CalculateScale()来标识正确的区域设置前缀。我用calculateLocale()实现了自己的ViewHandler,它从用户会话中检索语言环境。因此,它正确地创建了一个指向“/resources/english/img/flag.gif”的资源实例。然后用户将其区域设置更改为法语。重新加载页面时,将呈现并请求相同的图像URL。这次ViewHandler.CalculateScale()将Locale.FRENCH返回给ResourceHandler,从而创建路径为“/resources/FRENCH/img/flag.gif”的资源
根据规范,在流式传输图像之前,ResourceHandler.HandlerResourceRequest()必须执行以下操作:
•调用Resource.userAgentNeedsUpdate(javax.faces.context.FacesContext)。如果此方法返回false,则必须将HttpServletRequest.SC_NOT_MODIFIED传递给HttpServletResponse.setStatus(),然后handleResourceRequest必须立即返回
它检测到自上次浏览器请求后资源未更新-未考虑到对此“逻辑”URL的上次请求导致服务器上不同的“物理”资源。并返回HTTP 304,其导致再次向用户显示先前的英文图像
如果使用Shift+F5刷新页面,则法语图像将正确下载,因为用户代理未发送“If Modified-since”
始终可以在库名称中手动添加带有EL的区域设置前缀,如下所示:
<h:graphicImage name="flag.gif" library="img">
<h:graphicImage library="#{userContext.locale}/img" name="flag.gif" />
<img alt="#{i18n['some.image.title']}" src="#{localizationController.someImage}" />
但我仍然认为前一种方法应该有效,而且更干净
我想知道:
欢迎任何意见 实际上,您也可以使用常规HTML
标记并构建自己的路径。似乎最好创建自己的控制器来解析路径: 还提供真实路径名(即磁盘上的路径名,如果使用分解格式)-如果需要,请参阅
getRealPath()
method
为什么我喜欢这种方法?它非常简单且功能强大:使用本地化控制器不仅可以提供指向本地化对象的路径,如CSS文件(或至少是主样式表覆盖)、客户端脚本,当然还有图像,还可以实际提供动态本地化上下文(即JavaScript中可翻译字符串的数组)
要回答您的具体问题:
如果我了解您的具体问题,您希望根据当前地区切换某些特定的国旗。实际上,您也可以在这里使用条件渲染(
render=“#{someController.someBooleanMethod}”
)并实际一次写入所有图像引用。我知道这很糟糕,但这是一个可行的解决方案您在上面给出的解决方案非常强大且易于应用。但如果我错了,请纠正我:引入库并将大部分表示数据描述(图像、css、metainfo等)移动到JSF标记中,可以让我们创建一个良好的表示抽象。在阅读了JSR314之后,我感觉图像、css等现在也是JSF2.0国际化的一部分。因此,在i18n中包含图像是一种新趋势,而在JSF中没有很好地实现,还是不适合使用该技术?JSF组件无疑是更好的方法。如果你打算重复使用它们的话。至于JSF2.0,我真的希望它能提供一种简单的机制来本地化CSS、JS和图像等文件。我可能没有意识到一些事情,我希望有人能启发我,但我不知道如何使此类文件依赖于区域设置(除了上面的解决方案)。现在,我不建议使用许多依赖于区域设置的图像。它们很难本地化,因此应该避免。没问题