JSF-1.1 I18n- Как зарегистрировать пользовательский ResourceBundle в face-config.xml
Я работал над интернационализацией сообщений / строк в моем старом проекте JSF-1.x, когда обнаружил, что рендеринг UTF-8 не применяется к сообщениям.
Я столкнулся с подобной проблемой здесь: - i18n с файлами свойств в кодировке UTF-8 в приложении JSF 2.0
Но это сработало бы для приложения JSF-2, и я не могу зарегистрировать свой Custom Resource Bundle таким же образом, как объяснено там (ошибка развертывания пространства имен не совпадает).
Нужна помощь, чтобы зарегистрировать мой Custom Resource Bundle в face-config.xml для JSF-1.x.
(Мы использовали там message-bundle. Но я не могу зарегистрировать свой класс bundle в message-bundle, как мы можем в теге resource-bundle)
1 ответ
В JSF-1.x
, нет поддержки для регистрации моего собственного Custom ResourceBundle
учебный класс.
Поэтому нужно идти вперед, чтобы создать собственный тег <x:loadBundle>
который кодирует файл свойств в правильной кодировке.
Обратитесь к пользовательскому тегу Facelets, который не отображается для регистрации вашего Tag Library XML
в вашем web.xml
, Тогда в вашем TagLibrary XML
, есть этот конфиг:-
<tag>
<tag-name>loadBundle</tag-name>
<handler-class>org.somepackage.facelets.tag.jsf.handler.LoadBundleHandler</handler-class>
</tag>
Расширьте свой пользовательский LoadBundleHandler, чтобы расширить класс граней TagHandler (код будет таким же, как и LoadBundleHandler @). com.sun.facelets.tag.jsf.core.LoadBundleHandler
И теперь вы можете переопределить класс Control, как указано в моем посте в вопросе. Итак, в целом ваш класс будет выглядеть так:
public final class LoadBundleHandler extends TagHandler {
private static final String BUNDLE_EXTENSION = "properties"; // The default extension for langauge Strings (.properties)
private static final String CHARSET = "UTF-8";
private static final Control UTF8_CONTROL = new UTF8Control();
private final static class ResourceBundleMap implements Map {
private final static class ResourceEntry implements Map.Entry {
protected final String key;
protected final String value;
public ResourceEntry(String key, String value) {
this.key = key;
this.value = value;
}
public Object getKey() {
return this.key;
}
public Object getValue() {
return this.value;
}
public Object setValue(Object value) {
throw new UnsupportedOperationException();
}
public int hashCode() {
return this.key.hashCode();
}
public boolean equals(Object obj) {
return (obj instanceof ResourceEntry && this.hashCode() == obj
.hashCode());
}
}
protected final ResourceBundle bundle;
public ResourceBundleMap(ResourceBundle bundle) {
this.bundle = bundle;
}
public void clear() {
throw new UnsupportedOperationException();
}
public boolean containsKey(Object key) {
try {
bundle.getString(key.toString());
return true;
} catch (MissingResourceException e) {
return false;
}
}
public boolean containsValue(Object value) {
throw new UnsupportedOperationException();
}
public Set entrySet() {
Enumeration e = this.bundle.getKeys();
Set s = new HashSet();
String k;
while (e.hasMoreElements()) {
k = (String) e.nextElement();
s.add(new ResourceEntry(k, this.bundle.getString(k)));
}
return s;
}
public Object get(Object key) {
try {
return this.bundle.getObject((String) key);
} catch( java.util.MissingResourceException mre ) {
return "???"+key+"???";
}
}
public boolean isEmpty() {
return false;
}
public Set keySet() {
Enumeration e = this.bundle.getKeys();
Set s = new HashSet();
while (e.hasMoreElements()) {
s.add(e.nextElement());
}
return s;
}
public Object put(Object key, Object value) {
throw new UnsupportedOperationException();
}
public void putAll(Map t) {
throw new UnsupportedOperationException();
}
public Object remove(Object key) {
throw new UnsupportedOperationException();
}
public int size() {
return this.keySet().size();
}
public Collection values() {
Enumeration e = this.bundle.getKeys();
Set s = new HashSet();
while (e.hasMoreElements()) {
s.add(this.bundle.getObject((String) e.nextElement()));
}
return s;
}
}
private final TagAttribute basename;
private final TagAttribute var;
public LoadBundleHandler(TagConfig config) {
super(config);
this.basename = this.getRequiredAttribute("basename");
this.var = this.getRequiredAttribute("var");
}
public void apply(FaceletContext ctx, UIComponent parent)
throws IOException, FacesException, FaceletException, ELException {
UIViewRoot root = ComponentSupport.getViewRoot(ctx, parent);
ResourceBundle bundle = null;
FacesContext faces = ctx.getFacesContext();
String name = this.basename.getValue(ctx);
try {
ClassLoader cl = Thread.currentThread().getContextClassLoader();
if (root != null && root.getLocale() != null) {
bundle = ResourceBundle.getBundle(name, root.getLocale(), cl, UTF8_CONTROL);
} else {
bundle = ResourceBundle
.getBundle(name, Locale.getDefault(), cl);
}
} catch (Exception e) {
throw new TagAttributeException(this.tag, null , e);
}
ResourceBundleMap map = new ResourceBundleMap(bundle);
faces.getExternalContext().getRequestMap().put(this.var.getValue(ctx),
map);
}
protected static class UTF8Control extends Control {
public ResourceBundle newBundle
(String baseName, Locale locale, String format, ClassLoader loader, boolean reload)
throws IllegalAccessException, InstantiationException, IOException
{
String bundleName = toBundleName(baseName, locale);
String resourceName = toResourceName(bundleName, BUNDLE_EXTENSION);
ResourceBundle bundle = null;
InputStream stream = null;
if (reload) {
URL url = loader.getResource(resourceName);
if (url != null) {
URLConnection connection = url.openConnection();
if (connection != null) {
connection.setUseCaches(false);
stream = connection.getInputStream();
}
}
} else {
stream = loader.getResourceAsStream(resourceName);
}
if (stream != null) {
try {
bundle = new PropertyResourceBundle(new InputStreamReader(stream, UTF8_CONTROL));
} finally {
stream.close();
}
}
return bundle;
}
}
}
Вы могли бы даже пропустить basename
конфиг в <x:loadbundle var="msg basename="resources">
удалив basename
недвижимость в этом классе.