[Bungee/Spigot/Bukkit] Mu1ti1ingu41

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • [Bungee/Spigot/Bukkit] Mu1ti1ingu41

      Hallo Community,

      hier möchte ich euch kurz mein kleines Multilanguage Plugin vorstellen.
      Dies ist interessant für Plugin Entwickler welche den Leuten die Sprachauswahl selbst überlassen wollen.

      So können mehrere Sprachen auf einem Server verwendet werden zugleich.

      Das Plugin besteht zum einen aus einem Plugin für den Server selbst, sowohl Bukkit wie auch Spigot. Spigot hat hier den vorteil das Ihr ganz einfach Hover und Click Events mit einfügen könnt.

      Zum Zweiten für BungeeCord. Auch hier sind Hover und Click Events einstellbar direkt bei den Nachrichten.
      Solltet Ihr beide einbinden, läuft der Befehl zum Sprachändern ( Befehl zur Sprachänderung über die Config einstellbar ) über BungeeCord.

      Die BungeeCord version verfügt zusätzlich über die Funktion config Dateien sowie andere yml Dateien von anderen BungeeCords zu öffnen und in dessen eigenen plugin Ordner zu Speichern. Wodurch das Laden und Speichern der Config Datei sowie anderen Dateien ganz leicht fällt und das Plugin BungeeYaml entfällt.


      Verwendung / API:
      Bukkit/Spigot:

      Java-Quellcode

      1. [I]Beispiel Klasse zur verwendung mit Mu1ti1ingu41 und/oder ohne[/I]
      2. [B]Lang.java[/B]
      3. package test.classes;
      4. import test.Test;
      5. import de.bl4ckskull666.mu1ti1ingu41.Language;
      6. import de.bl4ckskull666.mu1ti1ingu41.Mu1ti1ingu41;
      7. import de.bl4ckskull666.mu1ti1ingu41.utils.Utils;
      8. import java.io.File;
      9. import java.io.FileOutputStream;
      10. import java.io.IOException;
      11. import java.io.InputStream;
      12. import java.io.OutputStream;
      13. import java.util.UUID;
      14. import net.md_5.bungee.api.chat.ClickEvent;
      15. import net.md_5.bungee.api.chat.ComponentBuilder;
      16. import net.md_5.bungee.api.chat.HoverEvent;
      17. import net.md_5.bungee.api.chat.TextComponent;
      18. import org.bukkit.Bukkit;
      19. import org.bukkit.ChatColor;
      20. import org.bukkit.command.CommandSender;
      21. import org.bukkit.configuration.file.FileConfiguration;
      22. import org.bukkit.configuration.file.YamlConfiguration;
      23. import org.bukkit.entity.Player;
      24. /**
      25. *
      26. * @author Bl4ckSkull666
      27. */
      28. public final class Lang {
      29. private boolean _isMu1ti1ingu41 = false;
      30. private boolean _isSpigot = false;
      31. private FileConfiguration _fc = null;
      32. public Lang() {
      33. if(Bukkit.getPluginManager().isPluginEnabled("Mu1ti1ingu41")) {
      34. [COLOR="#FF0000"]//ACHTUNG Hier bitte den ordner wo Ihr die languages yaml dateien in eurem Plugin versteckt habt angeben. Bei mir im Ordner [B]languages[/B] ( de.yml, en.yml und lang.yml )[/COLOR]
      35. Mu1ti1ingu41.loadExternalDefaultLanguage(Test.getPlugin(), "languages");
      36. _isMu1ti1ingu41 = true;
      37. } else {
      38. _isSpigot = Bukkit.getVersion().toLowerCase().contains("spigot");
      39. File f = new File(Test.getPlugin().getDataFolder(), "language.yml");
      40. if(!f.exists())
      41. loadLanguageFile();
      42. else
      43. _fc = YamlConfiguration.loadConfiguration(f);
      44. }
      45. }
      46. public void sendMessage(CommandSender cs, String path, String def) {
      47. sendMessage(cs, path, def, new String[] {}, new String[] {});
      48. }
      49. public void sendMessage(CommandSender cs, String path, String def, String[] search, String[] replace) {
      50. if(cs instanceof Player)
      51. sendMessage((Player)cs, path, def, search, replace);
      52. else
      53. cs.sendMessage(getText(UUID.fromString("00000000-0000-0000-0000-000000000000"), path, def, search, replace));
      54. }
      55. public void sendMessage(Player p, String path, String def) {
      56. sendMessage(p, path, def, new String[] {}, new String[] {});
      57. }
      58. public void sendMessage(Player p, String path, String def, String[] search, String[] replace) {
      59. if(_isMu1ti1ingu41) {
      60. Language.sendMessage(CSM.getPlugin(), p, path, def, search, replace);
      61. return;
      62. }
      63. if(!_fc.isString(path) && !_fc.isConfigurationSection(path)) {
      64. p.sendMessage(replaceAll(def, search, replace));
      65. return;
      66. }
      67. if(_isSpigot) {
      68. if(_fc.isConfigurationSection(path) && _fc.isString(path + ".message")) {
      69. TextComponent msg = new TextComponent(replaceAll(_fc.getString(path + ".message"), search, replace));
      70. if(_fc.isString(path + ".hover-msg")) {
      71. msg.setHoverEvent(
      72. new HoverEvent(
      73. Utils.isHoverAction("show_" + _fc.getString(path + ".hover-type", "text"))?HoverEvent.Action.valueOf(("show_" + _fc.getString(path + ".hover-type", "text")).toUpperCase()):HoverEvent.Action.SHOW_TEXT,
      74. new ComponentBuilder(replaceAll(_fc.getString(path + ".hover-msg"), search, replace)).create()
      75. )
      76. );
      77. }
      78. if(_fc.isString(path + ".click-msg")) {
      79. msg.setClickEvent(
      80. new ClickEvent(
      81. Utils.isClickAction(_fc.getString(path + ".click-type", "open_url"))?ClickEvent.Action.valueOf(_fc.getString(path + ".click-type", "open_url").toUpperCase()):ClickEvent.Action.OPEN_URL,
      82. replaceAll(_fc.getString(path + ".click-msg"), search, replace)
      83. )
      84. );
      85. }
      86. p.spigot().sendMessage(msg);
      87. return;
      88. }
      89. }
      90. p.sendMessage(replaceAll(_fc.getString(path), search, replace));
      91. }
      92. public String getText(UUID uuid, String path, String def) {
      93. return getText(uuid, path, def, new String[] {}, new String[] {});
      94. }
      95. public String getText(UUID uuid, String path, String def, String[] search, String[] replace) {
      96. if(_isMu1ti1ingu41)
      97. return Language.getText(CSM.getPlugin(), uuid, path, def, search, replace);
      98. if(!_fc.isString(path) && !_fc.isString(path + ".message"))
      99. return replaceAll(def, search, replace);
      100. if(_fc.isString(path + ".message"))
      101. return replaceAll(_fc.getString(path + ".message"), search, replace);
      102. else
      103. return replaceAll(_fc.getString(path), search, replace);
      104. }
      105. public FileConfiguration getFile(UUID uuid) {
      106. if(_isMu1ti1ingu41)
      107. return Language.getMessageFile(Test.getPlugin(), uuid);
      108. return _fc;
      109. }
      110. private void loadLanguageFile() {
      111. [COLOR="#FF0000"]//ACHTUNG Hier eure Haupt language yaml datei eintragen. Bei mir [B]lang.yml[/B][/COLOR]
      112. InputStream in = Test.getPlugin().getResource("languages/lang.yml");
      113. int c = -1;
      114. File spLang = new File(Test.getPlugin().getDataFolder(), "language.yml");
      115. try {
      116. OutputStream os = new FileOutputStream(spLang);
      117. while((c = in.read()) != -1)
      118. os.write(c);
      119. os.close();
      120. in.close();
      121. _fc = YamlConfiguration.loadConfiguration(spLang);
      122. _fc.save(spLang);
      123. } catch (IOException ex) {
      124. }
      125. }
      126. private String replaceAll(String msg, String[] search, String[] replace) {
      127. if(search.length > 0 && replace.length > 0 && search.length == replace.length) {
      128. for(int i = 0; i < search.length; i++)
      129. msg = msg.replace(search[i], replace[i]);
      130. }
      131. return ChatColor.translateAlternateColorCodes('&', msg);
      132. }
      133. }
      Alles anzeigen


      Quellcode

      1. [B]Bukkit/Spigot Haupt Klasse ( hier Test.java )[/B]
      2. package test;
      3. import org.bukkit.plugin.java.JavaPlugin;
      4. public class Test extends JavaPlugin {
      5. @Override
      6. public void onEnable() {
      7. _plugin = this;
      8. _lang = new Lang();
      9. }
      10. private static Test _plugin = null;
      11. public static Test getPlugin() {
      12. return _plugin;
      13. }
      14. private static Lang _lang = null;
      15. public static Lang getLang() {
      16. return _lang;
      17. }
      18. }
      Alles anzeigen


      Jetzt können wir in unserem Plugin ganz einfach folgende Text Aufrufe verwenden:

      Quellcode

      1. //Direkte Nachricht an Spieler versenden oder auch an CommandSender
      2. Test.getPlugin().getLang().sendMessage(player, "pfad.in.der.lang.datei", "Dies ist ein Standart Text");
      3. //Direkte Nachricht an Spieler versenden oder auch an CommandSender mi Variablen
      4. Test.getPlugin().getLang().sendMessage(player, "pfad.in.der.lang.datei", "Dies %var1% ein %var2% Text %var3%.", new String[] {"%var1%", "%var2%", "%var3%"}. new String[] {"ist", "Standart", "hier"});


      Falls wir mal nur den Text brauchen um z.B. mehrere Text Zeile abzufragen dann könnte man als Beispiel dies so machen:

      Quellcode

      1. int i = 1;
      2. while(!Test.getPlugin().getLang().getText(p.getUniqueId(), "pfad.in.der.yaml.datei." + String.valueOf(i), "--").equalsIgnoreCase("--")) {
      3. Test.getPlugin().getLang().sendMessage(p, "pfad.in.der.yaml.datei." + String.valueOf(i), "Ein Muster Text");
      4. i++;
      5. }




      BungeeCord:
      Hier haben wir ein paar Möglichkeiten mehr durch die Config Datei sowie Custom Dateien.

      Der Beginn:

      Quellcode

      1. package test;
      2. import de.bl4ckskull666.mu1ti1ingu41.Mu1ti1ingu41;
      3. import net.md_5.bungee.api.plugin.Plugin;
      4. import org.bukkit.configuration.file.FileConfiguration;
      5. /**
      6. *
      7. * @author Bl4ckSkull666
      8. */
      9. public class Test extends Plugin {
      10. [B]//Unsere Config Datei[/B]
      11. private FileConfiguration _config;
      12. @Override
      13. public void onEnable() {
      14. _plugin = this;
      15. [B]//Config Datei laden lassen[/B]
      16. loadConfig();
      17. [B]//Die language Dateien aus diesem Plugin laden falls noch nötig - [COLOR="#FF0000"]languages[/COLOR] ist wieder der Ordner wo sich unsere Language Dateien befinden.[/B]
      18. Mu1ti1ingu41.loadExternalDefaultLanguage(this, "languages");
      19. }
      20. public FileConfiguration getConfig() {
      21. return _config;
      22. }
      23. public void loadConfig() {
      24. _config = Mu1ti1ingu41.loadConfig(_plugin);
      25. }
      26. public void saveConfig() {
      27. Mu1ti1ingu41.saveConfig(_config, _plugin);
      28. }
      29. }
      Alles anzeigen


      Da es Unsinn wäre hier eine extra Lang class anzulegen können wir hier unsere Nachrichten direkt über das Plugin senden. Im grossen und ganzen wie beim Bukkit Plugin. Diesmal nur direkt in der Language abgerufen ;-)

      Quellcode

      1. //Direkte Nachricht an Spieler versenden oder auch an CommandSender
      2. Language.sendMessage(Test.getPlugin(), player, "pfad.in.der.lang.datei", "Dies ist ein Standart Text");
      3. //Direkte Nachricht an Spieler versenden oder auch an CommandSender mi Variablen
      4. Language.sendMessage(Test.getPlugin(), player, "pfad.in.der.lang.datei", "Dies %var1% ein %var2% Text %var3%.", new String[] {"%var1%", "%var2%", "%var3%"}. new String[] {"ist", "Standart", "hier"});


      Den reinen Text ggf mit gesetzten Variablen bekommt Ihr so

      Quellcode

      1. int i = 1;
      2. while(!Language.getPlainText(Test.getPlugin(), pp.getUniqueId(), "pfad.in.der.yaml.datei." + String.valueOf(i), "--").equalsIgnoreCase("--")) {
      3. Language.sendMessage(Test.getPlugin(), pp, "pfad.in.der.yaml.datei." + String.valueOf(i), "Ein Muster Text");
      4. i++;
      5. }


      Externe Dateien könnt Ihr Laden/Speichern wie folgt:

      Quellcode

      1. //Lade Custom yml Datei
      2. FileConfiguration fc = Mu1ti1ingu41.loadCustomFile(Test.getPlugin(), "meineDatei.yml");
      3. //Speichern der Datei
      4. Mu1ti1ingu41.saveCustomFile(fc, Test.getPlugin());


      Die Yaml Dateien sind benutzbar wie die Bukkit Yaml Configuration ;-)


      Zur Konfiguration:

      Quellcode

      1. [B][I]Bukkit/Spigot[/I][/B]
      2. #Benutze BungeeCord Sprache?
      3. use-bungeecord: true
      4. #Falls BungeeCord true, ist dieser Teil schon wieder uninteressant.
      5. #Der Begriff welcher zum ändern der Sprache verfügbar ist: Die Sprach Datei ( yml ) zum Begriff.
      6. short-language:
      7. english: en
      8. englisch: en
      9. german: de
      10. deutsch: de
      11. #Verfügbare Sprachen überhaupt
      12. available-languages:
      13. - de
      14. - en
      15. #Sprache die als Standart gesetzt werden soll wenn die eigentliche Sprache nicht verfügbar ist.
      16. default-language: en
      17. #Ersetze Länderkennung mit: verfügbarer Länderkennung.
      18. replace-languages:
      19. at: de
      20. ch: de
      21. [B][I]BungeeCord Konfiguration[/I][/B]
      22. #Der Begriff welcher zum ändern der Sprache verfügbar ist: Die Sprach Datei ( yml ) zum Begriff.
      23. short-language:
      24. english: en
      25. englisch: en
      26. german: de
      27. deutsch: de
      28. #Verfügbare Sprachen überhaupt
      29. available-languages:
      30. - de
      31. - en
      32. #Sprache die als Standart gesetzt werden soll wenn die eigentliche Sprache nicht verfügbar ist.
      33. default-language: en
      34. #Ersetze Länderkennung mit: verfügbarer Länderkennung.
      35. replace-languages:
      36. at: de
      37. ch: de
      38. #Speichere gewählte User sprache?
      39. save-user-language: true
      40. #Unter welchen Befehlen soll das Sprachewechseln verfügbar sein?
      41. commands:
      42. - lang
      43. - language
      44. - sprache
      Alles anzeigen


      Die Permission zum Sprache ändern ist immer "mu1ti1ingu41.change". Ist dies nicht gesetzt, kann die Sprache, welche beim Betreten erkannt wurde über die IP, nicht geändert werden.



      Ich hoffe man versteht die kleine Erklärung zumindest ein klein wenig ;-)
      Bei Fehlern, Fragen oder Anregungen. Einfach bitte hier Posten bzw Fragen.

      Vielen Dank.



      Die Downloads dazu findet Ihr HIER.

      Source Codes:
      Mu1ti1ingu41 für Bukkit/Spigot
      Mu1ti1ingu41 für BungeeCord
    • Werbung zur Unterstützung des Forums ( Bitte AddBlocker deaktivieren )