1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем glavrak, 29 авг 2017.

Статус темы:
Закрыта.
  1. Автор темы
    glavrak

    glavrak Активный участник Пользователь

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

    Exception_Prototype Активный участник Пользователь

    Баллы:
    96
    Ник автора @Dereku
    PHP:
    public class Locale {

        private final 
    JavaPluginplugin;
        private final 
    HashMap<StringMessageFormatmessageCache = 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(keyfalse"");
        }

        
    /**
         * Получение сообщения с аргументами из конфигурации Пример сообщения:
         * "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(keyfalseargs);
        }

        
    /**
         * Получение сообщения из конфигурации с возможностью фильтрации цвета
         * Пример сообщения: "\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(keyremoveColors"");
        }

        
    /**
         * Получение сообщения с аргументами из конфигурации с возможностью
         * фильтрации цвета Пример сообщения: "\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(outmf);
            }

            
    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(islocaleFile);
            } catch (
    IOException ex) {
                
    Logging.severe("Failed to save '" name ".properties'!"ex);
                return 
    false;
            }
            return 
    true;
        }

    }
     
    Последнее редактирование: 30 авг 2017
  3. Автор темы
    glavrak

    glavrak Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    Mr_Krab
    Этому классу как я понял нужен еще класс. Откуда откопал то хоть?
    И мне неоткуда взять импорт для JavaPluginplugin, хотя у меня полный пакет JDK 8.
     
  4. Cool_boy

    Cool_boy Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    org.bukkit.plugin.java.JavaPlugin
     
  5. Exception_Prototype

    Exception_Prototype Активный участник Пользователь

    Баллы:
    96
    Ему ничего больше не надо.
    JavaPlugin это то, от куда ты переопределяешь методы onEnable() и т.д.
    Короче, серверное ядро.
     
  6. Автор темы
    glavrak

    glavrak Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    Mr_Krab
    Я вроде не дурак и знаю про такой импорт, без него плагин вообще работать не будет, тут либо опечатались просто, либо специально так написано для чего-то.
    И этому классу требуется еще класс 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);
        }
    }
     
  7. iD3LSY

    iD3LSY Активный участник Пользователь

    Баллы:
    76
    Держи. С таким не получиться даже у аутяги (не оск.) ошибиться. тык
     
  8. Exception_Prototype

    Exception_Prototype Активный участник Пользователь

    Баллы:
    96
    Я выше тоже самое скинул.
     
  9. iD3LSY

    iD3LSY Активный участник Пользователь

    Баллы:
    76
    Сори, не видел. Просто отправил, ибо читать лень)
     
  10. Автор темы
    glavrak

    glavrak Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    Mr_Krab
    Да и там дополнительный класс требуется.
    Вот что у меня сейчас.

    Код:
    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) ~[?:?]
     
  11. iD3LSY

    iD3LSY Активный участник Пользователь

    Баллы:
    76
    И что это собственно такое? Как я понял, Exception_Prototype тебе уже кинул ссылку на утилиту. Ты решил говнокодом написать свою? Умно, умно.
     
  12. Автор темы
    glavrak

    glavrak Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    Mr_Krab
    Для того что вы скинули нужен еще 1 класс. Я уже сам находил эту страницу на гитхабе еще вчера, необходимого класса там нет. Конкретно этот класс требуется FileUtils.
     
  13. Exception_Prototype

    Exception_Prototype Активный участник Пользователь

    Баллы:
    96
    Он должен быть в ядре. Если нет, то найти сам метод перезаписи из одно файла в другой.
     
  14. Автор темы
    glavrak

    glavrak Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    Mr_Krab
    Нашел импорт этого класса, он от 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 фиг не видит.
     
  15. Exception_Prototype

    Exception_Prototype Активный участник Пользователь

    Баллы:
    96
    NullPointerException
    at mr_krab.customjoinstream.CmdExecutor.onCommand(CmdExecutor.java:21) ~[?:?]

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

    glavrak Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    Mr_Krab
    Стоит

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

    Exception_Prototype Активный участник Пользователь

    Баллы:
    96
    Ну так ты файл положит куда надо?
     
  18. Автор темы
    glavrak

    glavrak Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    Mr_Krab
    Файл то он сохраняет, а вот читать отказывается.
     
  19. Exception_Prototype

    Exception_Prototype Активный участник Пользователь

    Баллы:
    96
    Обнови сорцы плагина, сам гляну
     
  20. Автор темы
    glavrak

    glavrak Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    Mr_Krab
    Уже.
     
Статус темы:
Закрыта.

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