1

我有一个需要本地化的 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 和控件

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

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

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

您对如何完成此任务有任何想法吗?我不想维护属性文件。

TL;DR: 我想实现一种机制,该机制可以根据用户的区域设置从文件系统获取图像,而不使用属性文件。

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

4

1 回答 1

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一个映射,其键是 library + ":" + filename。所以页面作者可以访问上述资源 as ,尽管我认为使用and属性#{resource['images:i_print.png']}更清晰。libraryname

于 2013-10-21T02:39:26.380 回答