Ankündigung

Einklappen

WIR SUCHEN DICH! [Redakteur]


PSST.... Du zockst gerne?
Du schreibst gerne über das was du Zockst?
Dann Bewerbe dich als Redakteur bei uns.
Wir bieten dir Zugang zu neuen Spielen, große Beitrags Reichweite und vieles mehr.
Mehr Infos findest du HIER zum nachlesen.
Mehr anzeigen
Weniger anzeigen

[Bungee/Spigot/Bukkit] Mu1ti1ingu41

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [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:
    Code:
    Beispiel Klasse zur verwendung mit Mu1ti1ingu41 und/oder ohne
    Lang.java
    
    
    package test.classes;
    
    import test.Test;
    import de.bl4ckskull666.mu1ti1ingu41.Language;
    import de.bl4ckskull666.mu1ti1ingu41.Mu1ti1ingu41;
    import de.bl4ckskull666.mu1ti1ingu41.utils.Utils;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.util.UUID;
    import net.md_5.bungee.api.chat.ClickEvent;
    import net.md_5.bungee.api.chat.ComponentBuilder;
    import net.md_5.bungee.api.chat.HoverEvent;
    import net.md_5.bungee.api.chat.TextComponent;
    import org.bukkit.Bukkit;
    import org.bukkit.ChatColor;
    import org.bukkit.command.CommandSender;
    import org.bukkit.configuration.file.FileConfiguration;
    import org.bukkit.configuration.file.YamlConfiguration;
    import org.bukkit.entity.Player;
    
    /**
     *
     * @author Bl4ckSkull666
     */
    public final class Lang {
        private boolean _isMu1ti1ingu41 = false;
        private boolean _isSpigot  = false;
        private FileConfiguration _fc = null;  
        public Lang() {
            if(Bukkit.getPluginManager().isPluginEnabled("Mu1ti1ingu41")) {
                //ACHTUNG Hier bitte den ordner wo Ihr die languages yaml dateien in eurem Plugin versteckt habt angeben. Bei mir im Ordner languages ( de.yml, en.yml und lang.yml )
                Mu1ti1ingu41.loadExternalDefaultLanguage(Test.getPlugin(), "languages");
                _isMu1ti1ingu41 = true;
            } else {
                _isSpigot = Bukkit.getVersion().toLowerCase().contains("spigot");
                File f = new File(Test.getPlugin().getDataFolder(), "language.yml");
                if(!f.exists())
                    loadLanguageFile();
                else
                    _fc = YamlConfiguration.loadConfiguration(f);
            }
        }
        
        public void sendMessage(CommandSender cs, String path, String def) {
            sendMessage(cs, path, def, new String[] {}, new String[] {});
        }
        
        public void sendMessage(CommandSender cs, String path, String def, String[] search, String[] replace) {
            if(cs instanceof Player)
                sendMessage((Player)cs, path, def, search, replace);
            else
                cs.sendMessage(getText(UUID.fromString("00000000-0000-0000-0000-000000000000"), path, def, search, replace));
        }
        
        public void sendMessage(Player p, String path, String def) {
            sendMessage(p, path, def, new String[] {}, new String[] {});
        }
        
        public void sendMessage(Player p, String path, String def, String[] search, String[] replace) {
            if(_isMu1ti1ingu41) {
                Language.sendMessage(CSM.getPlugin(), p, path, def, search, replace);
                return;
            }
            
            if(!_fc.isString(path) && !_fc.isConfigurationSection(path)) {
                p.sendMessage(replaceAll(def, search, replace));
                return;
            }
            
            if(_isSpigot) {
                if(_fc.isConfigurationSection(path) && _fc.isString(path + ".message")) {
                    TextComponent msg = new TextComponent(replaceAll(_fc.getString(path + ".message"), search, replace));
                    if(_fc.isString(path + ".hover-msg")) {
                        msg.setHoverEvent(
                            new HoverEvent(
                                Utils.isHoverAction("show_" + _fc.getString(path + ".hover-type", "text"))?HoverEvent.Action.valueOf(("show_" + _fc.getString(path + ".hover-type", "text")).toUpperCase()):HoverEvent.Action.SHOW_TEXT, 
                                new ComponentBuilder(replaceAll(_fc.getString(path + ".hover-msg"), search, replace)).create()
                            )
                        );
                    }
                    if(_fc.isString(path + ".click-msg")) {
                        msg.setClickEvent(
                            new ClickEvent(
                                Utils.isClickAction(_fc.getString(path + ".click-type", "open_url"))?ClickEvent.Action.valueOf(_fc.getString(path + ".click-type", "open_url").toUpperCase()):ClickEvent.Action.OPEN_URL, 
                                replaceAll(_fc.getString(path + ".click-msg"), search, replace)
                            )
                        );
                    }
                    p.spigot().sendMessage(msg);
                    return;
                }
            }
            p.sendMessage(replaceAll(_fc.getString(path), search, replace));
        }
        
        public String getText(UUID uuid, String path, String def) {
            return getText(uuid, path, def, new String[] {}, new String[] {});
        }
        
        public String getText(UUID uuid, String path, String def, String[] search, String[] replace) {
            if(_isMu1ti1ingu41)
                return Language.getText(CSM.getPlugin(), uuid, path, def, search, replace);
            
            if(!_fc.isString(path) && !_fc.isString(path + ".message"))
                return replaceAll(def, search, replace);
            
            if(_fc.isString(path + ".message"))
                return replaceAll(_fc.getString(path + ".message"), search, replace);
            else
                return replaceAll(_fc.getString(path), search, replace);
        }
        
        public FileConfiguration getFile(UUID uuid) {
            if(_isMu1ti1ingu41)
                return Language.getMessageFile(Test.getPlugin(), uuid);
            return _fc;
        }
        
        private void loadLanguageFile() {
            //ACHTUNG Hier eure Haupt language yaml datei eintragen. Bei mir lang.yml
            InputStream in = Test.getPlugin().getResource("languages/lang.yml");
            int c = -1;
            File spLang = new File(Test.getPlugin().getDataFolder(), "language.yml");
            try {
                OutputStream os = new FileOutputStream(spLang);
                while((c = in.read()) != -1)
                    os.write(c);
                os.close();
                in.close();
                _fc = YamlConfiguration.loadConfiguration(spLang);
                _fc.save(spLang);
            } catch (IOException ex) {
                
            }
        }
        
        private String replaceAll(String msg, String[] search, String[] replace) {
            if(search.length > 0 && replace.length > 0 && search.length == replace.length) {
                for(int i = 0; i < search.length; i++)
                    msg = msg.replace(search[i], replace[i]);
            }
            return ChatColor.translateAlternateColorCodes('&', msg);
        }
    }
    Code:
    Bukkit/Spigot Haupt Klasse ( hier Test.java )
    package test;
    
    import org.bukkit.plugin.java.JavaPlugin;
    
    public class Test extends JavaPlugin {
    
        @Override
        public void onEnable() {
            _plugin = this;
            
            _lang = new Lang();
        }
    
        private static Test _plugin = null;
        public static Test getPlugin() {
            return _plugin;
        }
        
        private static Lang _lang = null;
        public static Lang getLang() {
            return _lang;
        }
    }
    Jetzt können wir in unserem Plugin ganz einfach folgende Text Aufrufe verwenden:
    Code:
    //Direkte Nachricht an Spieler versenden oder auch an CommandSender
    Test.getPlugin().getLang().sendMessage(player, "pfad.in.der.lang.datei", "Dies ist ein Standart Text");
    
    //Direkte Nachricht an Spieler versenden oder auch an CommandSender mi Variablen
    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:
    Code:
    int i = 1;
    while(!Test.getPlugin().getLang().getText(p.getUniqueId(), "pfad.in.der.yaml.datei." + String.valueOf(i), "--").equalsIgnoreCase("--")) {
        Test.getPlugin().getLang().sendMessage(p, "pfad.in.der.yaml.datei." + String.valueOf(i), "Ein Muster Text");
        i++;
    }


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

    Der Beginn:
    Code:
    package test;
    
    import de.bl4ckskull666.mu1ti1ingu41.Mu1ti1ingu41;
    import net.md_5.bungee.api.plugin.Plugin;
    import org.bukkit.configuration.file.FileConfiguration;
    
    /**
     *
     * @author Bl4ckSkull666
     */
    public class Test extends Plugin {
        //Unsere Config Datei
        private FileConfiguration _config; 
        @Override
        public void onEnable() {
            _plugin = this;
    
            //Config Datei laden lassen
            loadConfig();
    
           //Die language Dateien aus diesem Plugin laden falls noch nötig - languages ist wieder der Ordner wo sich unsere Language Dateien befinden.
           Mu1ti1ingu41.loadExternalDefaultLanguage(this, "languages");
        }
    
        public FileConfiguration getConfig() {
            return _config;
        }
      
        public void loadConfig() {
            _config = Mu1ti1ingu41.loadConfig(_plugin);
        }
        
        public void saveConfig() {
            Mu1ti1ingu41.saveConfig(_config, _plugin);
        }
    }
    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 ;-)
    Code:
    //Direkte Nachricht an Spieler versenden oder auch an CommandSender
    Language.sendMessage(Test.getPlugin(), player, "pfad.in.der.lang.datei", "Dies ist ein Standart Text");
    
    //Direkte Nachricht an Spieler versenden oder auch an CommandSender mi Variablen
    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
    Code:
    int i = 1;
    while(!Language.getPlainText(Test.getPlugin(), pp.getUniqueId(), "pfad.in.der.yaml.datei." + String.valueOf(i), "--").equalsIgnoreCase("--")) {
        Language.sendMessage(Test.getPlugin(), pp, "pfad.in.der.yaml.datei." + String.valueOf(i), "Ein Muster Text");
        i++;
    }
    Externe Dateien könnt Ihr Laden/Speichern wie folgt:
    Code:
    //Lade Custom yml Datei
    FileConfiguration fc = Mu1ti1ingu41.loadCustomFile(Test.getPlugin(), "meineDatei.yml");
    
    //Speichern der Datei
    Mu1ti1ingu41.saveCustomFile(fc, Test.getPlugin());
    Die Yaml Dateien sind benutzbar wie die Bukkit Yaml Configuration ;-)


    Zur Konfiguration:
    Code:
    Bukkit/Spigot
    #Benutze BungeeCord Sprache?
    use-bungeecord: true
    #Falls BungeeCord true, ist dieser Teil schon wieder uninteressant.
    #Der Begriff welcher zum ändern der Sprache verfügbar ist: Die Sprach Datei ( yml ) zum Begriff.
    short-language:
      english: en
      englisch: en
      german: de
      deutsch: de
    #Verfügbare Sprachen überhaupt
    available-languages:
    - de
    - en
    #Sprache die als Standart gesetzt werden soll wenn die eigentliche Sprache nicht verfügbar ist.
    default-language: en
    #Ersetze Länderkennung mit: verfügbarer Länderkennung.
    replace-languages:
      at: de
      ch: de
    
    
    
    BungeeCord Konfiguration
    #Der Begriff welcher zum ändern der Sprache verfügbar ist: Die Sprach Datei ( yml ) zum Begriff.
    short-language:
      english: en
      englisch: en
      german: de
      deutsch: de
    #Verfügbare Sprachen überhaupt
    available-languages:
    - de
    - en
    #Sprache die als Standart gesetzt werden soll wenn die eigentliche Sprache nicht verfügbar ist.
    default-language: en
    #Ersetze Länderkennung mit: verfügbarer Länderkennung.
    replace-languages:
      at: de
      ch: de
    #Speichere gewählte User sprache?
    save-user-language: true
    #Unter welchen Befehlen soll das Sprachewechseln verfügbar sein?
    commands:
    - lang
    - language
    - sprache
    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
    MantraCore - Dein Deutscher Reign of Kings PvE Server


    Schnell, Schneller , am Schnellsten? [SPOILER]
    [/SPOILER]

    Galaxie Wars Online
    GalaxieWars 

    Coresium:


    Coretax:



  • #2
    Update:
    Neuer Download Link --> HIER | ACHTUNG !!!! Alle Plugins nur noch für Java 8 und höher.
    MantraCore - Dein Deutscher Reign of Kings PvE Server


    Schnell, Schneller , am Schnellsten? [SPOILER]
    [/SPOILER]

    Galaxie Wars Online
    GalaxieWars 

    Coresium:


    Coretax:


    Kommentar

    Lädt...
    X