我们有很多包含相同子字符串的字符串,从关于检查日志或如何联系支持的句子,到包含公司或产品名称的类似品牌的字符串。重复给我们自己带来了一些问题(主要是拼写错误或复制/粘贴错误),但它也导致了问题,因为它增加了我们的翻译必须翻译的文本量。
我想出的解决方案是这样的:
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 类?