我正在编写一个多语言应用程序。创建了一个演示:
public class SwingLang {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(230,500);
JPanel panel = new JPanel();
String[] x = new String[7];
//текст "Checking your configuration and account"
x[0] = "ব্যবস্থা এবং একাউন্ট দেখা"; //Bengal
x[1] = "తయారీ మరియు ఖాతా తనిఖీ"; //Telugu
x[2] = "तयारी र खाता जाँच"; //Nepali
x[3] = "සූදානම් වීම සහ ගිණුම පරීක්\u200Dෂාව"; //Sinhalese
x[4] = "तैयारी और खाता जांच"; //Hindi
x[5] = "தயாரிப்பு மற்றும் கணக்கு சரிபார்ப்பு"; //Tamil
x[6] = "การเตรียมและตรวจสอบบัญชี"; //Thai
for (int i = 0; i < x.length; i++) {
JLabel label = new JLabel(x[i]);
System.out.println(x[i]);
panel.add(label);
}
frame.add(panel);
frame.setVisible(true);
}
}
Windows 10 上的 swing 应用程序中的这些语言显示为正方形,这是主要问题。
所有这些语言在 Linux Ubuntu 上都能正确显示。 在 Windows 上,控制台输出也是正确的。
尝试以 unicode 传递字符串 - 结果是相同的。它按预期输出到控制台,swing 输出方块。
最重要的是,我对作为开发人员可以使用代码或其启动参数做什么感兴趣,以免编写用户应使用其操作系统执行哪些操作的说明
我尝试通过 Font 类替换字体,但这也没有帮助。虽然使用字体的想法不太好,但考虑到 Linux 没有字体也能读取。
我还尝试将 Java Open JDK 17 的版本更改为 21。对我来说,高于 21 的版本与 Lombok 不兼容,所以我也删除了此选项
(基于此答案以及 user85421 和 Ivar 提到的评论https://stackoverflow.com/a/31515771/16037941)
尝试使用逻辑字体,例如 SANS_SERIF,它应该从一个或多个物理字体源中提取以最初生成正确的输出。
接下来检查哪些文本可以使用基于 user85421 评论中提供的代码在启动时运行的函数显示在用户计算机上。如果有些语言由于没有可用的字体而无法使用,那么我还会在某种类型的旁白/设置中向用户提及:“我们无法显示语言 X,因为您的电脑没有字体已安装”