Как я избегаю повторения в строках 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 файлы были скомпилированы без информации об отладке, настолько отлаживающей, это - тяжелая работа.

Мои вопросы:

  1. Есть ли некоторый способ глобальной установки ResourceBundle по умолчанию. Управление, о котором я не мог бы знать? Это решило бы все скорее изящно.

  2. Есть ли некоторый другой способ обработать такого рода вещь изящно, возможно, не вмешиваясь в классы ResourceBundle вообще?

14
задан Trejkaz 9 April 2010 в 06:03
поделиться

2 ответа

Я думаю, что это фундаментальный недостаток способа работы ResourceBundles: клавиши, которые ссылаются на другие клавиши, автоматически нарушают принцип DRY (не повторяйтесь). То, как я обошел это, было похоже на ваш метод: создайте класс ReflectiveResourceBundle, который позволяет вам указывать ключи ресурсов в сообщениях, используя нотацию EL.

НЕПРАВИЛЬНЫЙ ПУТЬ:

my.name.first=Bob
my.name.last=Smith
my.name.full=Bob Smith

ПРАВИЛЬНЫЙ ПУТЬ:

my.name.first=Bob
my.name.last=Smith
my.name.full=${my.name.first} ${my.name.last}

Я загрузил код на GitHub , чтобы вы или кто-либо другой могли его загрузить. Кроме того, я добавил несколько примеров кода для всех, кто использует Stripes Framework ( http://www.stripesframework.org/ ), чтобы вы могли быстро приступить к работе.

Чтобы заставить это работать со стандартными библиотеками тегов JSTL fmt, нужно было настроить перехватчик, который заменил ресурс HttpServletRequest нашим собственным. Код выглядит примерно так:

ResourceBundle bundle = MyStaticResourceHoldingTheBundle.getBundle();
Config.set(request, Config.FMT_LOCALIZATION_CONTEXT, new LocalizationContext(bundle, locale));

Взгляните на пакет stripes.interceptor по ссылке выше, чтобы получить более подробную информацию.

6
ответ дан 1 December 2019 в 16:31
поделиться

Если повторы строк локализованы в том смысле, что вы знаете, что определенная строка будет повторяться, но только в рамках одного проекта, так что совместное использование пакетов ресурсов не является кошмар дизайна, то вы можете подумать о том, чтобы разбить строки на несколько частей "ключ-значение". Отделите повторяющиеся части от тех, которые не повторяются, и повторно используйте повторяющиеся части. Например, предположим, что у вас есть две следующие строки, которые вам нужно отобразить:

  1. «Красношапочный малиновый - небольшая воробьиная птица, обитающая в Австралии».
  2. «Красно-шапочный малиновый обитает в более засушливых регионах по всему миру. большая часть континента ».

Пакет ресурсов может быть следующим:

robin.name=The Red-capped Robin
robin.native=is a small passerine bird native to Australia.
robin.region=is found in dryer regions across much of the continent.

, а затем объединить требуемые части там, где это необходимо bundle.getString (« robin.name ») + bundle.getString (robin.native) .

Одна вещь, о которой вы должны быть осторожны, заключается в том, что правила грамматики, такие как порядок предикатов субъекта и т. Д., Могут не быть одинаковыми для всех языков. Таким образом, вам нужно быть немного осторожным при разбиении предложений.

0
ответ дан 1 December 2019 в 16:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: