1
2
3
4
5 package org.rcfaces.core.internal.converter;
6
7 import java.util.HashMap;
8 import java.util.Locale;
9 import java.util.Map;
10
11 import javax.faces.component.UIComponent;
12 import javax.faces.context.FacesContext;
13 import javax.faces.convert.Converter;
14
15 import org.rcfaces.core.internal.lang.StringAppender;
16 import org.rcfaces.core.model.AbstractConverter;
17
18
19
20
21
22
23 public class LocaleConverter extends AbstractConverter {
24 private static final String REVISION = "$Revision: 1.18 $";
25
26 public static final Converter SINGLETON = new LocaleConverter();
27
28 private static final Map localesByName;
29 static {
30 Locale ls[] = Locale.getAvailableLocales();
31
32 localesByName = new HashMap(ls.length);
33
34 for (int i = 0; i < ls.length; i++) {
35 Locale l = ls[i];
36
37 String key = getKey(l);
38 if (key == null) {
39 continue;
40 }
41
42 localesByName.put(key, l);
43 }
44
45 Locale defaultLocale = Locale.getDefault();
46 localesByName.put("default", defaultLocale);
47 }
48
49 public Object getAsObject(FacesContext context, UIComponent component,
50 String value) {
51 if (value == null || value.length() < 1) {
52 return null;
53 }
54
55 return localesByName.get(value.toLowerCase());
56 }
57
58 public String getAsString(FacesContext context, UIComponent component,
59 Object value) {
60 if (value == null) {
61 return null;
62 }
63
64 Locale locale = (Locale) value;
65
66 return getKey(locale);
67 }
68
69 private static String getKey(Locale locale) {
70 String lg = locale.getLanguage();
71 if (lg == null || lg.length() < 1) {
72 return null;
73 }
74
75 StringAppender sb = new StringAppender(24);
76 sb.append(lg.toLowerCase());
77
78 String cnt = locale.getCountry();
79 if (cnt != null && cnt.length() > 0) {
80 sb.append('_');
81 sb.append(cnt.toLowerCase());
82
83 String var = locale.getVariant();
84 if (var != null && var.length() > 0) {
85 sb.append('_');
86 sb.append(var.toLowerCase());
87 }
88 }
89
90 return sb.toString();
91 }
92
93 }