2009-03-05 108 views
19

我希望能夠在運行時更改我的Swing應用程序中的語言環境,並使屏幕上的所有文本元素都使用新語言環境的ResourceBundle中的本地化文本進行更新。在Swing中運行時更改語言環境

這可以在沒有自定義擺動組件或爲處理呈現本地化文本的所有組件創建UIDelegates的情況下完成嗎?

如果不是,那麼我可以考慮實施什麼樣的解決方案?

+0

respondend here:http:// stackoverflow。com/questions/14810454/swing-internationalization-how-to-update-language-at-runtime/30960413#30960413 – Heitor 2015-06-21 13:31:59

回答

12
  1. 您有一種方法用於更改應用程序語言環境(可能會持久存儲新值),另一種方法用於獲取本地化字符串。

  2. 創建一個接口:

    interface LocaleChangeListener { 
        void onLocaleChange(); 
    } 
    

    由需要能夠在運行時改變區域和覆蓋onLocaleChange()設置新值UI組件實現它。

  3. 現在,有一個偵聽器列表,它將通過第一種方法通知語言環境更改。

+0

我們決定做一些與此非常相似的事情。除了我們要使用一些系統屬性和反射來嘗試刷新事件發生時屏幕上的所有組件。最高層的Jpanel將會聽取當地的變化。 – 2009-10-12 18:32:22

-1

還有我看到兩個明顯的方法:

而不是從ResourceBundle得到一個String的,獲得某種事件源String持有人。 Document將是非常繁重的解決方案,但任何可以處理替換不可變值的東西都可以。不要只是在標籤上設置文本,比如說,有一種方法可以設置一個監聽器。請注意,這是一個相當「重」的解決方案。

或者,讓一箇中央倉庫的偵聽器在一個語言環境變化中被觸發,然後每個語句返回並重新執行設置代碼的相關部分(不重複)。對於常見的情況,例如,您可以使用字面上的資源字符串JLabel,那麼可以將這些全部組合成一個具有WeakHashMap<JLabel,String>的偵聽器。有時候它會更好地避免大量的小聽衆。

2

您可能想要保存語言首選項,然後要求重新啓動應用程序才能使更改生效。

然後,在渲染GUI之前,您應該能夠在啓動時使用Locale.setDefault(Locale.<desired language>);。這應該正確地切換您的語言環境,這將導致加載所需的.properties文件。

+0

這就是我們要做的事情,如果我們不能拿出適合時間表的東西。謝謝 – 2009-03-05 18:59:22

+0

OP在運行時需要一些東西。重新啓動不是一個選項。 – FaithReaper 2016-08-09 10:44:32

16

使用ResourceBundle.getBundle(BUNDLE_NAME).getString(key);來訪問字符串。

當更新默認語言環境例如通過Locale.setDefault(Locale.GERMAN); 明確資源包緩存:ResourceBundle.clearCache();

ResourceBundle.getBundle(BUNDLE_NAME).getString(key);下一次調用應該返回所選擇的語言環境的本地化String。

0

怎麼樣,在改變語言環境時,做一個firePropertyChangeEvent(「locale」,「...」),然後添加propertyChangeListener()並註冊它們,無論標籤等都要更新?