簡體   English   中英

Java:跨多個GUI對象共享本地化對象的最佳實踐?

[英]Java: Best practice for sharing localization object across many GUI objects?

在應用程序中的多個GUI對象之間共享本地化對象(在這種情況下為ResourceBundle,我保存所有翻譯)的最佳實踐是什么? 我的想法不多,但都有缺點:

1)通過每個GUI類構造函數傳遞ResourceBundle,但隨后我需要將其保存在每個類中(以備后用)-意味着一次又一次地在每個類中使用相同的代碼

2)在主GUI類(例如“ public static ResourceBundle msg”)中將ResourceBundle聲明為公共靜態(但不是最終的,因為我可能需要更改它-例如更改語言),然后以后始終通過它訪問它(例如調用MainGuiClass)。 msg.getString(“ something”))),但是它也可以被同一包中的任何其他GUI類修改/銷毀...

也許有一些更好的做法可以進行共享?

謝謝。

全局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 )引入一些偵聽器界面,而不是直接更改區域設置。

您可以實現一個緩存工廠,該工廠將根據輸入語言環境參數的值返回ResourceBundle。 首次調用時,將構造ResourceBundle,然后將其緩存在靜態引用中,隨后可以將其返回並在以后的工廠調用中重新使用。

如果您擔心其他類對您的對象不希望發生的事情,請將其設置為類的受保護/私有字段,該類具有要在其上執行的方法。

全球人是邪惡的,但有時他們的便利大於邪惡。

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 ());
}

因此,您可以為每個線程設置區域設置,而不是全局設置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM