Multi-Sprache (Easy use)

  • Servus,

    ich darf euch mein erstes komplett geschriebene Plugin vorstellen :D

    (Ohne die Hilfe von Mr. Fu und Boros , die meine ständigen Fragen erdulden mussten hätte ich es wahrscheinlich nicht hinbekommen - Tat mich voll schwer es als "Ordentliches Plugin" [Benutzerfreundlich] zu erstellen

    - Danke euch noch einmal hier :-) )


    Lange Rede kurzer Sinn - Das Plugin benötigt ein Core-Plugin, der die Sprache anpasst und ein Sprach-Plugin, welches als Database dient. :-)

    Die Namen dieser Plugins müssen fix sein:

    Core-Plugin -> Sprache-Core

    Database-Plugin(s) -> Sprache-1; Sprache-2; Sprache-3; Sprache-4; Sprache-5

    (Ja es sind bis 5 Sprachen möglich)

    Um die Sprache nun zu integrieren werden folgende Befehle verwendet:
    <#> Bei der gesamten Datenbank, egal ob es sich im einen Skill/ Item - Namen oder ne Beschreibung handelt

    <#,"Folder #"> Für "Zeige Nachricht" oder dem Auswahlfenster

    # bedeutet immer die ID :-)

    Die Datenbank ist selbst ist in Sub-Kategorien aufgeteilt um mögliche Performance-Einbußen entgegen zu wirken, daher auch bei Nachrichten mehrere Folder



    Wer Fit ist mit Plugins schreiben kann gerne mal auch Inhaltlich drüber schauen und mir mitteilen wo ich was besser hätte machen können :saint:


    Dieser Beitrag wurde bereits 1 Mal editiert, zuletzt von Firemaster640 () aus folgendem Grund: Version 2 hinzugefügt + Altes rausgelöscht

  • Achja, noch vergessen:


    Wenn ein Bereich verknüpft wird, dann wird der restliche Inhalt gelöscht, mal Beispiele:

    Bei Skillname: Feuerball <1>

    Würde den Eintrag 1 laden im Spiel, der Name "Feuerball" wird dafür dann rausgelöscht
    Bei Zeige Auswahl:

    Auswahl 1: <1,"Folder 1"> Trete dem König in den Arsch

    Auswahl 1: <2,"Folder 1"> Werf eine Torte dem König ins Gesicht

    Bei Auswahl 1: Würde damit Eintrag 1 aus Folder 1 geladen werden und der Text "Trete dem König in den Arsch" würde gelöscht werden

    Bei Auswahl 2: Würde damit Eintrag 2 aus Folder 2 geladen werden und der Text "Werf eine Torte dem König ins Gesicht" würde gelöscht werden


    :-)


    Und dann noch Thema Lizenz:

    Ich könnt gerne das Plugin verwendet, einfach Credits geben. Wenn es für ein kommerzielles Spiel verwendet wird möchte ich ne Lizenz von dem Spiel. ;-)

  • Ich habe jetzt nicht alles genau analysiert. Hier aber meine Anmerkungen:


    1. Man kann jedoch viel vom Code erheblich kürzen indem du Helferfunktionen baust, die die ganzen Dopplungen vermeiden.
    2. Du arbeitest in der Mitte mit vielen Ifs hintereinander. Später nutzt du Switch-Case. Würde dir Switch-Case auch für den Mittelteil empfehlen, weil du bei den Ifs immer dieselbe Variable abfragst.
    3. Ist es nötig dafür bis zu sechs Plugins verwenden zu müssen? Der Code unterscheidet sich nicht wesentlich und du überschreibst dann mit den Databaseplugins auch viele Variablen, die das Coreplugin definiert. Die Sprachen kann man über die Pluginparameter setzen. Dann hast du auch die Möglichkeit beliebig viele Sprachen zu unterstützen.
    4. Ich würde den ganzen funktionalen Code, also alles außer den riesen Kommentarblock für die Params usw., in eine sich selbst aufrufende Funktion packen. Die hast du schon mal bei deinen anderen Fragen definiert. Hat einfach den Vorteil, dass dir dann andere Plugins weniger in die Queere kommen können.
    5. Die Sprachauswahl würde ich in die Optionen packen. Also Scene_Options und Window_Options. Dann kann man die Sprache auch während des Spiels wechseln.
    6. Die Beschreibung sollte noch erweitert werden, wie das mit den Ordnern genau funktioniert. Am Besten mit einem Beispiel.
    7. Die Terms sollten entweder ins Plugin oder auf ne Homepage, die im Plugin verlinkt wird.

    Ich habe das Plugin noch nicht getestet. Wenn es aber funktioniert, ist das fürs erste Plugin schon ne ordentliche Leistung!

  • @Mr.Fu danke schonmal :-)
    Zu 1. Das habe ich probiert aber nicht hinbekommen - Ist aber noch geplant zu kürzen :-)
    Zu 2. Das ist mir wohl beim Schreiben nicht aufgefallen, weil ich das innerhalb von 7 Tagen mit jeweils ca. 3 Stunden am Tag daran gearbeitet habe und musste erstmal alles ausprobieren ob es so funktioniert :-) Wird gemacht :-)

    Zu 3. Dafür habe ich mich bewusst entschieden, weil ich hierbei an die Performance gedacht habe - Rein theoretisch müssten so weniger Daten geladen werden und es läuft dann somit flüssiger

    Zu 4. Würde das nicht dann die Belastung erhöhen auf den Maker, so würden die Daten nur dann geladen werden, wenn sie benötigt werden

    Zu 5. Geile Idee - Das wird noch reingebastelt :-)

    Zu 6. Öhm ~ Hopla :-)

    Zu 7. Die sind mir vorhin spontan auch beim Rauchen eingefallen, dass ich die vergessen habe. Daher hab ich dafür nochmal eine extra Nachricht darunter geschrieben. :-) Wird aber noch ins Plugin reingebastelt :-)


    Wenn es aber funktioniert, ist das fürs erste Plugin schon ne ordentliche Leistung!

    Also bei mir hat es ohne Probleme geklappt, es kommt aber ne Fehlermeldung, wenn man eine ID aufrufen möchte die es nicht gibt :-)

  • Zu 1.:


    Als Beispiel:

    Code
    1. SprachConfigMSGa: function(){ var SprachAusgabe = []; if (this.Sprache === 1) { let params = PluginManager.parameters("Sprache-1"); SprachAusgabe = JSON.parse(params["folderA"]); } if (this.Sprache === 2) { let params = PluginManager.parameters("Sprache-2"); SprachAusgabe = JSON.parse(params["folderA"]); } if (this.Sprache === 3) { let params = PluginManager.parameters("Sprache-3"); SprachAusgabe = JSON.parse(params["folderA"]); } if (this.Sprache === 4) { let params = PluginManager.parameters("Sprache-4"); SprachAusgabe = JSON.parse(params["folderA"]); } if (this.Sprache === 5) { let params = PluginManager.parameters("Sprache-5"); SprachAusgabe = JSON.parse(params["folderA"]); } return SprachAusgabe; }, SprachConfigMSGb: function(){ var SprachAusgabe = []; if (this.Sprache === 1) { let params = PluginManager.parameters("Sprache-1"); SprachAusgabe = JSON.parse(params["folderB"]); } if (this.Sprache === 2) { let params = PluginManager.parameters("Sprache-2"); SprachAusgabe = JSON.parse(params["folderB"]); } if (this.Sprache === 3) { let params = PluginManager.parameters("Sprache-3"); SprachAusgabe = JSON.parse(params["folderB"]); } if (this.Sprache === 4) { let params = PluginManager.parameters("Sprache-4"); SprachAusgabe = JSON.parse(params["folderB"]); } if (this.Sprache === 5) { let params = PluginManager.parameters("Sprache-5"); SprachAusgabe = JSON.parse(params["folderB"]); } return SprachAusgabe; },

    Hier könntest du eine Funktion einbauen, die dir dynamisch das zurückgibt, was du haben möchtest. Du baust also eine Funktion und übergibst ihr den Message-Buchstabe. Die Funktion sucht dann gemäß der Anweisung den gewünschten Wert und gibt ihn dir zurück.

    Code
    1. SprachConfigMSG: function(c){
    2.     var langString = "Sprache-" + this.Sprache;
    3.     var paramString = "folder" + c.toUpperCase();
    4.     var params = PluginManager.parameters(langString);
    5.     return JSON.parse(params[paramString]);
    6. }
    7. // Aufgerufen wird das dann so (Beispiel aus Zeile 797 in deinem Code):
    8. var aktuelleSprache = RUN_SPRACHE.SprachConfigMSG('a'); // Nach MSG kommt kein Buchstabe mehr. Dieser ist jetzt in der Klammer und wird daher der Funktion übergeben.

    Zu 3.:

    Die Pluginparameter sind ja nur Texte. Die brauchen nicht viel Speicher und tun der Performance sicher keinen Abbruch. Da würde ich den Komfort für den Entwickler schon höher werten.


    Zu 4.:

    Nein. Das Plugin ruft sich einmal selbst auf, um sich zu initialisieren. Ob du das mit oder ohne der selbstaufrufenden Funktion machst, ist für die Performance egal. Danach kannst du ganz normal die Funktionen nutzen. Du musst nur die Variable CALLER_SPRACHE davor definieren, also außerhalb des Funktionsblocks, weil auf diese Variable von außen zugegriffen werden soll. Befüllen kannst du sie aber dann in der Funktion. Also musst du außerhalb nur CALLER_SPRACHE = {} schreiben.

  • Zu 1: Danke dir :-) Wie schon geschrieben, ich muss es nochmal überarbeiten - zumindest ist die Funktion erstmal gegeben :-P
    Jetzt kann ich daran feilen :-)


    Zu 3: Darüber habe ich auch schon meinen Kopf zerbrochen, weil es diesbezüglich noch paar Sachen gibt die ich nicht sicher weiß. Hatte jetzt die Idee die Daten als Externe Textdatei abzuspeichern, dass jede Zeile von dieser als eigener String dient. Somit würden die sich beim Start an die entsprechenden Arrays kleben und anschließend sind die ja abgespeichert und können dann easy geladen werden. Auf der anderen Seite wäre es für den Entwickler auch vermutlich angenehmer einfach mit einem Texteditor die Texte einfach reinzuschreiben und im Maker dann die Zeile zu ergänzen. Ob ich das hinbekomme weiß ich aber nicht, hab noch nicht ausprobiert ob ich ein externes laden hinbekomme. :-) (Mal mit Bildern versucht aber nicht hinbekommen)


    Zu 4: Okay, dann hab ich wohl zu kompliziert gedacht ^^ Stimmt aber, eigentlich logisch

  • Hey Firemaster, erstmal Glückwunsch zu deinem ersten Plugin :)

    Ich hätte nicht die Skills mich hier ran zu setzen und erstmal ein eigenes Plugin zu schreiben. Aber vielelicht auch nochmal kurz für uns Dullys die sich mit Scripten jetzt nicht so auskennen, was kann den das Plugin überhaupt, oder wofür kann ich es verwenden? :)


    Indemfall wo ich mir das ganze Plugin kopieren kann, finde ich es immer super wenn man einen Header hat, wo steht wie man das Plugin benennen muss, wie zum Beispiel:


    Code
    1. //=============================================================================
    2. // MrTS_Crafting.js
    3. //=============================================================================

    Das macht die Sache schonmal einfacher. So wie ich es verstanden habe, ist der Name des Plugins auch sehr wichtig.

  • Aber vielelicht auch nochmal kurz für uns Dullys die sich mit Scripten jetzt nicht so auskennen, was kann den das Plugin überhaupt, oder wofür kann ich es verwenden?

    Es gibt die Möglichkeit mehrere Sprachen in einem Spiel ohne großen Aufwand zu verwenden.

    Beispiel: Bei Beginn wird Sprache 1 Ausgewählt
    Im Command "Neues Spiel": Steht zum Beispiel "New Game <1>"
    Jetzt würde das Plugin erkennen, dass etwas in <> steht und die Entsprechende ID laden, das heißt in diesem Beispiel nun:
    Datei: Sprache-1 Im Pluginmanager Eintrag: Commands und darin der erste Eintrag.
    Würde jetzt die zweite Sprache ausgewählt werden dann würde es wie folgt aussehen:
    Datei: Sprache-2 Im Pluginmanager Eintrag: Commands und darin der erste Eintrag.



    Indemfall wo ich mir das ganze Plugin kopieren kann, finde ich es immer super wenn man einen Header hat, wo steht wie man das Plugin benennen muss, wie zum Beispiel:

    Äh jop, Beschreibungen machen muss ich wirklich noch üben xD


    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    Aber das Plugin muss ich wahrscheinlich nochmal komplett überarbeiten - Es gibt paar Bereiche die bisschen doof geschrieben sind, sie funktionieren zwar sind aber wenig Freundlich :P

    Naja, Übung macht den Meister :D

  • Sodala :-)
    Ich habe das Plugin nun wesentlich kompakter und Benutzerfreundlicher gemacht :-)

    Die Hauptänderung ist nun, dass es keine 2 Plugins benötigt jedoch nur noch sich selbst :-)

    Die Daten die benötigt werden, müssten im Ordner "Data" im Unterordner "Sprache-X" wobei X gleich die ID der Sprache ist.

    In diesem Ordner werden dann die 9 Sprachdateien als *.txt Datei benötigt :-)

    Das überarbeitete Plugin füge ich oben bei meinem ersten Post mit rein :-)