Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image JSF2.0应用程序中的本地化图像_Image_Jsf_Localization_Jsf 2 - Fatal编程技术网

Image JSF2.0应用程序中的本地化图像

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" /> &

我有一个JSF2.0应用程序,它允许用户更改站点的语言,这将影响文本和图像

当前,区域设置是在会话bean中设置的,并且每个页面都具有从该会话bean设置的区域设置。它对文本非常有效。但是我在图像方面有困难。目前我们使用的图像如下:

<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}" />

但我仍然认为前一种方法应该有效,而且更干净

我想知道:

  • 在我们使用“name”和“library”属性的情况下,为什么JSF不生成一个“src”作为图像的实际路径?JSF拥有在初始页面请求上构建完整路径的所有信息,包括UIViewRoot的区域设置(无需实现我自己的ViewHandler)。我的假设是,这是因为根据规范,资源也可以放在类路径中的JAR中。但是,servlet的url只能用于检索位于类路径的资源,而不能为这些资源提供直接url

  • 为什么该规范声明生成的图像“src”属性应该包括库,但没有说明语言环境前缀(请参阅Resource.getRequestPath())?图像src由Resource.getRequestPath()检索。如果URL中包含前缀,则浏览器不会将法语和英语图像解释为单个“已修改”资源


  • 欢迎任何意见

    实际上,您也可以使用常规HTML
    标记并构建自己的路径。
    似乎最好创建自己的控制器来解析路径:

    还提供真实路径名(即磁盘上的路径名,如果使用分解格式)-如果需要,请参阅
    getRealPath()
    method

    为什么我喜欢这种方法?它非常简单且功能强大:使用本地化控制器不仅可以提供指向本地化对象的路径,如CSS文件(或至少是主样式表覆盖)、客户端脚本,当然还有图像,还可以实际提供动态本地化上下文(即JavaScript中可翻译字符串的数组)

    要回答您的具体问题:

  • 简单的回答是我不知道。我很想考虑一下,设计这个API的人仔细权衡了所有的利弊,并选择了最佳的解决方案(尽管并不能满足所有可能的用例)

  • 为此,我可以给你准确的答案。基本上,正确的国际化应用程序不应该包含任何可能依赖于区域设置的图像,即特定于区域性的图像。这是一种非常理想化的世界观,但老实说,拥有真正取决于当地环境的形象应该是罕见的。
    如果我了解您的具体问题,您希望根据当前地区切换某些特定的国旗。实际上,您也可以在这里使用条件渲染(
    render=“#{someController.someBooleanMethod}”
    )并实际一次写入所有图像引用。我知道这很糟糕,但这是一个可行的解决方案


  • 您在上面给出的解决方案非常强大且易于应用。但如果我错了,请纠正我:引入库并将大部分表示数据描述(图像、css、metainfo等)移动到JSF标记中,可以让我们创建一个良好的表示抽象。在阅读了JSR314之后,我感觉图像、css等现在也是JSF2.0国际化的一部分。因此,在i18n中包含图像是一种新趋势,而在JSF中没有很好地实现,还是不适合使用该技术?JSF组件无疑是更好的方法。如果你打算重复使用它们的话。至于JSF2.0,我真的希望它能提供一种简单的机制来本地化CSS、JS和图像等文件。我可能没有意识到一些事情,我希望有人能启发我,但我不知道如何使此类文件依赖于区域设置(除了上面的解决方案)。现在,我不建议使用许多依赖于区域设置的图像。它们很难本地化,因此应该避免。没问题