1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.ui.framework.i18n;
35
36 import info.magnolia.cms.i18n.I18nContentSupport;
37 import info.magnolia.link.LinkUtil;
38 import info.magnolia.objectfactory.Components;
39 import info.magnolia.ui.api.i18n.I18NAuthoringSupport;
40 import info.magnolia.ui.form.field.AbstractCustomMultiField;
41 import info.magnolia.ui.form.field.transformer.TransformedProperty;
42 import info.magnolia.ui.form.field.transformer.basic.BasicTransformer;
43 import info.magnolia.ui.vaadin.integration.jcr.JcrItemAdapter;
44
45 import java.util.ArrayList;
46 import java.util.Iterator;
47 import java.util.List;
48 import java.util.Locale;
49
50 import javax.jcr.Node;
51
52 import org.apache.commons.lang3.StringUtils;
53 import org.slf4j.Logger;
54 import org.slf4j.LoggerFactory;
55
56 import com.vaadin.data.Property;
57 import com.vaadin.ui.AbstractField;
58 import com.vaadin.ui.Component;
59 import com.vaadin.ui.Field;
60 import com.vaadin.ui.HasComponents;
61
62
63
64
65 public class DefaultI18NAuthoringSupport implements I18NAuthoringSupport {
66
67 private static final Logger log = LoggerFactory.getLogger(DefaultI18NAuthoringSupport.class);
68
69 private I18nContentSupport i18nContentSupport;
70
71 private boolean enabled = true;
72
73 public DefaultI18NAuthoringSupport() {
74 this.i18nContentSupport = Components.getComponent(I18nContentSupport.class);
75 }
76
77
78
79
80
81
82
83
84 @Override
85 public List<Locale> getAvailableLocales(Node node) {
86 if (enabled && i18nContentSupport.isEnabled()) {
87 return new ArrayList<Locale>(i18nContentSupport.getLocales());
88 }
89 return null;
90 }
91
92 @Override
93 public Locale getDefaultLocale(Node node) {
94 if (enabled && i18nContentSupport.isEnabled()) {
95 return i18nContentSupport.getDefaultLocale();
96 }
97 return null;
98 }
99
100 @Override
101 public void i18nize(HasComponents fieldContainer, Locale locale) {
102 Locale defaultLocale = null;
103 Iterator<Component> fieldComponentIterator = fieldContainer.iterator();
104 if (isEnabled() && i18nContentSupport.isEnabled() && locale != null) {
105 while (fieldComponentIterator.hasNext()) {
106 Component component = fieldComponentIterator.next();
107 if (component instanceof Field) {
108 Field field = (Field) component;
109 Property propertyDataSource = field.getPropertyDataSource();
110
111 if (propertyDataSource instanceof TransformedProperty) {
112 final TransformedProperty i18nBaseProperty = (TransformedProperty) propertyDataSource;
113
114 if (defaultLocale == null && i18nBaseProperty.getTransformer() instanceof BasicTransformer) {
115 com.vaadin.data.Item item = ((BasicTransformer) i18nBaseProperty.getTransformer()).getRelatedFormItem();
116 if (item instanceof JcrItemAdapter) {
117 javax.jcr.Item jcrItem = ((JcrItemAdapter) item).getJcrItem();
118 if (jcrItem.isNode()) {
119 defaultLocale = getDefaultLocale((Node) jcrItem);
120 }
121 }
122 }
123
124 boolean isDefaultLocale = locale.equals(defaultLocale);
125
126 if (i18nBaseProperty.hasI18NSupport()) {
127 final Locale formerLocale = i18nBaseProperty.getTransformer().getLocale();
128 final String basePropertyName = i18nBaseProperty.getTransformer().getBasePropertyName();
129 final String localizedPropertyName = isDefaultLocale ?
130 basePropertyName :
131 constructI18NPropertyName(basePropertyName, locale);
132 i18nBaseProperty.getTransformer().setI18NPropertyName(localizedPropertyName);
133 i18nBaseProperty.getTransformer().setLocale(locale);
134 i18nBaseProperty.fireI18NValueChange();
135 String currentCaption = field.getCaption();
136
137 if (StringUtils.isNotBlank(currentCaption)) {
138 if (formerLocale != null) {
139 currentCaption = currentCaption.replace(String.format("(%s)", formerLocale.getLanguage()), "");
140 }
141 field.setCaption(String.format("%s (%s)", currentCaption, locale.getLanguage()));
142 }
143
144
145 if (field instanceof AbstractField) {
146 ((AbstractField) field).setLocale(locale);
147 }
148
149 } else if (field instanceof AbstractCustomMultiField) {
150
151 ((AbstractCustomMultiField) field).setLocale(locale);
152 }
153
154 }
155 }
156
157
158 if (component instanceof HasComponents) {
159 i18nize((HasComponents) component, locale);
160 }
161 }
162 }
163 }
164
165 @Override
166 public String createI18NURI(Node node, Locale locale) {
167
168 Locale currentLocale = i18nContentSupport.getLocale();
169 String uri = null;
170 try {
171
172 i18nContentSupport.setLocale(locale);
173 uri = LinkUtil.createAbsoluteLink(node);
174 }
175
176 finally {
177 i18nContentSupport.setLocale(currentLocale);
178 }
179 return uri;
180 }
181
182 private String constructI18NPropertyName(CharSequence basePropertyName, Locale locale) {
183 return basePropertyName + "_" + locale.toString();
184 }
185
186 public boolean isEnabled() {
187 return enabled;
188 }
189
190 public void setEnabled(boolean enabled) {
191 this.enabled = enabled;
192 }
193
194 @Override
195 @Deprecated
196 public Locale getAuthorLocale() {
197 log.warn("I18NAuthoringSupport.getAuthorLocale() is deprecated, returning null. Use SubAppContext.getAuthoringLocale() instead.");
198 return null;
199 }
200
201 @Deprecated
202 public void setAuthorLocale(Locale locale) {
203 log.warn("I18NAuthoringSupport.setAuthorLocale(Locale) is deprecated, not doing anything. Use SubAppContext.setAuthoringLocale(Locale) instead.");
204 }
205
206 }