У нас было много строк, которые содержали одну и ту же подстроку, из предложений о проверке журнала или о том, как связаться с ним, с типами брендинга, содержащими название компании или продукта. Повторение вызывало несколько проблем для себя (в первую очередь опечатки или ошибки копирования/вставки), но также вызывает проблемы в том, что он увеличивает количество текста, который должен перевести наш переводчик.Как избежать повторения в строках 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
выбрасывает хорошее значение и заменяет его сломанным. Я еще не понял, почему и файлы jar Sun были скомпилированы без отладочной информации, поэтому отладка это очень сложная задача.
Мои вопросы:
есть какой-то способ глобально установки ResourceBundle.Control по умолчанию, что я не мог бы быть в курсе? Это решило бы все довольно элегантно.
Есть ли какой-либо другой способ управления этим видом элегантно, возможно, без вмешательства в классы ResourceBundle?
Это то, что можно было бы легко обработать с помощью метапрограммирования, если бы у него была Java. –