1
14
15 package com.liferay.portal.servlet.filters.language;
16
17 import com.liferay.portal.kernel.language.LanguageUtil;
18 import com.liferay.portal.kernel.language.UnicodeLanguageUtil;
19 import com.liferay.portal.kernel.servlet.PortletServlet;
20 import com.liferay.portal.kernel.util.LocaleUtil;
21 import com.liferay.portal.kernel.util.StringPool;
22 import com.liferay.portal.model.Portlet;
23 import com.liferay.portal.model.PortletApp;
24 import com.liferay.portal.servlet.filters.BasePortalFilter;
25 import com.liferay.portlet.PortletConfigFactory;
26 import com.liferay.util.servlet.filters.CacheResponse;
27 import com.liferay.util.servlet.filters.CacheResponseData;
28 import com.liferay.util.servlet.filters.CacheResponseUtil;
29
30 import java.util.List;
31 import java.util.Locale;
32 import java.util.regex.Matcher;
33 import java.util.regex.Pattern;
34
35 import javax.portlet.PortletConfig;
36
37 import javax.servlet.FilterChain;
38 import javax.servlet.FilterConfig;
39 import javax.servlet.ServletContext;
40 import javax.servlet.http.HttpServletRequest;
41 import javax.servlet.http.HttpServletResponse;
42
43
48 public class LanguageFilter extends BasePortalFilter {
49
50 public void init(FilterConfig filterConfig) {
51 super.init(filterConfig);
52
53 ServletContext servletContext = filterConfig.getServletContext();
54
55 PortletApp portletApp = (PortletApp)servletContext.getAttribute(
56 PortletServlet.PORTLET_APP);
57
58 if ((portletApp == null) || !portletApp.isWARFile()) {
59 return;
60 }
61
62 List<Portlet> portlets = portletApp.getPortlets();
63
64 if (portlets.size() <= 0) {
65 return;
66 }
67
68 _portletConfig = PortletConfigFactory.create(
69 portlets.get(0), filterConfig.getServletContext());
70 }
71
72 protected void processFilter(
73 HttpServletRequest request, HttpServletResponse response,
74 FilterChain filterChain)
75 throws Exception {
76
77 CacheResponse cacheResponse = new CacheResponse(
78 response, StringPool.UTF8);
79
80 processFilter(
81 LanguageFilter.class, request, cacheResponse, filterChain);
82
83 byte[] bytes = translateResponse(
84 request, cacheResponse, cacheResponse.unsafeGetData(),
85 cacheResponse.getContentLength());
86
87 CacheResponseData cacheResponseData = new CacheResponseData(
88 bytes, bytes.length, cacheResponse.getContentType(),
89 cacheResponse.getHeaders());
90
91 CacheResponseUtil.write(response, cacheResponseData);
92 }
93
94 protected byte[] translateResponse(
95 HttpServletRequest request, HttpServletResponse response,
96 byte[] bytes, int length) {
97
98 String languageId = LanguageUtil.getLanguageId(request);
99 Locale locale = LocaleUtil.fromLanguageId(languageId);
100
101 String content = new String(bytes, 0 ,length);
102
103 Matcher matcher = _pattern.matcher(content);
104
105 while (matcher.find()) {
106 String match = matcher.group(0);
107 String key = matcher.group(1);
108
109 StringBuffer sb = new StringBuffer();
110
111 sb.append(StringPool.APOSTROPHE);
112
113 String value = null;
114
115 if (_portletConfig != null) {
116 value = UnicodeLanguageUtil.get(_portletConfig, locale, key);
117 }
118 else {
119 value = UnicodeLanguageUtil.get(locale, key);
120 }
121
122 sb.append(value);
123 sb.append(StringPool.APOSTROPHE);
124
125 content = content.replace(match, sb.toString());
126 }
127
128 return content.getBytes();
129 }
130
131 private static Pattern _pattern = Pattern.compile(
132 "Liferay\\.Language\\.get\\([\"']([^)]+)[\"']\\)");
133
134 private PortletConfig _portletConfig;
135
136 }