mirror of
https://github.com/CitizensDev/Citizens2.git
synced 2025-01-04 07:27:59 +01:00
Begin work on translation
This commit is contained in:
parent
0c32720fb3
commit
0baac5d002
83
src/main/java/net/citizensnpcs/util/Messages.java
Normal file
83
src/main/java/net/citizensnpcs/util/Messages.java
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
package net.citizensnpcs.util;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.util.ListResourceBundle;
|
||||||
|
import java.util.Properties;
|
||||||
|
import java.util.PropertyResourceBundle;
|
||||||
|
import java.util.ResourceBundle;
|
||||||
|
|
||||||
|
import net.citizensnpcs.api.CitizensAPI;
|
||||||
|
|
||||||
|
import com.google.common.io.Closeables;
|
||||||
|
|
||||||
|
public enum Messages {
|
||||||
|
;
|
||||||
|
private String defaultTranslation;
|
||||||
|
|
||||||
|
private String key;
|
||||||
|
|
||||||
|
Messages(String key, String defaultTranslation) {
|
||||||
|
this.key = key;
|
||||||
|
this.defaultTranslation = defaultTranslation;
|
||||||
|
}
|
||||||
|
public String getKey() {
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ResourceBundle defaultBundle;
|
||||||
|
|
||||||
|
public static ResourceBundle getDefaultResourceBundle() {
|
||||||
|
if (defaultBundle == null) {
|
||||||
|
File dir = new File(CitizensAPI.getDataFolder(), "i18n");
|
||||||
|
dir.mkdirs();
|
||||||
|
|
||||||
|
File bundleFile = new File(dir, Translator.PREFIX + "_en.properties");
|
||||||
|
if (!bundleFile.exists())
|
||||||
|
populateDefaults(bundleFile);
|
||||||
|
FileInputStream stream = null;
|
||||||
|
try {
|
||||||
|
stream = new FileInputStream(bundleFile);
|
||||||
|
defaultBundle = new PropertyResourceBundle(stream);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
defaultBundle = getFallbackResourceBundle();
|
||||||
|
} finally {
|
||||||
|
Closeables.closeQuietly(stream);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return defaultBundle;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ResourceBundle getFallbackResourceBundle() {
|
||||||
|
return new ListResourceBundle() {
|
||||||
|
@Override
|
||||||
|
protected Object[][] getContents() {
|
||||||
|
Messages[] values = values();
|
||||||
|
Object[][] contents = new Object[values.length][2];
|
||||||
|
for (int i = 0; i < values.length; i++) {
|
||||||
|
Messages message = values[i];
|
||||||
|
contents[i] = new Object[] { message.key, message.defaultTranslation };
|
||||||
|
}
|
||||||
|
return contents;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void populateDefaults(File bundleFile) {
|
||||||
|
Properties properties = new Properties();
|
||||||
|
for (Messages message : values()) {
|
||||||
|
properties.put(message.key, message.defaultTranslation);
|
||||||
|
}
|
||||||
|
OutputStream stream = null;
|
||||||
|
try {
|
||||||
|
properties.store(stream = new FileOutputStream(bundleFile), "");
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} finally {
|
||||||
|
Closeables.closeQuietly(stream);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -67,6 +67,14 @@ public class Messaging {
|
|||||||
sender.sendMessage(msg);
|
sender.sendMessage(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void sendTr(CommandSender sender, String key) {
|
||||||
|
sendMessageTo(sender, Translator.tr(key));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void sendTr(CommandSender sender, String key, Object... msg) {
|
||||||
|
sendMessageTo(sender, Translator.tr(key, msg));
|
||||||
|
}
|
||||||
|
|
||||||
public static void sendWithNPC(CommandSender sender, Object msg, NPC npc) {
|
public static void sendWithNPC(CommandSender sender, Object msg, NPC npc) {
|
||||||
String send = msg.toString();
|
String send = msg.toString();
|
||||||
|
|
||||||
|
99
src/main/java/net/citizensnpcs/util/Translator.java
Normal file
99
src/main/java/net/citizensnpcs/util/Translator.java
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
package net.citizensnpcs.util;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.net.MalformedURLException;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.text.MessageFormat;
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.MissingResourceException;
|
||||||
|
import java.util.ResourceBundle;
|
||||||
|
|
||||||
|
import com.google.common.collect.Maps;
|
||||||
|
|
||||||
|
public class Translator {
|
||||||
|
private ResourceBundle bundle;
|
||||||
|
private final Map<String, MessageFormat> messageFormatCache = Maps.newHashMap();
|
||||||
|
|
||||||
|
public Translator(File resourceFile, Locale locale) {
|
||||||
|
try {
|
||||||
|
bundle = ResourceBundle.getBundle(PREFIX, locale,
|
||||||
|
new FileClassLoader(Translator.class.getClassLoader(), resourceFile));
|
||||||
|
} catch (MissingResourceException e) {
|
||||||
|
bundle = getDefaultBundle();
|
||||||
|
}
|
||||||
|
instance = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String format(String key, Object... msg) {
|
||||||
|
String unreplaced = translate(key);
|
||||||
|
MessageFormat formatter = getFormatter(unreplaced);
|
||||||
|
return formatter.format(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
private ResourceBundle getDefaultBundle() {
|
||||||
|
return Messages.getDefaultResourceBundle();
|
||||||
|
}
|
||||||
|
|
||||||
|
private MessageFormat getFormatter(String unreplaced) {
|
||||||
|
MessageFormat formatter = messageFormatCache.get(unreplaced);
|
||||||
|
if (formatter == null)
|
||||||
|
messageFormatCache.put(unreplaced, formatter = new MessageFormat(unreplaced));
|
||||||
|
return formatter;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String translate(String key) {
|
||||||
|
try {
|
||||||
|
return bundle.getString(key);
|
||||||
|
} catch (MissingResourceException e) {
|
||||||
|
try {
|
||||||
|
return getDefaultBundle().getString(key);
|
||||||
|
} catch (MissingResourceException ex) {
|
||||||
|
return "?" + key + "?";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class FileClassLoader extends ClassLoader {
|
||||||
|
private final File folder;
|
||||||
|
|
||||||
|
public FileClassLoader(ClassLoader classLoader, File folder) {
|
||||||
|
super(classLoader);
|
||||||
|
this.folder = folder;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public URL getResource(String string) {
|
||||||
|
File file = new File(folder, string);
|
||||||
|
if (file.exists()) {
|
||||||
|
try {
|
||||||
|
return file.toURI().toURL();
|
||||||
|
} catch (MalformedURLException ex) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return super.getResource(string);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public InputStream getResourceAsStream(String string) {
|
||||||
|
File file = new File(folder, string);
|
||||||
|
if (file.exists()) {
|
||||||
|
try {
|
||||||
|
return new FileInputStream(file);
|
||||||
|
} catch (FileNotFoundException ex) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return super.getResourceAsStream(string);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Translator instance;
|
||||||
|
public static final String PREFIX = "messages";
|
||||||
|
|
||||||
|
public static String tr(String key, Object... msg) {
|
||||||
|
return msg.length == 0 ? instance.translate(key) : instance.format(key, msg);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user