我希望能够在我的Swing应用程序运行时更改所在地区,并使屏幕上的所有文本元素使用新区域设置的ResourceBundle中的本地化文本进行更新。
如果不定制Swing组件或创建UIDelegate以处理呈现本地化文本的所有组件,则可以完成此操作吗?
如果不能,那么我可以考虑实施什么好的解决方案?
我希望能够在我的Swing应用程序运行时更改所在地区,并使屏幕上的所有文本元素使用新区域设置的ResourceBundle中的本地化文本进行更新。
如果不定制Swing组件或创建UIDelegate以处理呈现本地化文本的所有组件,则可以完成此操作吗?
如果不能,那么我可以考虑实施什么好的解决方案?
使用 ResourceBundle.getBundle(BUNDLE_NAME).getString(key);
来访问字符串。
当更新默认语言环境时,例如通过 Locale.setDefault(Locale.GERMAN);
,清除 Resourcebundle 缓存:ResourceBundle.clearCache();
下一次调用 ResourceBundle.getBundle(BUNDLE_NAME).getString(key);
应该返回所选语言环境的本地化字符串。
你有一个用于更改应用语言环境(可能会持久化新值)的方法,以及另一个用于获取本地化字符串的方法。
创建一个接口:
interface LocaleChangeListener {
void onLocaleChange();
}
通过 UI 组件实现运行时需要能够更改语言环境并在 onLocaleChange()
中设置新值的覆盖。
现在,有一个监听器列表,将通过第一种方法在语言环境更改时收到通知。
您可能希望保存语言偏好设置,并要求重新启动应用程序以使更改生效。
然后,在渲染GUI之前,您应该能够使用Locale.setDefault(Locale.<desired language>);
进行启动。这样可以正确切换您的语言环境,从而加载所需的.properties文件。
我看到有两种明显的方法:
不要从ResourceBundle
获取String
,而是获取某种事件源String
持有者。 Document
是非常重的解决方案,但任何能够处理替换不可变值的东西都可以。不仅在标签上设置文本,还要设置一个方法来设置监听器。请注意,这是一种相当“重”的解决方案。
或者,有一个中央存储库,其中包含在语言环境更改时触发的侦听器,然后每个侦听器都会返回并重新执行设置代码的相关部分(不要重复)。对于通常情况下使用资源字符串的JLabel
,您可以将所有这些组合成一个带有WeakHashMap<JLabel,String>
的侦听器。有时避免使用许多小侦听器效果更好。