如何在使用带有GWT的Hibernate Validator时将错误消息国际化?

时间:2014-02-19 07:57:52

标签: java hibernate gwt internationalization hibernate-validator

我正在寻找有关如何在使用GWT时使我的hibernate验证消息国际化的一些帮助,以便它适用于客户端和服务器消息。

根据this question,我应该在我的类路径中放置一个ValidationMessages.properties文件,或者使用以下代码:

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

但是这个方法是否可以在客户端使用GWT代码?我该怎么做才能使它在客户端工作?

1 个答案:

答案 0 :(得分:1)

请检查GWT Internationalize

如果您想使用GWT对消息进行国际化,请检查Static String InternationalizationDynamic String Internationalization
我使用GWT ConstantsWithLookup作为常量数据(例如按钮文本,文本标签) 。
我使用GWT Messages作为我的消息数据(例如警报,警告,确认,提示对话框)。

不要忘记在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"/>
........

我使用本地 en 表示英语, ja 表示日语。我创建了ListBox供用户根据自己的喜好选择Locale,并使用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;
}

要将网址更改为本地化,我使用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 "";
}

Here是您的有用链接。我很抱歉链接太多了。有一些对你有用:)

编辑(后缀属性文件)

来自this链接。

  

注意:后缀属性文件

  如果您以前从未处理过国际化,那么您可能想知道为什么将_de后缀附加到德语属性文件中。后缀_de是德语(Deutsch)的标准语言标记。语言标记是指示文档或应用程序的语言环境的缩写。除了指定语言外,它们还可以包含指示区域设置区域的子标签。例如,加拿大法语区的语言标签是fr_CA。   
在GWT中,属性文件指示具有语言代码后缀的语言环境(就像Java资源包一样)。例外是默认语言环境的属性文件。如果在运行时未显式设置语言环境,则使用不带语言代码后缀的属性文件。对于StockWatcher,您已使用注释指定了默认转换,而不是使用默认属性文件。