Как отображать текст на сербском, русском и арабском языках (JSF 2.0) - PullRequest
3 голосов
/ 15 августа 2011

В интернете я нашел книгу под названием JSF 2.0 cookbook .

Я ехал в главе 7 (Интернационализация), и мне это показалось довольно простым, я все сам попробовал, и все работало нормально, кроме использования символов из таких языков, как русский, арабский, сербский ...

Книга гласит:

Распространенная проблема при использовании арабских, китайских, русских символов (и и так далее) звучит так: «Я могу набирать такие символы во входном тексте компонента, но когда я отправляю форму, отображается вставленный текст в символах Юникода, вместо читаемых человеком символов. Как почини это?". Решение очень простое. Все, что вам нужно сделать, это написать следующая строка на вашей странице JSF:

<%@page contentType="text/html" pageEncoding="UTF-8"%>

Так что именно это я и сделал. Я добавил эту строку в самой первой строке кода моего основного шаблона JSF. Но это не сработало. Что мне не хватает? все мои файлы свойств локализации настроены на использование UTF-8:

enter image description here

Также я попробовал эту строку в своем теге 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/

Я понимаю большинство из них, но когда я пытаюсь сделать это в своем приложении, я вижу, что в браузере по-прежнему видны пятна. Я пробовал по-разному, но никто не работал:

Вот как я организовал свои файлы:

enter image description here

Это мои лица-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 говорит, когда я запрашиваю изменение языка:

enter image description here

1 Ответ

4 голосов
/ 15 августа 2011
<%@page contentType="text/html" pageEncoding="UTF-8"%>

Это синтаксис JSP. Это не имеет никакого смысла. Вы используете Facelets, который по умолчанию уже использует UTF-8.

<meta http-equiv="content-type" content="text/html;charset=utf-8"/>

Это бесполезно, если вы обслуживаете страницу по HTTP, а не открываете ее из файловой системы локального диска.


Если вы видите мусор, то проблема вызвана чем-то другим. Я бы посоветовал потратить некоторое время, чтобы разобраться в этой статье: Юникод - Как правильно настроить символы?

Как минимум, ключевые моменты для JSF2 / Facelets:

  • Настройте IDE для использования UTF-8.
  • Сконфигурируйте свою БД / таблицу для использования UTF-8.
  • Файлы свойств должны быть ISO-8859-1, и вы должны использовать экранирование Unicode. Но для JSF есть обходной путь для пользовательского ResourceBundle, так что вы можете использовать UTF-8 в файлах свойств.
...