我正在国际化一个相当大的 Swing 应用程序。我已经完成了所有的ResourceBundle
工作,接下来尝试了从右到左的方向。
我曾期望从命令行(通过 JVM 参数)简单地设置 Locale 会传播到所有实例化的组件,但情况似乎并非如此。我的默认语言环境是正确的(iw_IL
在我的测试用例中),但像 GridBag 这样的布局不尊重默认值。
我尝试在我的主要方法中显式设置默认值,然后也使用applyComponentOrientation
我的父 JFrame,但这也不起作用。应用到特定的 JPanel 确实有效(对于 GridBag 布局),但这不会影响 ComboBoxes 等子组件。
public class TestI18N extends JFrame {
TestI18N() {
super("Test I18N");
//test 1 - set orientation at instantiation, this just affects the border layout not the menu or combos
applyComponentOrientation(ComponentOrientation.getOrientation(Locale.getDefault()));
JComponent comp = (JComponent)getContentPane();
setJMenuBar(getTestMenuBar());
comp.setLayout(new BorderLayout());
JComboBox<String> box1 = new JComboBox<String>(new DefaultComboBoxModel<String>(new String[] {"one", "two", "three"}));
comp.add(box1, BorderLayout.LINE_START);
JComboBox<String> box2 = new JComboBox<String>(new DefaultComboBoxModel<String>(new String[] {"uno", "dos", "tres"}));
comp.add(box2, BorderLayout.LINE_END);
//test 2 - this orients the menu and combo box arrows
//but the renderers are still LTR
applyComponentOrientation(ComponentOrientation.getOrientation(Locale.getDefault()));
}
private JMenuBar getTestMenuBar() {
JMenuBar bar = new JMenuBar();
bar.add(new JMenuItem("Menu item"));
return bar;
}
public static void main(String[] args) {
Locale locale = new Locale("iw", "IL");
Locale.setDefault(locale);
System.out.println("default locale="+Locale.getDefault());
SwingUtilities.invokeLater(new Runnable() {
public void run() {
TestI18N me = new TestI18N();
me.pack();
me.setVisible(true);
}
});
}
}
现在没有调用“应用”,一切正常(尽管默认语言环境是 RTL)。如果我只使用第一个“应用”,则 uno 框在左侧,但菜单和组合是正常的。使用第二个“应用”我得到菜单 RTL,组合箭头在左边,但数据仍然是左对齐的。所以我想现在渲染器需要修改?
这是它应该工作的方式吗?如果我在以色列的 Windows 机器上运行,我还需要做这一切吗?
谢谢