001 package cpw.mods.fml.common.registry;
002
003 import java.io.IOException;
004 import java.io.InputStream;
005 import java.net.URL;
006 import java.util.HashMap;
007 import java.util.Map;
008 import java.util.Properties;
009
010 import net.minecraft.src.Block;
011 import net.minecraft.src.Item;
012 import net.minecraft.src.ItemStack;
013 import net.minecraft.src.StringTranslate;
014
015 public class LanguageRegistry
016 {
017 private static final LanguageRegistry INSTANCE = new LanguageRegistry();
018
019 private Map<String,Properties> modLanguageData=new HashMap<String,Properties>();
020
021 public static LanguageRegistry instance()
022 {
023 return INSTANCE;
024 }
025
026 public String getStringLocalization(String key)
027 {
028 return getStringLocalization(key, StringTranslate.getInstance().getCurrentLanguage());
029 }
030
031 public String getStringLocalization(String key, String lang)
032 {
033 String localizedString = "";
034 Properties langPack = modLanguageData.get(lang);
035
036 if (langPack != null) {
037 if (langPack.getProperty(key) != null) {
038 localizedString = langPack.getProperty(key);
039 }
040 }
041
042 return localizedString;
043 }
044
045 public void addStringLocalization(String key, String value)
046 {
047 addStringLocalization(key, "en_US", value);
048 }
049 public void addStringLocalization(String key, String lang, String value)
050 {
051 Properties langPack=modLanguageData.get(lang);
052 if (langPack==null) {
053 langPack=new Properties();
054 modLanguageData.put(lang, langPack);
055 }
056 langPack.put(key,value);
057 }
058
059 public void addStringLocalization(Properties langPackAdditions) {
060 addStringLocalization(langPackAdditions, "en_US");
061 }
062
063 public void addStringLocalization(Properties langPackAdditions, String lang) {
064 Properties langPack = modLanguageData.get(lang);
065 if (langPack == null) {
066 langPack = new Properties();
067 modLanguageData.put(lang, langPack);
068 }
069 if (langPackAdditions != null) {
070 langPack.putAll(langPackAdditions);
071 }
072 }
073
074 public static void reloadLanguageTable()
075 {
076 // reload language table by forcing lang to null and reloading the properties file
077 String lang = StringTranslate.getInstance().getCurrentLanguage();
078 StringTranslate.getInstance().currentLanguage = null;
079 StringTranslate.getInstance().setLanguage(lang);
080 }
081
082
083 public void addNameForObject(Object objectToName, String lang, String name)
084 {
085 String objectName;
086 if (objectToName instanceof Item) {
087 objectName=((Item)objectToName).getItemName();
088 } else if (objectToName instanceof Block) {
089 objectName=((Block)objectToName).getBlockName();
090 } else if (objectToName instanceof ItemStack) {
091 objectName=((ItemStack)objectToName).getItem().getItemNameIS((ItemStack)objectToName);
092 } else {
093 throw new IllegalArgumentException(String.format("Illegal object for naming %s",objectToName));
094 }
095 objectName+=".name";
096 addStringLocalization(objectName, lang, name);
097 }
098
099 public static void addName(Object objectToName, String name)
100 {
101 instance().addNameForObject(objectToName, "en_US", name);
102 }
103
104 public void loadLanguageTable(Properties languagePack, String lang)
105 {
106 Properties usPack=modLanguageData.get("en_US");
107 if (usPack!=null) {
108 languagePack.putAll(usPack);
109 }
110 Properties langPack=modLanguageData.get(lang);
111 if (langPack==null) {
112 return;
113 }
114 languagePack.putAll(langPack);
115 }
116
117 public void loadLocalization(String localizationFile, String lang, boolean isXML)
118 {
119 loadLocalization(this.getClass().getResource(localizationFile), lang, isXML);
120 }
121
122 public void loadLocalization(URL localizationFile, String lang, boolean isXML)
123 {
124 InputStream langStream = null;
125 Properties langPack = new Properties();
126
127 try {
128 langStream = localizationFile.openStream();
129
130 if (isXML) {
131 langPack.loadFromXML(langStream);
132 }
133 else {
134 langPack.load(langStream);
135 }
136
137 addStringLocalization(langPack, lang);
138 }
139 catch (IOException e) {
140 e.printStackTrace();
141 }
142 finally {
143 try {
144 if (langStream != null) {
145 langStream.close();
146 }
147 }
148 catch (IOException ex) {
149 ex.printStackTrace();
150 }
151 }
152 }
153 }