使用MessageFormat中的Locale递归格式化

时间:2016-11-18 21:42:18

标签: java

我们正在使用MessageFormat来管理我们的应用程序中的翻译。我们有一个包装类(TranslationWrapper),其中包含翻译键及其参数。

显示翻译的消息时,使用此命令格式化

String message = new MessageFormat( translationKey, aLocale ).format( parameters );

translationKey的格式类似于"消息{0} {1}",参数是包含{0}和{1}值的Object数组。 / p>

由于任何对象都可以用作参数,我们经常使用TranslationWrapper作为参数。这允许我们基于imbricaed翻译键创建本地化的字符串。

对于作为参数传递的任何对象,将调用toString()方法。 toString()的{​​{1}}方法会使用当前用户的区域设置自动翻译,但我有时会想使用其他区域设置。

由于我将这个不同的Locale传递给它的构造函数中的TranslationWrapper,我想知道是否有办法处理参数的方式'替换{0}之类的值时,会在MessageFormat中生成字符串。我没有在MessageFormat上调用toString()方法,而是打电话给:

TranslationWrapper

其中locale是我在构造函数中传递的Locale。

1 个答案:

答案 0 :(得分:1)

这是一个相当丑陋的解决方案但您可以将当前区域设置设置为线程局部变量以在toString方法中使用它(如果已设置):

private static final ThreadLocal<Locale> threadLocale = new ThreadLocal<Locale>();

...

public String translate(String translationKey, Locale aLocale, Object ...parameters) {

    Locale previousLocale = threadLocale.get();
    try {
        threadLocale.set(aLocale);
        return new MessageFormat( translationKey, aLocale ).format( parameters);
        ...
    } finally {
        threadLocale.set(previousLocale);
    }
}

// somewhere in toString method threadLocale.get() will return you current Locale