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
93
94
95
96
97 public Locale getDefaultLocale(Node node) {
98 if (enabled && i18nContentSupport.isEnabled()) {
99 return i18nContentSupport.getDefaultLocale();
100 }
101 return null;
102 }
103
104 @Override
105 public void i18nize(HasComponents fieldContainer, Locale locale) {
106 Locale defaultLocale = null;
107 Iterator<Component> fieldComponentIterator = fieldContainer.iterator();
108 if (isEnabled() && i18nContentSupport.isEnabled() && locale != null) {
109 while (fieldComponentIterator.hasNext()) {
110 Component component = fieldComponentIterator.next();
111 if (component instanceof Field) {
112 Field field = (Field) component;
113 Property propertyDataSource = field.getPropertyDataSource();
114
115 if (propertyDataSource instanceof TransformedProperty) {
116 final TransformedProperty i18nBaseProperty = (TransformedProperty) propertyDataSource;
117
118 if (defaultLocale == null && i18nBaseProperty.getTransformer() instanceof BasicTransformer) {
119 com.vaadin.data.Item item = ((BasicTransformer) i18nBaseProperty.getTransformer()).getRelatedFormItem();
120 if (item instanceof JcrItemAdapter) {
121 javax.jcr.Item jcrItem = ((JcrItemAdapter) item).getJcrItem();
122 if (jcrItem.isNode()) {
123 defaultLocale = getDefaultLocale((Node) jcrItem);
124 }
125 }
126 }
127
128 boolean isDefaultLocale = locale.equals(defaultLocale);
129
130 if (i18nBaseProperty.hasI18NSupport()) {
131 final Locale formerLocale = i18nBaseProperty.getTransformer().getLocale();
132 final String basePropertyName = i18nBaseProperty.getTransformer().getBasePropertyName();
133 final String localizedPropertyName = isDefaultLocale ?
134 basePropertyName :
135 constructI18NPropertyName(basePropertyName, locale);
136 i18nBaseProperty.getTransformer().setI18NPropertyName(localizedPropertyName);
137 i18nBaseProperty.getTransformer().setLocale(locale);
138 i18nBaseProperty.fireI18NValueChange();
139 String currentCaption = field.getCaption();
140
141 if (StringUtils.isNotBlank(currentCaption)) {
142 if (formerLocale != null) {
143 currentCaption = currentCaption.replace(String.format("(%s)", formerLocale.getLanguage()), "");
144 }
145 field.setCaption(String.format("%s (%s)", currentCaption, locale.getLanguage()));
146 }
147
148
149 if (field instanceof AbstractField) {
150 ((AbstractField) field).setLocale(locale);
151 }
152
153 } else if (field instanceof AbstractCustomMultiField) {
154
155 ((AbstractCustomMultiField) field).setLocale(locale);
156 }
157
158 }
159 }
160
161
162 if (component instanceof HasComponents) {
163 i18nize((HasComponents) component, locale);
164 }
165 }
166 }
167 }
168
169 @Override
170 public String createI18NURI(Node node, Locale locale) {
171
172 Locale currentLocale = i18nContentSupport.getLocale();
173 String uri = null;
174 try {
175
176 i18nContentSupport.setLocale(locale);
177 uri = LinkUtil.createAbsoluteLink(node);
178 }
179
180 finally {
181 i18nContentSupport.setLocale(currentLocale);
182 }
183 return uri;
184 }
185
186 private String constructI18NPropertyName(CharSequence basePropertyName, Locale locale) {
187 return basePropertyName + "_" + locale.toString();
188 }
189
190 public boolean isEnabled() {
191 return enabled;
192 }
193
194 public void setEnabled(boolean enabled) {
195 this.enabled = enabled;
196 }
197
198 @Override
199 @Deprecated
200 public Locale getAuthorLocale() {
201 log.warn("I18NAuthoringSupport.getAuthorLocale() is deprecated, returning null. Use SubAppContext.getAuthoringLocale() instead.");
202 return null;
203 }
204
205 @Deprecated
206 public void setAuthorLocale(Locale locale) {
207 log.warn("I18NAuthoringSupport.setAuthorLocale(Locale) is deprecated, not doing anything. Use SubAppContext.setAuthoringLocale(Locale) instead.");
208 }
209
210 }