Erste Schritte Spracheneinstellungen

beastofchaos

Bekanntes Mitglied
Hallölle,
ich frage mich gerade, wie ich zu meinem Progrmam verschiedene Sprachen speichern soll. Eigentlich will ich as Programm in einem Ordner ( mit der exe ) udn einem Unterordner "src/languages" haben, wo dann mehrere txt-Datei leigen können, die das Programm am Anfang ausliest und in einem Array speichert. So kann man im Nachhinein noch andere Sprachen hinzufügen. Soll ich das wirklich einfach als Txt-Datie speichern (bzw. ein eigene Endung erfinden :p ) oder gäbe es vll. eine schönere Möglichkeit. Und wie soll ich das im Programm dann speichern lassen?
Meine bisherige Idee, ich mache zu jedem String, wie z.B. "Speichern" ein Array, dass für jede beliebige Sprache den Begriff gespeichert hat. Bloß würde mein Programm am Ende ca. 40/50 Arrays haben mit vorraussichtlich erstmal zwei Inhalten (1x Deutsch, 1x Englisch).
Ich könnte auch für alle Sprache ein 2dimensionales Array erstellen und wenn ich jetzt den Begriff Speichern haben will, eine Konstante für den String erstellen.
Code:
             buttonNew.setToolTipText(languages[actLanguag][NEW]);
Wenn ich also, deutsch eingestellt hätte, müsste er "Neu" ausgeben.

Wash altet ihr von meinen Ideen und hättet ihr vll. Vorschläge für andere leichtere Möglichkeiten?
 

njans

Top Contributor
Da sollte man erst mal klären, von wie viel Text wir hier reden ?!
Sind das nur einzelnde Wörter, die du in mehreren Sprachen brauchst oder wirklich ganze Texte?
 

beastofchaos

Bekanntes Mitglied
Also ich versuche bei Stichwörtern zu bleiben. Texte, wie für eine Hilfe, obwohl ich sowas immer für unnötig halte, oder ein Tutorial, werde ich dann in Englisch schreiben ;)

Ich hab mir kurz schonmal eine Klasse geschrieben, die schonmal Konstanten für bisher alle Stichwörter freihält.

Java:
public class Languages {
	public int[][] languages;
	
	public static int MENU 					= 1;
	public static int EDIT 					= 2;
	public static int OPTIONS 				= 3;
	public static int EFFECTS				= 4;
	
	public static int NEW					= 10;
	public static int SAVE					= 11;
	public static int SAVEAS 				= 12;
	public static int OPEN 					= 13;
	
	public static int UNDO 					= 20;
	public static int REDO 					= 21;
	public static int SELECTALL 			= 22;
	public static int COPY 					= 23;
	public static int CUT 					= 24;
	public static int PASTE 				= 25;
	
	public static int SAVEPATH 				= 30;
	public static int LANGUAGES 			= 31;
	public static int DESIGN 				= 32;
	
	public static int NORMAL				= 100;
	public static int SELECT 				= 101;
	public static int FREEHAND 				= 102;
	public static int LINE 					= 103;
	public static int RECTANGLE 			= 104;
	public static int FILLEDRECTANGLE 		= 105;
	public static int ELLIPSE 				= 106;
	public static int FILLEDELLIPSE 		= 107;
	
	public static int MODEL 				= 130;
	public static int PRIMARY 				= 131;
	public static int SECUNDARY 			= 132;
	
    public void getLanguages(){
        // Sprachbegriffe aus allen Txt-Dateien auslesen
    }
}

Mif fällt dazu auf, dass ich ja leider zur Laufzeit keine öffentlichen Kosntanten erstellen kann - das heißt, dass ich nur Konstanten wie DEUTSCH/ ENGLISH haben kann, wenn ich die separat im Programm noch reinschreibe.
Gäbe es nicht eine Möglichkeit, dass ich in meine Textdatei oder sonstwo "GERMAN" reinschreibe und er das automatische als öffentliche Konstante/Variable mit DIESEM Namen speichert?
 

diggaa1984

Top Contributor
genau das erreichst du mit localization .. dort werden die textdaten in einer art property-datei abgelegt, welche eine bestimmte namenskonvention hat, anhand der im programm eingestellten Locale wird dann die entsprechende Datei zur Nutzung der Properties herangezogen
 

beastofchaos

Bekanntes Mitglied
Ganz blick ich noch nicht durch, wozu ich die Locale brauche und einiges mehr versteh ich auch nicht xD

Ich habe mich mal gerade mit I18N beschäftigt, auf dieser Seite: Internationalizing the Sample Program (The Java™ Tutorials > Internationalization > Introduction)
Da ich noch Schüler bin und kein Englisch-Profi bin, tu ich mir auf schwer zu verstehen, was sie in Schritt 3 machen:

The ResourceBundle is created as follows:
messages = ResourceBundle.getBundle("MessagesBundle",
currentLocale);

The arguments passed to the getBundle method identify which properties file will be accessed. The first argument, MessagesBundle, refers to this family of properties files:
MessagesBundle_en_US.properties
MessagesBundle_fr_FR.properties
MessagesBundle_de_DE.properties


Was ist z.B. "MessagesBundle_de_DE.properties". Ein Package oder eine Datei, die man erstellen muss und die dann automatisch aufgerufen wird. Nach eigenen Dateien sieht das nämlich in ihrem Beispiel aus:
After Internationalization (The Java™ Tutorials > Internationalization > Introduction)

Direkt unter dem Beispiel stehen nämlich die benötigten Ressourcen. Wenn man da z.B. auf "MessagesBundle_de_DE.properties" sieht man nur einen Dreizeiler, die mir verdächtig nach einer eigenen Datei aussieht :) Dann würd sich schließlich die Art nicht von meiner gerade wiederneueuerfundenen Idee unterscheiden :D

Und was ist der Unterschied oder die Verbindung zwischen I18N und L10N? Unterschiedliche Techniken? xD Denn ich hab mir nur die schon genannte Seite angeschaut
 

beastofchaos

Bekanntes Mitglied
<--- Dummkopf, der zu unfähig zum Suchen ist xD

Also meine bisherige Lösung, um auch Sprachen zu ändern ist jetzt:
Java:
public class Main {

	public static void main(String[] args) {
		Main app = new Main();
		String baseName = "languages.language";
		app.setLanguage("en");
	    try
	    {
	      ResourceBundle language = ResourceBundle.getBundle(baseName);
	      System.out.println( language.getString("Hello") );
	    }
	    catch ( MissingResourceException e ) {
	      System.err.println( e );
	    }
	}
	
	public void setLanguage(String shortLang){
		Locale.setDefault( new Locale(shortLang) );
	}

}

In einem anderen Package namens languages muss dafür die Datei "language_en.properties" liegen und sie enthält bei mir folgenden Inhalt:
HTML:
# english
Hello 	=  	Hello
Bye 	= 	Bye
Dabei handelt es sich nebenbei, um meine Eigene Frage zu beantworten, um eine Textdatei - Endung musste ich nicht angeben. Einfach bei Eclipse "Neu/File" und den Namen angeben ;)
Wenn das Schlüsselwort "Hello" oder die Textdatei nicht vorhanden ist, wirft das Programm einfach eine "java.util.MissingResourceException".
Nun werde ich das ganze in mein richtiges Programm einbauen, wobei sich mir die Frage ergibt ,wie ich das anstelle. Ich will ja dann, dass er erst alle Dateien liest, mir dann sagt, welche Sprachen vorhanden sind und dann für jede Sprache ein MenuItem erstellt. Das heißt, ich muss zur Laufzeit Buttons erstellen können :/ Rat? :D

Wie er rausfindet, welche Sprachen vorhanden sind, ist wohl etwas leichter, er liest überall die erste Zeile der Datei aus, in der bsp. steht "Language = Deutsch".

Gruß, Thomas

edit: Mir fällt gerade auf, dass wenn ich das ja in eine jar (und danach in eine exe) umwandle, das Package "language" nicht einsehbar ist, dabei will ich ja später einfach die Txt-Datei in den Ordner schieben und das Programm erledigt den Rest ;) die Methode "bundle.getString()" wird dann wohl kaum funktionieren, da er ja nach dem Package sucht (oder in dem akutellen) und NICHT außerhalb der jar/exe. Auch dafür einen Rat?
 
Zuletzt bearbeitet:

beastofchaos

Bekanntes Mitglied
Also ich lasse das ganze jetzt so. Bin echt stolz auf meine Arbeit und bin natürlich total dankbar für die kleinen Tipps :)

Jetzt hab ich noch eine Frage, die mir kam, weil ich gerade die "refresh"-Methode schreibe, mit der ich überall den Text neu eingebe, um die neue Sprache auch aktiv zu machen. Also ich benutze am Rand einen eingebundenen JFileChooser mit eigener Vorschau. Beim FileChoosser kann man oben zwischen den Seiten "Muster", "HSV" und "RGB" wechseln. Nun, will ich ja beim Wechsel zu Englisch auch "Muster" zu "Model" machen. Kann ich das verändern? :)

edit:
Das selbe Problem hab ich nun auch bei Dialogen.
Code:
int result = JOptionPane.showConfirmDialog(null, Languages.get("SaveQuestion"), Languages.get("ResetQuestionHeader"), JOptionPane.YES_NO_CANCEL_OPTION);

Selbst, wenn die Locale auf "en" gestellt ist, kommen die Buttons "Ja", "Nein", "Abbrechen". Muss ich jetzt einen eigenen Dialog erstellen, eine andere Art von Dialog benuzen oder geht das auch so?
 
Zuletzt bearbeitet:

Neue Themen


Oben