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