/*
* LanguageHandler.java
*
* Copyright (c) 2015 ITSTAKE
*
* This program is free software: you can redistribute it and/or modify
*
* it under the terms of the GNU General Public License as published by
*
* the Free Software Foundation, either version 3 of the License, or
*
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
*
* but WITHOUT ANY WARRANTY; without even the implied warranty of
*
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
*
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
*
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package tk.itstake.util;
import org.bukkit.Bukkit;
import org.bukkit.plugin.Plugin;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import java.io.*;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Created by bexco on 2015-07-26.
*/
public class LanguageHandler {
JSONObject language = null;
Plugin plugin = null;
public LanguageHandler() {
// Get Language Folder
plugin = Bukkit.getPluginManager().getPlugin("SteakGUI");
if(plugin != null && plugin.getDataFolder() != null) {
languageLoad();
} else {
language = getDefaultLanguage();
}
}
public void languageLoad() {
plugin = Bukkit.getPluginManager().getPlugin("SteakGUI");
File langfolder = new File(plugin.getDataFolder().toString() + File.separator + "lang");
if(!langfolder.exists()) {
langfolder.mkdir();
}
// Get Current Selected Language
final String sellang;
if (ConfigHandler.hasConfig("lang")) {
sellang = ConfigHandler.getConfig("lang").toString();
} else {
sellang = "ko_KR";
}
// Load Current Selected Language
if (langfolder.exists() && langfolder.isDirectory()) {
File[] langlist = langfolder.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
if (name.equals(sellang + ".json")) {
return true;
} else {
return false;
}
}
});
// If Detected Language
if (langlist.length > 0) {
// Load Language
try {
FileReader fr = new FileReader(langlist[0]);
JSONParser jp = new JSONParser();
language = (JSONObject) jp.parse(fr);
boolean notupdated = false;
for(Object key:language.keySet()) {
if(!getDefaultLanguage().containsKey(key)) {
notupdated = true;
}
}
if(notupdated) {
updateFile();
}
fr.close();
} catch (Exception e) {
language = getDefaultLanguage();
makeDefaultFile();
}
} else {
// If Can't Detect Language File
language = getDefaultLanguage();
makeDefaultFile();
ConfigHandler.setConfig("lang", "ko_KR");
}
}
}
private void updateFile() {
// If Can't Load Language File
plugin = Bukkit.getPluginManager().getPlugin("SteakGUI");
File langfolder = new File(plugin.getDataFolder().toString() + File.separator + "lang");
File langfile = new File(langfolder.toString() + File.separator + ConfigHandler.getConfig("lang").toString() + ".json");
// Write New File
try {
FileWriter fw = new FileWriter(langfile);
JSONObject defaultlang = getDefaultLanguage();
for(Object key:defaultlang.keySet()) {
if(!language.containsKey(key)) {
defaultlang.put(key, language.get(key));
}
}
fw.write(JSONUtil.getPretty(defaultlang.toJSONString()));
language = defaultlang;
fw.flush();
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private void makeDefaultFile() {
// If Can't Load Language File
plugin = Bukkit.getPluginManager().getPlugin("SteakGUI");
File langfolder = new File(plugin.getDataFolder().toString() + File.separator + "lang");
File langfile = new File(langfolder.toString() + File.separator + ConfigHandler.getConfig("lang").toString() + ".json");
// Write New File
try {
FileWriter fw = new FileWriter(langfile);
language = getDefaultLanguage();
fw.write(JSONUtil.getPretty(language.toJSONString()));
fw.flush();
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private JSONObject getDefaultLanguage() {
JSONObject defaultlang = new JSONObject();
defaultlang.put("editorhelp", "언어 파일을 수정하시려고 하시나요? 도움말은 http://wiki.itstake.tk/index.php?title=SteakGUI/언어 에서 찾아보세요!");
defaultlang.put("console.onenable", "&c[&2SteakGUI&c] &6소고기구이(SteakGUI) v%0% 이 활성화 되었습니다!");
defaultlang.put("console.ondisable", "&c[&2SteakGUI&c] &6소고기구이(SteakGUI) v%0% 이 비활성화 되었습니다. 사용해 주셔서 감사합니다.");
defaultlang.put("command.wronguse", "&c[&2SteakGUI&c] &c사용법:%0%");
defaultlang.put("command.help.intro", "&c[&2SteakGUI&c] &b소고기구이(SteakGUI) %0% 도움말 -----");
defaultlang.put("command.help.open", "&c[&2SteakGUI&c] &6/%0% open <메뉴 이름> &e- 메뉴를 엽니다.");
defaultlang.put("command.wronghelp.arg.player", "플레이어");
defaultlang.put("command.wronghelp.arg.menu", "메뉴 이름");
defaultlang.put("command.help.open", "&c[&2SteakGUI&c] &6/%0% open <메뉴 이름> &e- 메뉴를 엽니다.");
defaultlang.put("command.help.open.others", "&c[&2SteakGUI&c] &6/%0% open <메뉴 이름> [플레이어] &e- 메뉴를 엽니다. 플레이어 이름을 입력한 경우 그 플레이어에게 메뉴를 엽니다.");
defaultlang.put("command.help.open.console", "&c[&2SteakGUI&c] &6/%0% open <메뉴 이름> <플레이어> &e- 메뉴를 엽니다. 플레이어 이름을 입력한 경우 그 플레이어에게 메뉴를 엽니다.");
defaultlang.put("command.help.setting", "&c[&2SteakGUI&c] &6/%0% setting <메뉴 이름> &e- 메뉴를 수정합니다.");
defaultlang.put("command.help.create", "&c[&2SteakGUI&c] &6/%0% create <메뉴 이름> &e- 메뉴를 만듭니다.");
defaultlang.put("command.help.delete", "&c[&2SteakGUI&c] &6/%0% delete <메뉴 이름> &e- 메뉴를 삭제합니다.");
defaultlang.put("command.help.list", "&c[&2SteakGUI&c] &6/%0% list &e- 메뉴의 목록을 봅니다.");
defaultlang.put("command.help.reload", "&c[&2SteakGUI&c] &6/%0% reload &e- 메뉴 혹은 설정 파일을 리로드합니다.");
defaultlang.put("command.list.intro", "&c[&2SteakGUI&c] &b메뉴 목록---------");
defaultlang.put("command.list.format", "&c[&2SteakGUI&c]&6 %0%");
defaultlang.put("command.list.nomenu", "&c[&2SteakGUI&c] &c메뉴가 없습니다!");
defaultlang.put("command.reloaded", "&c[&2SteakGUI&c] &6소고기구이가 리로드 되었습니다.");
defaultlang.put("nopermission", "&c[&2SteakGUI&c] &c권한이 없습니다!");
defaultlang.put("noconsole", "&c[&2SteakGUI&c] &c콘솔에서는 사용할 수 없는 명령어입니다!");
defaultlang.put("menu.deleted", "&c[&2SteakGUI&c] &c메뉴 %0% 이 삭제되었습니다!");
defaultlang.put("menu.created", "&c[&2SteakGUI&c] &6메뉴 %0% 이 만들어졌습니다!");
defaultlang.put("menu.notexist", "&c[&2SteakGUI&c] &c메뉴가 존재하지 않습니다!");
defaultlang.put("offlineplayer", "&c[&2SteakGUI&c] &c오프라인인 플레이어 입니다!");
defaultlang.put("command.help.author", "&6소고기구이(SteakGUI) v%0%, 제작자: ITSTAKE(http://itstake.tk), 번역자: ITSTAKE(http://itstake.tk)");
defaultlang.put("menu.noitemtask", "&c아이템 작업이 없습니다. \n&b/sg setting <메뉴 이름> &c을 이용해 수정하세요.");
defaultlang.put("menu.wrongsetting", "&c[&2SteakGUI&c] 아이템 작업의 설정이 올바르지 않습니다. 자세한 오류 로그는 콘솔을 확인하세요.");
defaultlang.put("menufile.wannahelp", "&c[&2SteakGUI&c] &6파일을 직접 수정하고 싶으신가요?\n그렇다면 http://wiki.itstake.tk/index.php?title=SteakGUI/직접_설정 문서를 참고해 보세요.");
defaultlang.put("existpermission", "&c[&2SteakGUI&c] &c이미 존재하는 펄미션입니다!");
defaultlang.put("command.notmatchedformat", "&c[&2SteakGUI&c] &c매뉴 이름엔 한글을 사용할 수 없습니다! 일단 영어로 매뉴를 만드신 후, /sg setting 을 이용하여 매뉴 제목을 수정하세요!");
defaultlang.put("novault", "&c[&2SteakGUI&c] &cVault 가 존재하지 않습니다! 플러그인을 종료합니다.");
// TO-DO: Language Insert
return defaultlang;
}
public String getLanguage(String path, ArrayList<String> args) {
return getLanguage(path, (String[])args.toArray());
}
public String getLanguage(String path) {
return getLanguage(path, new String[]{});
}
public String getLanguage(String path, String[] args) {
if(language != null) {
if(language.containsKey(path)) {
String lango = (String) language.get(path);
Matcher mat = Pattern.compile("%*[0-9]%").matcher(lango);
String lang = lango;
while (mat.find()) {
String sen = mat.group();
if(sen.startsWith("%") && sen.endsWith("%") && isNum(sen.replace("%", "")) && args.length > Integer.parseInt(sen.replace("%", ""))) {
lang = lang.replace(mat.group(), args[Integer.parseInt(sen.replace("%", ""))]);
}
}
return lang;
} else {
updateFile();
if(language.containsKey(path)) {
String lango = (String) language.get(path);
Matcher mat = Pattern.compile("%*[0-9]%").matcher(lango);
String lang = lango;
while (mat.find()) {
String sen = mat.group();
if (sen.startsWith("%") && sen.endsWith("%") && isNum(sen.replace("%", "")) && args.length > Integer.parseInt(sen.replace("%", ""))) {
lang = lang.replace(mat.group(), args[Integer.parseInt(sen.replace("%", ""))]);
}
}
return lang;
} else {
return "Language file error! Please call admin(언어 파일 오류입니다. 관리자에게 연락해 주세요!)";
}
}
} else {
makeDefaultFile();
if(language.containsKey(path)) {
String lango = (String) language.get(path);
Matcher mat = Pattern.compile("%*[0-9]%").matcher(lango);
String lang = lango;
while (mat.find()) {
String sen = mat.group();
if (sen.startsWith("%") && sen.endsWith("%") && isNum(sen.replace("%", "")) && args.length > Integer.parseInt(sen.replace("%", ""))) {
lang = lang.replace(mat.group(), args[Integer.parseInt(sen.replace("%", ""))]);
}
}
return lang;
} else {
return "Language file error! Please call admin(언어 파일 오류입니다. 관리자에게 연락해 주세요!)";
}
}
}
public boolean isNum(String num) {
try {
Integer.parseInt(num);
return true;
} catch(Exception e) {
return false;
}
}
}