В интернете я нашел книгу под названием JSF 2.0 cookbook .
Я ехал в главе 7 (Интернационализация), и мне это показалось довольно простым, я все сам попробовал, и все работало нормально, кроме использования символов из таких языков, как русский, арабский, сербский ...
Книга гласит:
Распространенная проблема при использовании арабских, китайских, русских символов (и
и так далее) звучит так: «Я могу набирать такие символы во входном тексте
компонента, но когда я отправляю форму, отображается вставленный текст
в символах Юникода, вместо читаемых человеком символов. Как
почини это?".
Решение очень простое. Все, что вам нужно сделать, это написать
следующая строка на вашей странице JSF:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
Так что именно это я и сделал. Я добавил эту строку в самой первой строке кода моего основного шаблона JSF. Но это не сработало.
Что мне не хватает? все мои файлы свойств локализации настроены на использование UTF-8:
Также я попробовал эту строку в своем теге h: head:
<meta http-equiv="content-type" content="text/html;charset=utf-8"/>
Что еще мне нужно, чтобы я мог видеть текст на моей странице, написанный на русском, арабском ...
Единственное, что я вижу, когда я изменяю на ru, ar или sr locales, это такой текст:
ÙبØØ «Ù٠صÙØات ÙÙÙØ © ÙÙسÙ
Обновление
Прочитав несколько статей о локализации, я пришел к выводу, что моему приложению необходимо выполнить преобразования, чтобы иметь возможность отображать специальные символы (мне не нравится решение символов scape в файле свойств). Я следовал примеру по этой ссылке: http://jdevelopment.nl/internationalization-jsf-utf8-encoded-properties-files/
Я понимаю большинство из них, но когда я пытаюсь сделать это в своем приложении, я вижу, что в браузере по-прежнему видны пятна. Я пробовал по-разному, но никто не работал:
Вот как я организовал свои файлы:
Это мои лица-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<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>
<message-bundle>resources.application</message-bundle>
<locale-config>
<default-locale>en</default-locale>
<supported-locale>en</supported-locale>
<supported-locale>de</supported-locale>
<supported-locale>it</supported-locale>
<supported-locale>es</supported-locale>
<supported-locale>fr</supported-locale>
<supported-locale>sr</supported-locale>
<supported-locale>ar</supported-locale>
<supported-locale>ru</supported-locale>
</locale-config>
<!-- Localization files configuration -->
<resource-bundle>
<!-- Path to the file -->
<base-name>resources.messages</base-name>
<!-- Variable representation of the file -->
<var>msgs</var>
</resource-bundle>
</application>
</faces-config>
И это файл, который я нашел по ссылке выше, чтобы иметь возможность делать преобразования:
package support;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.Enumeration;
import java.util.Locale;
import java.util.PropertyResourceBundle;
import java.util.ResourceBundle;
import javax.faces.context.FacesContext;
public class TextBunddle extends ResourceBundle {
protected static final String BUNDLE_NAME = "resources.messages";
protected static final String BUNDLE_EXTENSION = "properties";
protected static final Control UTF8_CONTROL = new UTF8Control();
public TextBunddle() {
setParent(ResourceBundle.getBundle(BUNDLE_NAME,
FacesContext.getCurrentInstance().getViewRoot().getLocale(), UTF8_CONTROL));
}
@Override
protected Object handleGetObject(String key) {
return parent.getObject(key);
}
@Override
public Enumeration getKeys() {
return parent.getKeys();
}
protected static class UTF8Control extends Control {
public ResourceBundle newBundle
(String baseName, Locale locale, String format, ClassLoader loader, boolean reload)
throws IllegalAccessException, InstantiationException, IOException
{
// The below code is copied from default Control#newBundle() implementation.
// Only the PropertyResourceBundle line is changed to read the file as UTF-8.
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, "UTF-8"));
} finally {
stream.close();
}
}
return bundle;
}
}
}
Я думаю, что ошибка в Face-config.xml, но я не знаю, каким образом я должен настроить файл, чтобы иметь возможность видеть локализованные сообщения, когда на своих страницах я использую такие команды, как эта:
#{msgs.mainbaner}
Вот что Firebug говорит, когда я запрашиваю изменение языка: