    001/*
    002 * Forge Mod Loader
    003 * Copyright (c) 2012-2013 cpw.
    004 * All rights reserved. This program and the accompanying materials
    005 * are made available under the terms of the GNU Lesser Public License v2.1
    006 * which accompanies this distribution, and is available at
    007 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
    008 *
    009 * Contributors:
    010 *     cpw - implementation
    011 */
    012
    013package cpw.mods.fml.common.registry;
    014
    015import java.io.IOException;
    016import java.io.InputStream;
    017import java.io.InputStreamReader;
    018import java.net.URL;
    019import java.util.HashMap;
    020import java.util.Map;
    021import java.util.Properties;
    022import java.util.logging.Level;
    023
    024import com.google.common.base.Charsets;
    025
    026import cpw.mods.fml.common.FMLLog;
    027import cpw.mods.fml.common.Loader;
    028import cpw.mods.fml.common.ModContainer;
    029
    030import net.minecraft.block.Block;
    031import net.minecraft.item.Item;
    032import net.minecraft.item.ItemStack;
    033import net.minecraft.util.StringTranslate;
    034
    035public class LanguageRegistry
    036{
    037    private static final LanguageRegistry INSTANCE = new LanguageRegistry();
    038
    039    private Map<String,Properties> modLanguageData=new HashMap<String,Properties>();
    040
    041    public static LanguageRegistry instance()
    042    {
    043        return INSTANCE;
    044    }
    045
    046    public String getStringLocalization(String key)
    047    {
    048        return getStringLocalization(key, StringTranslate.getInstance().getCurrentLanguage());
    049    }
    050
    051    public String getStringLocalization(String key, String lang)
    052    {
    053        String localizedString = "";
    054        Properties langPack = modLanguageData.get(lang);
    055
    056        if (langPack != null) {
    057            if (langPack.getProperty(key) != null) {
    058                localizedString = langPack.getProperty(key);
    059            }
    060        }
    061
    062        return localizedString;
    063    }
    064
    065    public void addStringLocalization(String key, String value)
    066    {
    067        addStringLocalization(key, "en_US", value);
    068    }
    069    public void addStringLocalization(String key, String lang, String value)
    070    {
    071        Properties langPack=modLanguageData.get(lang);
    072        if (langPack==null) {
    073            langPack=new Properties();
    074            modLanguageData.put(lang, langPack);
    075        }
    076        langPack.put(key,value);
    077    }
    078
    079    public void addStringLocalization(Properties langPackAdditions) {
    080        addStringLocalization(langPackAdditions, "en_US");
    081    }
    082
    083    public void addStringLocalization(Properties langPackAdditions, String lang) {
    084        Properties langPack = modLanguageData.get(lang);
    085        if (langPack == null) {
    086            langPack = new Properties();
    087            modLanguageData.put(lang, langPack);
    088        }
    089        if (langPackAdditions != null) {
    090            langPack.putAll(langPackAdditions);
    091        }
    092    }
    093
    094    public static void reloadLanguageTable()
    095    {
    096        // reload language table by forcing lang to null and reloading the properties file
    097        String lang = StringTranslate.getInstance().getCurrentLanguage();
    098        StringTranslate.getInstance().setLanguage(lang, true);
    099    }
    100
    101
    102    public void addNameForObject(Object objectToName, String lang, String name)
    103    {
    104        String objectName;
    105        if (objectToName instanceof Item) {
    106            objectName=((Item)objectToName).getUnlocalizedName();
    107        } else if (objectToName instanceof Block) {
    108            objectName=((Block)objectToName).getUnlocalizedName();
    109        } else if (objectToName instanceof ItemStack) {
    110            objectName=((ItemStack)objectToName).getItem().getUnlocalizedName((ItemStack)objectToName);
    111        } else {
    112            throw new IllegalArgumentException(String.format("Illegal object for naming %s",objectToName));
    113        }
    114        objectName+=".name";
    115        addStringLocalization(objectName, lang, name);
    116    }
    117
    118    public static void addName(Object objectToName, String name)
    119    {
    120        instance().addNameForObject(objectToName, "en_US", name);
    121    }
    122
    123    public void loadLanguageTable(Properties languagePack, String lang)
    124    {
    125        Properties usPack=modLanguageData.get("en_US");
    126        if (usPack!=null) {
    127            languagePack.putAll(usPack);
    128        }
    129        Properties langPack=modLanguageData.get(lang);
    130        if (langPack==null) {
    131            return;
    132        }
    133        languagePack.putAll(langPack);
    134    }
    135
    136    public void loadLocalization(String localizationFile, String lang, boolean isXML)
    137    {
    138        URL urlResource = this.getClass().getResource(localizationFile);
    139        if (urlResource != null)
    140        {
    141            loadLocalization(urlResource, lang, isXML);
    142        }
    143        else
    144        {
    145            ModContainer activeModContainer = Loader.instance().activeModContainer();
    146            if (activeModContainer!=null)
    147            {
    148                FMLLog.log(activeModContainer.getModId(), Level.SEVERE, "The language resource %s cannot be located on the classpath. This is a programming error.", localizationFile);
    149            }
    150            else
    151            {
    152                FMLLog.log(Level.SEVERE, "The language resource %s cannot be located on the classpath. This is a programming error.", localizationFile);
    153            }
    154        }
    155    }
    156
    157    public void loadLocalization(URL localizationFile, String lang, boolean isXML)
    158    {
    159        InputStream langStream = null;
    160        Properties langPack = new Properties();
    161
    162        try    {
    163            langStream = localizationFile.openStream();
    164
    165            if (isXML) {
    166                langPack.loadFromXML(langStream);
    167            }
    168            else {
    169                langPack.load(new InputStreamReader(langStream,Charsets.UTF_8));
    170            }
    171
    172            addStringLocalization(langPack, lang);
    173        }
    174        catch (IOException e) {
    175            FMLLog.log(Level.SEVERE, e, "Unable to load localization from file %s", localizationFile);
    176        }
    177        finally    {
    178            try    {
    179                if (langStream != null)    {
    180                    langStream.close();
    181                }
    182            }
    183            catch (IOException ex) {
    184                // HUSH
    185            }
    186        }
    187    }
    188}