Реализовать поддержку двух языков (русский + английский) в пользовате…#4
Реализовать поддержку двух языков (русский + английский) в пользовате…#4temailkaev wants to merge 1 commit into
Conversation
|
|
||
| public class I18N { | ||
| private static final String BUNDLE_NAME = "localization.Messages"; | ||
| private static ResourceBundle bundle; |
There was a problem hiding this comment.
bundle и currentLocale — изменяемые static без volatile. setLocale() пишет их, а format()/get() читают (потенциально из
EDT и других потоков). Стоит пометить volatile или синхронизировать
| return currentLocale; | ||
| } | ||
|
|
||
| public static String get(String key) { |
There was a problem hiding this comment.
et() — bundle.getString(key) бросит MissingResourceException при отсутствии ключа, фолбэка нет. Хорошо бы дефолт лог
| import java.text.MessageFormat; | ||
| import java.util.Locale; | ||
|
|
||
| public class PerformanceTest { |
There was a problem hiding this comment.
бенчмарк класс с main() попал в продакшн исходники (src/localization). Его место — в тестах отдельном модуле или вообще удалить
| // 1. Formatter (String.format) | ||
| long start = System.nanoTime(); | ||
| for (int i = 0; i < ITERATIONS; i++) { | ||
| String.format("Позиция X: %.2f, Y: %.2f, Направление: %.3f", x, y, dir); |
There was a problem hiding this comment.
сравнение некорректное: String.format("...%.2f...") реально форматирует числа, а MessageFormat с шаблоном {0} просто вставляет toString() double. Это не «честный» бенчмарк, вывод про ускорение в N раз вводит в заблуждение
| log.ready=\u0420\u043e\u0431\u043e\u0442 \u0433\u043e\u0442\u043e\u0432 \u043a \u0440\u0430\u0431\u043e\u0442\u0435 | ||
| log.newline=\u041d\u043e\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 | ||
| log.closing=\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 | ||
| benchmark.key=\u041f\u043e\u0437\u0438\u0446\u0438\u044f X: {0}, Y: {1}, \u041d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435: {2} No newline at end of file |
There was a problem hiding this comment.
служебный ключ для бенчмарка не должен лежать в продакшн-ресурсах
| log.ready=Robot is ready | ||
| log.newline=New line | ||
| log.closing=Application is shutting down | ||
| benchmark.key=Position X: {0}, Y: {1}, Direction: {2} No newline at end of file |
There was a problem hiding this comment.
служебный ключ для бенчмарка не должен лежать в продакшн-ресурсах
| return viewMenu; | ||
| } | ||
|
|
||
| private void switchLanguage(Locale locale) { |
There was a problem hiding this comment.
private void switchLanguage(Locale locale) — выбранный язык не сохраняется между запусками, хотя в проекте уже есть WindowStateStore
| updateUIFromBundle(); | ||
| } | ||
|
|
||
| private void updateUIFromBundle() { |
There was a problem hiding this comment.
updateUIFromBundle() — ручное и дублирующее перечисление всех setText(). При добавлении пункта меню легко забыть строку. Можно вынести в цикл/мапу «компонент → ключ»
There was a problem hiding this comment.
Каждый элемент меню пусть обновляет себя сам. Иначе опять получается гигантский класс.
| } catch (Exception ex) {} | ||
| }); | ||
| showCoordsItem = new JMenuItem(I18N.get("menu.windows.coords")); | ||
| showCoordsItem.addActionListener(e -> { coordinatesWindow.setVisible(true); try { coordinatesWindow.setIcon(false); } catch (Exception ex) {} }); |
There was a problem hiding this comment.
catch (Exception ex) {} (в showCoordsItem/showGameItem/showLogItem) — пустые catch молча проглатывают исключения (setIcon). Хотя бы лог
…льском интерфейсе приложения, обеспечив возможность переключения языка через меню. Также реализовать кэширование объектов MessageFormat для ускорения форматирования сообщений и провести сравнительный анализ производительности.
| String.format("%.1f", (double)msgFormatUncachedTime / msgFormatCachedTime) + | ||
| " раз по сравнению с MessageFormat без кэша"); | ||
| } | ||
| }//ауе No newline at end of file |
There was a problem hiding this comment.
…льском интерфейсе приложения, обеспечив возможность переключения языка через меню. Также реализовал кэширование объектов MessageFormat для ускорения форматирования сообщений и провести сравнительный анализ производительности.