Verbesserungen I18N Support (Messages)

thobaben_serialize
Harald Wolff 2016-12-07 09:00:32 +01:00
parent 5d64fb51c1
commit fa3eaffc18
1 changed files with 132 additions and 6 deletions

View File

@ -1,13 +1,24 @@
package org.hwo.i18n;
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.util.ArrayList;
import java.util.InvalidPropertiesFormatException;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import java.util.MissingResourceException;
import java.util.Properties;
import java.util.PropertyResourceBundle;
import java.util.ResourceBundle;
import static org.hwo.logging.LogLevel.*;
import static org.hwo.logging.Logging.*;
public class Messages {
@ -15,7 +26,15 @@ public class Messages {
protected static List<Messages> instanceList;
protected static Locale activeLocale;
protected String BUNDLE_NAME = "org.hwo.i18n.messages";
protected static List<ResourceBundle>
resourceBundles;
protected static List<Properties>
properties;
protected String
BUNDLE_NAME = "org.hwo.i18n.messages";
protected Class<?>
BUNDLE_CLASS = null;
private ResourceBundle defaultResourceBundle;
@ -32,7 +51,7 @@ public class Messages {
BUNDLE_NAME = bundleName;
initialize();
}
public void saveMissingStrings() {
if (missingKeys != null)
@ -42,7 +61,7 @@ public class Messages {
fos = new FileOutputStream(missingKeysFileName);
System.err.println(String.format("Writing missing strings to %s",missingKeysFileName));
missingKeys.store(fos, "");
missingKeys.storeToXML(fos, "missing translations");
fos.close();
} catch (Exception e) {
e.printStackTrace();
@ -52,7 +71,8 @@ public class Messages {
private void initialize()
{
System.err.println(this.getClass().getName() + ": Using Locale:" + activeLocale.getCountry() + " / " + activeLocale.getLanguage());
System.err.println(this.getClass().getName() + ": Using Locale:" + activeLocale.getCountry() + " / " + activeLocale.getLanguage());
defaultResourceBundle = ResourceBundle.getBundle(BUNDLE_NAME);
localeResourceBundle = ResourceBundle.getBundle(BUNDLE_NAME,activeLocale);
@ -65,23 +85,48 @@ public class Messages {
}
public void setMissingKeysFileName(String fileName)
{
if (missingKeys == null){
enableMissingKeys();
}
missingKeysFileName = fileName;
try {
missingKeys.loadFromXML(new FileInputStream(fileName));
} catch (Exception e){
log(e);
}
}
public void enableMissingKeys()
{
missingKeys = new Properties();
if (missingKeys == null)
missingKeys = new Properties();
}
public static String getString(String key) {
for (ResourceBundle bundle: resourceBundles){
if (bundle.containsKey(key))
return bundle.getString(key);
}
for (Messages messages: instanceList)
{
if (messages.hasKey(key))
return messages.getInstanceString(key);
}
for (Properties p: properties){
if (p.containsKey(key))
return p.getProperty(key);
}
if (getInstance().missingKeys != null)
{
getInstance().missingKeys.setProperty(key, "");
if (getInstance().missingKeys.containsKey(key))
return getInstance().missingKeys.getProperty(key);
getInstance().missingKeys.setProperty(key, key);
}
return key;
}
@ -104,8 +149,89 @@ public class Messages {
{
return pInstance;
}
private static String[] generateFileNamesForBase(Class<?> clazz,Locale locale){
if (locale == null)
locale = activeLocale;
return new String[]{
String.format("%s.msg_%s_%s", clazz.getCanonicalName(), locale.getLanguage(), locale.getCountry()),
String.format("%s.msg_%s_%s", clazz.getSimpleName(), locale.getLanguage(), locale.getCountry()),
String.format("%s.msg_%s", clazz.getCanonicalName(), locale.getLanguage()),
String.format("%s.msg_%s", clazz.getSimpleName(), locale.getLanguage()),
String.format("%s.msg", clazz.getCanonicalName()),
String.format("%s.msg", clazz.getSimpleName())
};
}
private static File[] possibleFilesFor(Class<?> clazz){
LinkedList<File> files = new LinkedList<>();
for (String fn: generateFileNamesForBase(clazz, null)){
File f = new File(fn);
if (f.exists())
files.add(f);
}
return files.toArray(new File[0]);
}
private static ResourceBundle tryLoad(InputStream is){
try {
return new PropertyResourceBundle(is);
} catch (Exception e){
log(e);
}
return null;
}
public static boolean loadMessages(Class<?> clazz){
boolean leastOne = false;
String[] fileNames = generateFileNamesForBase(clazz, null);
for (String fn: fileNames){
InputStream is = clazz.getClassLoader().getResourceAsStream(fn);
if (is == null){
if (new File(fn).exists())
try {
is = new FileInputStream(fn);
} catch (FileNotFoundException e) {
log(e);
}
}
if (is != null){
ResourceBundle rb = tryLoad(is);
if (rb != null){
log(INFO,"I18N: loaded %s",fn);
resourceBundles.add(rb);
continue;
}
}
Properties prop = new Properties();
try {
String xfn = String.format("%s.xml", fn);
prop.loadFromXML(new FileInputStream(xfn));
properties.add(prop);
log(INFO,"I18N: loaded %s",xfn);
continue;
} catch (Exception e) {
}
log(INFO,"I18N: does not exist: %s",fn);
}
return leastOne;
}
static {
resourceBundles = new ArrayList<>();
properties = new ArrayList<>();
if (activeLocale == null)
activeLocale = Locale.getDefault();