在Swing中在运行时更改语言环境

时间:2009-03-05 18:28:48

标签: java swing internationalization

我希望能够在运行时更改Swing应用程序中的语言环境,并让屏幕上的所有文本元素都使用新语言环境的ResourceBundle中的本地化文本进行更新。

这可以在不自定义swing组件或为处理渲染本地化文本的所有组件创建UIDelegates的情况下完成吗?

如果不是,那么我可以考虑实施什么是好的解决方案?

5 个答案:

答案 0 :(得分:18)

使用ResourceBundle.getBundle(BUNDLE_NAME).getString(key);访问字符串。

更新默认区域设置时,例如通过Locale.setDefault(Locale.GERMAN); 清除Resourcebundle缓存:ResourceBundle.clearCache();

ResourceBundle.getBundle(BUNDLE_NAME).getString(key);的下一次调用应该返回所选区域设置的本地化字符串。

答案 1 :(得分:13)

  1. 您有一个方法可用于更改应用区域设置(可能会保留新值),另一个用于获取本地化字符串。

  2. 创建界面:

    interface LocaleChangeListener {
        void onLocaleChange();
    }
    

    通过需要能够在运行时更改语言环境的UI组件实现它,并在覆盖onLocaleChange()中设置新值。

  3. 现在,有一个监听器列表,将通过第一种方法通知区域设置更改。

答案 2 :(得分:2)

您可能希望保存语言首选项,然后需要重新启动应用才能使更改生效。

然后,在渲染GUI之前,您应该能够在启动时使用Locale.setDefault(Locale.<desired language>);。这应该正确切换你的语言环境,这将导致加载所需的.properties文件。

答案 3 :(得分:0)

在更改区域设置时,执行firePropertyChangeEvent(&#34;区域设置&#34;,&#34; ...&#34;),然后添加propertyChangeListener()并注册它们,无论是标签等等要更新?

答案 4 :(得分:-1)

我看到了两种明显的方法:

不是从String获取ResourceBundle,而是获得某种事件源String持有者。 Document将是非常重要的解决方案,但任何可以处理替换不可变值的东西都可以。例如,有一个方法也可以设置一个监听器,而不是仅仅在标签上设置文本。请注意,这是一个非常“沉重”的解决方案。

或者,拥有一个在区域设置更改时触发的侦听器的中央存储库,然后每个都返回并重新执行设置代码的相关部分(不要重复)。对于您有一个JLabel字面上使用资源字符串的常见情况,您可以将这些全部组合到一个具有WeakHashMap<JLabel,String>的侦听器中。有时它可以更好地避免许多小听众。