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