Как интернационализировать сообщения об ошибках при использовании Hibernate Validator с GWT?

Я ищу небольшую помощь в том, как интернационализировать мои сообщения проверки гибернации при использовании GWT, чтобы он работал как с сообщениями клиента, так и с сервером.

В соответствии с этим вопросом я должен поместить файл ValidationMessages.properties в свой путь к классу или использовать следующий код:

Validation
    .byProvider(HibernateValidator.class)
    .configure()
    .messageInterpolator(
        new ResourceBundleMessageInterpolator(
            new PlatformResourceBundleLocator("com.mycompany.Messages")))
    .buildValidatorFactory()
    .getValidator();`

Но будет ли этот метод работать на стороне клиента с кодом GWT? Что я должен сделать, чтобы заставить его работать на стороне клиента?


person Ali    schedule 19.02.2014    source источник


Ответы (1)


Проверьте GWT Internationalize.

Если вы хотите интернационализировать сообщения с помощью GWT , проверьте Интернационализация статических строк и Динамическая интернационализация строк.
Я использовал GWT ConstantsWithLookup для постоянных данных (таких как текст кнопок, Текст этикетки).
И я использую сообщения GWT для моих данных сообщений (таких как предупреждения, предупреждения, подтверждения, диалоговые окна подсказок).

Не забудьте добавить конфигурацию в файл gwt.xml, как показано ниже...

<extend-property name="locale" values="en"/>
<extend-property name="locale" values="ja"/>
<!-- set the fallback for locale default Japan  -->
<set-property-fallback name="locale" value="ja"/>
........

Я использовал Local en для английского и ja для японского. Я создал ListBox, чтобы пользователь мог выбирать локаль по своему усмотрению, и использовал Cookie для сохранения в качестве предпочтения пользователя. Ниже приведены мои примеры кодов для сохранения локали в файле cookie для интернационализации при следующем открытии...

    public static void initializeLocaleBox(final ListBox localeBox) {
    String currentLocale = LocaleInfo.getCurrentLocale().getLocaleName();
    if (currentLocale.equals("default")) {
        currentLocale = "ja";
    }
    String[] localeNames = LocaleInfo.getAvailableLocaleNames();
    for (String localeName : localeNames) {
        if (!localeName.equals("default")) {
            String nativeName = LocaleInfo.getLocaleNativeDisplayName(localeName);
            localeBox.addItem(nativeName, localeName);
            if (localeName.equals(currentLocale)) {
                localeBox.setSelectedIndex(localeBox.getItemCount() - 1);
            }
        }
    }
    localeBox.addChangeHandler(new ChangeHandler() {
        public void onChange(final ChangeEvent event) {
            String localeName = localeBox.getValue(localeBox.getSelectedIndex());

            Date now = new Date();
            long sevenDays = now.getTime();
            // seven days
            sevenDays = sevenDays + (1000 * 60 * 60 * 24 * 7);
            now.setTime(sevenDays);
            Cookies.setCookie("locale", localeName, now);
            UrlBuilder builder = Location.createUrlBuilder().setParameter("locale", localeName);
            Window.Location.replace(builder.buildString());
        }
    });
}

public static boolean isLocaleJapan() {
    String currentLocale = LocaleInfo.getCurrentLocale().getLocaleName();
    return currentLocale != null && currentLocale.equals("ja") ? true : false;
}

public static boolean isLocaleEnglish() {
    String currentLocale = LocaleInfo.getCurrentLocale().getLocaleName();
    return currentLocale != null && currentLocale.equals("en") ? true : false;
}

Для изменения URL на локализацию я преобразовал GWT следующим образом.

public static final String getBaseUrl(final int codesvrPort) {
    String locale = Cookies.getCookie("locale");
    if (locale == null || locale.equals("")) {
        locale = "en";
    }
    String baseUrl = GWT.getHostPageBaseURL() + GWT.getModuleName() + ".html";
    if (GWT.getHostPageBaseURL().contains("localhost")
            || GWT.getHostPageBaseURL().contains("127.0.0.1")) {
        return baseUrl + "?locale=" + locale + "&gwt.codesvr=127.0.0.1:" + codesvrPort;
    }
    return "";
}

Вот полезная ссылка для вас. Прошу прощения за слишком много ссылок. Есть для вас полезное :)

Изменить (Добавить суффикс к файлу свойств)

Цитата из этой ссылки.

Примечание. Добавление суффикса к файлу свойств

Если вы никогда раньше не сталкивались с интернационализацией, вам может быть интересно, почему к немецкому файлу свойств добавляется суффикс _de. . Суффикс _de является стандартным языковым тегом для немецкого языка (Deutsch). Теги языков — это аббревиатуры, указывающие на язык документа или приложения. Помимо указания языка, они также могут содержать вложенный тег, указывающий регион локали. Например, языковой тег для франкоязычной Канады — fr_CA.
В GWT файлы свойств указывают локаль с суффиксом кода языка (точно так же, как пакеты ресурсов Java). Исключением является файл свойств для локали по умолчанию. Если языковой стандарт явно не задан во время выполнения, используется файл свойств без суффикса кода языка. Для StockWatcher вы указали перевод по умолчанию с аннотациями вместо использования файла свойств по умолчанию.

person Cataclysm    schedule 20.02.2014
comment
так что единственный способ изменить локаль - указать локаль в URL-адресе с аргументом locale=xx? - person Ali; 20.02.2014
comment
Означает ли это, что если пользователь посещает вашу страницу, сначала все загружается на языке по умолчанию, затем вы определяете локаль из файла cookie и обновляете страницу для него с locale=xx в URL-адресе? это кажется очень неэффективным - person Ali; 20.02.2014
comment
@ClickUpvote, пожалуйста, проверьте раздел Добавление суффикса к файлу свойств в gwtproject .org/doc/latest/tutorial/i18n.html - person Cataclysm; 20.02.2014
comment
Я не понимаю, как это отвечает на мой вопрос относительно подхода строки запроса/обновления. - person Ali; 20.02.2014
comment
@ClickUpvote, ваш второй комментарий был плохим для моего метода getBaseUrl(). Я использовал его для навигации по некоторым страницам, например getBaseUrl(9997) + #mylink: +123);. И я думаю, это может зависеть от того, как вы разберетесь. - person Cataclysm; 20.02.2014
comment
@ClickUpvote Я отредактировал свой ответ. Пожалуйста, проверьте имена файлов свойств. Если у вас все еще есть проблемы с этим, пожалуйста, проверьте себя, и тогда вы поймете, что я имею в виду. - person Cataclysm; 20.02.2014
comment
На самом деле, моя проблема в том, что мой язык по умолчанию — английский, а пользователь указал французский в качестве своего языка. Поэтому я храню это как файл cookie. Но в следующий раз, когда пользователь посетит приложение, оно все равно сначала покажет все на английском, пока не обнаружит из cookie, что его язык французский, и не перенаправит его. Это не кажется эффективным. Приложение должно загружаться на французском языке по умолчанию, если есть файл cookie для французского языка. - person Ali; 20.02.2014
comment
@ClickUpvote да, я абсолютно понимаю, что вы имеете в виду. :) Если вы сначала покажете английский, пользователь сначала покажет английский, а затем предпочитаемый им язык. Если для этого у вас есть перехватчики , например проверка с помощью сопоставления URL-адресов, вам не нужно сначала показывать на английском языке. Вы можете использовать его с некоторыми утилитами, такими как Spring MVC или другими... Или открыть другую тему. Мой ответ для интернационализации с сообщениями или константами. - person Cataclysm; 20.02.2014
comment
Как бы я установил его на французский по умолчанию? через метатег? - person Ali; 20.02.2014
comment
@ClickUpvote в моих приведенных выше примерах кодов по умолчанию используется Япония, если в URL-адресе нет locale из-за ‹set-property-fallback name=locale value=ja/›.Французский fr также. Но, пожалуйста, помните, у вас также будет файл относительных свойств. - person Cataclysm; 21.02.2014
comment
Я спрашиваю о том, если пользователь выбрал французский язык, но мой по умолчанию английский, как я могу изменить значение по умолчанию на французский для этого пользователя? - person Ali; 21.02.2014