src/main/java/de/uapcore/lightpit/modules/LanguageModule.java

changeset 29
27a0fdd7bca7
parent 24
8137ec335416
child 31
58f78f0142e8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/de/uapcore/lightpit/modules/LanguageModule.java	Sat May 09 14:26:31 2020 +0200
@@ -0,0 +1,118 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ * 
+ * Copyright 2018 Mike Becker. All rights reserved.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *   1. Redistributions of source code must retain the above copyright
+ *      notice, this list of conditions and the following disclaimer.
+ *
+ *   2. Redistributions in binary form must reproduce the above copyright
+ *      notice, this list of conditions and the following disclaimer in the
+ *      documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+package de.uapcore.lightpit.modules;
+
+import de.uapcore.lightpit.LightPITModule;
+import de.uapcore.lightpit.AbstractLightPITServlet;
+import de.uapcore.lightpit.Constants;
+import de.uapcore.lightpit.Functions;
+import de.uapcore.lightpit.HttpMethod;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import de.uapcore.lightpit.RequestMapping;
+import de.uapcore.lightpit.ResponseType;
+import java.util.ArrayList;
+import java.util.IllformedLocaleException;
+import java.util.List;
+import java.util.Locale;
+import java.util.Optional;
+import javax.servlet.ServletException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+@LightPITModule(
+        bundleBaseName = "localization.language",
+        modulePath = "language"
+)
+@WebServlet(
+        name = "LanguageModule",
+        urlPatterns = "/language/*"
+)
+public final class LanguageModule extends AbstractLightPITServlet {
+    
+    private static final Logger LOG = LoggerFactory.getLogger(LanguageModule.class);
+    
+    private final List<Locale> languages = new ArrayList<>();
+
+    @Override
+    public void init() throws ServletException {
+        super.init();
+        
+        Optional<String[]> langs = Functions.availableLanguages(getServletContext());
+        if (langs.isPresent()) {
+            for (String lang : langs.get()) {
+                try {
+                    Locale locale = Locale.forLanguageTag(lang);
+                    if (locale.getLanguage().isEmpty()) {
+                        throw new IllformedLocaleException();
+                    }
+                    languages.add(locale);
+                } catch (IllformedLocaleException ex) {
+                    LOG.warn("Specified lanaguge {} in context parameter cannot be mapped to an existing locale - skipping.", lang);
+                }
+            }
+            
+        } else {
+            languages.add(Locale.ENGLISH);
+            LOG.warn("Context parameter 'available-languges' not found. Only english will be available.");
+        }
+    }
+
+    @Override
+    public void destroy() {
+        super.destroy();
+        languages.clear();
+    }
+    
+    @RequestMapping(method = HttpMethod.GET)
+    public ResponseType handle(HttpServletRequest req, HttpServletResponse resp) {
+
+        req.setAttribute("languages", languages);
+        req.setAttribute("browserLanguage", req.getLocale());
+        
+        setStylesheet(req, "language");
+        setDynamicFragment(req, "language");
+        return ResponseType.HTML_FULL;
+    }
+    
+    @RequestMapping(method = HttpMethod.POST)
+    public ResponseType switchLanguage(HttpServletRequest req, HttpServletResponse resp) {
+        
+        Optional<Locale> chosenLanguage = Optional.ofNullable(req.getParameter("language"))
+                .map(Locale::forLanguageTag)
+                .filter((l) -> !l.getLanguage().isEmpty());
+        
+        chosenLanguage.ifPresent((l) -> req.getSession().setAttribute(Constants.SESSION_ATTR_LANGUAGE, l));
+        chosenLanguage.ifPresent(resp::setLocale);
+        
+        return handle(req, resp);
+    }
+}

mercurial