Skip to content

Commit a1ade79

Browse files
committed
Add ability to choose language.
Note that I didn't add link for changing language to error pages because I'm not sure that we need it. Also on some error pages we log event to the database and such link may produce meaningless log records. Fix #200
1 parent a2e9db2 commit a1ade79

File tree

17 files changed

+304
-39
lines changed

17 files changed

+304
-39
lines changed

src/main/java/ru/mystamps/web/config/MvcConfig.java

+20
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import javax.inject.Inject;
2121

2222
import java.util.List;
23+
import java.util.Locale;
2324

2425
import org.springframework.context.annotation.Bean;
2526
import org.springframework.context.annotation.Configuration;
@@ -31,10 +32,14 @@
3132
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
3233
import org.springframework.validation.Validator;
3334
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
35+
import org.springframework.web.servlet.LocaleResolver;
3436
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
37+
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
3538
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
3639
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
3740
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
41+
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
42+
import org.springframework.web.servlet.i18n.SessionLocaleResolver;
3843

3944
import ru.mystamps.web.support.spring.security.CustomUserDetailsArgumentResolver;
4045
import ru.mystamps.web.Url;
@@ -95,6 +100,21 @@ public Validator getValidator() {
95100
return factory;
96101
}
97102

103+
@Override
104+
public void addInterceptors(InterceptorRegistry registry) {
105+
LocaleChangeInterceptor interceptor = new LocaleChangeInterceptor();
106+
interceptor.setParamName("lang");
107+
108+
registry.addInterceptor(interceptor);
109+
}
110+
111+
@Bean(name = "localeResolver")
112+
public LocaleResolver getLocaleResolver() {
113+
SessionLocaleResolver resolver = new SessionLocaleResolver();
114+
resolver.setDefaultLocale(Locale.ENGLISH);
115+
return resolver;
116+
}
117+
98118
@Bean
99119
@Inject
100120
public DomainClassConverter<?> getDomainClassConverter(FormattingConversionService service) {

src/main/resources/ru/mystamps/i18n/Messages.properties

+2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
typeMismatch = Invalid value
22

33
# shared
4+
t_english = English
5+
t_russian = Russian
46
t_login = Login
57
t_logout = Sign out
68
t_password = Password

src/main/resources/ru/mystamps/i18n/Messages_ru.properties

+2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
typeMismatch = Некорректное значение
22

33
# используемые на нескольких страницах
4+
t_english = Английский
5+
t_russian = Русский
46
t_login = Логин
57
t_logout = Выйти
68
t_password = Пароль

src/main/webapp/WEB-INF/static/styles/main.css

+7
Original file line numberDiff line numberDiff line change
@@ -75,3 +75,10 @@ label {
7575
.row .series-images {
7676
margin-bottom: 10px;
7777
}
78+
79+
/* http://stackoverflow.com/questions/20547819/vertical-align-with-bootstrap-3 */
80+
.vcenter {
81+
display: inline-block;
82+
vertical-align: middle;
83+
float: none;
84+
}

src/main/webapp/WEB-INF/views/account/activate.html

+21-3
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,29 @@
1515
<body lang="en" th:lang="${#locale.language == 'ru' ? 'ru' : 'en'}">
1616
<div class="container-fluid">
1717
<div class="row" id="header">
18-
<div id="logo" class="col-sm-10">
18+
<div id="logo" class="col-sm-9 vcenter">
1919
<a href="../site/index.html" th:href="'/'" th:text="#{t_my_stamps}">My stamps</a>
20-
</div>
20+
</div><!--
21+
22+
--><div class="col-sm-1 vcenter">
23+
<div class="dropdown">
24+
<a href="javascript:void(0)" class="dropdown-toggle" data-toggle="dropdown">
25+
<span th:text="#{t_english}" th:if="${#locale.language == 'en'}">English</span>
26+
<!--/*/
27+
<span th:text="#{t_russian}" th:if="${#locale.language == 'ru'}">Russian</span>
28+
/*/-->
29+
</a>
30+
<span class="caret"></span>
31+
<ul class="dropdown-menu">
32+
<li><a href="?lang=ru" hreflang="ru" th:text="#{t_russian}" th:if="${#locale.language == 'en'}">Russian</a></li>
33+
<!--/*/
34+
<li><a href="?lang=en" hreflang="en" th:text="#{t_english}" th:if="${#locale.language == 'ru'}">English</a></li>
35+
/*/-->
36+
</ul>
37+
</div>
38+
</div><!--
2139
22-
<div id="user_bar" class="col-sm-2">
40+
--><div id="user_bar" class="col-sm-2 vcenter">
2341
<ul class="list-unstyled">
2442
<!--/*/
2543
<li sec:authorize="isAuthenticated()">

src/main/webapp/WEB-INF/views/account/auth.html

+21-3
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,29 @@
1515
<body lang="en" th:lang="${#locale.language == 'ru' ? 'ru' : 'en'}">
1616
<div class="container-fluid">
1717
<div class="row" id="header">
18-
<div id="logo" class="col-sm-10">
18+
<div id="logo" class="col-sm-9 vcenter">
1919
<a href="../site/index.html" th:href="'/'" th:text="#{t_my_stamps}">My stamps</a>
20-
</div>
20+
</div><!--
21+
22+
--><div class="col-sm-1 vcenter">
23+
<div class="dropdown">
24+
<a href="javascript:void(0)" class="dropdown-toggle" data-toggle="dropdown">
25+
<span th:text="#{t_english}" th:if="${#locale.language == 'en'}">English</span>
26+
<!--/*/
27+
<span th:text="#{t_russian}" th:if="${#locale.language == 'ru'}">Russian</span>
28+
/*/-->
29+
</a>
30+
<span class="caret"></span>
31+
<ul class="dropdown-menu">
32+
<li><a href="?lang=ru" hreflang="ru" th:text="#{t_russian}" th:if="${#locale.language == 'en'}">Russian</a></li>
33+
<!--/*/
34+
<li><a href="?lang=en" hreflang="en" th:text="#{t_english}" th:if="${#locale.language == 'ru'}">English</a></li>
35+
/*/-->
36+
</ul>
37+
</div>
38+
</div><!--
2139
22-
<div id="user_bar" class="col-sm-2">
40+
--><div id="user_bar" class="col-sm-2 vcenter">
2341
<ul class="list-unstyled">
2442
<!--/*/
2543
<li sec:authorize="isAuthenticated()">

src/main/webapp/WEB-INF/views/account/register.html

+21-3
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,29 @@
1515
<body lang="en" th:lang="${#locale.language == 'ru' ? 'ru' : 'en'}">
1616
<div class="container-fluid">
1717
<div class="row" id="header">
18-
<div id="logo" class="col-sm-10">
18+
<div id="logo" class="col-sm-9 vcenter">
1919
<a href="../site/index.html" th:href="'/'" th:text="#{t_my_stamps}">My stamps</a>
20-
</div>
20+
</div><!--
21+
22+
--><div class="col-sm-1 vcenter">
23+
<div class="dropdown">
24+
<a href="javascript:void(0)" class="dropdown-toggle" data-toggle="dropdown">
25+
<span th:text="#{t_english}" th:if="${#locale.language == 'en'}">English</span>
26+
<!--/*/
27+
<span th:text="#{t_russian}" th:if="${#locale.language == 'ru'}">Russian</span>
28+
/*/-->
29+
</a>
30+
<span class="caret"></span>
31+
<ul class="dropdown-menu">
32+
<li><a href="?lang=ru" hreflang="ru" th:text="#{t_russian}" th:if="${#locale.language == 'en'}">Russian</a></li>
33+
<!--/*/
34+
<li><a href="?lang=en" hreflang="en" th:text="#{t_english}" th:if="${#locale.language == 'ru'}">English</a></li>
35+
/*/-->
36+
</ul>
37+
</div>
38+
</div><!--
2139
22-
<div id="user_bar" class="col-sm-2">
40+
--><div id="user_bar" class="col-sm-2 vcenter">
2341
<ul class="list-unstyled">
2442
<!--/*/
2543
<li sec:authorize="isAuthenticated()">

src/main/webapp/WEB-INF/views/category/add.html

+21-3
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,29 @@
1515
<body lang="en" th:lang="${#locale.language == 'ru' ? 'ru' : 'en'}">
1616
<div class="container-fluid">
1717
<div class="row" id="header">
18-
<div id="logo" class="col-sm-10">
18+
<div id="logo" class="col-sm-9 vcenter">
1919
<a href="../site/index.html" th:href="'/'" th:text="#{t_my_stamps}">My stamps</a>
20-
</div>
20+
</div><!--
21+
22+
--><div class="col-sm-1 vcenter">
23+
<div class="dropdown">
24+
<a href="javascript:void(0)" class="dropdown-toggle" data-toggle="dropdown">
25+
<span th:text="#{t_english}" th:if="${#locale.language == 'en'}">English</span>
26+
<!--/*/
27+
<span th:text="#{t_russian}" th:if="${#locale.language == 'ru'}">Russian</span>
28+
/*/-->
29+
</a>
30+
<span class="caret"></span>
31+
<ul class="dropdown-menu">
32+
<li><a href="?lang=ru" hreflang="ru" th:text="#{t_russian}" th:if="${#locale.language == 'en'}">Russian</a></li>
33+
<!--/*/
34+
<li><a href="?lang=en" hreflang="en" th:text="#{t_english}" th:if="${#locale.language == 'ru'}">English</a></li>
35+
/*/-->
36+
</ul>
37+
</div>
38+
</div><!--
2139
22-
<div id="user_bar" class="col-sm-2">
40+
--><div id="user_bar" class="col-sm-2 vcenter">
2341
<ul class="list-unstyled">
2442
<li sec:authorize="isAuthenticated()">
2543
<i class="glyphicon glyphicon-user"></i>

src/main/webapp/WEB-INF/views/category/info.html

+21-3
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,29 @@
1515
<body lang="en" th:lang="${#locale.language == 'ru' ? 'ru' : 'en'}">
1616
<div class="container-fluid">
1717
<div class="row" id="header">
18-
<div id="logo" class="col-sm-10">
18+
<div id="logo" class="col-sm-9 vcenter">
1919
<a href="../site/index.html" th:href="'/'" th:text="#{t_my_stamps}">My stamps</a>
20-
</div>
20+
</div><!--
21+
22+
--><div class="col-sm-1 vcenter">
23+
<div class="dropdown">
24+
<a href="javascript:void(0)" class="dropdown-toggle" data-toggle="dropdown">
25+
<span th:text="#{t_english}" th:if="${#locale.language == 'en'}">English</span>
26+
<!--/*/
27+
<span th:text="#{t_russian}" th:if="${#locale.language == 'ru'}">Russian</span>
28+
/*/-->
29+
</a>
30+
<span class="caret"></span>
31+
<ul class="dropdown-menu">
32+
<li><a href="?lang=ru" hreflang="ru" th:text="#{t_russian}" th:if="${#locale.language == 'en'}">Russian</a></li>
33+
<!--/*/
34+
<li><a href="?lang=en" hreflang="en" th:text="#{t_english}" th:if="${#locale.language == 'ru'}">English</a></li>
35+
/*/-->
36+
</ul>
37+
</div>
38+
</div><!--
2139
22-
<div id="user_bar" class="col-sm-2">
40+
--><div id="user_bar" class="col-sm-2 vcenter">
2341
<ul class="list-unstyled">
2442
<!--/*/
2543
<li sec:authorize="isAuthenticated()">

src/main/webapp/WEB-INF/views/category/list.html

+21-3
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,29 @@
1414
<body lang="en" th:lang="${#locale.language == 'ru' ? 'ru' : 'en'}">
1515
<div class="container-fluid">
1616
<div class="row" id="header">
17-
<div id="logo" class="col-sm-10">
17+
<div id="logo" class="col-sm-9 vcenter">
1818
<a href="../site/index.html" th:href="'/'" th:text="#{t_my_stamps}">My stamps</a>
19-
</div>
19+
</div><!--
20+
21+
--><div class="col-sm-1 vcenter">
22+
<div class="dropdown">
23+
<a href="javascript:void(0)" class="dropdown-toggle" data-toggle="dropdown">
24+
<span th:text="#{t_english}" th:if="${#locale.language == 'en'}">English</span>
25+
<!--/*/
26+
<span th:text="#{t_russian}" th:if="${#locale.language == 'ru'}">Russian</span>
27+
/*/-->
28+
</a>
29+
<span class="caret"></span>
30+
<ul class="dropdown-menu">
31+
<li><a href="?lang=ru" hreflang="ru" th:text="#{t_russian}" th:if="${#locale.language == 'en'}">Russian</a></li>
32+
<!--/*/
33+
<li><a href="?lang=en" hreflang="en" th:text="#{t_english}" th:if="${#locale.language == 'ru'}">English</a></li>
34+
/*/-->
35+
</ul>
36+
</div>
37+
</div><!--
2038
21-
<div id="user_bar" class="col-sm-2">
39+
--><div id="user_bar" class="col-sm-2 vcenter">
2240
<ul class="list-unstyled">
2341
<!--/*/
2442
<li sec:authorize="isAuthenticated()">

src/main/webapp/WEB-INF/views/collection/info.html

+21-3
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,29 @@
1414
<body lang="en" th:lang="${#locale.language == 'ru' ? 'ru' : 'en'}">
1515
<div class="container-fluid">
1616
<div class="row" id="header">
17-
<div id="logo" class="col-sm-10">
17+
<div id="logo" class="col-sm-9 vcenter">
1818
<a href="../site/index.html" th:href="'/'" th:text="#{t_my_stamps}">My stamps</a>
19-
</div>
19+
</div><!--
20+
21+
--><div class="col-sm-1 vcenter">
22+
<div class="dropdown">
23+
<a href="javascript:void(0)" class="dropdown-toggle" data-toggle="dropdown">
24+
<span th:text="#{t_english}" th:if="${#locale.language == 'en'}">English</span>
25+
<!--/*/
26+
<span th:text="#{t_russian}" th:if="${#locale.language == 'ru'}">Russian</span>
27+
/*/-->
28+
</a>
29+
<span class="caret"></span>
30+
<ul class="dropdown-menu">
31+
<li><a href="?lang=ru" hreflang="ru" th:text="#{t_russian}" th:if="${#locale.language == 'en'}">Russian</a></li>
32+
<!--/*/
33+
<li><a href="?lang=en" hreflang="en" th:text="#{t_english}" th:if="${#locale.language == 'ru'}">English</a></li>
34+
/*/-->
35+
</ul>
36+
</div>
37+
</div><!--
2038
21-
<div id="user_bar" class="col-sm-2">
39+
--><div id="user_bar" class="col-sm-2 vcenter">
2240
<ul class="list-unstyled">
2341
<!--/*/
2442
<li sec:authorize="isAuthenticated()">

src/main/webapp/WEB-INF/views/country/add.html

+21-3
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,29 @@
1515
<body lang="en" th:lang="${#locale.language == 'ru' ? 'ru' : 'en'}">
1616
<div class="container-fluid">
1717
<div class="row" id="header">
18-
<div id="logo" class="col-sm-10">
18+
<div id="logo" class="col-sm-9 vcenter">
1919
<a href="../site/index.html" th:href="'/'" th:text="#{t_my_stamps}">My stamps</a>
20-
</div>
20+
</div><!--
21+
22+
--><div class="col-sm-1 vcenter">
23+
<div class="dropdown">
24+
<a href="javascript:void(0)" class="dropdown-toggle" data-toggle="dropdown">
25+
<span th:text="#{t_english}" th:if="${#locale.language == 'en'}">English</span>
26+
<!--/*/
27+
<span th:text="#{t_russian}" th:if="${#locale.language == 'ru'}">Russian</span>
28+
/*/-->
29+
</a>
30+
<span class="caret"></span>
31+
<ul class="dropdown-menu">
32+
<li><a href="?lang=ru" hreflang="ru" th:text="#{t_russian}" th:if="${#locale.language == 'en'}">Russian</a></li>
33+
<!--/*/
34+
<li><a href="?lang=en" hreflang="en" th:text="#{t_english}" th:if="${#locale.language == 'ru'}">English</a></li>
35+
/*/-->
36+
</ul>
37+
</div>
38+
</div><!--
2139
22-
<div id="user_bar" class="col-sm-2">
40+
--><div id="user_bar" class="col-sm-2 vcenter">
2341
<ul class="list-unstyled">
2442
<li sec:authorize="isAuthenticated()">
2543
<i class="glyphicon glyphicon-user"></i>

src/main/webapp/WEB-INF/views/country/info.html

+21-3
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,29 @@
1515
<body lang="en" th:lang="${#locale.language == 'ru' ? 'ru' : 'en'}">
1616
<div class="container-fluid">
1717
<div class="row" id="header">
18-
<div id="logo" class="col-sm-10">
18+
<div id="logo" class="col-sm-9 vcenter">
1919
<a href="../site/index.html" th:href="'/'" th:text="#{t_my_stamps}">My stamps</a>
20-
</div>
20+
</div><!--
21+
22+
--><div class="col-sm-1 vcenter">
23+
<div class="dropdown">
24+
<a href="javascript:void(0)" class="dropdown-toggle" data-toggle="dropdown">
25+
<span th:text="#{t_english}" th:if="${#locale.language == 'en'}">English</span>
26+
<!--/*/
27+
<span th:text="#{t_russian}" th:if="${#locale.language == 'ru'}">Russian</span>
28+
/*/-->
29+
</a>
30+
<span class="caret"></span>
31+
<ul class="dropdown-menu">
32+
<li><a href="?lang=ru" hreflang="ru" th:text="#{t_russian}" th:if="${#locale.language == 'en'}">Russian</a></li>
33+
<!--/*/
34+
<li><a href="?lang=en" hreflang="en" th:text="#{t_english}" th:if="${#locale.language == 'ru'}">English</a></li>
35+
/*/-->
36+
</ul>
37+
</div>
38+
</div><!--
2139
22-
<div id="user_bar" class="col-sm-2">
40+
--><div id="user_bar" class="col-sm-2 vcenter">
2341
<ul class="list-unstyled">
2442
<!--/*/
2543
<li sec:authorize="isAuthenticated()">

0 commit comments

Comments
 (0)