java - 如何在运行后将 swing 组件文本更新为不同的区域设置

标签 java swing localization resourcebundle

我想让我的程序能够通过 ResourceBundle 类使用多种语言。这是我的代码:

Main.java

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

import javax.swing.JFrame;
import javax.swing.JLabel;

public class Main {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        JLabel label0 = new JLabel(Language.getString("Main.label0"));
        JLabel label1 = new JLabel(Language.getString("Main.label1"));
        //...
        frame.setLayout(new FlowLayout());
        frame.add(label0);
        frame.add(label1);
        //...
        frame.pack();
        frame.setVisible(true);
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Language.setLocale(new Locale("de_DE"));
        label0.setText(Language.getString("Main.label0"));
        label1.setText(Language.getString("Main.label1"));
        //...
        frame.pack();
    }
}

语言.java

import java.util.Locale;
import java.util.MissingResourceException;
import java.util.ResourceBundle;

public class Language {
    private static final String BUNDLE_NAME = "Language";
    private static Locale locale = new Locale("en_US");
    private static ResourceBundle RESOURCE_BUNDLE = ResourceBundle
            .getBundle(BUNDLE_NAME, locale);

    private Language() {
    }

    public static String getString(String key) {
        try {
            return RESOURCE_BUNDLE.getString(key);
        } catch (MissingResourceException e) {
            return '!' + key + '!';
        }
    }

    public static void setLocale(Locale locale) {
        Language.locale = locale;
        Language.RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME, locale);
    }
}

Language_en_US.properties

#Language English
Main.label0=This is some text
Main.label1=This is some more text

Language_de_DE.properties

#Language German
Main.label0=Dies ist ein Text
Main.label1=Dies ist etwas mehr Text

如您所见,在Main.java中,我必须再次手动设置标签的所有文本。对于其中的 5 个或 10 个,这很容易,但如果我使用其中的 50 个,加上工具提示、选项卡名称、组合框和菜单都需要更改区域设置,那么对所有这些都执行此操作是非常不切实际的。有什么想法吗?

最佳答案

资源包背后的想法是实际上“外部化”应用程序中的所有字符串,以便您可以为不同的语言使用不同的字符串(现在我们只讨论字符串)编写不同的文件,而无需触及源代码。

例如,假设您有:

System.out.println("Sorry, an error has occurred");

您可以像这样使用 PropertyResourceBundle :

System.out.println(bundle.getString("error_occurred"));

然后创建如下文件:

error_occurred=Sorry, an error has occurred

或者

error_occurred=Purtroppo si è verificato un errore

然后,您可以根据用户选择的语言或平台的区域设置将正确的属性加载到资源包中:

public void initBundle(String language) throws IOException {
  InputStream is = Class.getResourceAsStream("/bundles/messages_" + language + ".properties);
  try {
    return new PropertyResourceBundle(is);
  } finally {
    fis.close();
  }      
}

关于java - 如何在运行后将 swing 组件文本更新为不同的区域设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25734882/

相关文章:

php - 如何在 Ubuntu 上安装 php 本地化字符串

ruby-on-rails - Ruby on Rails 法语即时消息

未加载 Android 语言环境文件

java - 使用 java 在基于 REST 的 Web 服务中进行文件响应

java - 更改局部变量中的字典对象

java - java swing中定时器与for循环之间的性能?

java - 以这种方式为 JPanel 制作图表可以接受吗?

Java:检查 int 中的数字是否按升序的快速方法

java - 如何捕获通过分布式系统中各个组件传递的事件的时间滞后?

java - 从菜单栏打开登录屏幕