1
22
23 package com.liferay.util;
24
25 import com.liferay.portal.kernel.log.Log;
26 import com.liferay.portal.kernel.log.LogFactoryUtil;
27 import com.liferay.portal.kernel.util.LocaleUtil;
28 import com.liferay.portal.kernel.util.StringPool;
29 import com.liferay.portal.kernel.util.StringUtil;
30 import com.liferay.portal.kernel.util.Validator;
31 import com.liferay.util.xml.XMLFormatter;
32
33 import java.io.StringReader;
34
35 import java.util.Iterator;
36
37 import javax.portlet.PortletPreferences;
38
39 import org.dom4j.Document;
40 import org.dom4j.Element;
41 import org.dom4j.io.SAXReader;
42
43
49 public class LocalizationUtil {
50
51 public static String[] getAvailableLocales(String xml) {
52 String[] availableLocales = new String[0];
53
54 try {
55 SAXReader reader = new SAXReader();
56
57 Document doc = reader.read(new StringReader(xml));
58
59 Element root = doc.getRootElement();
60
61 availableLocales = StringUtil.split(
62 root.attributeValue("available-locales"));
63 }
64 catch (Exception e) {
65 if (_log.isWarnEnabled()) {
66 _log.warn(e);
67 }
68 }
69
70 return availableLocales;
71 }
72
73 public static String getDefaultLocale(String xml) {
74 String defaultLanguageId = LocaleUtil.toLanguageId(
75 LocaleUtil.getDefault());
76
77 try {
78 SAXReader reader = new SAXReader();
79
80 Document doc = reader.read(new StringReader(xml));
81
82 Element root = doc.getRootElement();
83
84 return root.attributeValue("default-locale", defaultLanguageId);
85 }
86 catch (Exception e) {
87 if (_log.isWarnEnabled()) {
88 _log.warn(e);
89 }
90 }
91
92 return defaultLanguageId;
93 }
94
95 public static String getLocalization(
96 String xml, String requestedLanguageId) {
97
98 return getLocalization(xml, requestedLanguageId, true);
99 }
100
101 public static String getLocalization(
102 String xml, String requestedLanguageId, boolean useDefault) {
103
104 String defaultLanguageId = LocaleUtil.toLanguageId(
105 LocaleUtil.getDefault());
106
107 String value = StringPool.BLANK;
108
109 String defaultValue = StringPool.BLANK;
110
111 try {
112 SAXReader reader = new SAXReader();
113
114 Document doc = reader.read(new StringReader(xml));
115
116 Element root = doc.getRootElement();
117
118 Iterator itr = root.elements().iterator();
119
120 while (itr.hasNext()) {
121 Element el = (Element)itr.next();
122
123 String languageId =
124 el.attributeValue("language-id", defaultLanguageId);
125
126 if (languageId.equals(defaultLanguageId)) {
127 defaultValue = el.getText();
128 }
129
130 if (languageId.equals(requestedLanguageId)) {
131 value = el.getText();
132 }
133 }
134
135 if (useDefault && Validator.isNull(value)) {
136 value = defaultValue;
137 }
138 }
139 catch (Exception e) {
140 if (_log.isWarnEnabled()) {
141 _log.warn(e);
142 }
143 }
144
145 return value;
146 }
147
148 public static String getPrefsValue(
149 PortletPreferences prefs, String key, String languageId) {
150
151 return getPrefsValue(prefs, key, languageId, true);
152 }
153
154 public static String getPrefsValue(
155 PortletPreferences prefs, String key, String languageId,
156 boolean useDefault) {
157
158 String localizedKey = _getPrefsKey(key, languageId);
159
160 String value = prefs.getValue(localizedKey, StringPool.BLANK);
161
162 if (useDefault && Validator.isNull(value)) {
163 value = prefs.getValue(key, StringPool.BLANK);
164 }
165
166 return value;
167 }
168
169 public static String[] getPrefsValues(
170 PortletPreferences prefs, String key, String languageId) {
171
172 return getPrefsValues(prefs, key, languageId, true);
173 }
174
175 public static String[] getPrefsValues(
176 PortletPreferences prefs, String key, String languageId,
177 boolean useDefault) {
178
179 String localizedKey = _getPrefsKey(key, languageId);
180
181 String[] values = prefs.getValues(localizedKey, new String[0]);
182
183 if (useDefault && Validator.isNull(values)) {
184 values = prefs.getValues(key, new String[0]);
185 }
186
187 return values;
188 }
189
190 public static String removeLocalization(
191 String xml, String key, String requestedLanguageId) {
192
193 if (Validator.isNull(xml) || (xml.indexOf("<root") == -1)) {
194 xml = "<root />";
195 }
196
197 String defaultLanguageId =
198 LocaleUtil.toLanguageId(LocaleUtil.getDefault());
199
200 try {
201 SAXReader reader = new SAXReader();
202
203 Document doc = reader.read(new StringReader(xml));
204
205 Element root = doc.getRootElement();
206
207 String availableLocales = root.attributeValue("available-locales");
208
209 defaultLanguageId =
210 root.attributeValue("default-locale", defaultLanguageId);
211
212 if (availableLocales.indexOf(requestedLanguageId) != -1) {
213 Iterator itr = root.elements().iterator();
214
215 while (itr.hasNext()) {
216 Element el = (Element) itr.next();
217
218 String languageId =
219 el.attributeValue("language-id", defaultLanguageId);
220
221 if (languageId.equals(requestedLanguageId)) {
222 root.remove(el);
223
224 break;
225 }
226 }
227
228 availableLocales = StringUtil.remove(
229 availableLocales, requestedLanguageId, StringPool.COMMA);
230
231 root.addAttribute("available-locales", availableLocales);
232 }
233
234 xml = XMLFormatter.toString(doc, " ");
235 }
236 catch (Exception e) {
237 if (_log.isWarnEnabled()) {
238 _log.warn(e);
239 }
240 }
241
242 return xml;
243 }
244
245 public static void setPrefsValue(
246 PortletPreferences prefs, String key, String languageId,
247 String value)
248 throws Exception {
249
250 prefs.setValue(_getPrefsKey(key, languageId), value);
251 }
252
253 public static void setPrefsValues(
254 PortletPreferences prefs, String key, String languageId,
255 String[] values)
256 throws Exception {
257
258 prefs.setValues(_getPrefsKey(key, languageId), values);
259 }
260
261 public static String updateLocalization(
262 String xml, String key, String value) {
263
264 String defaultLanguageId = LocaleUtil.toLanguageId(
265 LocaleUtil.getDefault());
266
267 return updateLocalization(
268 xml, key, value, defaultLanguageId, defaultLanguageId);
269 }
270
271 public static String updateLocalization(
272 String xml, String key, String value, String requestedLanguageId) {
273
274 String defaultLanguageId = LocaleUtil.toLanguageId(
275 LocaleUtil.getDefault());
276
277 return updateLocalization(
278 xml, key, value, requestedLanguageId, defaultLanguageId);
279 }
280
281 public static String updateLocalization(
282 String xml, String key, String value, String requestedLanguageId,
283 String defaultLanguageId) {
284
285 return updateLocalization(
286 xml, key, value, requestedLanguageId, defaultLanguageId, false);
287 }
288
289 public static String updateLocalization(
290 String xml, String key, String value, String requestedLanguageId,
291 String defaultLanguageId, boolean cdata) {
292
293 if (Validator.isNull(xml) || (xml.indexOf("<root") == -1)) {
294 xml = "<root />";
295 }
296
297 String updatedXml = xml;
298
299 try {
300 SAXReader reader = new SAXReader();
301
302 Document doc = reader.read(new StringReader(xml));
303
304 Element root = doc.getRootElement();
305
306 String availableLocales = root.attributeValue("available-locales");
307
308 Element localeEl = null;
309
310 Iterator itr = root.elements().iterator();
311
312 while (itr.hasNext()) {
313 Element el = (Element) itr.next();
314
315 String languageId =
316 el.attributeValue("language-id", defaultLanguageId);
317
318 if (languageId.equals(requestedLanguageId)) {
319 localeEl = el;
320
321 break;
322 }
323 }
324
325 if (localeEl != null) {
326 localeEl.addAttribute("language-id", requestedLanguageId);
327
328 if (cdata) {
329 localeEl.clearContent();
330 localeEl.addCDATA(value);
331 }
332 else {
333 localeEl.setText(value);
334 }
335 }
336 else {
337 localeEl = root.addElement(key);
338
339 localeEl.addAttribute("language-id", requestedLanguageId);
340
341 if (cdata) {
342 localeEl.addCDATA(value);
343 }
344 else {
345 localeEl.setText(value);
346 }
347
348 if (availableLocales == null) {
349 availableLocales = defaultLanguageId;
350 }
351
352 if (!requestedLanguageId.equals(defaultLanguageId)) {
353 availableLocales += StringPool.COMMA + requestedLanguageId;
354 }
355
356 root.addAttribute("available-locales", availableLocales);
357 }
358
359 root.addAttribute("default-locale", defaultLanguageId);
360
361 updatedXml = XMLFormatter.toString(doc, " ");
362 }
363 catch (Exception e) {
364 if (_log.isWarnEnabled()) {
365 _log.warn(e);
366 }
367 }
368
369 return updatedXml;
370 }
371
372 private static String _getPrefsKey(String key, String languageId) {
373 String defaultLanguageId = LocaleUtil.toLanguageId(
374 LocaleUtil.getDefault());
375
376 if (!languageId.equals(defaultLanguageId)) {
377 key += "_" + languageId;
378 }
379
380 return key;
381 }
382
383 private static Log _log = LogFactoryUtil.getLog(LocalizationUtil.class);
384
385 }