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 String defaultLanguageId =
99 LocaleUtil.toLanguageId(LocaleUtil.getDefault());
100
101 return getLocalization(xml, requestedLanguageId, defaultLanguageId);
102 }
103
104 public static String getLocalization(
105 String xml, String requestedLanguageId, String defaultLanguageId) {
106
107 String value = StringPool.BLANK;
108
109 try {
110 SAXReader reader = new SAXReader();
111
112 Document doc = reader.read(new StringReader(xml));
113
114 Element root = doc.getRootElement();
115
116 Iterator itr = root.elements().iterator();
117
118 while (itr.hasNext()) {
119 Element el = (Element)itr.next();
120
121 String languageId =
122 el.attributeValue("language-id", defaultLanguageId);
123
124 if (languageId.equals(defaultLanguageId)) {
125 value = el.getText();
126 }
127
128 if (languageId.equals(requestedLanguageId)) {
129 value = el.getText();
130
131 break;
132 }
133 }
134 }
135 catch (Exception e) {
136 if (_log.isWarnEnabled()) {
137 _log.warn(e);
138 }
139 }
140
141 return value;
142 }
143
144 public static String getPrefsValue(
145 PortletPreferences prefs, String key, String languageId) {
146
147 String localizedKey = _getPrefsKey(key, languageId);
148
149 String value = prefs.getValue(localizedKey, StringPool.BLANK);
150
151 if (Validator.isNull(value)) {
152 value = prefs.getValue(key, StringPool.BLANK);
153 }
154
155 return value;
156 }
157
158 public static String[] getPrefsValues(
159 PortletPreferences prefs, String key, String languageId) {
160
161 String localizedKey = _getPrefsKey(key, languageId);
162
163 String[] values = prefs.getValues(localizedKey, new String[0]);
164
165 if (Validator.isNull(values)) {
166 values = prefs.getValues(key, new String[0]);
167 }
168
169 return values;
170 }
171
172 public static String removeLocalization(
173 String xml, String key, String requestedLanguageId) {
174
175 if (Validator.isNull(xml) || (xml.indexOf("<root") == -1)) {
176 xml = "<root />";
177 }
178
179 String defaultLanguageId =
180 LocaleUtil.toLanguageId(LocaleUtil.getDefault());
181
182 try {
183 SAXReader reader = new SAXReader();
184
185 Document doc = reader.read(new StringReader(xml));
186
187 Element root = doc.getRootElement();
188
189 String availableLocales = root.attributeValue("available-locales");
190
191 defaultLanguageId =
192 root.attributeValue("default-locale", defaultLanguageId);
193
194 if (availableLocales.indexOf(requestedLanguageId) != -1) {
195 Iterator itr = root.elements().iterator();
196
197 while (itr.hasNext()) {
198 Element el = (Element) itr.next();
199
200 String languageId =
201 el.attributeValue("language-id", defaultLanguageId);
202
203 if (languageId.equals(requestedLanguageId)) {
204 root.remove(el);
205
206 break;
207 }
208 }
209
210 availableLocales = StringUtil.remove(
211 availableLocales, requestedLanguageId, StringPool.COMMA);
212
213 root.addAttribute("available-locales", availableLocales);
214 }
215
216 xml = XMLFormatter.toString(doc, " ");
217 }
218 catch (Exception e) {
219 if (_log.isWarnEnabled()) {
220 _log.warn(e);
221 }
222 }
223
224 return xml;
225 }
226
227 public static void setPrefsValue(
228 PortletPreferences prefs, String key, String languageId,
229 String value)
230 throws Exception {
231
232 prefs.setValue(_getPrefsKey(key, languageId), value);
233 }
234
235 public static void setPrefsValues(
236 PortletPreferences prefs, String key, String languageId,
237 String[] values)
238 throws Exception {
239
240 prefs.setValues(_getPrefsKey(key, languageId), values);
241 }
242
243 public static String updateLocalization(
244 String xml, String key, String value) {
245
246 String defaultLanguageId = LocaleUtil.toLanguageId(
247 LocaleUtil.getDefault());
248
249 return updateLocalization(
250 xml, key, value, defaultLanguageId, defaultLanguageId);
251 }
252
253 public static String updateLocalization(
254 String xml, String key, String value, String requestedLanguageId) {
255
256 String defaultLanguageId = LocaleUtil.toLanguageId(
257 LocaleUtil.getDefault());
258
259 return updateLocalization(
260 xml, key, value, requestedLanguageId, defaultLanguageId);
261 }
262
263 public static String updateLocalization(
264 String xml, String key, String value, String requestedLanguageId,
265 String defaultLanguageId) {
266
267 return updateLocalization(
268 xml, key, value, requestedLanguageId, defaultLanguageId, false);
269 }
270
271 public static String updateLocalization(
272 String xml, String key, String value, String requestedLanguageId,
273 String defaultLanguageId, boolean cdata) {
274
275 if (Validator.isNull(xml) || (xml.indexOf("<root") == -1)) {
276 xml = "<root />";
277 }
278
279 String updatedXml = xml;
280
281 try {
282 SAXReader reader = new SAXReader();
283
284 Document doc = reader.read(new StringReader(xml));
285
286 Element root = doc.getRootElement();
287
288 String availableLocales = root.attributeValue("available-locales");
289
290 Element localeEl = null;
291
292 Iterator itr = root.elements().iterator();
293
294 while (itr.hasNext()) {
295 Element el = (Element) itr.next();
296
297 String languageId =
298 el.attributeValue("language-id", defaultLanguageId);
299
300 if (languageId.equals(requestedLanguageId)) {
301 localeEl = el;
302
303 break;
304 }
305 }
306
307 if (localeEl != null) {
308 localeEl.addAttribute("language-id", requestedLanguageId);
309
310 if (cdata) {
311 localeEl.clearContent();
312 localeEl.addCDATA(value);
313 }
314 else {
315 localeEl.setText(value);
316 }
317 }
318 else {
319 localeEl = root.addElement(key);
320
321 localeEl.addAttribute("language-id", requestedLanguageId);
322
323 if (cdata) {
324 localeEl.addCDATA(value);
325 }
326 else {
327 localeEl.setText(value);
328 }
329
330 if (availableLocales == null) {
331 availableLocales = defaultLanguageId;
332 }
333
334 if (!requestedLanguageId.equals(defaultLanguageId)) {
335 availableLocales += StringPool.COMMA + requestedLanguageId;
336 }
337
338 root.addAttribute("available-locales", availableLocales);
339 }
340
341 root.addAttribute("default-locale", defaultLanguageId);
342
343 updatedXml = XMLFormatter.toString(doc, " ");
344 }
345 catch (Exception e) {
346 if (_log.isWarnEnabled()) {
347 _log.warn(e);
348 }
349 }
350
351 return updatedXml;
352 }
353
354 private static String _getPrefsKey(String key, String languageId) {
355 String defaultLanguageId = LocaleUtil.toLanguageId(
356 LocaleUtil.getDefault());
357
358 if (!languageId.equals(defaultLanguageId)) {
359 key += "_" + languageId;
360 }
361
362 return key;
363 }
364
365 private static Log _log = LogFactoryUtil.getLog(LocalizationUtil.class);
366
367 }