001
014
015 package com.liferay.portal.servlet.filters.language;
016
017 import com.liferay.portal.kernel.language.LanguageUtil;
018 import com.liferay.portal.kernel.language.UnicodeLanguageUtil;
019 import com.liferay.portal.kernel.log.Log;
020 import com.liferay.portal.kernel.log.LogFactoryUtil;
021 import com.liferay.portal.kernel.servlet.BufferCacheServletResponse;
022 import com.liferay.portal.kernel.servlet.PortletServlet;
023 import com.liferay.portal.kernel.servlet.ServletResponseUtil;
024 import com.liferay.portal.kernel.util.HttpUtil;
025 import com.liferay.portal.kernel.util.LocaleUtil;
026 import com.liferay.portal.kernel.util.StringBundler;
027 import com.liferay.portal.kernel.util.StringPool;
028 import com.liferay.portal.model.Portlet;
029 import com.liferay.portal.model.PortletApp;
030 import com.liferay.portal.servlet.filters.BasePortalFilter;
031 import com.liferay.portlet.PortletConfigFactoryUtil;
032
033 import java.util.List;
034 import java.util.Locale;
035 import java.util.regex.Matcher;
036 import java.util.regex.Pattern;
037
038 import javax.portlet.PortletConfig;
039
040 import javax.servlet.FilterChain;
041 import javax.servlet.FilterConfig;
042 import javax.servlet.ServletContext;
043 import javax.servlet.http.HttpServletRequest;
044 import javax.servlet.http.HttpServletResponse;
045
046
050 public class LanguageFilter extends BasePortalFilter {
051
052 @Override
053 public void init(FilterConfig filterConfig) {
054 super.init(filterConfig);
055
056 ServletContext servletContext = filterConfig.getServletContext();
057
058 PortletApp portletApp = (PortletApp)servletContext.getAttribute(
059 PortletServlet.PORTLET_APP);
060
061 if ((portletApp == null) || !portletApp.isWARFile()) {
062 return;
063 }
064
065 List<Portlet> portlets = portletApp.getPortlets();
066
067 if (portlets.size() <= 0) {
068 return;
069 }
070
071 _portletConfig = PortletConfigFactoryUtil.create(
072 portlets.get(0), filterConfig.getServletContext());
073 }
074
075 @Override
076 protected void processFilter(
077 HttpServletRequest request, HttpServletResponse response,
078 FilterChain filterChain)
079 throws Exception {
080
081 BufferCacheServletResponse bufferCacheServletResponse =
082 new BufferCacheServletResponse(response);
083
084 processFilter(
085 LanguageFilter.class, request, bufferCacheServletResponse,
086 filterChain);
087
088 if (_log.isDebugEnabled()) {
089 String completeURL = HttpUtil.getCompleteURL(request);
090
091 _log.debug("Translating response " + completeURL);
092 }
093
094 String content = bufferCacheServletResponse.getString();
095
096 content = translateResponse(request, content);
097
098 ServletResponseUtil.write(response, content);
099 }
100
101 protected String translateResponse(
102 HttpServletRequest request, String content) {
103
104 String languageId = LanguageUtil.getLanguageId(request);
105 Locale locale = LocaleUtil.fromLanguageId(languageId);
106
107 StringBundler sb = new StringBundler();
108
109 Matcher matcher = _pattern.matcher(content);
110
111 int x = 0;
112
113 while (matcher.find()) {
114 int y = matcher.start(0);
115
116 String key = matcher.group(1);
117
118 sb.append(content.substring(x, y));
119 sb.append(StringPool.APOSTROPHE);
120
121 String value = null;
122
123 if (_portletConfig != null) {
124 value = UnicodeLanguageUtil.get(_portletConfig, locale, key);
125 }
126 else {
127 value = UnicodeLanguageUtil.get(locale, key);
128 }
129
130 sb.append(value);
131 sb.append(StringPool.APOSTROPHE);
132
133 x = matcher.end(0);
134 }
135
136 sb.append(content.substring(x));
137
138 return sb.toString();
139 }
140
141 private static Log _log = LogFactoryUtil.getLog(LanguageFilter.class);
142
143 private static Pattern _pattern = Pattern.compile(
144 "Liferay\\.Language\\.get\\([\"']([^)]+)[\"']\\)");
145
146 private PortletConfig _portletConfig;
147
148 }