feat: add language filter
This commit is contained in:
parent
a9c5268c46
commit
9fccc6e1de
@ -2,4 +2,13 @@
|
|||||||
<div>
|
<div>
|
||||||
<h3>Charm <3</h3>
|
<h3>Charm <3</h3>
|
||||||
<hr>
|
<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>
|
</div>
|
||||||
@ -7,54 +7,50 @@
|
|||||||
<body>
|
<body>
|
||||||
<%@ include file="header.jsp" %>
|
<%@ include file="header.jsp" %>
|
||||||
<div>
|
<div>
|
||||||
<c:if test="${requestScope.profile.id == null}">
|
|
||||||
<h1>Hello new user!</h1>
|
|
||||||
</c:if>
|
|
||||||
<form method="post" action="/profile">
|
<form method="post" action="/profile">
|
||||||
<c:if test="${requestScope.profile.id != null}">
|
<c:if test="${requestScope.profile.id != null}">
|
||||||
<input hidden name="_method" value="PUT">
|
<input type = "hidden" name = "_method" value = "put"/>
|
||||||
</c:if>
|
</c:if>
|
||||||
<input hidden type="text" name="id" value="${requestScope.profile.id}">
|
<input type = "hidden" name="id" value="${requestScope.profile.id}">
|
||||||
<table>
|
<table>
|
||||||
<tr>
|
<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>
|
<td><input type="email" name="email" value="${requestScope.profile.email}"></td>
|
||||||
</tr>
|
</tr>
|
||||||
<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>
|
<td><input type="text" name="name" value="${requestScope.profile.name}"></td>
|
||||||
</tr>
|
</tr>
|
||||||
<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>
|
<td><input type="text" name="surname" value="${requestScope.profile.surname}"></td>
|
||||||
</tr>
|
</tr>
|
||||||
<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>
|
<td><input type="text" name="about" value="${requestScope.profile.about}"></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><h3>Gender</h3></td>
|
<td><h3>${requestScope.wordBundle.getWord("gender")}</h3></td>
|
||||||
<td>
|
<td>
|
||||||
<select name="gender">
|
<select name="gender">
|
||||||
<option value="${requestScope.profile.gender}" selected hidden>${requestScope.profile.gender}</option>
|
<option value="${requestScope.profile.gender}" selected hidden>${requestScope.profile.gender}</option>
|
||||||
<c:forEach var="gender" items="${applicationScope.genders}">
|
<c:forEach var="gender" items="${applicationScope.genders}">
|
||||||
<option value="${gender}">${gender}</option>
|
<option value="${gender}">${requestScope.wordBundle.getWord(gender)}</option>
|
||||||
</c:forEach>
|
</c:forEach>
|
||||||
</select>
|
</select>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
<button type="submit">Save</button>
|
<button type="submit">${requestScope.wordBundle.getWord("save")}</button>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
<c:if test="${requestScope.profile.id != null}">
|
<c:if test="${requestScope.profile.id != null}">
|
||||||
<form action="/profile" method="post">
|
<form method="post" action="/profile">
|
||||||
<input hidden name="_method" value="DELETE">
|
<input type = "hidden" name = "_method" value = "delete"/>
|
||||||
<input hidden name="id" value="${requestScope.profile.id}">
|
<input type = "hidden" name="id" value="${requestScope.profile.id}">
|
||||||
<button type="submit">Delete</button>
|
<button type="submit">${requestScope.wordBundle.getWord("delete")}</button>
|
||||||
</form>
|
</form>
|
||||||
</c:if>
|
</c:if>
|
||||||
</div>
|
</div>
|
||||||
<%@ include file="footer.html" %>
|
<%@ include file="footer.jsp" %>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
11
resources/words.properties
Normal file
11
resources/words.properties
Normal 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
|
||||||
11
resources/words_en.properties
Normal file
11
resources/words_en.properties
Normal 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
|
||||||
11
resources/words_ru.properties
Normal file
11
resources/words_ru.properties
Normal 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
|
||||||
31
src/ru/charm/back/controller/LanguageController.java
Normal file
31
src/ru/charm/back/controller/LanguageController.java
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
34
src/ru/charm/back/controller/filter/LanguageFilter.java
Normal file
34
src/ru/charm/back/controller/filter/LanguageFilter.java
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
32
src/ru/charm/back/service/WordBundle.java
Normal file
32
src/ru/charm/back/service/WordBundle.java
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user