Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

В разработке CustomJoinStream создание локализации.

Статус
Закрыто для дальнейших ответов.

glavrak

Активный участник
Пользователь
Баллы
96
Имя в Minecraft
Mr_Krab
Делаю локализацию плагина, нашел тут 2 инструкции - ТЫК.
Исходники моего плагина - ТЫК.
В случае с первой у меня Эклипс в коде класса ругается на Main, если я делаю импорт библиотеки, то начинает ругаться на config. Судя по описанию этот код должен указывать на каталог в котором лежит файл локализации, но мне его подсвечивает и далее дело не двигается.
Взялся за второй вариант, вроде эклипс не ругается на код(пара варнов не в счет), но плагин не сохраняет подгруженый в него файл локализации, только папку создает.
Прошу помочь в данном вопросе. Как я понял эта информация могла сильно устареть, так как написана еще в 2012 году. На официальных ресурсах баккит/спигот я вообще ничего не нашел.
 
Ник автора @Dereku
PHP:
public class Locale {

    private final JavaPluginplugin;
    private final HashMap<String, MessageFormat> messageCache = new HashMap<>();
    private final Properties locale = new Properties();
    private File localeFile;

    public Locale(JavaPlugin plugin) {
        this.plugin = aThis;
    }

    /**
     * Инициализация класса. Должно вызываться в первую очередь. В противном
     * случае вы будете получать Key "key" does not exists!
     */
    public void init() {
        this.locale.clear();
        String loc = this.plugin.getConfig().getString("locale", "ru_RU");
        this.localeFile = new File(this.plugin.getDataFolder(), loc + ".properties");

        if (this.saveLocale(loc)) {
            try (FileReader fr = new FileReader(this.localeFile)) {
                this.locale.load(fr);
            } catch (IOException ex) {
                Logging.severe("Failed to load " + loc + " locale!", ex);
            }
        } else {
            try {
                this.locale.load(this.plugin.getResource("ru_RU.properties"));
            } catch (IOException ex) {
                Logging.severe("Failed to load ru_RU locale!", ex);
            }
        }
    }

    /**
     * Получение сообщения из конфигурации Пример сообщения: "There is so many
     * players." Пример вызова: getString("key");
     *
     * @param key ключ сообщения
     * @return сообщение, иначе null
     */
    public String getString(final String key) {
        return this.getString(key, false, "");
    }

    /**
     * Получение сообщения с аргументами из конфигурации Пример сообщения:
     * "There is {0} players: {1}." Пример вызова: getString("key", "2", "You,
     * Me");
     *
     * @param key  ключ сообщения
     * @param args аргументы сообщения
     * @return сообщение, иначе null
     */
    public String getString(final String key, final String... args) {
        return this.getString(key, false, args);
    }

    /**
     * Получение сообщения из конфигурации с возможностью фильтрации цвета
     * Пример сообщения: "\u00a76There is so many players." Пример вызова:
     * getString("key", false);
     *
     * @param key          ключ сообщения
     * @param removeColors если true, то цвета будут убраны
     * @return сообщение, иначе null
     */
    public String getString(final String key, final boolean removeColors) {
        return this.getString(key, removeColors, "");
    }

    /**
     * Получение сообщения с аргументами из конфигурации с возможностью
     * фильтрации цвета Пример сообщения: "\u00a76There is \u00a7c{0}
     * \u00a76players:\u00a7c {1}." Пример вызова: getString("key", false, "2",
     * "You, Me");
     *
     * @param key          ключ сообщения
     * @param removeColors если true, то цвета будут убраны
     * @param args         аргументы сообщения
     * @return сообщение, иначе null
     */
    public String getString(final String key, final boolean removeColors, final String... args) {
        String out = this.locale.getProperty(key);
        if (out == null) {
            return ChatColor.RED + "Key \"" + key + "\" not found!";
        }

        MessageFormat mf = this.messageCache.get(out);
        if (mf == null) {
            mf = new MessageFormat(out);
            this.messageCache.put(out, mf);
        }

        out = mf.format(args);

        if (removeColors) {
            out = ChatColor.stripColor(out);
        }

        return CHAT_PREFIX + out;
    }

    private boolean saveLocale(final String name) {
        if (this.localeFile.exists()) {
            return true;
        }

        InputStream is = this.plugin.getResource(name + ".properties");
        if (is == null) {
            Logging.severe("Locale '" + name + "' does not exists!");
            return false;
        }

        try {
            FileUtils.copyInputStreamToFile(is, localeFile);
        } catch (IOException ex) {
            Logging.severe("Failed to save '" + name + ".properties'!", ex);
            return false;
        }
        return true;
    }

}
 
Последнее редактирование:
Этому классу как я понял нужен еще класс. Откуда откопал то хоть?
И мне неоткуда взять импорт для JavaPluginplugin, хотя у меня полный пакет JDK 8.
Ему ничего больше не надо.
JavaPlugin это то, от куда ты переопределяешь методы onEnable() и т.д.
Короче, серверное ядро.
 
org.bukkit.plugin.java.JavaPlugin
Ему ничего больше не надо.
JavaPlugin это то, от куда ты переопределяешь методы onEnable() и т.д.
Короче, серверное ядро.
Я вроде не дурак и знаю про такой импорт, без него плагин вообще работать не будет, тут либо опечатались просто, либо специально так написано для чего-то.
И этому классу требуется еще класс FileUtils.

Конкретно этот код не создает сам файл и подозреваю даже пытаться прочитать не будет его, хотя это уже другой вопрос.

Код:
package mr_krab.customjoinstream;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

import org.yaml.snakeyaml.Yaml;

public class Translator {
    Plugin p;
    
    Map<String,String> tran = new HashMap<String, String>();
 
    public Translator(Plugin plugin, String locale){
        if(locale.contains(File.separator)) throw new RuntimeException("locale name is not valid");
        if (locale.equals("system")) locale = System.getProperty("user.language");
        InputStream is = null;
        File file = new File(plugin.getLangFolder(),locale+".yml");
        if(!file.exists()){
            is = plugin.getResource(locale+".yml");
            if (is==null){
                is = plugin.getResource("en.yml");
            }
        } else {
            try {
                is = new FileInputStream(file);
            } catch (FileNotFoundException ignored) {}
        }
        if(is!=null){
            try {
                Yaml yaml = new Yaml();
                Map<String, Object> map = (Map<String, Object>) yaml.load(is);
                Map<String,Object> vals = (Map<String, Object>) map.get("locale");
                for(Map.Entry<String,Object> e:vals.entrySet()){
                    tran.put(e.getKey(),e.getValue().toString());
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
 
    public String translate(String key, Object... values){
        if(!tran.containsKey(key))return key;
        return String.format(tran.get(key),values);
    }
 
    public String translate(String key){
        if(!tran.containsKey(key))return key;
        return tran.get(key);
    }
}
 
Держи. С таким не получиться даже у аутяги (не оск.) ошибиться. тык
 
Держи. С таким не получиться даже у аутяги (не оск.) ошибиться. тык
Я выше тоже самое скинул.
Да и там дополнительный класс требуется.
Вот что у меня сейчас.

Код:
package mr_krab.customjoinstream;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import org.bukkit.ChatColor;
import org.bukkit.configuration.file.YamlConfiguration;

public class Lang {

    static Plugin plugin;
    private static Map<String, String> language = new HashMap<String, String>();

    public static void load(YamlConfiguration langYml) {
        for (Entry<String, Object> entry : langYml.getConfigurationSection(plugin.getConfig().getString("lang")).getValues(false).entrySet()) {
            language.put(plugin.getConfig().getString("lang") + "." + entry.getKey(), String.valueOf(entry.getValue()));
        }
    }

    public static String getMessage(String target) {
        String r = language.get(plugin.config.getString("lang") + "." + target);
        if (r == null)
            return ChatColor.DARK_RED + "Ошибка локализации, строка [" + target + "] не обнаружена";
        else
            return r;
}
}
Сервер ругается на строку
String r = language.get(plugin.config.getString("lang") + "." + target);
Не пойму, что ему надо, в конфиге прописал как положено все.
Вот ошибка

Код:
Caused by: java.lang.NullPointerException
    at mr_krab.customjoinstream.Lang.getMessage(Lang.java:22) ~[?:?]
 
Да и там дополнительный класс требуется.
Вот что у меня сейчас.

Код:
package mr_krab.customjoinstream;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import org.bukkit.ChatColor;
import org.bukkit.configuration.file.YamlConfiguration;

public class Lang {

    static Plugin plugin;
    private static Map<String, String> language = new HashMap<String, String>();

    public static void load(YamlConfiguration langYml) {
        for (Entry<String, Object> entry : langYml.getConfigurationSection(plugin.getConfig().getString("lang")).getValues(false).entrySet()) {
            language.put(plugin.getConfig().getString("lang") + "." + entry.getKey(), String.valueOf(entry.getValue()));
        }
    }

    public static String getMessage(String target) {
        String r = language.get(plugin.config.getString("lang") + "." + target);
        if (r == null)
            return ChatColor.DARK_RED + "Ошибка локализации, строка [" + target + "] не обнаружена";
        else
            return r;
}
}
Сервер ругается на строку
String r = language.get(plugin.config.getString("lang") + "." + target);
Не пойму, что ему надо, в конфиге прописал как положено все.
И что это собственно такое? Как я понял, Exception_Prototype тебе уже кинул ссылку на утилиту. Ты решил говнокодом написать свою? Умно, умно.
 
И что это собственно такое? Как я понял, Exception_Prototype тебе уже кинул ссылку на утилиту. Ты решил говнокодом написать свою? Умно, умно.
Для того что вы скинули нужен еще 1 класс. Я уже сам находил эту страницу на гитхабе еще вчера, необходимого класса там нет. Конкретно этот класс требуется FileUtils.
 
Для того что вы скинули нужен еще 1 класс. Я уже сам находил эту страницу на гитхабе еще вчера, необходимого класса там нет. Конкретно этот класс требуется FileUtils.
Он должен быть в ядре. Если нет, то найти сам метод перезаписи из одно файла в другой.
 
Он должен быть в ядре. Если нет, то найти сам метод перезаписи из одно файла в другой.
Нашел импорт этого класса, он от apache, теперь другая проблема. Я вроде как надо все настроил, но вместо вывода сообщения в консоли ошибка.

Код:
[12:48:49] [Server thread/WARN]: Unexpected exception while parsing console command "cjs reload"
org.bukkit.command.CommandException: Unhandled exception executing 'cjs reload' in mr_krab.customjoinstream.CommandRegister(customjoinstream)
    at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:148) ~[spigot.jar:git-Spigot-65e8124-79e55b6]
    at org.bukkit.craftbukkit.v1_12_R1.CraftServer.dispatchCommand(CraftServer.java:647) ~[spigot.jar:git-Spigot-65e8124-79e55b6]
    at org.bukkit.craftbukkit.v1_12_R1.CraftServer.dispatchServerCommand(CraftServer.java:633) [spigot.jar:git-Spigot-65e8124-79e55b6]
    at net.minecraft.server.v1_12_R1.DedicatedServer.aP(DedicatedServer.java:444) [spigot.jar:git-Spigot-65e8124-79e55b6]
    at net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:407) [spigot.jar:git-Spigot-65e8124-79e55b6]
    at net.minecraft.server.v1_12_R1.MinecraftServer.C(MinecraftServer.java:679) [spigot.jar:git-Spigot-65e8124-79e55b6]
    at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:577) [spigot.jar:git-Spigot-65e8124-79e55b6]
    at java.lang.Thread.run(Unknown Source) [?:1.8.0_131]
Caused by: java.lang.NullPointerException
    at mr_krab.customjoinstream.CmdExecutor.onCommand(CmdExecutor.java:21) ~[?:?]
    at mr_krab.customjoinstream.CommandRegister.execute(CommandRegister.java:30) ~[?:?]
    at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:141) ~[spigot.jar:git-Spigot-65e8124-79e55b6]
    ... 7 more
Как я понял он не может найти файл, странно, но файл есть, я даже в onEnable прописал сохранение файла, 1 фиг не видит.
 
NullPointerException
at mr_krab.customjoinstream.CmdExecutor.onCommand(CmdExecutor.java:21) ~[?:?]

А ты разве вызываешь метод init() при создании? Locale loc = new Locale();
loc.init();
 
NullPointerException
at mr_krab.customjoinstream.CmdExecutor.onCommand(CmdExecutor.java:21) ~[?:?]

А ты разве вызываешь метод init() при создании? Locale loc = new Locale();
loc.init();
Стоит

Код:
        Locale loc = new Locale(this);
        loc.init();
Если убрать this, требует параметр, если поставить null, то плагин не включится.
 
Статус
Закрыто для дальнейших ответов.

Поделиться этой страницей

Назад
Верх