/*
* This file is part of RPG Items.
*
* RPG Items 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.
*
* RPG Items 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 RPG Items. If not, see <http://www.gnu.org/licenses/>.
*/
package think.rpgitems.data;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Set;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;
import think.rpgitems.Plugin;
import think.rpgitems.item.ItemManager;
import think.rpgitems.item.RPGItem;
public class Locale extends BukkitRunnable {
private static HashMap<String, HashMap<String, String>> localeStrings = new HashMap<String, HashMap<String,String>>();
private static FileConfiguration config = think.rpgitems.Plugin.config;
private Plugin plugin;
private long lastUpdate = 0;
private File dataFolder;
private String version;
private Locale(Plugin plugin) {
this.plugin = plugin;
lastUpdate = plugin.getConfig().getLong("lastLocaleUpdate", 0);
version = plugin.getDescription().getVersion();
if (!plugin.getConfig().getString("pluginVersion", "0.0").equals(version)) {
lastUpdate = 0;
plugin.getConfig().set("pluginVersion", version);
plugin.saveConfig();
}
dataFolder = plugin.getDataFolder();
reloadLocales(plugin);
if (!plugin.getConfig().contains("localeDownload")) {
plugin.getConfig().set("localeDownload", true);
plugin.saveConfig();
}
}
private final static String localeUpdateURL = "http://198.199.127.128/rpgitems/index.php?page=localeget&lastupdate=";
private final static String localeDownloadURL = "http://www.rpgitems2.bugs3.com/locale/%s/%s.lang";
public static Set<String> getLocales() {
return localeStrings.keySet();
}
@Override
public void run() {
if (!plugin.getConfig().getBoolean("localeDownload", true)) {
cancel();
}
try {
URL updateURL = new URL(localeUpdateURL + lastUpdate);
lastUpdate = System.currentTimeMillis();
URLConnection conn = updateURL.openConnection();
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
ArrayList<String> locales = new ArrayList<String>();
String line = null;
while ((line = reader.readLine()) != null) {
locales.add(line);
}
reader.close();
File localesFolder = new File(dataFolder, "locale/");
localesFolder.mkdirs();
for (String locale : locales) {
URL downloadURL = new URL(String.format(localeDownloadURL, version, locale));
File outFile = new File(dataFolder, "locale/" + locale + ".lang");
InputStream in = downloadURL.openStream();
FileOutputStream out = new FileOutputStream(outFile);
byte []buf = new byte[1024];
int bytesRead;
while ((bytesRead = in.read(buf)) != -1) {
out.write(buf, 0, bytesRead);
}
in.close();
out.close();
}
} catch (Exception e) {
return;
}
(new BukkitRunnable() {
@Override
public void run() {
ConfigurationSection config = plugin.getConfig();
config.set("lastLocaleUpdate", lastUpdate);
plugin.saveConfig();
reloadLocales(plugin);
for (RPGItem item : ItemManager.itemById.valueCollection()) {
item.rebuild();
}
}
}).runTask(plugin);
}
public static void reloadLocales(Plugin plugin) {
localeStrings.clear();
localeStrings.put("en_GB", loadLocaleStream(plugin.getResource("locale/en_GB.lang")));
localeStrings.put("fr_FR", loadLocaleStream(plugin.getResource("locale/fr_FR.lang")));
localeStrings.put("es_ES", loadLocaleStream(plugin.getResource("locale/es_ES.lang")));
}
private static HashMap<String, String> loadLocaleStream(InputStream in, HashMap<String, String> map) {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(in, "UTF-8"));
String line = null;
while((line = reader.readLine()) != null) {
if (line.startsWith("#")) continue;
String[] args = line.split("=");
map.put(args[0].trim(), args[1].trim());
}
return map;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
private static HashMap<String, String> loadLocaleStream(InputStream in) {
return loadLocaleStream(in, new HashMap<String, String>());
}
public static String getPlayerLocale(Player player) {
String language = config.getString("language");
if(language.equals("es_ES")){
return "es_ES";
}else if(language.equals("fr_FR")){
return "fr_FR";
}else if(language.equals("en_GB")){
return "en_GB";
}else{
Plugin.plugin.getLogger().warning("Error language you've set : '" + language + "' isn't supported or don't exist ! Languages aviables are es_ES, fr_FR and en_GB");
return "en_GB";
}
}
public static void init(Plugin plugin) {
(new Locale(plugin)).runTaskTimerAsynchronously(plugin, 0, 24l * 60l * 60l * 20l);
}
public static String get(String key, String locale) {
if (!localeStrings.containsKey(locale))
return get(key);
HashMap<String, String> strings = localeStrings.get(locale);
if (strings == null || !strings.containsKey(key)){
return get(key);
}
return strings.get(key);
}
private static String get(String key) {
HashMap<String, String> strings = localeStrings.get("en_GB");
if (!strings.containsKey(key))
return "!" + key + "!";
return strings.get(key);
}
}