001    // License: GPL. Copyright 2007 by Immanuel Scholz and others
002    package org.openstreetmap.josm.tools;
003    
004    import static org.openstreetmap.josm.tools.I18n.tr;
005    
006    import java.util.Locale;
007    
008    public class LanguageInfo {
009    
010        /**
011         * Replies the wiki language prefix for the given locale. The wiki language
012         * prefix has the form 'Xy:' where 'Xy' is a ISO 639 language code in title
013         * case.
014         *
015         * @param locale  the locale
016         * @return the wiki language prefix
017         */
018        static public String getWikiLanguagePrefix(Locale locale) {
019            String code = getJOSMLocaleCode(locale);
020            if (code.length() == 2) {
021                if (code.equals("en")) return "";
022            } else if (code.equals("zh_TW") || code.equals("zh_CN")) {
023                /* do nothing */
024            } else if (code.matches("[^_]+_[^_]+")) {
025                code = code.substring(0,2);
026                if (code.equals("en")) return "";
027            } else {
028                System.err.println(tr("Warning: failed to derive wiki language prefix from JOSM locale code ''{0}''. Using default code ''en''.", code));
029                return "";
030            }
031            return code.substring(0,1).toUpperCase() + code.substring(1) + ":";
032        }
033    
034        /**
035         * Replies the wiki language prefix for the current locale.
036         *
037         * @return the wiki language prefix
038         * @see Locale#getDefault()
039         * @see #getWikiLanguagePrefix(Locale)
040         */
041        static public String getWikiLanguagePrefix() {
042            return getWikiLanguagePrefix(Locale.getDefault());
043        }
044    
045        /**
046         * Replies the JOSM locale code for the default locale.
047         *
048         * @return the JOSM locale code for the default locale
049         * @see #getJOSMLocaleCode(Locale)
050         */
051        static public String getJOSMLocaleCode() {
052            return getJOSMLocaleCode(Locale.getDefault());
053        }
054    
055        /**
056         * Replies the locale code used by JOSM for a given locale.
057         *
058         * In most cases JOSM uses the 2-character ISO 639 language code ({@link Locale#getLanguage()}
059         * to identify the locale of a localized resource, but in some cases it may use the
060         * programmatic name for locales, as replied by {@link Locale#toString()}.
061         *
062         * @param locale the locale. Replies "en" if null.
063         * @return the JOSM code for the given locale
064         */
065        static public String getJOSMLocaleCode(Locale locale) {
066            if (locale == null) return "en";
067            String full = locale.toString();
068            if (full.equals("iw_IL"))
069                return "he";
070            else if (full.equals("in"))
071                return "id";
072            else if (I18n.hasCode(full)) /* catch all non-single codes */
073                return full;
074    
075            /* return single code */
076            return locale.getLanguage();
077        }
078    
079        /**
080         * Replies the locale code used by Java for a given locale.
081         *
082         * In most cases JOSM and Java uses the same codes, but for some exceptions this is needed.
083         *
084         * @param localeName the locale code.
085         * @return the resulting locale
086         */
087        static public Locale getLocale(String localeName) {
088            if (localeName.equals("he")) {
089                localeName = "iw_IL";
090            }
091            else if (localeName.equals("id")) {
092                localeName = "in";
093            }
094            Locale l;
095            int i = localeName.indexOf('_');
096            if (i > 0) {
097                l = new Locale(localeName.substring(0, i), localeName.substring(i + 1));
098            } else {
099                l = new Locale(localeName);
100            }
101            return l;
102        }
103    
104        static public String getLanguageCodeXML()
105        {
106            return getJOSMLocaleCode()+".";
107        }
108        static public String getLanguageCodeManifest()
109        {
110            return getJOSMLocaleCode()+"_";
111        }
112    }