Java中的图像的无文件资源包?

时间:2013-10-20 23:49:58

标签: java jsf localization

我有一个需要本地化的Java(JSF)Web应用程序,包括文本,图像等(数字,日期)。我试图让程序员只使用

<h:graphicImage value="#{images['i_print.png']}" ... />

...并根据用户的区域设置,在后台自动选择正确的本地化图像。

一种方法是使资源包属性文件具有针对特定图像密钥的不同图像路径。有没有办法可以在没有属性文件的情况下完成?

我的意思是.. images目录具有以下结构:

-Images
--en
---en_US
---en_CA
--fr
---fr_FR

是否有可能创建资源包,其中查找将首先通过最本地化的目录,然后上升到树,直到找到图像名称?

到目前为止,我有以下内容:

(1)图像处理程序。

<resource-bundle>
    <base-name>com.example.ImageResourcesHandler</base-name>
    <var>images</var>
</resource-bundle>

(2)处理程序实现,它通过重写getObject

来扩展资源包并处理调用
public class ImageResourcesHandler extends ResourceBundle {

@Override
protected Object handleGetObject(String key) {...}


}

(3)一个图像控件,它扩展了ResourceBundle.Control,应该是BundleLoading和control

public class ImageControl extends ResourceBundle.Control { ... }

现在我浏览图像根目录并创建一个地图,其中图像的名称为关键,其路径为值。

问题是我没有Bundle结构,这意味着如果我有两个不同语言环境中的密钥,我的地图显然不起作用(两个+路径映射到同一个密钥)。

你对如何做到这一点有什么想法吗?我不想维护属性文件。

TL; DR:我想实现一种机制,根据用户的语言环境从文件系统获取图像,而不使用属性文件。

任何想法都受到高度赞赏。谢谢!

1 个答案:

答案 0 :(得分:1)

JSF有一个内置机制来执行此操作:资源。

通过将资源放在.war中名为/ resources / locale / library 的目录中,可以对资源进行本地化。所以你的.war可能包含这些文件:

  • /resources/images/i_print.png
  • /resources/en_UK/images/i_print.png
  • /resources/de/images/i_print.png
  • /resources/ja/images/i_print.png

......等等。

对于图像,此访问权限为<h:graphicImage library="images" name="i_print.png"/>。 JSF将根据视图根的区域设置自动选择资源目录。

样式表可以采用相同的方式进行本地化:<h:outputStylesheet library="css" name="apptheme.css"/>

对于图像和样式表以外的资源,JSF提供了一个内置的EL解析器,它将标识符resource视为地图,其键是库+“:”+ filename。因此,页面作者可以访问上述资源#{resource['images:i_print.png']},但我认为使用libraryname属性更加清晰。