1 /* |
1 /* |
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
3 * |
3 * |
4 * Copyright 2018 Mike Becker. All rights reserved. |
4 * Copyright 2018 Mike Becker. All rights reserved. |
5 * |
5 * |
6 * Redistribution and use in source and binary forms, with or without |
6 * Redistribution and use in source and binary forms, with or without |
7 * modification, are permitted provided that the following conditions are met: |
7 * modification, are permitted provided that the following conditions are met: |
8 * |
8 * |
9 * 1. Redistributions of source code must retain the above copyright |
9 * 1. Redistributions of source code must retain the above copyright |
10 * notice, this list of conditions and the following disclaimer. |
10 * notice, this list of conditions and the following disclaimer. |
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
26 * POSSIBILITY OF SUCH DAMAGE. |
26 * POSSIBILITY OF SUCH DAMAGE. |
27 * |
27 * |
28 */ |
28 */ |
29 package de.uapcore.lightpit.modules; |
29 package de.uapcore.lightpit.modules; |
30 |
30 |
31 import de.uapcore.lightpit.*; |
31 import de.uapcore.lightpit.*; |
32 import org.slf4j.Logger; |
32 import org.slf4j.Logger; |
47 @WebServlet( |
47 @WebServlet( |
48 name = "LanguageModule", |
48 name = "LanguageModule", |
49 urlPatterns = "/language/*" |
49 urlPatterns = "/language/*" |
50 ) |
50 ) |
51 public final class LanguageModule extends AbstractLightPITServlet { |
51 public final class LanguageModule extends AbstractLightPITServlet { |
52 |
52 |
53 private static final Logger LOG = LoggerFactory.getLogger(LanguageModule.class); |
53 private static final Logger LOG = LoggerFactory.getLogger(LanguageModule.class); |
54 |
54 |
55 private final List<Locale> languages = new ArrayList<>(); |
55 private final List<Locale> languages = new ArrayList<>(); |
56 |
56 |
57 @Override |
57 @Override |
58 public void init() throws ServletException { |
58 public void init() throws ServletException { |
59 super.init(); |
59 super.init(); |
60 |
60 |
61 Optional<String[]> langs = Functions.availableLanguages(getServletContext()); |
61 Optional<String[]> langs = Functions.availableLanguages(getServletContext()); |
62 if (langs.isPresent()) { |
62 if (langs.isPresent()) { |
63 for (String lang : langs.get()) { |
63 for (String lang : langs.get()) { |
64 try { |
64 try { |
65 Locale locale = Locale.forLanguageTag(lang); |
65 Locale locale = Locale.forLanguageTag(lang); |
69 languages.add(locale); |
69 languages.add(locale); |
70 } catch (IllformedLocaleException ex) { |
70 } catch (IllformedLocaleException ex) { |
71 LOG.warn("Specified lanaguge {} in context parameter cannot be mapped to an existing locale - skipping.", lang); |
71 LOG.warn("Specified lanaguge {} in context parameter cannot be mapped to an existing locale - skipping.", lang); |
72 } |
72 } |
73 } |
73 } |
74 |
74 |
75 } else { |
75 } else { |
76 languages.add(Locale.ENGLISH); |
76 languages.add(Locale.ENGLISH); |
77 LOG.warn("Context parameter 'available-languges' not found. Only english will be available."); |
77 LOG.warn("Context parameter 'available-languges' not found. Only english will be available."); |
78 } |
78 } |
79 } |
79 } |
81 @Override |
81 @Override |
82 public void destroy() { |
82 public void destroy() { |
83 super.destroy(); |
83 super.destroy(); |
84 languages.clear(); |
84 languages.clear(); |
85 } |
85 } |
86 |
86 |
87 @RequestMapping(method = HttpMethod.GET) |
87 @RequestMapping(method = HttpMethod.GET) |
88 public ResponseType handle(HttpServletRequest req, HttpServletResponse resp) { |
88 public ResponseType handle(HttpServletRequest req, HttpServletResponse resp) { |
89 |
89 |
90 req.setAttribute("languages", languages); |
90 req.setAttribute("languages", languages); |
91 req.setAttribute("browserLanguage", req.getLocale()); |
91 req.setAttribute("browserLanguage", req.getLocale()); |
92 |
92 |
93 setStylesheet(req, "language"); |
93 setStylesheet(req, "language"); |
94 setDynamicFragment(req, "language"); |
94 setDynamicFragment(req, "language"); |
95 return ResponseType.HTML_FULL; |
95 return ResponseType.HTML_FULL; |
96 } |
96 } |
97 |
97 |
98 @RequestMapping(method = HttpMethod.POST) |
98 @RequestMapping(method = HttpMethod.POST) |
99 public ResponseType switchLanguage(HttpServletRequest req, HttpServletResponse resp) { |
99 public ResponseType switchLanguage(HttpServletRequest req, HttpServletResponse resp) { |
100 |
100 |
101 Optional<Locale> chosenLanguage = Optional.ofNullable(req.getParameter("language")) |
101 Optional<Locale> chosenLanguage = Optional.ofNullable(req.getParameter("language")) |
102 .map(Locale::forLanguageTag) |
102 .map(Locale::forLanguageTag) |
103 .filter((l) -> !l.getLanguage().isEmpty()); |
103 .filter((l) -> !l.getLanguage().isEmpty()); |
104 |
104 |
105 chosenLanguage.ifPresent((l) -> req.getSession().setAttribute(Constants.SESSION_ATTR_LANGUAGE, l)); |
105 chosenLanguage.ifPresent((l) -> req.getSession().setAttribute(Constants.SESSION_ATTR_LANGUAGE, l)); |
106 chosenLanguage.ifPresent(resp::setLocale); |
106 chosenLanguage.ifPresent(resp::setLocale); |
107 |
107 |
108 return handle(req, resp); |
108 return handle(req, resp); |
109 } |
109 } |
110 } |
110 } |