我想使用JSF(在属性文件中)的标准国际化以及切换到数据库的可能性。是否可以用自己的实现替换 JSF 国际化,从数据库中检索数据,以便我可以配置它?还是在这种情况下,另一个更好?我找到了以下示例:http://jdevelopment.nl/internationalization-jsf-utf8-encoded-properties-files/.在此示例中,定义了自己的资源包类。要使用它,只需替换 xml 中对实现类的引用。
正如BalusC所指出的,您需要创建一个资源包并将其注册到应用程序或按页面单独注册。
简单的例子:
索引.xhtml
<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:p="http://primefaces.org/ui">
<h:body>
<h:outputText value="[helloworld]: #{msgs.helloworld}" />
</h:body>
</html>
人脸配置.xml
<?xml version="1.0"?>
<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
version="2.0">
<application>
<resource-bundle>
<base-name>com.myproject.CustomResourceBundle</base-name>
<var>msgs</var>
</resource-bundle>
</application>
</faces-config>
自定义资源包.java
package com.myproject;
import java.util.ListResourceBundle;
public class CustomResourceBundle extends ListResourceBundle {
@Override
protected Object[][] getContents() {
return getMapOfWordsFromDatabase();
}
private Object[][] getMapOfWordsFromDatabase() {
// TODO get key and words relation from database!
return map;
}
}
理论:
http://docs.oracle.com/javaee/5/tutorial/doc/bnaxv.html
http://docs.oracle.com/javase/7/docs/api/java/util/ResourceBundle.html