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:
Alles anzeigen
Alles anzeigen
Jetzt können wir in unserem Plugin ganz einfach folgende Text Aufrufe verwenden:
Falls wir mal nur den Text brauchen um z.B. mehrere Text Zeile abzufragen dann könnte man als Beispiel dies so machen:
BungeeCord:
Hier haben wir ein paar Möglichkeiten mehr durch die Config Datei sowie Custom Dateien.
Der Beginn:
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 ;-)
Den reinen Text ggf mit gesetzten Variablen bekommt Ihr so
Externe Dateien könnt Ihr Laden/Speichern wie folgt:
Die Yaml Dateien sind benutzbar wie die Bukkit Yaml Configuration ;-)
Zur Konfiguration:
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
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
- [I]Beispiel Klasse zur verwendung mit Mu1ti1ingu41 und/oder ohne[/I]
- [B]Lang.java[/B]
- 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")) {
- [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]
- 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() {
- [COLOR="#FF0000"]//ACHTUNG Hier eure Haupt language yaml datei eintragen. Bei mir [B]lang.yml[/B][/COLOR]
- 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);
- }
- }
Quellcode
- [B]Bukkit/Spigot Haupt Klasse ( hier Test.java )[/B]
- 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:
Quellcode
- //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:
BungeeCord:
Hier haben wir ein paar Möglichkeiten mehr durch die Config Datei sowie Custom Dateien.
Der Beginn:
Quellcode
- 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 {
- [B]//Unsere Config Datei[/B]
- private FileConfiguration _config;
- @Override
- public void onEnable() {
- _plugin = this;
- [B]//Config Datei laden lassen[/B]
- loadConfig();
- [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]
- 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 ;-)
Quellcode
- //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
Externe Dateien könnt Ihr Laden/Speichern wie folgt:
Die Yaml Dateien sind benutzbar wie die Bukkit Yaml Configuration ;-)
Zur Konfiguration:
Quellcode
- [B][I]Bukkit/Spigot[/I][/B]
- #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
- [B][I]BungeeCord Konfiguration[/I][/B]
- #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