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

21

我希望能够在我的Swing应用程序运行时更改所在地区,并使屏幕上的所有文本元素使用新区域设置的ResourceBundle中的本地化文本进行更新。

如果不定制Swing组件或创建UIDelegate以处理呈现本地化文本的所有组件,则可以完成此操作吗?

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


请点击此处进行回复:https://dev59.com/gm7Xa4cB1Zd3GeqPoVHd#30960413 - Heitor
5个回答

18

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

当更新默认语言环境时,例如通过 Locale.setDefault(Locale.GERMAN);,清除 Resourcebundle 缓存:ResourceBundle.clearCache();

下一次调用 ResourceBundle.getBundle(BUNDLE_NAME).getString(key); 应该返回所选语言环境的本地化字符串。


1
虽然另一个选项也很好很有趣,但我认为这才是真正应该被接受的答案。 - Whimusical
在我的情况下,我还需要添加这个 JComponent.setDefaultLocale(Locale.GERMAN); - ktulinho
看不到它在工作。实际上,我不知道你怎么能让它工作。 - WesternGun
这不会在运行时更新JComponents上的文本。 - Alex Mandelias

14
  1. 你有一个用于更改应用语言环境(可能会持久化新值)的方法,以及另一个用于获取本地化字符串的方法。

  2. 创建一个接口:

interface LocaleChangeListener {
    void onLocaleChange();
}

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

  • 现在,有一个监听器列表,将通过第一种方法在语言环境更改时收到通知。


  • 我们决定做与此非常相似的事情。除了我们将使用一些系统属性和反射来尝试在事件发生时刷新屏幕上的所有组件。顶层Jpanel将监听本地更改。 - Tony Eichelberger

    3

    您可能希望保存语言偏好设置,并要求重新启动应用程序以使更改生效。

    然后,在渲染GUI之前,您应该能够使用Locale.setDefault(Locale.<desired language>);进行启动。这样可以正确切换您的语言环境,从而加载所需的.properties文件。


    如果我们无法想出符合时间表的解决方案,这就是我们将要做的事情。谢谢。 - Tony Eichelberger
    OP希望在运行时得到某些东西。重新启动不是一个选项。 - WesternGun

    0
    关于更改语言环境,怎么样做一个firePropertyChangeEvent("locale", "..."),然后添加propertyChangeListener()并在需要更新标签等的地方进行注册呢?

    -1

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

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

    或者,有一个中央存储库,其中包含在语言环境更改时触发的侦听器,然后每个侦听器都会返回并重新执行设置代码的相关部分(不要重复)。对于通常情况下使用资源字符串的JLabel,您可以将所有这些组合成一个带有WeakHashMap<JLabel,String>的侦听器。有时避免使用许多小侦听器效果更好。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接