1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/src/main/java/de/uapcore/lightpit/modules/LanguageModule.java Sat May 09 14:26:31 2020 +0200 1.3 @@ -0,0 +1,118 @@ 1.4 +/* 1.5 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 1.6 + * 1.7 + * Copyright 2018 Mike Becker. All rights reserved. 1.8 + * 1.9 + * Redistribution and use in source and binary forms, with or without 1.10 + * modification, are permitted provided that the following conditions are met: 1.11 + * 1.12 + * 1. Redistributions of source code must retain the above copyright 1.13 + * notice, this list of conditions and the following disclaimer. 1.14 + * 1.15 + * 2. Redistributions in binary form must reproduce the above copyright 1.16 + * notice, this list of conditions and the following disclaimer in the 1.17 + * documentation and/or other materials provided with the distribution. 1.18 + * 1.19 + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 1.20 + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1.21 + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1.22 + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 1.23 + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 1.24 + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 1.25 + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 1.26 + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 1.27 + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 1.28 + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 1.29 + * POSSIBILITY OF SUCH DAMAGE. 1.30 + * 1.31 + */ 1.32 +package de.uapcore.lightpit.modules; 1.33 + 1.34 +import de.uapcore.lightpit.LightPITModule; 1.35 +import de.uapcore.lightpit.AbstractLightPITServlet; 1.36 +import de.uapcore.lightpit.Constants; 1.37 +import de.uapcore.lightpit.Functions; 1.38 +import de.uapcore.lightpit.HttpMethod; 1.39 +import javax.servlet.annotation.WebServlet; 1.40 +import javax.servlet.http.HttpServletRequest; 1.41 +import javax.servlet.http.HttpServletResponse; 1.42 +import de.uapcore.lightpit.RequestMapping; 1.43 +import de.uapcore.lightpit.ResponseType; 1.44 +import java.util.ArrayList; 1.45 +import java.util.IllformedLocaleException; 1.46 +import java.util.List; 1.47 +import java.util.Locale; 1.48 +import java.util.Optional; 1.49 +import javax.servlet.ServletException; 1.50 +import org.slf4j.Logger; 1.51 +import org.slf4j.LoggerFactory; 1.52 + 1.53 + 1.54 +@LightPITModule( 1.55 + bundleBaseName = "localization.language", 1.56 + modulePath = "language" 1.57 +) 1.58 +@WebServlet( 1.59 + name = "LanguageModule", 1.60 + urlPatterns = "/language/*" 1.61 +) 1.62 +public final class LanguageModule extends AbstractLightPITServlet { 1.63 + 1.64 + private static final Logger LOG = LoggerFactory.getLogger(LanguageModule.class); 1.65 + 1.66 + private final List<Locale> languages = new ArrayList<>(); 1.67 + 1.68 + @Override 1.69 + public void init() throws ServletException { 1.70 + super.init(); 1.71 + 1.72 + Optional<String[]> langs = Functions.availableLanguages(getServletContext()); 1.73 + if (langs.isPresent()) { 1.74 + for (String lang : langs.get()) { 1.75 + try { 1.76 + Locale locale = Locale.forLanguageTag(lang); 1.77 + if (locale.getLanguage().isEmpty()) { 1.78 + throw new IllformedLocaleException(); 1.79 + } 1.80 + languages.add(locale); 1.81 + } catch (IllformedLocaleException ex) { 1.82 + LOG.warn("Specified lanaguge {} in context parameter cannot be mapped to an existing locale - skipping.", lang); 1.83 + } 1.84 + } 1.85 + 1.86 + } else { 1.87 + languages.add(Locale.ENGLISH); 1.88 + LOG.warn("Context parameter 'available-languges' not found. Only english will be available."); 1.89 + } 1.90 + } 1.91 + 1.92 + @Override 1.93 + public void destroy() { 1.94 + super.destroy(); 1.95 + languages.clear(); 1.96 + } 1.97 + 1.98 + @RequestMapping(method = HttpMethod.GET) 1.99 + public ResponseType handle(HttpServletRequest req, HttpServletResponse resp) { 1.100 + 1.101 + req.setAttribute("languages", languages); 1.102 + req.setAttribute("browserLanguage", req.getLocale()); 1.103 + 1.104 + setStylesheet(req, "language"); 1.105 + setDynamicFragment(req, "language"); 1.106 + return ResponseType.HTML_FULL; 1.107 + } 1.108 + 1.109 + @RequestMapping(method = HttpMethod.POST) 1.110 + public ResponseType switchLanguage(HttpServletRequest req, HttpServletResponse resp) { 1.111 + 1.112 + Optional<Locale> chosenLanguage = Optional.ofNullable(req.getParameter("language")) 1.113 + .map(Locale::forLanguageTag) 1.114 + .filter((l) -> !l.getLanguage().isEmpty()); 1.115 + 1.116 + chosenLanguage.ifPresent((l) -> req.getSession().setAttribute(Constants.SESSION_ATTR_LANGUAGE, l)); 1.117 + chosenLanguage.ifPresent(resp::setLocale); 1.118 + 1.119 + return handle(req, resp); 1.120 + } 1.121 +}