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