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.i18nsystem;
35
36 import info.magnolia.cms.i18n.MessagesManager;
37 import info.magnolia.cms.util.ClasspathResourcesUtil;
38 import info.magnolia.i18nsystem.util.LocaleUtils;
39 import org.apache.commons.io.IOUtils;
40 import org.apache.commons.lang.StringUtils;
41 import org.slf4j.Logger;
42 import org.slf4j.LoggerFactory;
43 import java.io.IOException;
44 import java.io.InputStreamReader;
45 import java.io.Reader;
46 import java.util.HashMap;
47 import java.util.Locale;
48 import java.util.Map;
49 import java.util.Properties;
50
51
52
53
54 public class DefaultMessageBundlesLoader {
55 private static final Logger log = LoggerFactory.getLogger(DefaultMessageBundlesLoader.class);
56
57 private final Map<Locale, Properties> messages = new HashMap<Locale, Properties>();
58
59 public DefaultMessageBundlesLoader() {
60 loadMessages();
61 }
62
63 Map<Locale, Properties> getMessages() {
64 return messages;
65 }
66
67 private void loadMessages() {
68 final String[] propertiesFiles = ClasspathResourcesUtil.findResources(new ClasspathResourcesUtil.Filter() {
69 @Override
70 public boolean accept(String name) {
71 return name.startsWith("/mgnl-i18n/") && name.endsWith(".properties");
72 }
73 });
74
75 for (String propertiesFile : propertiesFiles) {
76 Reader inStream = null;
77 try {
78 final String fileName = StringUtils.substringAfterLast(propertiesFile, "/");
79 Locale locale = resolveLocale(fileName);
80
81 log.debug("Loading properties file at [{}] with locale [{}]...", propertiesFile, locale);
82 inStream = new InputStreamReader(ClasspathResourcesUtil.getStream(propertiesFile), "UTF-8");
83
84 final Properties properties = new Properties();
85 properties.load(inStream);
86 Properties existingProperties = messages.get(locale);
87
88 if (existingProperties != null) {
89
90 log.debug("Adding properties to already existing ones under {} locale", locale);
91 properties.putAll(existingProperties);
92 }
93 messages.put(locale, properties);
94 } catch (IOException e) {
95 log.warn("An IO error occurred while trying to read properties file at [{}]", propertiesFile, e);
96 } finally {
97 IOUtils.closeQuietly(inStream);
98 }
99 }
100 }
101
102
103
104
105 protected Locale resolveLocale(final String fileName) {
106 return LocaleUtils.parseFromFilename(fileName, getFallbackLocale());
107 }
108
109
110 private Locale getFallbackLocale() {
111 return MessagesManager.getInstance().getDefaultLocale();
112 }
113 }