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