我们有很多字符串包含相同的子字符串,从关于检查日志或如何联系支持的句子到包含公司或产品名称的类似品牌的字符串。重复导致了我们自己的一些问题(主要是拼写错误或复制/粘贴错误),但它也引起了问题,因为它增加了翻译者翻译的文本数量。如何避免Java ResourceBundle字符串中的重复?
我想出了解决办法去是这样的:
public class ExpandingResourceBundleControl extends ResourceBundle.Control {
public static final ResourceBundle.Control EXPANDING =
new ExpandingResourceBundleControl();
private ExpandingResourceBundleControl() { }
@Override
public ResourceBundle newBundle(String baseName, Locale locale, String format,
ClassLoader loader, boolean reload)
throws IllegalAccessException, InstantiationException, IOException {
ResourceBundle inner = super.newBundle(baseName, locale, format, loader, reload);
return inner == null ? null : new ExpandingResourceBundle(inner, loader);
}
}
ExpandingResourceBundle
委托给真正的资源包,但执行的{{this.kind.of.thing}}查找在关键转换资源。
你想获得其中之一时,你都必须去:
ResourceBundle.getBundle("com/acme/app/Bundle", EXPANDING);
而且这工作得很好 - 有一阵子。
最终发生的是,一些新代码(在我们的案例中,自动生成的代码是从Matisse中吐出的)查找相同的资源包,但未指定自定义控件。如果您编写一个简单的单元测试,然后调用该单元测试,而这个测试看起来是不可重复的,但是当应用程序真实运行时会发生这种情况。不知何故,ResourceBundle
内的缓存弹出良好的值,并用破碎的替换它。我还没有弄清楚为什么Sun的jar文件是在没有调试信息的情况下编译的,所以调试它是一件苦差事。
我的问题:
是否有在全球设置默认的ResourceBundle.Control,我可能不知道的一些方法?这将解决一切相当优雅。
有没有其他的方式来优雅地处理这种事情,也许没有篡改ResourceBundle类呢?
这是使用元编程可以轻松处理的东西,如果Java有它的话。 – 2010-04-09 10:38:28