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