feat: add language filter

This commit is contained in:
Sergey Krylov 2026-02-16 05:34:13 +03:00
parent a9c5268c46
commit 9fccc6e1de
9 changed files with 153 additions and 18 deletions

View File

@ -2,4 +2,13 @@
<div>
<h3>Charm <3</h3>
<hr>
<form action="/lang" method="post">
<button name="lang" value="ru">Русский</button>
<button name="lang" value="en">English</button>
</form>
<h3>My current language: ${cookie["lang"].value}</h3>
<hr>
</div>

View File

@ -7,54 +7,50 @@
<body>
<%@ include file="header.jsp" %>
<div>
<c:if test="${requestScope.profile.id == null}">
<h1>Hello new user!</h1>
</c:if>
<form method="post" action="/profile">
<c:if test="${requestScope.profile.id != null}">
<input hidden name="_method" value="PUT">
<input type = "hidden" name = "_method" value = "put"/>
</c:if>
<input hidden type="text" name="id" value="${requestScope.profile.id}">
<input type = "hidden" name="id" value="${requestScope.profile.id}">
<table>
<tr>
<td><h3>Email</h3></td>
<td><h3>${requestScope.wordBundle.getWord("email")}</h3></td>
<td><input type="email" name="email" value="${requestScope.profile.email}"></td>
</tr>
<tr>
<td><h3>Name</h3></td>
<td><h3>${requestScope.wordBundle.getWord("name")}</h3></td>
<td><input type="text" name="name" value="${requestScope.profile.name}"></td>
</tr>
<tr>
<td><h3>Surname</h3></td>
<td><h3>${requestScope.wordBundle.getWord("surname")}</h3></td>
<td><input type="text" name="surname" value="${requestScope.profile.surname}"></td>
</tr>
<tr>
<td><h3>About</h3></td>
<td><h3>${requestScope.wordBundle.getWord("about")}</h3></td>
<td><input type="text" name="about" value="${requestScope.profile.about}"></td>
</tr>
<tr>
<td><h3>Gender</h3></td>
<td><h3>${requestScope.wordBundle.getWord("gender")}</h3></td>
<td>
<select name="gender">
<option value="${requestScope.profile.gender}" selected hidden>${requestScope.profile.gender}</option>
<c:forEach var="gender" items="${applicationScope.genders}">
<option value="${gender}">${gender}</option>
<option value="${gender}">${requestScope.wordBundle.getWord(gender)}</option>
</c:forEach>
</select>
</td>
</tr>
</table>
<button type="submit">Save</button>
<button type="submit">${requestScope.wordBundle.getWord("save")}</button>
</form>
<c:if test="${requestScope.profile.id != null}">
<form action="/profile" method="post">
<input hidden name="_method" value="DELETE">
<input hidden name="id" value="${requestScope.profile.id}">
<button type="submit">Delete</button>
<form method="post" action="/profile">
<input type = "hidden" name = "_method" value = "delete"/>
<input type = "hidden" name="id" value="${requestScope.profile.id}">
<button type="submit">${requestScope.wordBundle.getWord("delete")}</button>
</form>
</c:if>
</div>
<%@ include file="footer.html" %>
<%@ include file="footer.jsp" %>
</body>
</html>

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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;
}
}