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}