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.transformer.TransformedProperty;
41
42 import java.util.ArrayList;
43 import java.util.Iterator;
44 import java.util.List;
45 import java.util.Locale;
46
47 import javax.jcr.Node;
48
49 import com.vaadin.data.Property;
50 import com.vaadin.ui.Component;
51 import com.vaadin.ui.Field;
52 import com.vaadin.ui.HasComponents;
53
54
55
56
57 public class DefaultI18NAuthoringSupport implements I18NAuthoringSupport {
58
59 private I18nContentSupport i18nContentSupport;
60
61 private boolean enabled = true;
62
63 public DefaultI18NAuthoringSupport() {
64 this.i18nContentSupport = Components.getComponent(I18nContentSupport.class);
65 }
66
67
68
69
70
71
72
73
74 @Override
75 public List<Locale> getAvailableLocales(Node node) {
76 if (enabled && i18nContentSupport.isEnabled()) {
77 return new ArrayList<Locale>(i18nContentSupport.getLocales());
78 }
79 return null;
80 }
81
82 @Override
83 public void i18nize(HasComponents fieldContainer, Locale locale) {
84 Iterator<Component> it = fieldContainer.iterator();
85 boolean isFallbackLanguage = i18nContentSupport.getFallbackLocale().equals(locale);
86 if (isEnabled() && i18nContentSupport.isEnabled() && locale != null) {
87 while (it.hasNext()) {
88 Component c = it.next();
89 if (c instanceof Field) {
90 Field f = (Field) c;
91 Property p = f.getPropertyDataSource();
92 if (p instanceof TransformedProperty) {
93 final TransformedProperty i18nBaseProperty = (TransformedProperty) p;
94 if (!i18nBaseProperty.hasI18NSupport()) {
95 continue;
96 }
97 final Locale formerLocale = i18nBaseProperty.getTransformer().getLocale();
98 final String basePropertyName = i18nBaseProperty.getTransformer().getBasePropertyName();
99 final String localizedPropertyName = isFallbackLanguage ?
100 basePropertyName :
101 constructI18NPropertyName(basePropertyName, locale);
102 i18nBaseProperty.getTransformer().setI18NPropertyName(localizedPropertyName);
103 i18nBaseProperty.getTransformer().setLocale(locale);
104 i18nBaseProperty.fireI18NValueChange();
105 String currentCaption = c.getCaption();
106 if (formerLocale != null) {
107 currentCaption = currentCaption.replace(String.format("(%s)", formerLocale.getLanguage()), "");
108 }
109 f.setCaption(String.format("%s (%s)", currentCaption, locale.getLanguage()));
110 }
111 } else if (c instanceof HasComponents) {
112 i18nize((HasComponents) c, locale);
113 }
114 }
115 }
116 }
117
118 @Override
119 public String createI18NURI(Node node, Locale locale){
120
121 Locale currentLocale = i18nContentSupport.getLocale();
122 String uri = null;
123 try {
124
125 i18nContentSupport.setLocale(locale);
126 uri = LinkUtil.createAbsoluteLink(node);
127 }
128
129 finally{
130 i18nContentSupport.setLocale(currentLocale);
131 }
132 return uri;
133 }
134 private String constructI18NPropertyName(CharSequence basePropertyName, Locale locale) {
135 return basePropertyName + "_" + locale.toString();
136 }
137
138 public boolean isEnabled() {
139 return enabled;
140 }
141
142 public void setEnabled(boolean enabled) {
143 this.enabled = enabled;
144 }
145
146 }