1
14
15 package com.liferay.portal.kernel.util;
16
17 import com.liferay.portal.kernel.log.Log;
18 import com.liferay.portal.kernel.log.LogFactoryUtil;
19
20 import java.util.Arrays;
21 import java.util.HashMap;
22 import java.util.Locale;
23 import java.util.Map;
24
25
30 public class LocaleUtil {
31
32 public static Locale fromLanguageId(String languageId) {
33 return _instance._fromLanguageId(languageId);
34 }
35
36 public static Locale[] fromLanguageIds(String[] languageIds) {
37 return _instance._fromLanguageIds(languageIds);
38 }
39
40 public static Locale getDefault() {
41 return _instance._getDefault();
42 }
43
44 public static LocaleUtil getInstance() {
45 return _instance;
46 }
47
48 public static void setDefault(
49 String userLanguage, String userCountry, String userVariant) {
50
51 _instance._setDefault(userLanguage, userCountry, userVariant);
52 }
53
54 public static String toLanguageId(Locale locale) {
55 return _instance._toLanguageId(locale);
56 }
57
58 public static String[] toLanguageIds(Locale[] locales) {
59 return _instance._toLanguageIds(locales);
60 }
61
62 public static String toW3cLanguageId(Locale locale) {
63 return _instance._toW3cLanguageId(locale);
64 }
65
66 public static String toW3cLanguageId(String languageId) {
67 return _instance._toW3cLanguageId(languageId);
68 }
69
70 public static String[] toW3cLanguageIds(Locale[] locales) {
71 return _instance._toW3cLanguageIds(locales);
72 }
73
74 public static String[] toW3cLanguageIds(String[] languageIds) {
75 return _instance._toW3cLanguageIds(languageIds);
76 }
77
78 private LocaleUtil() {
79 _locale = new Locale("en", "US");
80
81 _isoCountries = Locale.getISOCountries().clone();
82
83 for (int i = 0; i < _isoCountries.length; i++) {
84 _isoCountries[i] = _isoCountries[i].toUpperCase();
85 }
86
87 Arrays.sort(_isoCountries);
88
89 _isoLanguages = Locale.getISOLanguages().clone();
90
91 for (int i = 0; i < _isoLanguages.length; i++) {
92 _isoLanguages[i] = _isoLanguages[i].toLowerCase();
93 }
94
95 Arrays.sort(_isoLanguages);
96 }
97
98 private Locale _fromLanguageId(String languageId) {
99 if (languageId == null) {
100 return _locale;
101 }
102
103 Locale locale = null;
104
105 try {
106 locale = _locales.get(languageId);
107
108 if (locale == null) {
109 int pos = languageId.indexOf(CharPool.UNDERLINE);
110
111 if (pos == -1) {
112 if (Arrays.binarySearch(_isoLanguages, languageId) < 0) {
113 return _getDefault();
114 }
115
116 locale = new Locale(languageId);
117 }
118 else {
119 String languageCode = languageId.substring(0, pos);
120 String countryCode = languageId.substring(
121 pos + 1, languageId.length());
122
123 if ((Arrays.binarySearch(
124 _isoLanguages, languageCode) < 0) ||
125 (Arrays.binarySearch(_isoCountries, countryCode) < 0)) {
126
127 return _getDefault();
128 }
129
130 locale = new Locale(languageCode, countryCode);
131 }
132
133 _locales.put(languageId, locale);
134 }
135 }
136 catch (Exception e) {
137 if (_log.isWarnEnabled()) {
138 _log.warn(languageId + " is not a valid language id");
139 }
140 }
141
142 if (locale == null) {
143 locale = _locale;
144 }
145
146 return locale;
147 }
148
149 private Locale[] _fromLanguageIds(String[] languageIds) {
150 Locale[] locales = new Locale[languageIds.length];
151
152 for (int i = 0; i < languageIds.length; i++) {
153 locales[i] = _fromLanguageId(languageIds[i]);
154 }
155
156 return locales;
157 }
158
159 private Locale _getDefault() {
160 Locale locale = LocaleThreadLocal.getLocale();
161
162 if (locale != null) {
163 return locale;
164 }
165
166 return _locale;
167 }
168
169 public void _setDefault(
170 String userLanguage, String userCountry, String userVariant) {
171
172 if (Validator.isNotNull(userLanguage) &&
173 Validator.isNull(userCountry) && Validator.isNull(userVariant)) {
174
175 _locale = new Locale(userLanguage);
176 }
177 else if (Validator.isNotNull(userLanguage) &&
178 Validator.isNotNull(userCountry) &&
179 Validator.isNull(userVariant)) {
180
181 _locale = new Locale(userLanguage, userCountry);
182 }
183 else if (Validator.isNotNull(userLanguage) &&
184 Validator.isNotNull(userCountry) &&
185 Validator.isNotNull(userVariant)) {
186
187 _locale = new Locale(userLanguage, userCountry, userVariant);
188 }
189 }
190
191 private String _toLanguageId(Locale locale) {
192 if (locale == null) {
193 locale = _locale;
194 }
195
196 String languageId = locale.getLanguage();
197
198 if (Validator.isNotNull(locale.getCountry())) {
199 languageId = languageId.concat(StringPool.UNDERLINE);
200 languageId = languageId.concat(locale.getCountry());
201 }
202
203 return languageId;
204 }
205
206 private String[] _toLanguageIds(Locale[] locales) {
207 String[] languageIds = new String[locales.length];
208
209 for (int i = 0; i < locales.length; i++) {
210 languageIds[i] = _toLanguageId(locales[i]);
211 }
212
213 return languageIds;
214 }
215
216 private String _toW3cLanguageId(Locale locale) {
217 return _toW3cLanguageId(_toLanguageId(locale));
218 }
219
220 private String _toW3cLanguageId(String languageId) {
221 return StringUtil.replace(
222 languageId, CharPool.UNDERLINE, CharPool.MINUS);
223 }
224
225 private String[] _toW3cLanguageIds(Locale[] locales) {
226 return _toW3cLanguageIds(_toLanguageIds(locales));
227 }
228
229 private String[] _toW3cLanguageIds(String[] languageIds) {
230 String[] w3cLanguageIds = new String[languageIds.length];
231
232 for (int i = 0; i < languageIds.length; i++) {
233 w3cLanguageIds[i] = _toW3cLanguageId(languageIds[i]);
234 }
235
236 return w3cLanguageIds;
237 }
238
239 private static Log _log = LogFactoryUtil.getLog(LocaleUtil.class);
240
241 private static LocaleUtil _instance = new LocaleUtil();
242
243 private String[] _isoCountries;
244 private String[] _isoLanguages;
245 private Locale _locale;
246 private Map<String, Locale> _locales = new HashMap<String, Locale>();
247
248 }