1

在应用程序中的许多 GUI 对象之间共享本地化对象(在本例中为 ResourceBundle,我保存所有翻译)的最佳实践是什么?我的想法很少,但都有缺点:

1)通过每个GUI类构造函数传递ResourceBundle,但是我需要将它保存在每个类中(供以后使用) - 意味着在每个类中一遍又一遍地使用相同的代码

2)在主GUI类(例如“public static ResourceBundle msg”)中将ResourceBundle声明为公共静态(但不是最终的,因为我可能需要更改它-例如语言已更改),然后始终通过它访问它(例如调用MainGuiClass. msg.getString("something")),但它也可以被同一个包中的任何其他 GUI 类修改/销毁......

也许有一些更好的做法来进行分享?

谢谢。

4

4 回答 4

3

全局 ResourceBundle 对象不能是最终的,而是应该缓存在 Map 中。更改语言不需要更改此参考:

import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.ResourceBundle;

public class UIBundle {
    private static final Map<Locale, ResourceBundle> allUIResources = new HashMap<Locale, ResourceBundle>();

    public static String getString(final String key) {
        return getString(key, Locale.getDefault());
    }

    public static String getString(final String key, final Locale locale) {
        ResourceBundle rb = allUIResources.get(locale);
        if (rb == null) {
            rb = ResourceBundle.getBundle("my-ui-resource", locale);
            allUIResources.put(locale, rb);
        }
        return rb.getString(key);
    }

}

使用此代码,您可以访问特定语言/区域设置的文本,或者只使用默认区域设置。如果要切换区域设置,只需设置默认区域设置。您的 UI 需要了解语言环境更改,因此您可能必须为所有 UI 组件(PropertyChangeListenerPropertyChangeSupport)引入一些侦听器接口,而不是直接更改语言环境。

于 2010-02-28T13:52:38.057 回答
0

您可以实现一个缓存工厂,它根据输入语言环境参数的值返回 ResourceBundle。在第一次调用时,将构造 ResourceBundle,然后将其缓存在静态引用中,随后可以返回并在以后对工厂的调用中重用。

于 2010-02-28T12:40:18.173 回答
0

如果您担心其他类在做您不想对对象执行的操作,请将其设置为具有您想要对其执行的方法的类的受保护/私有字段。

全局变量是邪恶的,但有时它们的便利性大于它们的邪恶性。

于 2010-02-28T12:58:56.880 回答
0

ResourceBundle 类已经实现了缓存,所以不需要自己实现缓存。您的访问类可以实现为单例。要切换语言,我使用 ThreadLocal 作为语言环境:

public final class ThreadLocale extends ThreadLocal<Locale>
{
    public static final ThreadLocale theInstance = new ThreadLocale ();

    private ThreadLocale () 
    {
        super ();
    }

    protected Locale initialValue()
    {
        return Locale.getDefault ();
    }
}

在访问类的方法中,它从资源包中获取文本,我使用当前线程语言环境:

public synchronized String getMessage (Object messageKey, Locale locale) throws MissingResourceException
{
    ResourceBundle resourceBundle = null;
    resourceBundle = ResourceBundle.getBundle (filename, ThreadLocale.theInstance.get ());
    return resourceBundle.getString (messageKey.toString ());
}

因此,您可以为每个线程而不是全局设置语言环境。

于 2016-01-19T17:41:52.047 回答