EneR: Programmsprache

Hallo,
ich schreibe mir gerade ein Grundgerüst für mein erstes etwas größeres Projekt, in Java. Ich hatte mir überlegt, die Sprache des Programms (sprich die der Ausgaben) variabel zu machen, indem jeder für jede Sprache in einer bestimmten Reihenfolge die Bedeutung des Satzes auf der entsprechenden Sprache.
Bsp:

Syntax:
//begruessung
//verabschiedung

Bsp Datei:
Welcome to ...
Good bye! Cu soon!

Diese Datei lese ich dann Zeile für Zeile aus und möchte sie in Variablen speichern. Sicher Variablen? Nein, eben nicht...
Denn mit Variablen (genauer Strings) müsste ich für jede Textausgabe einen eigenen String bereitstellen...
Da kam mir die Idee mit Feldern, da drängte sich mir natürlich gleich die Frage auf wie ich bei x Ausgaben mir noch merken kann, welche welche ist...
Soll ich jetzt lieber vieeeellleeee (übersichtlichere) Strings machen, oder ein (unübersichtliches, dafür weniger Script, und einfachere Erweiterungen) Feld benutzen??
Oder kenn jemand eine noch schönere Lösung für mein Problem?

  1. Hi!

    Jeder Text bekommt einen Bezeichner (Variablennamen) und fertig. Da du ja wohl nciht alle Sprachen auf einmal anzeigen willst, hast du auch fuer jeden Text nur eine Variable. Abhaengig von der benutzten Sprache wird eben diese in die Variablen geladen. Oder wolltest Du tatsaechlich alle Sprachen gleichzeitig laden?

    1. Hallo nochmal,

      Oder wolltest Du tatsaechlich alle Sprachen gleichzeitig laden?

      nein, keinesfalls! ich möchte nachürlich nur 1 Sprache zur Zeit laden, allerdings wenn ich sagen wir mal 30 Ausgaben habe, brauche ich 30 Variablen, und muss einen switch-case-Block mit 30 case schreiben, ich dachte, es gäbe eine einfachere, schönere Lösung...
      Mit einem Feld würde man natürlich nur eine for Schleife Brauchen, aber wie gesagt, man weis nicht mehr, was auf welcher position gespeichert ist...

      Vielen Dank für die Antwort!

      1. Deshalb nimmst Du sprechende Variablen oder meinetwegen ein Array.

        • Hallo/Hello/Buenos Dias/... - Begruessung
        • Wilkommen auf.../Welcome to.../ - Einleitung
        • Auf wiedersehen/ See ya mate/Hasta la vista imbeciles/... - Verabschiedung.

        Du kannst die Dateien auch so aufbauen. (lassen sich dann gut uebersetzen) Dann laedst Du die sprachfiles und immer wenn Begruessung kommen soll, gibst Du die Variable Begruessung aus.

        ANgenommen es ist eine Installatioinsroutine. Du weisst es gibt 5 Fenster. Also hast Du 5 Texte. Fenster1 mit Text1, fenster 2 mit Text2,... Und noch die Buttons mit laden/speichern/einstellung/beenden/zurueck/...

        Fenster 1:

        Schritt 1

        Dies ist das Programm zur Installation von 'Tolles Tool 1.0'. Sie benoetigen Adminstratorrechte zum installieren.

        Moechten sie fortfahren?

        [weiter]  [beenden]

        Du erstellst also ein Textfenster mit der variable Header als Ueberschrift ('Schritt 1'), den Text hast Du in Variable text1 und die Buttons bekommen die Variablen weiter und beenden.

        Wo genau liegt denn nun dein Problem? Oder hattest du ne Denkblockade?

      2. Hello,

        Mit einem Feld würde man natürlich nur eine for Schleife Brauchen, aber wie gesagt, man weis nicht mehr, was auf welcher position gespeichert ist...

        doch, weil man beides kombiniert - mal in Java ausgedrückt:

          
        public static final String LANG_TABLE_WELCOME = 0;  
        public static final String LANG_TABLE_INTRO = 1;  
          
        // Spracharray Deutsch  
        public static String[] langDE;  
        static {  
           langDE = new String[2];  
           langDE[LANG_TABLE_WELCOME] = "Willkommen";  
           langDE[LANG_TABLE_INTRO] = "Diese Seite zeigt Ihnen Sprachkonzepte";  
        }  
          
        
        

        MfG
        Rouven

        --
        -------------------
        sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
        Eine Bilanz ist wie der Bikini einer Frau. Sie zeigt fast alles, aber verdeckt das Wesentliche  --  Günter Stotz, Regierungsdirektor des baden-württembergischen Wirtschaftsministeriums
        1. Hallo,
          Danke!!!
          Ich denke Du hast verstanden, worum es mir geht! Allerdings habe ich frei nach Deinem Code das hier geschrieben, und Eclipse unterstreicht mir im Static-Block das in den Eckcigen ([]) klammer immer rot.
          Beim Compilieren bekomme ich folgeende (informative xD) NAchricht:

          Exception in thread "main" java.lang.Error: Unresolved compilation problem:

          at AypacWowEasyHandler.main(AypacWowEasyHandler.java:167)

            
          //initialisiere di variablen  
           public static String WrongEnterCharInsteadInt = "0";  
           public static String WrongEnterInvalidNum = "1";  
           public static String WhatToDo = "2";  
           public static String Exit = "3";  
           public static String Main = "4";  
           public static String Action1 = "5";  
           public static String Action2 = "6";  
           public static String Action3 = "7";  
           public static String Success = "8";  
           public static String[8] lang;  
            
            
          //im static-Block  
          lang = new String[8];  
          //0  
          lang[WrongEnterCharInsteadInt] = "Ungueltige Eingabe!(Keine Zeichen, Nur Zahlen!)";  
          //1  
          lang[WrongEnterInvalidNum] = "Zu grosse oder zu kleine Zahl eingeben!";  
          //2  
          lang[WhatToDo] = "Was moechten Sie machen?";  
          //3  
          lang[Exit] = "Verlassen";  
          //4  
          lang[Main] = "Hauptmenue";  
          //5  
          lang[Action1] = "action1!";  
          //6  
          lang[Action2] = "action2!";  
          //7  
          lang[Action3] = "action3!";  
          //8  
          lang[Success] = "Erfolg!";  
          
          
          1. Hello,

            public static String WrongEnterCharInsteadInt = "0";

            da hab ich dich gerade auf ne falsche Fährte gesetzt, merke ich gerade. "0" macht wenig Sinn, deklariere als int und nimm eine 0, dann kommt Java auch mit dem Array besser klar.

            public static String[8] lang;

            wer hat diese 8 erfunden?

            MfG
            Rouven

            --
            -------------------
            sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
            Vegetarier essen meinem Essen das Essen weg.
            1. public static String[8] lang;
              wer hat diese 8 erfunden?

              Die Schweizer?

              Siech*SCNR*fred

              --
              Hinter den Kulissen passiert viel mehr, als man denkt, aber meistens nicht das, was man denkt.
      3. Hallo,

        Oder wolltest Du tatsaechlich alle Sprachen gleichzeitig laden?
        nein, keinesfalls!

        na, dann bin ich ja beruhigt.

        ich möchte nachürlich nur 1 Sprache zur Zeit laden, allerdings wenn ich sagen wir mal 30 Ausgaben habe, brauche ich 30 Variablen, und muss einen switch-case-Block mit 30 case schreiben, ich dachte, es gäbe eine einfachere, schönere Lösung...

        Ja, ein Array.

        Mit einem Feld würde man natürlich nur eine for Schleife Brauchen, aber wie gesagt, man weis nicht mehr, was auf welcher position gespeichert ist...

        Hmm. Gibt's in Java keine assoziativen Arrays?
        In C würde ich es mit einem enum-Typ und intuitiven Bezeichnern realisieren:

        enum language
         { msgEmpty = 0,
           msgHello,
           msgByebye,
           msgError,
           msgReady,
           ...
         }

        Und dann kann ich im Programm den gewünschten Text z.B. mit Message[msgHello] referenzieren. Das ist, wenn man die Bezeichner günstig wählt, recht übersichtlich. Für die Initialisierung des Message-Arrays kann ich trotzdem eine for-Schleife verwenden, weil enum-Typen und int-Typen kompatibel sind.

        Ich vermute stark, dass Java ähnliche Möglichkeiten bietet.

        So long,
         Martin

        --
        Bitte komme jemand mit einem *g* zum Wochenende, damit nicht über mich gelacht wird.
          (Gunnar Bittersmann)
  2. Hallo EneR,

    Da das eine gängige Anforderung ist, gibt es auch schon Klassen in Java dafür.
    ResourceBundle (und angeleitete Klassen) eignet sich für so eine Zugriff auf sprachspezifische Meldungen über Schlüssel. Das Laden einer entsprechenden Sprachdatei abhängig von den Benutzereinstellungen übernimmt da schon die Klasse.

    MessageFormat erlaubt einfach Platzhalter in Nachrichten zu ersetzen.

    Grüße

    Daniel