[Plugin] SprachAPI

    18.03.2019: Ein neuer Hotfix (0.9.5.4) ist nun verfügbar! Multiplayer Server müssen entsprechend geupdated werden

    • [Plugin] SprachAPI

      Beschreibung Deutsch
      Spoiler anzeigen

      Dieses Plugin verfolgt das Ziel, das mehr Plugins mit Unterstützung für verschiedene Sprachen, erstellt werden.
      Um dies zu fördern hier eine Variante wie ihr ziemlich einfach verschiedene Sprachen in die Ausgabe eurer Plugins bekommt.


      Wenn ihr die API benutzt müsst ihr euch nicht mehr um das Datei Management kümmern.
      Und größtmögliche Flexibilität bietet.


      zum Verhalten der API:

      die definierten Variablen werden bei jeden Serverstart mit den Sprachdateien abgeglichen,
      • existiert eine Variable nicht wird sie hinzu gefügt
      • Existieren mehr Variablen in der Sprachdatei als definiert, wird die Datei bereinigt (nicht existierende Variablen werden aus der Datei entfernt)
      • somit lassen sich Erweiterungen und Änderungen der Textausgabe Variablen einfach Umsetzen.
      und dabei eingelesen.


      jeder Serverbetreiber kann diese Plugins um die Sprachen seiner Wahl erweitern.
      • in dem er in das Plugin Verzeichnis zu dem betreffendem Plugin in den Ordner "locale" geht, und dort eine Sprachdatei dupliziert, den Ländercode anpasst und die Übersetzung vor nimmt. Schon steht (nach einem Server Neustart) auf diesem Server für dies Plugin eine "neue" Sprache zur Verfügung.



      !!! nachträglich geänderte Variablen Inhalte (Ausgegebener Text) !!!
      • sobald eine entsprechende Sprachdatei mir der dazugehörigen Variable existiert, wird diese geladen.
      • es muss dann darauf hingewiesen werden, diese Variable oder die gesamte Datei zu entfernen und den Server neu zu starten. Die Standardwerte werden neu hinzugefügt.
      • Bei selbst definierten Sprachen werden die Standardwerte mit der ersten definierten Sprache erstellt und müssen wieder übersetzt werden.
      • Daher sollte die erste Sprache Englisch sein, für Universale Übersetzbarkeit ^^


      description English
      Spoiler anzeigen

      This plugin aims to create more plugins with support for different languages.
      To promote this, here is a variation on how you can easily get different languages into the output of your plugins.


      If you use the API, you do not have to worry about file management anymore.
      And offers maximum flexibility.


      on the behavior of the API:
      the defined variables are synchronized with the language files at every server start,
      • if a variable does not exist, it will be added
      • If there are more variables in the language file than defined, the file is cleaned up (non-existent variables are removed from the file)
      • Thus, extensions and changes to the text output variables can be easily implemented.
      and read in.


      each server operator can extend these plugins with the languages of his choice.
      • In the plugin directory to the plugin concerned in the folder "locale" goes, and there duplicated a language file, the country code adapts and makes the translation before. Already stands (after a server restart) on this server for this plugin a "new" language available.



      !!! subsequently changed variables contents (published text) !!!
      • as soon as a corresponding language file with the associated variable exists, it will be loaded.
      • it must then be pointed out to remove this variable or the entire file and restart the server.
      • The default values will be added.
      • For self-defined languages, the default values are created with the first defined language and must be translated again.

      • Therefore, the first language should be English, for Universal Translatability ^^



      Version:
      Spoiler anzeigen

      SprachAPI(1.1.6)
      • [UP] - CRT, GUI, _3D Funktionen
      • [FIX] - GetConfigDaten im UTF8-Format laden.
      SprachAPI(1.1.5) - JavaDoc

      • [UP] - CRT Funktionen
      SprachAPI(1.1.4) - JavaDoc
      • [UP] - CRT Funktionen
      SprachAPI (1.1.3)
      • [FIX] - API Probleme
      SprachAPI (1.1.2)
      • [UP] - CRT Funktionen
      SprachAPI (1.1.1)
      • [FIX] - Verzeichnis/Unterverzeichnis erstellung für Linux Server angepasst
      SprachAPI (1.1.0)
      • [NEU] - GetConfigDaten class
      • [NEU] - CRT class


      SprachAPI (1.0.1)
      • [NEU] - setDir & getDir - Speicherpfad/storage path
      • [NEU]- setFilePart & getFilePart - Dateianhang/File attachment


      SprachAPI (1.0.0)


      Hilfe zur Installation:
      [Übersetzt] Wie installiert / startet man ein Plugin. / Plug-in installieren
      [Tutorial] [HD] [German] Plugins programmieren mit der Rising World Plugin API
      Einbindung der Plugin API in IntelliJ IDEA / How to use the Plugin API in IntelliJ IDEA


      Beispiel(1.1.3):
      In diesem Beispiel zeige ich, welche Unterstützung die API zur Verfügung stellt.
      • Sprach Daten Erstellen und Laden.
      • Konfigurations Datei Verwalten und nutzen.
        - Die Funktion übernimmt das Datei Management, so wie das Hinzufügen oder entfernen von Schaltern.
        - Die Schalter werden Alphabetische sortiert.
      • Versionen von Plugins Vergleichen/Prüfen.
      • Versions Fehler Verarbeitung.
        Information für Admins, über die benötigte Aktualisierungen.
      • Variablen Übergabe Klasse für Lambad Funktion.


      [Hauptdatei] - Initialisierung und Startoptionen des Plugins

      Java-Quellcode: MyPlugin.java

      1. package de.chaoswg.Tutorial;
      2. import de.chaoswg.CRT;
      3. import static de.chaoswg.CRT.isSameVersion;
      4. import de.chaoswg.GetConfigDaten;
      5. import de.chaoswg.SprachAPI;
      6. import net.risingworld.api.Plugin;
      7. import net.risingworld.api.Server;
      8. import net.risingworld.api.World;
      9. import net.risingworld.api.events.EventMethod;
      10. import net.risingworld.api.events.Listener;
      11. import net.risingworld.api.events.player.PlayerCommandEvent;
      12. import net.risingworld.api.objects.Player;
      13. public class MyPlugin extends Plugin implements Listener{
      14. MyPlugin plugin;
      15. Server server;
      16. World world;
      17. private String conf;
      18. private int debug;
      19. int getDebug() { return debug; }
      20. String requireSprachApiVersion;
      21. private SprachAPI sprachApiPlugin;
      22. private GetConfigDaten sysConfig;
      23. private MyPluginClassText sprachApiDaten;
      24. @Override
      25. public void onEnable() {
      26. plugin = this;
      27. server = getServer();
      28. world = getWorld();
      29. CRT crt = new CRT();
      30. conf = crt.getSpecP()+"config";
      31. debug = 1;
      32. requireSprachApiVersion = "1.1.3"; // Benötigte SprachAPI Version
      33. // Prüfen ob Sprach API überhaupt installiert ist
      34. if(plugin.getPluginByName("SprachAPI") != null ){
      35. // Lade Plugin
      36. sprachApiPlugin = (SprachAPI) plugin.getPluginByName("SprachAPI");
      37. // Prüfe SprachAPI Version
      38. if (isSameVersion(requireSprachApiVersion,sprachApiPlugin.getDescription("version"))){
      39. // Lade Eigene Text Klasse
      40. sprachApiDaten = new MyPluginClassText();
      41. sprachApiDaten.setDebug(debug); //### gebe Debug weiter
      42. sprachApiDaten.setDir(conf+sprachApiDaten.getDir());
      43. sprachApiDaten.INI(plugin);
      44. if(debug>0){System.out.println("[" + plugin.getDescription("name") + "] "+"Enabled "+"SprachAPI("+sprachApiPlugin.getDescription("version")+") OK");}
      45. //#########################
      46. //### CONFIG für System ###
      47. //### Definiere Variablen
      48. String[][] sysConfigArray = {
      49. //Name Wert
      50. {"command", "myPl"},
      51. {"Debug", String.valueOf(debug)}
      52. };
      53. //################################
      54. //### Initialiesiere System Config
      55. sysConfig = new GetConfigDaten("System", sysConfigArray, this, debug,conf);
      56. debug = Integer.parseInt(sysConfig.getValue("Debug"));
      57. registerEventListener(this);
      58. //... onEnable stuff
      59. }else{
      60. //Sprach API Version zu klein
      61. System.err.println("[" + plugin.getDescription("name") + "-ERR] Die Version von Plugin 'SprachAPI("+sprachApiPlugin.getDescription("version")+")' ist zu klein! Bitte Aktualisieren auf Version("+requireSprachApiVersion+")!");
      62. registerEventListener(new MyPluginErrorSprachAPI(this));
      63. }
      64. }else{
      65. //keine Sprach API vorhanden
      66. System.err.println("[" + plugin.getDescription("name") + "-ERR] Das Plugin 'SprachAPI' ist nicht installiert! Bitte installieren!");
      67. registerEventListener(new MyPluginErrorSprachAPI(this));
      68. }
      69. }
      70. @Override
      71. public void onDisable() {
      72. if(debug>0){System.out.println("[" + plugin.getDescription("name") + "] "+"Disabled ");}
      73. }
      74. @EventMethod
      75. public void onPlayerCommand(PlayerCommandEvent event){
      76. Player player = event.getPlayer();
      77. //Command abholen und ggf. Leerzeichen auf eines reduzieren
      78. String command = event.getCommand();
      79. String[] cmd = command.split(" ");
      80. System.out.println("[" + plugin.getDescription("name") + "] "+"onPlayerCommand "+debug);
      81. if (cmd[0].toLowerCase().equals("/"+sysConfig.getValue("command")) || cmd[0].toLowerCase().equals("/"+sysConfig.getValue("command").toLowerCase())) {
      82. if (cmd.length > 1){
      83. //### Zeigt dem Spieler den Eingegebenen Befehl an
      84. player.sendTextMessage("");
      85. player.sendTextMessage(("#> "+cmd[0].substring(1)+" "+command.substring(1+cmd[0].length()))); //+1 für jedes Leerzeichen
      86. }
      87. if (cmd.length > 1) {
      88. if (cmd[1].toLowerCase().equals("debug")) {
      89. int deb = debug;
      90. try{debug=Integer.parseInt(cmd[2]);}catch(NumberFormatException e){
      91. System.err.println("[" + plugin.getDescription("name") + "] "+"Fehler "+e.getMessage());
      92. debug = deb;
      93. }
      94. }
      95. if (cmd[1].toLowerCase().equals("msg")) {
      96. // Nachricht erstellen, aus den nachfolgenden Komandos
      97. String msg = command.substring(cmd[0].length()+1+cmd[1].length()+1); //+1 für jedes Leerzeichen
      98. //int n=0; //=> Fehler bei benutzung in der Lambad Function
      99. //Abhilfe:
      100. CRT.ClassLambadHelper l = new CRT.ClassLambadHelper();
      101. l.n = 0;
      102. if (msg!=null)
      103. server.getAllPlayers().forEach((Player playerBroadcast) -> {
      104. if (player!=null){
      105. playerBroadcast.sendYellMessage(msg);
      106. //n++; //=> Fehler
      107. l.n++;
      108. }
      109. });
      110. }
      111. }
      112. } else if (cmd[0].toLowerCase().equals("/")) {
      113. // Ausgabe für die Chat Eingabe "/" anzeigen. Das Komando aus der Konfigurations Datei
      114. player.sendTextMessage("" + "/"+sysConfig.getValue("command"));
      115. }
      116. }
      117. }
      Alles anzeigen

      [Sprachunterstützung] - Definieren der Sprachen.

      Java-Quellcode: MyPluginClassText.java

      1. package de.chaoswg.Tutorial;
      2. import de.chaoswg.SprachAPI;
      3. import java.util.ArrayList;
      4. public class MyPluginClassText extends SprachAPI{
      5. @Override
      6. protected void setDatenFunktion(){
      7. Sprache = new ArrayList();
      8. Sprache.add("en");
      9. Sprache.add("de");
      10. setSprache(Sprache);
      11. Daten = new String[][] {
      12. //Name en de
      13. {"bsp 1" ,"en Text 1", "de Text 1"},
      14. {"bsp 2" ,"en Text 2", "de Text 2"}
      15. };
      16. setDaten(Daten);
      17. }
      18. }
      Alles anzeigen

      [Fehler Event] - verarbeitet die Fehler für das Fehlen der API und einer Versionsabhängigkeit.

      Java-Quellcode: MyPluginErrorSprachAPI.java

      1. package de.chaoswg.Tutorial;
      2. import net.risingworld.api.Timer;
      3. import net.risingworld.api.events.EventMethod;
      4. import net.risingworld.api.events.Listener;
      5. import net.risingworld.api.events.player.PlayerConnectEvent;
      6. import net.risingworld.api.objects.Player;
      7. public class MyPluginErrorSprachAPI implements Listener {
      8. private final MyPlugin plugin;
      9. private final int debug;
      10. public MyPluginErrorSprachAPI(MyPlugin plugin) {
      11. this.plugin = plugin;
      12. this.debug = plugin.getDebug();
      13. }
      14. @EventMethod
      15. public void onPlayerConnectEvent(PlayerConnectEvent event) {
      16. if(debug>0){System.out.println("[" + plugin.getDescription("name") + "] "+"Connect ");}
      17. Player player = event.getPlayer();
      18. boolean notFound = (plugin.getPluginByName("SprachAPI") == null);
      19. if (player.isAdmin()){
      20. if (player.getLanguage().equals("de")){
      21. player.sendYellMessage("[" + plugin.getDescription("name") + "]"+"\nPlugin angehalten"+"\n\n"+"\"SprachAPI\" "+(notFound?"nicht gefunden.":"zu Alte Version. "+"\nBenötiege Version("+plugin.requireSprachApiVersion+") "));
      22. }else{
      23. player.sendYellMessage("[" + plugin.getDescription("name") + "]"+"\nPlugin stopt"+"\n\n"+"\"SprachAPI\" "+(notFound?"not found.":"to Old Version. "+"\nRequires version("+plugin.requireSprachApiVersion+") "));
      24. }
      25. // Das Plugin kann auch, nachdem der erste Admin informiert wurde nach einer gewissen Zeit Komplet abgeschaltet werden.
      26. // Das Hilft um Konflikte zu Vermeiden.
      27. // Hier nach 1 Minute und 30 Sekunden.
      28. Timer closePlugin = new Timer(60f*1.5f, 0f, -1, () -> { // lambda expression
      29. // This will be executed when the timer triggers
      30. plugin.onDisable(); // Plugin Beenden
      31. });
      32. closePlugin.start(); // Timer Starten
      33. }
      34. }
      35. }
      Alles anzeigen

      Für fragen und Anregung von Entwicklern stehe ich auch gerne über die persönlichen Nachrichten zur Verfügung. :thumbsup:
      For questions and suggestions of developers, I am also happy to personal information available.


      Altes Beispiel für (1.0.0)
      Spoiler anzeigen

      Java-Quellcode: myClass.java

      1. package de.chaoswg;
      2. import net.risingworld.api.Plugin;
      3. import net.risingworld.api.events.EventMethod;
      4. import net.risingworld.api.events.Listener;
      5. import net.risingworld.api.events.player.PlayerCommandEvent;
      6. import net.risingworld.api.events.player.PlayerConnectEvent;
      7. import net.risingworld.api.objects.Player;
      8. public class myClass extends Plugin implements Listener {
      9. private mySprachClass textDaten;
      10. @Override
      11. public void onEnable() {
      12. // erstelle deine Class
      13. // die Werte in der mySpracheClass werden jetzt initialisiert
      14. //######################## by Google ########################
      15. // create your class
      16. // the values in mySpracheClass are now initialized
      17. textDaten = new mySprachClass();
      18. textDaten.setDebug(1);
      19. textDaten.setDir("\config\lang");
      20. // da die Funktion nicht mit einem zwei Dimensionalen Array arbeitet muss jeztz noch Konvertiert werden ^^
      21. //######################## by Google ########################
      22. // since the function does not work with a two dimensional array, it can still be converted ^^
      23. textDaten.INI(this);
      24. registerEventListener(this);
      25. }
      26. @Override
      27. public void onDisable() {}
      28. @EventMethod
      29. public void onPlayerCommand(PlayerCommandEvent event){
      30. Player player = event.getPlayer();
      31. String command = event.getCommand();
      32. String[] cmd = command.split(" ");
      33. if (cmd[0].toLowerCase().equals("/mycom") || cmd[0].toLowerCase().equals("/mc")) {
      34. if (cmd.length == 1) {
      35. // greife auf den Text deiner Sprach-Class zu
      36. //######################## by Google ########################
      37. // access the text of your language class
      38. player.sendTextMessage(textDaten.getText(player, "command_help"));
      39. }
      40. // weiter/go on Command
      41. //...
      42. } else if (cmd[0].toLowerCase().equals("/")) {
      43. player.sendTextMessage("/mycom");
      44. }
      45. }
      46. @EventMethod
      47. public void onPlayerConnectEvent(PlayerConnectEvent event) {
      48. Player player = event.getPlayer();
      49. // benutze den Text, auch für Formatierten Text
      50. //######################## by Google ########################
      51. // also use the text for formatted text
      52. player.sendTextMessage(String.format(textDaten.getText(player, "DafaultWelcomMsg"), getServer().getName()));
      53. }
      54. }
      Alles anzeigen

      Java-Quellcode: mySprachClass.java

      1. package de.chaoswg;
      2. import java.util.ArrayList;
      3. public class mySprachClass extends SprachAPI {
      4. @Override
      5. protected void setDatenFunktion(){
      6. Sprache = new ArrayList();
      7. // definiere deine Sprachen, in dem du die Länderkennung der ArrayListe hinzufügst.
      8. // wobei die erste Sprache die Standard Sprache ist. z.B. Spielersprache nicht berücksichtigt, Server erstellt neue Speilersprache
      9. //######################## by Google ########################
      10. // define your languages by adding the locale to the ArrayList.
      11. // where the first language is the default language. e.g. Player language not taken into account, server creates new spokesman language
      12. Sprache.add("en"); // => Sprache.get(0)
      13. Sprache.add("de"); // => Sprache.get(1)
      14. setSprache(Sprache);
      15. // dieser Teil ist Dynamisch auf die Sprache aufgebaut.
      16. // im ersten Parameter wird der Name des Textes, wie die Variable in der Sprachdatei heißt und wie er im Code aufgerufen wird, angegeben
      17. // nun volgen für jede definierte Sprache die Voreinstellungen.
      18. // !!! zwei Dimensionales Area, bei Komma und Klammern aufpassen !!!
      19. //######################## by Google ########################
      20. // this part is dynamically built on the language.
      21. // the first parameter specifies the name of the text, which is the name of the variable in the language file and how it is called in the code
      22. // Now the default settings for each defined language.
      23. // !!! Two Dimensional Area, take care of comma and parentheses !!!
      24. Daten = new String[][] {
      25. //Name Sprache.get(0) => en Sprache.get(1) => de
      26. {"DafaultWelcomMsg" ,"You enter the Server [%s]" ,"Du betrittst den Server [%s]"},
      27. {"command_help" ,"use: \"/mycom help\"" ,"benutze: \"mycom help\""}
      28. };
      29. setDaten(Daten);
      30. }
      31. }
      Alles anzeigen



      !!! ACHTUNG -!- WICHTIG !!!
      Wenn die SprachAPI aktualisiert wird, prüfe bitte alle weiteren Plugins die SprachAPI verwenden auf NEUE Versionen.
      Dateien

      Dieser Beitrag wurde bereits 36 mal editiert, zuletzt von noci ()

    • what does this do? I am not completely clear on it's application. Does this translate everything on the server to another language and how is it activated so everybody doesn't have to see everything in that language or in every language? I like the idea of a translator program but it needs to be able to be turned off or on for each player individually. As I said I do not completely understand what this does or how or why I should use it. I see a lot of semi technical talk on how to do stuff but no clear description of the plugin's use.

      This plugin aims to create more plugins with support for different languages.
      To promote this, here is a variation on how you can easily get different languages into the output of your plugins.

      what does this mean and why should I use this? I am a layman not a programmer. what I get from this is you translate other plugins into other languages but you mention translating the output of other plugins too. Maybe I am missing something.

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von sharkbitefischer ()

    • so this will make the server broadcast it's announcements in alternate languages? or is this to make new plugins with multiple language controls?

      noci schrieb:

      no, you can set different languages for your plugin, or server owner can add languages .

      ###

      nein, du kanns für dein Plugin verschiedene Sprachen festlegen, oder Serverbetrwiber können selber Sprschen hinzu fügen.
    • ein eigener Ordner für die Sprach-API plugins\Sprache\Sprach-API.jar wer schon sinnvoll für die Übersicht im Plugin Ordner. Ist aber nicht zwingend nötig, kann auch in einen Plugin Ordner mit rein. Sprach-API erstellt selber ja keine Datein, wird aber wie ein normales Plugin von Rising World behandelt (darf auch nur einmal geladen werden, sonst Classen Konflikt).
    • Hallo noci,
      ich wollte mir dein Teleporter plugin installieren, wofür man ja diese Sprach API braucht.
      Hier kurz meine Plugin Aufteilung:

      Mit den Schildern habe ich mich noch nicht beschäftigt.
      Die Tierzucht funktioniert soweit, der Admin Teleport mit Mausrad auf der Karte auch.
      Nur Kann ich das Teleport Interface nicht Öffnen. Drücke "P" und nichts passiert. Habe versucht die plugins neu zu laden, aber erfolglos.
      Ich gehe also davon aus, das ich bei der Sprach API irgendwas falsch gemacht oder vergessen habe.
      Sind sonst in allen Ordnern mehrere Dateien, außer hier:

      zum Vergleich/Test hier der Teleport Ordner:

      würde dann auch gerne noch die pnb Plugin mit rein nehmen, wo ich zwar schon ein Interface hatte, die Strukturen allerdings alle weiß waren, also im Auswahl Fenster.
      Bilder
      • Komando Schilder.png

        9,82 kB, 341×240, 41 mal angesehen
      • Tierzucht.png

        16,41 kB, 396×358, 34 mal angesehen
    • Hier noch ein paar zusätzliche Infos:

      - spiele im Einzelspieler Modus

      - habe bisher nur die Daten in entsprechende Ordner gepackt (wie oben beschrieben)

      - mit altem und neuen Spielstand versucht, Ergebnis blieb gleich


      Frage:

      - muss ich dieses Programm (IntelliJ IDEA) benutzen ?
      - habe es installiert und kurz damit rum gespielt (habe ja keine Ahnung)
      - es fehlte wohl eine SDK datei zum fertigstellen
      - also habe ich es wieder geschlossen

      - muss ich irgendetwas umschreiben? z.B. in einer "ini" Datei
      - oder diesen Java Quellcode irgendwo einfügen ?

      PS: Sorry wegen dem durcheinander, mein Englisch ist schlecht und vom Programmieren versteh ich nicht viel ?(