konto usunięte

Temat: [SWT] Lokalizacja/Internacjonalizacja

Witam

Mam już tzw. Resource Bundle czyli Messages.java, messages.properties i
kilka messages_xx_XX.java (gdzie xx_XX to oznaczenie języka/kraju). I
nie wiem co dalej. Externalize strings też wykonane. Teraz chciałabym na
poziomie aplikacji wyświetlać listę dostępnych wersji językowych
aplikacji oraz wybierać z tej listy konkretną wersję językową z
natychmiastowym zauważalnie efektem. Chodzi mi o
org.eclipse.osgi.util.NLS. Dlaczego Window Builder Pro akurat korzysta z tej klasy? Jak dalej mam postępować?

Pozdrawiam

02.03.2011: Nikt nic nie wie, czy temat za szeroki?Mariusz P. edytował(a) ten post dnia 02.03.11 o godzinie 15:11

konto usunięte

Temat: [SWT] Lokalizacja/Internacjonalizacja

Odświeżam :-)

Chciałbym mieć listę dostępnych języków. Pewnie muszę
stworzyć jakąś kontrolkę typu lista lub combo i tam trzymać jakoś listę
dostępnych języków w postaci stringów lub enuma. Klikam na dany język
wywołując słuchacza wywołującego getBundle. I restart aplikacji
rozumiem? Tylko skąd moja aplikacja javowa będzie teraz wiedziała jaką
lokalizację (czyli plik properties z danym tłumaczeniem stringów)
załadować? Przechowywać tę informację gdzieś w zewnętrznym pliku
konfiguracyjnym? Rozumiem, że Locale.getDefault() pobierze mi
lokalizację na podstawie aktualnej lokalizacji systemu operacyjnego
(czyli na starcie moja aplikacja javowa będzie w języku systemu
operacyjnego)? Czy jest w SWT jakiś prosty sposób/funkcjonalność na zmianę języka interfejsu bez restartu aplikacji?

Pozdrawiam
Mariusz

konto usunięte

Temat: [SWT] Lokalizacja/Internacjonalizacja

Po kolei:
Pliki i18n powinny byc tworzene wedlug standardowej struktury sufixow, np:
labels.properties (plik domyslny)
labels_pl_PL.properties (plik z polskimi etykietami)
labels_de.properties (plik z niemieckimi etykietami)
itp.

W aplikacji może być combobox, albo inny rodzaj przycisków, które zapewnia użytkownikowi funkcjonalność wyboru języka. Wywołanie takiej akcji (klikniecie) powinno robić cos takiego:

ResourceBundle bundle = ResourceBundle.getBundle("org.ts.i18n.labels", Locale.ENGLISH);
// Gdzie pierwszy atrybut funkcji odwoluje sie do pliki domyslnego z etykietami (w tym przypadku jest rowniez dolaczona sciezka pakietowa)
// Drugi atrybut okresla lokalizacje, w tym przypadku jest to angielska, zatem JAVA sama bedzie wiedziala, ze powinna szukac etykiet w pliki _en. W aplikacji w zaleznosci od wybranego elementu z combobox powinien ten atrybut sie zmieniac, tzn jesli np. użytkownik wybierze z combobox'a jezyk niemiecki, to ta metoda powinna wygladac tak:

ResourceBundle bundle = ResourceBundle.getBundle("org.ts.i18n.labels", Locale.GERMAN);

Dla polskich etykiet:
ResourceBundle bundle = ResourceBundle.getBundle("org.ts.i18n.labels", new Locale("pl","PL"));

I tyle, pozniej etykiety wywoluje sie standardowo:
bundle.getString("message") (gdzie 'message' jest w tym przypadku kluczem w pliku properties).

Co do odpowiedzi:
1. Co do języka domyślnego, to zazwyczaj będzie to język systemu operacyjnego?
2. Aplikacji nie trzeba restartować, po prostu musisz wywołać raz jeszcze funkcje, która wczyta odpowiedni plik properties, a co ty z tym dalej zrobisz to już twoja decyzja. Oczywiście, jeśli masz gotowe GUI z etykietami, to one nagle się nie zmienia, trzeba je będzie zmienić na podstawie nowych etykiet.

Przykladowa strona pokazujaca w kilku linijkach kodu jak korzystac z takich rzeczy:
http://www.kodejava.org/examples/220.htmlTomasz Stachlewski edytował(a) ten post dnia 07.03.11 o godzinie 23:19

konto usunięte

Temat: [SWT] Lokalizacja/Internacjonalizacja

Tomasz napisał w zasadzie od A do Z co i jak, jeżeli chcesz w praktyce od podszewki zobaczyć internacjonalizację aplikacji to polecam Java Techniki Zaawansowane rozdział bodajże 5 lub 6. WARTO!

konto usunięte

Temat: [SWT] Lokalizacja/Internacjonalizacja

Ja jednak myślę, że temat jest jednak bardziej szeroki. Obecnie w swoim programie stosuję taka konstrukcję:
txtInfoAboutTranslate.setText(Messages.PD_TextInfoAboutTranslateText);

Messages to klasa pośrednicząca. Wygląda mniej więcej tak:

package com.nazwapakietu;

import org.eclipse.osgi.util.NLS;

public class Messages extends NLS {
private static final String BUNDLE_NAME = "com.nazwapakietu.messages"; //$NON-NLS-1$
public static String PD_TextInfoAboutTranslateText;
////////////////////////////////////////////////////////////////////////////
//
// Constructor
//
////////////////////////////////////////////////////////////////////////////
private Messages() {
// do not instantiate
}
////////////////////////////////////////////////////////////////////////////
//
// Class initialization
//
////////////////////////////////////////////////////////////////////////////
static {
// load message values from bundle file
NLS.initializeMessages(BUNDLE_NAME, Messages.class);
}
}

//$NON-NLS-1$ oznacza bodajże, że ciąg znaków jest taki sam dla wszystkich tłumaczeń (nie tłumaczymy go czyli nie bierzemy pod uwagę w plikach *.properties). No i do tego pliki messages_xx_XX.properties (gdzie xx to symbol języka, a XX kraju). Przykładowy jeden messages_en_GB.properties:

#Eclipse modern messages class
#Tue Mar 08 19:19:13 CET 2011
PD_TextInfoAboutTranslateText=English sample test text

Następnie w głównym kodzie wywołuję ResourceBundle.getBundle("Bundle", Locale.getDefault() i to załatwia sprawę. Nawet nie muszę przypisywać tego do zmiennej. Język aplikacji zostanie ustawiony zgodnie z językiem systemu operacyjnego. I zasadniczo to wszystko jeśli chodzi chyba o statyczną zmianę języka aplikacji. Jeśli chciałbym zrobić to dynamicznie to pewnie trzeba by było napisać jakąś metodę wywołującą ponownie wszystkie metody ustawiające jakiś tekst, datę itp. (czyli jakby takie odświeżenie) np.
txtInfoAboutTranslate.setText(Messages.PD_TextInfoAboutTranslateText);

Co do książki to posiadam, lecz starsze wydanie. Ale chyba nic się tam nie zmieniło w tym zakresie (poza tym, że w starszym wydaniu to rozdział 10, a w nowym 5)? Z rozdziałem z tym zapoznałem się wcześniej. Czy są jakieś różnice opisane odnośnie jdk 1.6? Akurat takiej metodyki jak powyżej nie ma tam opisanej. A stosuje ją np. WindowBuilder Pro.Mariusz P. edytował(a) ten post dnia 09.03.11 o godzinie 22:24

konto usunięte

Temat: [SWT] Lokalizacja/Internacjonalizacja

Wywołuję sobie setString na komponentach okna dialogowego z poziomu którego dokonuję zmiany języka aplikacji. Wszystko zmienia się bardzo ładnie podczas działania aplikacji. Jak jednak sobie wywołać tę metodę na głównym oknie aplikacji? Przekazywać wszystkie komponenty okna macierzystego jako parametry do okna dialogowego i z jego poziomu wywoływać metodę setString na każdej np. etykiecie? Trochę dużo byłoby tych parametrów.

Następna dyskusja:

SWT/JFace




Wyślij zaproszenie do