From 9fccc6e1deaf986a1140a36f14828954081f7232 Mon Sep 17 00:00:00 2001 From: Sergey Krylov Date: Mon, 16 Feb 2026 05:34:13 +0300 Subject: [PATCH] feat: add language filter --- .../WEB-INF/jsp/{footer.html => footer.jsp} | 0 resources/WEB-INF/jsp/header.jsp | 9 +++++ resources/WEB-INF/jsp/profile.jsp | 32 ++++++++--------- resources/words.properties | 11 ++++++ resources/words_en.properties | 11 ++++++ resources/words_ru.properties | 11 ++++++ .../back/controller/LanguageController.java | 31 +++++++++++++++++ .../controller/filter/LanguageFilter.java | 34 +++++++++++++++++++ src/ru/charm/back/service/WordBundle.java | 32 +++++++++++++++++ 9 files changed, 153 insertions(+), 18 deletions(-) rename resources/WEB-INF/jsp/{footer.html => footer.jsp} (100%) create mode 100644 resources/words.properties create mode 100644 resources/words_en.properties create mode 100644 resources/words_ru.properties create mode 100644 src/ru/charm/back/controller/LanguageController.java create mode 100644 src/ru/charm/back/controller/filter/LanguageFilter.java create mode 100644 src/ru/charm/back/service/WordBundle.java diff --git a/resources/WEB-INF/jsp/footer.html b/resources/WEB-INF/jsp/footer.jsp similarity index 100% rename from resources/WEB-INF/jsp/footer.html rename to resources/WEB-INF/jsp/footer.jsp diff --git a/resources/WEB-INF/jsp/header.jsp b/resources/WEB-INF/jsp/header.jsp index 57a80bb..681bdf6 100644 --- a/resources/WEB-INF/jsp/header.jsp +++ b/resources/WEB-INF/jsp/header.jsp @@ -2,4 +2,13 @@

Charm <3


+ +
+ + +
+ +

My current language: ${cookie["lang"].value}

+ +
\ No newline at end of file diff --git a/resources/WEB-INF/jsp/profile.jsp b/resources/WEB-INF/jsp/profile.jsp index ab56e13..4a9880e 100644 --- a/resources/WEB-INF/jsp/profile.jsp +++ b/resources/WEB-INF/jsp/profile.jsp @@ -7,54 +7,50 @@ <%@ include file="header.jsp" %>
- -

Hello new user!

-
- + - + - + - + - + - + - +

Email

${requestScope.wordBundle.getWord("email")}

Name

${requestScope.wordBundle.getWord("name")}

Surname

${requestScope.wordBundle.getWord("surname")}

About

${requestScope.wordBundle.getWord("about")}

Gender

${requestScope.wordBundle.getWord("gender")}

- +
- -
- - - + + + +
-<%@ include file="footer.html" %> +<%@ include file="footer.jsp" %> \ No newline at end of file diff --git a/resources/words.properties b/resources/words.properties new file mode 100644 index 0000000..aefe61d --- /dev/null +++ b/resources/words.properties @@ -0,0 +1,11 @@ +about=About +all-rights-reserved=All rights reserved +delete=Delete +email=Email +female=Female +gender=Gender +male=Male +name=Name +other=Other +save=Save +surname=Surname \ No newline at end of file diff --git a/resources/words_en.properties b/resources/words_en.properties new file mode 100644 index 0000000..aefe61d --- /dev/null +++ b/resources/words_en.properties @@ -0,0 +1,11 @@ +about=About +all-rights-reserved=All rights reserved +delete=Delete +email=Email +female=Female +gender=Gender +male=Male +name=Name +other=Other +save=Save +surname=Surname \ No newline at end of file diff --git a/resources/words_ru.properties b/resources/words_ru.properties new file mode 100644 index 0000000..e6f9218 --- /dev/null +++ b/resources/words_ru.properties @@ -0,0 +1,11 @@ +about=\u041E \u0441\u0435\u0431\u0435 +all-rights-reserved=\u0412\u0441\u0435 \u043F\u0440\u0430\u0432\u0430 \u0437\u0430\u0449\u0438\u0449\u0435\u043D\u044B +delete=\u0423\u0434\u0430\u043B\u0438\u0442\u044C +email=\u041F\u043E\u0447\u0442\u0430 +female=\u0416\u0435\u043D\u0449\u0438\u043D\u0430 +gender=\u041F\u043E\u043B +male=\u041C\u0443\u0436\u0447\u0438\u043D\u0430 +name=\u0418\u043C\u044F +other=\u0414\u0440\u0443\u0433\u043E\u0435 +save=\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C +surname=\u0424\u0430\u043C\u0438\u043B\u0438\u044F \ No newline at end of file diff --git a/src/ru/charm/back/controller/LanguageController.java b/src/ru/charm/back/controller/LanguageController.java new file mode 100644 index 0000000..981a625 --- /dev/null +++ b/src/ru/charm/back/controller/LanguageController.java @@ -0,0 +1,31 @@ +package ru.charm.back.controller; + +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.Cookie; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +import java.io.IOException; + +@WebServlet("/lang") +public class LanguageController extends HttpServlet { + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + String lang = req.getParameter("lang"); + + System.out.println("Cookie header" + req.getHeader("Cookie")); + + Cookie cookie = new Cookie("lang", "en"); + if ("ru".equals(lang)) { + cookie.setValue("ru"); + } + + resp.addCookie(cookie); + + String referer = req.getHeader("Referer"); + resp.sendRedirect(referer); + } +} diff --git a/src/ru/charm/back/controller/filter/LanguageFilter.java b/src/ru/charm/back/controller/filter/LanguageFilter.java new file mode 100644 index 0000000..aecc4c4 --- /dev/null +++ b/src/ru/charm/back/controller/filter/LanguageFilter.java @@ -0,0 +1,34 @@ +package ru.charm.back.controller.filter; + +import jakarta.servlet.*; +import jakarta.servlet.annotation.WebFilter; +import jakarta.servlet.http.Cookie; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import ru.charm.back.service.WordBundle; + +import java.io.IOException; +import java.util.Arrays; + +@WebFilter("/*") +public class LanguageFilter implements Filter { + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { + HttpServletRequest req = (HttpServletRequest) servletRequest; + HttpServletResponse res = (HttpServletResponse) servletResponse; + + Cookie[] cookies = req.getCookies() != null ? req.getCookies() : new Cookie[]{}; + + String lang = Arrays.stream(cookies) + .filter(cookie -> "lang".equals(cookie.getName())) + .map(Cookie::getValue) + .findFirst() + .orElse("en"); + + WordBundle wordBundle = new WordBundle(lang); + + req.setAttribute("wordBundle", wordBundle); + + filterChain.doFilter(req, res); + } +} diff --git a/src/ru/charm/back/service/WordBundle.java b/src/ru/charm/back/service/WordBundle.java new file mode 100644 index 0000000..67a5a7a --- /dev/null +++ b/src/ru/charm/back/service/WordBundle.java @@ -0,0 +1,32 @@ +package ru.charm.back.service; + + +import java.util.Locale; +import java.util.MissingResourceException; +import java.util.ResourceBundle; + + +public class WordBundle { + private final ResourceBundle resourceBundle; + + public WordBundle(String lang) { + Locale locale = Locale.of("en"); + if ("ru".equals(lang)) { + locale = Locale.of("ru"); + } + this.resourceBundle = ResourceBundle.getBundle("words", locale); + } + + public String getWord(String key) { + String result; + try { + result = resourceBundle.getString(key.toLowerCase()); + } catch (MissingResourceException | ClassCastException e) { + String[] pathArray = key.split("\\."); + result = pathArray[pathArray.length - 1]; + } catch (Exception e) { + return "* empty *"; + } + return result; + } +}