Фреймворк l18n с проверкой во время компиляции

В настоящее время я работаю над большим Java-приложением для рабочего стола-и сейчас нахожусь в том месте, где мне нужно добавить переводы. Что меня беспокоит в системе l18n-, так это то, что она не обеспечивает никакой проверки во время компиляции.

В системе Java у вас есть что-то вроде HashMap, где каждая локализованная строка имеет «Ключ», а переведенная строка является «Значением». Это выглядит примерно так (взято из примера туториала):

Locale currentLocale;
ResourceBundle messages;

currentLocale = new Locale(language, country);

messages = ResourceBundle.getBundle("MessagesBundle", currentLocale);
System.out.println(messages.getString("greetings"));

Это хорошо работает, если у вас простое/небольшое приложение. Но в большом приложении с тысячами переведенных строк может случиться так, что у вас есть опечатка в «Ключе» и, следовательно, вы получите пустую или неправильную строку.

Если повезет, приложение выдаст RuntimeException, чтобы сообщить вам об этом, но даже в этом случае возможно, что вы даже не дойдете до этого момента, потому что в диалоговом окне используется неверный «Ключ», который может не появляется при определенных обстоятельствах (говорят, что это диалоговое окно с ошибкой).

Чтобы этого не произошло, лучше использовать систему, которая предлагает проверку используемых «ключей» во время компиляции. Например, это используется в Android, где вы указываете ресурсы в файле XML-, который затем индексируется и сопоставляется с классом (, включая «ключи» для использования). Таким образом, вы получите что-то вроде этого (из Android Docs):

// Set the text on a TextView object using a resource ID
TextView msgTextView = (TextView) findViewById(R.id.msg);
msgTextView.setText(R.string.hello_message);

Если у вас есть опечатка в этом «ключе», вы получите сообщение об ошибке во время компиляции-время (также у вас есть "авто-завершение" из вашей IDE).

Теперь, чтобы что-то подобное работало, вам понадобится небольшой инструмент/скрипт, который выполняет часть индексирования и генерирует класс Resource-(R.java). В Android это сделает за вас плагин Eclipse-(или ваша IDE в целом).

Теперь мой вопрос::Существует ли уже система, которую я могу использовать для обычных настольных-приложений на Java? Или я ужасно ошибаюсь в том, что говорю?

5
задан Lukas Knuth 20 April 2012 в 15:09
поделиться