Не отображать модификаторы в их локализованной версии - это ошибка, о которой недавно сообщалось (и не похоже нигде в верхней части списка приоритетов для исправления). Таким образом, мы должны взломать это.
Основная идея состоит в том, чтобы заменить текст ускорителя после того, как обычная обработка установит его на жестко запрограммированную английскую версию. Пример ниже делает это в пользовательском классе Menu в обработчике onShown. Здесь это снова просто жестко запрограммировано, в производственном коде, очевидно, потребуется реализовать поиск правильной локализованной версии.
public class BugHackMenu extends Menu {
public BugHackMenu(String text) {
super(text);
setOnShown(e -> hackAcceleratorText());
}
private void hackAcceleratorText() {
getItems().stream().forEach(item -> {
if (!needsHack(item)) return;
Node menuRow = item.getStyleableNode();
if (menuRow != null) {
Node accText = menuRow.lookup(".accelerator-text");
if (accText instanceof Label) {
Label acc = (Label) accText;
acc.setText(getHackedText(item.getAccelerator()));
}
}
});
}
private String getHackedText(KeyCombination accelerator) {
return accelerator.getDisplayText().replace("Ctrl", "Strg");
}
private boolean needsHack(MenuItem item) {
KeyCombination acc = item.getAccelerator();
return acc != null && acc.getControl() == ModifierValue.DOWN;
}
}