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    }