首页 > 解决方案 > 阿拉伯语和东方语言的字体映射和 Swing UI 消息问题

问题描述

我正在测试对某些东方语言和阿拉伯语的 Java Swing 支持,并且得到了一些令人困惑的结果。

测试代码:

import java.awt.FlowLayout;
import java.util.Locale;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.UIManager;

public class Test {

  public static void main(String[] args) throws Exception {
    // Latin, Cyrillic & Greek writing systems not part of this test
    // AWT/Swing statically initializes some messages (e.g. 'OK', 'Cancel') -> can only test one locale at a time
    testSwing("zh", "CN", /* Simplified Chinese */ "简体中文");
    //    testSwing("zh", "TW", /* Traditional Chinese */ "繁體中文");
    //    testSwing("ja", "JP", /* Japanese */ "日本人");
    //    testSwing("ko", "KR", /* Korean */ "한국어");
    //    testSwing("hi", "IN", /* Hindi */ "हिन्दी");
    //    testSwing("th", "TH", /* Thai */ "ไทย");
    //    testSwing("ar", "EG", /* Arabic */ "اَلْعَرَبِيَّةُ");
    //    testSwing("iw", "IL", /* Hebrew */ "עִבְרִית");
  }

  private static void testSwing(String language, String countryCode, String text) throws Exception {
    Locale locale = new Locale(language, countryCode);
    Locale.setDefault(locale);
    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    JOptionPane.showMessageDialog(null, text);
    JOptionPane.showConfirmDialog(null, text);
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JMenu menu = new JMenu(text);
    menu.add(new JMenuItem(text));
    JMenuBar menuBar = new JMenuBar();
    menuBar.add(menu);
    frame.setJMenuBar(menuBar);
    frame.getContentPane().setLayout(new FlowLayout());
    frame.getContentPane().add(new JLabel(locale.toString()));
    frame.getContentPane().add(new JLabel(text));
    frame.getContentPane().add(new JButton(text));
    frame.setSize(300, 125);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
  }
}

结果(在 Windows 10 上采用 OpenJDK 1.8.0_265,但在 Java 11 和 15 上似乎相似):

在此处输入图像描述

我的 Windows 10 系统上安装的语言:

在此处输入图像描述

标签: javaswingfontsinternationalization

解决方案


大多数答案都可以在这里找到:https ://www.oracle.com/java/technologies/javase/jdk8-jre8-suported-locales.html

用户界面翻译

仅:zh_CN、zh_TW、en、fr、de、it、ja、ko、pt_BR、es、sv

请参阅https://www.oracle.com/java/technologies/javase/jdk8-jre8-suported-locales.html#translation

在此处输入图像描述

支持的书写系统

规范说:在 Windows Vista、7 和 8 上,当在 Windows 系统上运行且 UI 语言设置为使用该书写系统的语言时。

在此处输入图像描述


推荐阅读