    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    }