001 package net.minecraft.util;
002
003 import cpw.mods.fml.common.Side;
004 import cpw.mods.fml.common.asm.SideOnly;
005 import cpw.mods.fml.common.registry.LanguageRegistry;
006
007 import java.io.BufferedReader;
008 import java.io.IOException;
009 import java.io.InputStreamReader;
010 import java.util.Enumeration;
011 import java.util.IllegalFormatException;
012 import java.util.Properties;
013 import java.util.TreeMap;
014
015 public class StringTranslate
016 {
017 /** Is the private singleton instance of StringTranslate. */
018 private static StringTranslate instance = new StringTranslate("en_US");
019
020 /**
021 * Contains all key/value pairs to be translated - is loaded from '/lang/en_US.lang' when the StringTranslate is
022 * created.
023 */
024 public Properties translateTable = new Properties();
025 private TreeMap languageList;
026 public String currentLanguage;
027 private boolean isUnicode;
028
029 public StringTranslate(String par1Str)
030 {
031 this.loadLanguageList();
032 this.setLanguage(par1Str);
033 }
034
035 /**
036 * Return the StringTranslate singleton instance
037 */
038 public static StringTranslate getInstance()
039 {
040 return instance;
041 }
042
043 private void loadLanguageList()
044 {
045 TreeMap var1 = new TreeMap();
046
047 try
048 {
049 BufferedReader var2 = new BufferedReader(new InputStreamReader(StringTranslate.class.getResourceAsStream("/lang/languages.txt"), "UTF-8"));
050
051 for (String var3 = var2.readLine(); var3 != null; var3 = var2.readLine())
052 {
053 String[] var4 = var3.split("=");
054
055 if (var4 != null && var4.length == 2)
056 {
057 var1.put(var4[0], var4[1]);
058 }
059 }
060 }
061 catch (IOException var5)
062 {
063 var5.printStackTrace();
064 return;
065 }
066
067 this.languageList = var1;
068 this.languageList.put("en_US", "English (US)");
069 }
070
071 public TreeMap getLanguageList()
072 {
073 return this.languageList;
074 }
075
076 private void loadLanguage(Properties par1Properties, String par2Str) throws IOException
077 {
078 BufferedReader var3 = new BufferedReader(new InputStreamReader(StringTranslate.class.getResourceAsStream("/lang/" + par2Str + ".lang"), "UTF-8"));
079
080 for (String var4 = var3.readLine(); var4 != null; var4 = var3.readLine())
081 {
082 var4 = var4.trim();
083
084 if (!var4.startsWith("#"))
085 {
086 String[] var5 = var4.split("=");
087
088 if (var5 != null && var5.length == 2)
089 {
090 par1Properties.setProperty(var5[0], var5[1]);
091 }
092 }
093 }
094 LanguageRegistry.instance().loadLanguageTable(par1Properties, par2Str);
095 }
096
097 public void setLanguage(String par1Str)
098 {
099 if (!par1Str.equals(this.currentLanguage))
100 {
101 Properties var2 = new Properties();
102
103 try
104 {
105 this.loadLanguage(var2, "en_US");
106 }
107 catch (IOException var8)
108 {
109 ;
110 }
111
112 this.isUnicode = false;
113
114 if (!"en_US".equals(par1Str))
115 {
116 try
117 {
118 this.loadLanguage(var2, par1Str);
119 Enumeration var3 = var2.propertyNames();
120
121 while (var3.hasMoreElements() && !this.isUnicode)
122 {
123 Object var4 = var3.nextElement();
124 Object var5 = var2.get(var4);
125
126 if (var5 != null)
127 {
128 String var6 = var5.toString();
129
130 for (int var7 = 0; var7 < var6.length(); ++var7)
131 {
132 if (var6.charAt(var7) >= 256)
133 {
134 this.isUnicode = true;
135 break;
136 }
137 }
138 }
139 }
140 }
141 catch (IOException var9)
142 {
143 var9.printStackTrace();
144 return;
145 }
146 }
147
148 this.currentLanguage = par1Str;
149 this.translateTable = var2;
150 }
151 }
152
153 public String getCurrentLanguage()
154 {
155 return this.currentLanguage;
156 }
157
158 @SideOnly(Side.CLIENT)
159 public boolean isUnicode()
160 {
161 return this.isUnicode;
162 }
163
164 /**
165 * Translate a key to current language.
166 */
167 public String translateKey(String par1Str)
168 {
169 return this.translateTable.getProperty(par1Str, par1Str);
170 }
171
172 /**
173 * Translate a key to current language applying String.format()
174 */
175 public String translateKeyFormat(String par1Str, Object ... par2ArrayOfObj)
176 {
177 String var3 = this.translateTable.getProperty(par1Str, par1Str);
178
179 try
180 {
181 return String.format(var3, par2ArrayOfObj);
182 }
183 catch (IllegalFormatException var5)
184 {
185 return "Format error: " + var3;
186 }
187 }
188
189 /**
190 * Translate a key with a extra '.name' at end added, is used by blocks and items.
191 */
192 public String translateNamedKey(String par1Str)
193 {
194 return this.translateTable.getProperty(par1Str + ".name", "");
195 }
196
197 @SideOnly(Side.CLIENT)
198 public static boolean isBidirectional(String par0Str)
199 {
200 return "ar_SA".equals(par0Str) || "he_IL".equals(par0Str);
201 }
202 }