[英]Changing locale at runtime in Swing
我希望能够在运行时更改我的Swing应用程序中的语言环境,并让屏幕上的所有文本元素都使用新语言环境的ResourceBundle中的本地化文本进行更新。
这可以在不自定义swing组件或为处理渲染本地化文本的所有组件创建UIDelegates的情况下完成吗?
如果不是,那么我可以考虑实施什么是好的解决方案?
使用ResourceBundle.getBundle(BUNDLE_NAME).getString(key);
访问字符串。
更新默认区域设置时,例如通过Locale.setDefault(Locale.GERMAN);
清除Resourcebundle缓存: ResourceBundle.clearCache();
下一次调用ResourceBundle.getBundle(BUNDLE_NAME).getString(key);
应该返回所选Locale的本地化String。
您有一个方法用于更改应用程序区域设置(可能会保留新值),另一个方法用于获取本地化字符串。
创建一个界面:
interface LocaleChangeListener { void onLocaleChange(); }
由需要能够在运行时更改语言环境的UI组件实现它,并在覆盖onLocaleChange()
时设置新值。
现在,有一个监听器列表,将通过第一种方法通知区域设置更改。
您可能希望保存语言首选项,然后需要重新启动应用程序才能使更改生效。
然后,您应该能够使用Locale.setDefault(Locale.<desired language>);
在启动时,在渲染GUI之前。 这应该正确切换您的语言环境,这将导致加载所需的.properties文件。
那么,在更改区域设置时,执行firePropertyChangeEvent(“locale”,“...”),然后添加propertyChangeListener()并注册它们,是否要更新标签等?
我看到了两种明显的方法:
而不是从ResourceBundle
获取String
,获取某种事件源String
持有者。 Document
将是非常繁重的解决方案,但任何可以处理替换不可变值的东西都可以。 例如,有一个方法也可以设置一个监听器,而不是仅仅在标签上设置文本。 请注意,这是一个非常“沉重”的解决方案。
或者,拥有一个在区域设置更改时触发的中央侦听器存储库,然后每个都返回并重新执行设置代码的相关部分(不要重复)。 对于您使用资源字符串的JLabel
常见情况,您可以将这些全部组合到一个具有WeakHashMap<JLabel,String>
侦听器中。 有时它可以更好地避免许多小听众。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.