2012-08-17 5 views
5

Rozumiem, jak umiędzynarodowić program java, ale mam problem. Język w moim programie można zmienić w dowolnym momencie, ale mój program może istnieć w wielu stanach, co oznacza, że ​​może on zawierać kilka JLabel, JPanels, JFrames itd. Czy istnieje klasa lub metoda, która zaktualizuje bieżący interfejs graficzny do przełączanego języka, czy też musi być wykonana ręcznie?Java Swing - przełączaj ustawienia narodowe dynamicznie w czasie wykonywania

Jeśli nic nie działa jeszcze, ja po prostu wymaga od użytkownika, aby ponownie uruchomić program, aby przełączyć język, ale zmiana Runtime byłoby miło ...

+0

Czy masz zlokalizowane ciągi znaków dla każdego możliwego języka? Jak obecnie pobierasz te łańcuchy? A może ciągi są obecnie zakodowane na stałe w każdym elemencie? –

+0

Jeszcze nie napisałem dokładnie programu, tylko kilka linii, dokładnie by uniknąć tego problemu. Jestem otwarty na wszystko! – Karlovsky120

+0

Jakiego rodzaju program java będziesz pisać? Aplikacja internetowa korzystająca z JavaEE/JSF/etc lub coś innego? – jahroy

Odpowiedz

1

rozwiązanie powszechnie stosowane jest mieć hash łatwość okładziny ciągi w klasie centralnego menedżera. Można dodzwonić do tej klasy, kiedy tylko chcesz, aby wypełnić pola z danymi:

JLabel label = new JLabel(); 
label.setText(LocalizationManager.get("MY_LABEL_TEXT")); 

Wewnątrz LocalizationManager trzeba będzie pobrać aktualny język programu, a następnie wyszukać odpowiedni ciąg do MY_LABEL_TEXT w odpowiedni język. Menedżer następnie zwraca teraz "zlokalizowany" ciąg lub niektóre domyślne, jeśli język lub ciąg znaków nie są dostępne.

Pomyśl o menedżerze jako o nieco bardziej skomplikowanej Mapie; to odwzorowanie z klucza (tj. "MY_LABEL_TEXT") na to, co chcesz wyświetlić ("Dzień dobry!" lub "Bienvenido!") w zależności od języka, w którym się znajdujesz. Jest wiele sposobów na wdrożenie tego, ale Ty aby menedżer był statyczny lub singleton (ładowany raz) ze względu na pamięć/wydajność.

na przykład: (1)

public class LocalizationManager { 
    private SupportedLanguage currentLanguage = SupportedLanguage.ENGLISH;//defaults to english 
    private Map<SupportedLanguage, Map<String, String>> translations; 

    public LocalizationManager() { 
    //Initialize the strings. 
    //This is NOT a good way; don't hardcode it. But it shows how they're set up. 

    Map<String, String> english = new HashMap<String, String>(); 
    Map<String, String> french = new HashMap<String, String>(); 

    english.set("MY_LABEL_TEXT", "Good day!"); 
    french.set("MY_LABEL_TEXT", "Beinvenido!");//is that actually french? 

    translations.set(SupportedLanguage.ENGLISH, english); 
    translations.set(SupportedLanguage.FRENCH, french); 
    } 

    public get(String key) { 
    return this.translations.get(this.currentLanguage).get(key); 
    } 

    public setLanguage(SupportedLanguage language) { 
    this.currentLanguage = language; 
    } 

    public enum SupportedLanguage { 
    ENGLISH, CHINESE, FRENCH, KLINGON, RUSSIAN; 
    } 
} 

(1) nie zostały przetestowane, nie jest to pojedyncza, ale jest to przykładowo od mankietu.

+0

Więc chciałbym wywołać menedżera po zmianie języka i zaktualizował wszystkie ciągi, które mają zostać zaktualizowane (które są pod jego jurysdykcją)? – Karlovsky120

+0

Czy możesz mi powiedzieć coś więcej o LocalizationManager (s), nie mogę znaleźć niczego w Google? – Karlovsky120

+1

@ Karlovsky120 Zaktualizowałem swoją odpowiedź, aby spróbować i podać przykład. Nie aktualizuj wszystkich napisów dotyczących zmiany języka; zrób to raz. Jeszcze lepiej, zrób to leniwie, ale to już kolejny krok. Jeśli masz interfejs taki jak pokazałem, możesz poprawić implementację. –