如何避免 Java 资源捆绑字符串中的重复?
我们有很多包含相同子字符串的字符串,从有关检查日志或如何联系支持的句子,到包含公司或产品名称的类似品牌的字符串。重复给我们自己带来了一些问题(主要是拼写错误或复制/粘贴错误),但它也会导致问题,因为它增加了我们的翻译人员必须翻译的文本量。
我想出的解决方案是这样的:
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吐出的自动生成的代码)查找相同的资源包,而无需指定自定义控件。如果您编写一个简单的单元测试,该单元测试使用和不使用调用它,这似乎是不可重现的,但是当应用程序实际运行时,就会发生这种情况。不知何故,内部的缓存会弹出良好的值,并将其替换为损坏的值。我还没有弄清楚为什么Sun的jar文件在没有调试信息的情况下编译,所以调试它是一件苦差事。ResourceBundle
我的问题:
有没有某种方法可以全局设置我可能不知道的默认 ResourceBundle.Control?这将相当优雅地解决所有问题。
有没有其他方法可以优雅地处理这种事情,也许根本不会篡改ResourceBundle类?