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