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