6

我正在为一个国际网站使用 Java + Spring。

两种语言是ZH和EN(中文和英文)。

我有 2 个文件:messages.properties(用于英文键/值对)和 messages_zh.properties。

该网站使用#springMessage 标签以英文编码。然后我使用 Poeditor.com 让翻译人员为每个英文短语提供中文值。所以,虽然英文的 messages.properties 文件总是完整的,虽然 messages_zh.properties 文件总是有所有的,但是messages_zh.properties 文件有时会有空白,因为几天后我收到了翻译者的翻译。

每当缺少中文值时,我需要我的系统显示等效的英文值(在我的网站上)。

当中文值不可用时,我如何告诉 Spring “回退”以使用英文?我需要在逐个价值的基础上发生这种情况。

现在,我在我的网站上看到缺少中文值的空白按钮标签。我宁愿在中文为空时使用英语(默认语言)。

4

2 回答 2

6

为此,您可以创建自己的自定义消息源。

就像是:

public class SpecialMessageSource extends ReloadableResourceBundleMessageSource {

      @Override
      protected MessageFormat resolveCode(String code, Locale locale) {
         MessageFormat result = super.resolveCode(code, locale);
         if (result.getPattern().isEmpty() && locale == Locale.CHINESE) {
            return super.resolveCode(code, Locale.ENGLISH);
         }
         return result;
      }

      @Override
      protected String resolveCodeWithoutArguments(String code, Locale locale) {
         String result= super.resolveCodeWithoutArguments(code, locale);
         if ((result == null || result.isEmpty()) && locale == Locale.CHINESE) {
            return super.resolveCodeWithoutArguments(code, Locale.ENGLISH);
         }
         return result;
      }
   }

并在 spring xml 中将此 messageSource bean 配置为

<bean id="messageSource" class="SpecialMessageSource">
.....
</bean>

现在要获得解决标签,您将调用 MessageSource's以下任一方法

String getMessage(String code, Object[] args, Locale locale);
String getMessage(String code, Object[] args, String defaultMessage, Locale locale);

resolveCode()当您的消息标签具有参数并且您通过args如下参数传递这些参数并调用时
invalid.number= {0} is Invalid
将调用messageSource.getMessage("INVALID_NUMBER", new Object[]{2d}, locale)

resolveCodeWithoutArguments()当您的消息标签没有参数并且您将args参数传递为 null
validation.success = Validation Success
并且您调用时将被调用messageSource.getMessage("INVALID_NUMBER", null, locale)

于 2013-08-09T19:34:02.577 回答
1

@harrybvp 的回答让我走上了正轨。这是似乎对我有用的代码(并且当您模拟调用“super”的方法时是可单元测试的):

    public class GracefulMessageSource extends org.springframework.context.support.ReloadableResourceBundleMessageSource {

        final static private Locale defaultLocale = Locale.ENGLISH;

        @Override protected MessageFormat resolveCode(final String code, final Locale locale) {
            MessageFormat result = superResolveCode(code, locale);

            if (result.toPattern().isEmpty() && !locale.equals(this.defaultLocale)) {
                result = superResolveCode(code, this.defaultLocale);
            }

            return result;
        }

        @Override protected String resolveCodeWithoutArguments(final String code, final Locale locale) {
            String result = superResolveCodeWithoutArguments(code, locale);

            if (result.isEmpty() && !locale.equals(this.defaultLocale)) {
                result = superResolveCodeWithoutArguments(code, this.defaultLocale);
            }

            return result;
        }

        protected MessageFormat superResolveCode(final String code, final Locale locale) {
            return super.resolveCode(code, locale);

        }

        protected String superResolveCodeWithoutArguments(final String code, final Locale locale) {
            return super.resolveCodeWithoutArguments(code, locale);

        }

    }

在我的 webmvc-config.xml 中:

<bean id="messageSource" class="com.mycode.fe.web.GracefulMessageSource">
    <property name="basename">
        <value>${content.path.config}/WEB-INF/messages</value>
    </property>
    <property name="defaultEncoding" value="UTF-8" />
    <property name="cacheSeconds" value="2"/>
    <property name="fallbackToSystemLocale" value="true"/>
</bean>

然后在我的速度视图模板中:

对于没有参数的普通键:#springMessage('menu_item1')

对于接受参数的键:#springMessageText('male_to_female_ratio' [3, 2])

然后在messages.properties(英文翻译)中: male_to_female_ratio = There is a {0}:{1} male-to-female ratio.

于 2013-08-09T21:46:44.863 回答