/*
* Forge Mod Loader
* Copyright (c) 2012-2013 cpw.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v2.1
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*
* Contributors:
* cpw - implementation
*/
package cpw.mods.fml.common.registry;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.logging.Level;
import com.google.common.base.Charsets;
import cpw.mods.fml.common.FMLLog;
import cpw.mods.fml.common.Loader;
import cpw.mods.fml.common.ModContainer;
import net.minecraft.block.Block;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.StringTranslate;
public class LanguageRegistry
{
private static final LanguageRegistry INSTANCE = new LanguageRegistry();
private Map<String,Properties> modLanguageData=new HashMap<String,Properties>();
public static LanguageRegistry instance()
{
return INSTANCE;
}
public String getStringLocalization(String key)
{
return getStringLocalization(key, StringTranslate.getInstance().getCurrentLanguage());
}
public String getStringLocalization(String key, String lang)
{
String localizedString = "";
Properties langPack = modLanguageData.get(lang);
if (langPack != null) {
if (langPack.getProperty(key) != null) {
localizedString = langPack.getProperty(key);
}
}
return localizedString;
}
public void addStringLocalization(String key, String value)
{
addStringLocalization(key, "en_US", value);
}
public void addStringLocalization(String key, String lang, String value)
{
Properties langPack=modLanguageData.get(lang);
if (langPack==null) {
langPack=new Properties();
modLanguageData.put(lang, langPack);
}
langPack.put(key,value);
}
public void addStringLocalization(Properties langPackAdditions) {
addStringLocalization(langPackAdditions, "en_US");
}
public void addStringLocalization(Properties langPackAdditions, String lang) {
Properties langPack = modLanguageData.get(lang);
if (langPack == null) {
langPack = new Properties();
modLanguageData.put(lang, langPack);
}
if (langPackAdditions != null) {
langPack.putAll(langPackAdditions);
}
}
public static void reloadLanguageTable()
{
// reload language table by forcing lang to null and reloading the properties file
String lang = StringTranslate.getInstance().getCurrentLanguage();
StringTranslate.getInstance().setLanguage(lang, true);
}
public void addNameForObject(Object objectToName, String lang, String name)
{
String objectName;
if (objectToName instanceof Item) {
objectName=((Item)objectToName).getUnlocalizedName();
} else if (objectToName instanceof Block) {
objectName=((Block)objectToName).getUnlocalizedName();
} else if (objectToName instanceof ItemStack) {
objectName=((ItemStack)objectToName).getItem().getUnlocalizedName((ItemStack)objectToName);
} else {
throw new IllegalArgumentException(String.format("Illegal object for naming %s",objectToName));
}
objectName+=".name";
addStringLocalization(objectName, lang, name);
}
public static void addName(Object objectToName, String name)
{
instance().addNameForObject(objectToName, "en_US", name);
}
public void loadLanguageTable(Properties languagePack, String lang)
{
Properties usPack=modLanguageData.get("en_US");
if (usPack!=null) {
languagePack.putAll(usPack);
}
Properties langPack=modLanguageData.get(lang);
if (langPack==null) {
return;
}
languagePack.putAll(langPack);
}
public void loadLocalization(String localizationFile, String lang, boolean isXML)
{
URL urlResource = this.getClass().getResource(localizationFile);
if (urlResource != null)
{
loadLocalization(urlResource, lang, isXML);
}
else
{
ModContainer activeModContainer = Loader.instance().activeModContainer();
if (activeModContainer!=null)
{
FMLLog.log(activeModContainer.getModId(), Level.SEVERE, "The language resource %s cannot be located on the classpath. This is a programming error.", localizationFile);
}
else
{
FMLLog.log(Level.SEVERE, "The language resource %s cannot be located on the classpath. This is a programming error.", localizationFile);
}
}
}
public void loadLocalization(URL localizationFile, String lang, boolean isXML)
{
InputStream langStream = null;
Properties langPack = new Properties();
try {
langStream = localizationFile.openStream();
if (isXML) {
langPack.loadFromXML(langStream);
}
else {
langPack.load(new InputStreamReader(langStream,Charsets.UTF_8));
}
addStringLocalization(langPack, lang);
}
catch (IOException e) {
FMLLog.log(Level.SEVERE, e, "Unable to load localization from file %s", localizationFile);
}
finally {
try {
if (langStream != null) {
langStream.close();
}
}
catch (IOException ex) {
// HUSH
}
}
}
}