001// License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.tools; 003 004import java.util.Locale; 005 006public final class LanguageInfo { 007 008 private LanguageInfo() { 009 // Hide default constructor for utils classes 010 } 011 012 /** 013 * Type of the locale to use 014 * @since 5915 015 */ 016 public enum LocaleType { 017 /** The current default language */ 018 DEFAULT, 019 /** The current default language, but not english */ 020 DEFAULTNOTENGLISH, 021 /** The base language (i.e. pt for pt_BR) */ 022 BASELANGUAGE, 023 /** The standard english texts */ 024 ENGLISH 025 } 026 027 /** 028 * Replies the wiki language prefix for the given locale. The wiki language 029 * prefix has the form 'Xy:' where 'Xy' is a ISO 639 language code in title 030 * case (or Xy_AB: for sub languages). 031 * 032 * @param type the type 033 * @return the wiki language prefix or {@code null} for {@link LocaleType#BASELANGUAGE}, when 034 * base language is identical to default or english 035 * @since 5915 036 */ 037 public static String getWikiLanguagePrefix(LocaleType type) { 038 if(type == LocaleType.ENGLISH) 039 return ""; 040 041 String code = getJOSMLocaleCode(); 042 if(type == LocaleType.BASELANGUAGE) { 043 if(code.matches("[^_]+_[^_]+")) { 044 code = code.substring(0,2); 045 if ("en".equals(code)) 046 return null; 047 } else { 048 return null; 049 } 050 } else if(type == LocaleType.DEFAULTNOTENGLISH && "en".equals(code)) 051 return null; 052 return code.substring(0,1).toUpperCase() + code.substring(1) + ":"; 053 } 054 055 /** 056 * Replies the wiki language prefix for the current locale. 057 * 058 * @return the wiki language prefix 059 * @see Locale#getDefault() 060 * @see #getWikiLanguagePrefix(LocaleType) 061 */ 062 public static String getWikiLanguagePrefix() { 063 return getWikiLanguagePrefix(LocaleType.DEFAULT); 064 } 065 066 /** 067 * Replies the JOSM locale code for the default locale. 068 * 069 * @return the JOSM locale code for the default locale 070 * @see #getJOSMLocaleCode(Locale) 071 */ 072 public static String getJOSMLocaleCode() { 073 return getJOSMLocaleCode(Locale.getDefault()); 074 } 075 076 /** 077 * Replies the locale code used by JOSM for a given locale. 078 * 079 * In most cases JOSM uses the 2-character ISO 639 language code ({@link Locale#getLanguage()} 080 * to identify the locale of a localized resource, but in some cases it may use the 081 * programmatic name for locales, as replied by {@link Locale#toString()}. 082 * 083 * @param locale the locale. Replies "en" if null. 084 * @return the JOSM code for the given locale 085 */ 086 public static String getJOSMLocaleCode(Locale locale) { 087 if (locale == null) return "en"; 088 String full = locale.toString(); 089 if ("iw_IL".equals(full)) 090 return "he"; 091 else if ("in".equals(full)) 092 return "id"; 093 else if (I18n.hasCode(full)) // catch all non-single codes 094 return full; 095 096 // return single code 097 return locale.getLanguage(); 098 } 099 100 /** 101 * Replies the locale code used by Java for a given locale. 102 * 103 * In most cases JOSM and Java uses the same codes, but for some exceptions this is needed. 104 * 105 * @param localeName the locale code. 106 * @return the resulting locale 107 */ 108 public static Locale getLocale(String localeName) { 109 if ("he".equals(localeName)) { 110 localeName = "iw_IL"; 111 } 112 else if ("id".equals(localeName)) { 113 localeName = "in"; 114 } 115 Locale l; 116 int i = localeName.indexOf('_'); 117 if (i > 0) { 118 l = new Locale(localeName.substring(0, i), localeName.substring(i + 1)); 119 } else { 120 l = new Locale(localeName); 121 } 122 return l; 123 } 124 125 /** 126 * Check if a new language is better than a previous existing. Can be used in classes where 127 * multiple user supplied language marked strings appear and the best one is searched. Following 128 * priorities: current language, english, any other 129 * 130 * @param oldLanguage the language code of the existing string 131 * @param newLanguage the language code of the new string 132 * @return true if new one is better 133 * @since 8091 134 */ 135 public static boolean isBetterLanguage(String oldLanguage, String newLanguage) { 136 if (oldLanguage == null) 137 return true; 138 String want = getJOSMLocaleCode(); 139 return want.equals(newLanguage) || (!want.equals(oldLanguage) && newLanguage.startsWith("en")); 140 } 141 142 /** 143 * Replies the language prefix for use in XML elements (with a dot appended). 144 * 145 * @return the XML language prefix 146 * @see #getJOSMLocaleCode() 147 */ 148 public static String getLanguageCodeXML() { 149 return getJOSMLocaleCode()+"."; 150 } 151 152 /** 153 * Replies the language prefix for use in manifests (with an underscore appended). 154 * 155 * @return the manifest language prefix 156 * @see #getJOSMLocaleCode() 157 */ 158 public static String getLanguageCodeManifest() { 159 return getJOSMLocaleCode()+"_"; 160 } 161}