2

我正在国际化一个相当大的 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 机器上运行,我还需要做这一切吗?

谢谢

4

0 回答 0