2021-08-16
This commit is contained in:
@@ -14,8 +14,8 @@ plugins {
|
||||
|
||||
dependencies {
|
||||
implementation("org.springframework.boot:spring-boot-starter-web")
|
||||
implementation("org.springframework.boot:spring-boot-starter-mustache")
|
||||
|
||||
//implementation("org.springframework.boot:spring-boot-starter-mustache")
|
||||
implementation("org.springframework.boot:spring-boot-starter-thymeleaf")
|
||||
compileOnly("org.projectlombok:lombok")
|
||||
developmentOnly("org.springframework.boot:spring-boot-devtools")
|
||||
|
||||
|
||||
@@ -1,12 +1,14 @@
|
||||
package kr.pe.elex.examples;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.tomcat.jni.Local;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.springframework.web.servlet.LocaleResolver;
|
||||
import org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
|
||||
@@ -22,9 +24,9 @@ public class CustomLocaleResolver implements LocaleResolver {
|
||||
* 지원되는 로캐일 목록. 첫 번째 로캐일은 기본 로캐일로 사용된다.
|
||||
*/
|
||||
private static final List<Locale> supportedLocales = List
|
||||
.of(Locale.ENGLISH, Locale.KOREAN);
|
||||
.of(Locale.KOREAN, Locale.ENGLISH);
|
||||
|
||||
private Locale locale = null;
|
||||
//private Locale locale = null;
|
||||
private final AcceptHeaderLocaleResolver acceptHeaderLocaleResolver;
|
||||
|
||||
public CustomLocaleResolver() {
|
||||
@@ -32,26 +34,40 @@ public class CustomLocaleResolver implements LocaleResolver {
|
||||
|
||||
acceptHeaderLocaleResolver = new AcceptHeaderLocaleResolver();
|
||||
acceptHeaderLocaleResolver.setSupportedLocales(supportedLocales);
|
||||
acceptHeaderLocaleResolver.setDefaultLocale(supportedLocales.get(0));
|
||||
acceptHeaderLocaleResolver.setDefaultLocale(Locale.ENGLISH);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull Locale resolveLocale(@NotNull HttpServletRequest request) {
|
||||
if (null == locale) {
|
||||
String lang = request.getParameter("language");
|
||||
if (null == lang) {
|
||||
return acceptHeaderLocaleResolver.resolveLocale(request);
|
||||
|
||||
} else {
|
||||
for (Locale loc : supportedLocales) {
|
||||
Locale loc = new Locale(lang);
|
||||
List<Locale.LanguageRange> priorityList = new ArrayList<>();
|
||||
priorityList.add(new Locale.LanguageRange(loc.toLanguageTag(), 1.0));
|
||||
priorityList.add(new Locale.LanguageRange(loc.getLanguage(), 0.9));
|
||||
priorityList.add(new Locale.LanguageRange(Locale.ENGLISH.getLanguage(),0.3));
|
||||
//priorityList.add(new Locale.LanguageRange(Locale.ROOT.getLanguage(),0.1));
|
||||
log.debug("PriorityList: {}", priorityList);
|
||||
Locale pick = Locale.lookup(
|
||||
priorityList,
|
||||
supportedLocales);
|
||||
log.debug("Picked locale: {}", pick);
|
||||
return pick;
|
||||
/*for (Locale loc : supportedLocales) {
|
||||
if (locale.equals(loc)) return loc;
|
||||
}
|
||||
for (Locale loc : supportedLocales) {
|
||||
if (locale.getLanguage().equals(loc.getLanguage())) return loc;
|
||||
}
|
||||
return supportedLocales.get(0);
|
||||
return supportedLocales.get(0);*/
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 안터셉터에서 처리될껄?
|
||||
* 세션 등에 저장하고 싶을 때 사용한다.
|
||||
* @param request
|
||||
* @param response
|
||||
* @param locale
|
||||
@@ -59,6 +75,7 @@ public class CustomLocaleResolver implements LocaleResolver {
|
||||
@Override
|
||||
public void setLocale(@NotNull HttpServletRequest request, HttpServletResponse response,
|
||||
Locale locale) {
|
||||
this.locale = locale;
|
||||
//this.locale = locale;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,30 +0,0 @@
|
||||
package kr.pe.elex.examples;
|
||||
|
||||
import com.samskivert.mustache.Mustache;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.MessageSource;
|
||||
import org.springframework.web.bind.annotation.ControllerAdvice;
|
||||
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
/**
|
||||
* Mustache 템플릿에 국제화 문자열을 끼워넣기 위해 사용된다.
|
||||
*/
|
||||
@Slf4j
|
||||
@ControllerAdvice
|
||||
public class I18nAdvice {
|
||||
@Autowired
|
||||
private MessageSource messageSource;
|
||||
|
||||
@ModelAttribute("i18n")
|
||||
public Mustache.Lambda i18n(Locale locale){
|
||||
return (frag, out) -> {
|
||||
String body = frag.execute();
|
||||
String message = this.messageSource.getMessage(body, new String[]{}, locale);
|
||||
log.debug("User Locale: {} -> {}", locale, message);
|
||||
out.write(message);
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -18,6 +18,7 @@ import org.springframework.stereotype.Controller;
|
||||
import org.springframework.ui.Model;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
import org.springframework.web.servlet.ModelAndView;
|
||||
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
|
||||
|
||||
import java.util.HashMap;
|
||||
@@ -28,8 +29,7 @@ public class MyController {
|
||||
|
||||
@GetMapping(path = {"/"})
|
||||
public String index() throws Exception {
|
||||
|
||||
return "main";
|
||||
return "home";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -4,12 +4,16 @@ import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.context.MessageSource;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.annotation.Description;
|
||||
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
|
||||
import org.springframework.context.support.ResourceBundleMessageSource;
|
||||
import org.springframework.web.servlet.LocaleResolver;
|
||||
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
|
||||
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
||||
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
@Configuration
|
||||
public class WebConfig implements WebMvcConfigurer {
|
||||
@Value("${spring.messages.basename:i18n}")
|
||||
@@ -44,11 +48,12 @@ public class WebConfig implements WebMvcConfigurer {
|
||||
}
|
||||
|
||||
@Bean
|
||||
public MessageSource messageSource() {
|
||||
ReloadableResourceBundleMessageSource messageSource
|
||||
= new ReloadableResourceBundleMessageSource();
|
||||
messageSource.setBasename("classpath:/" + messagesBasename);
|
||||
public ResourceBundleMessageSource messageSource() {
|
||||
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
|
||||
messageSource.setBasename(messagesBasename);
|
||||
messageSource.setDefaultEncoding("UTF-8");
|
||||
messageSource.setDefaultLocale(Locale.ENGLISH);
|
||||
return messageSource;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,9 +1,14 @@
|
||||
spring:
|
||||
application:
|
||||
name: My spring-boot project
|
||||
mustache:
|
||||
expose-request-attributes: true
|
||||
messages:
|
||||
basename: i18n
|
||||
thymeleaf:
|
||||
enabled: true
|
||||
cache: false
|
||||
encoding: UTF-8
|
||||
mode: HTML
|
||||
prefix: classpath:/templates/
|
||||
suffix: .html
|
||||
server:
|
||||
port: 8080
|
||||
|
||||
2
i18n/src/main/resources/i18n.properties
Normal file
2
i18n/src/main/resources/i18n.properties
Normal file
@@ -0,0 +1,2 @@
|
||||
hello.text = Hello
|
||||
only.text = Root Only
|
||||
@@ -1 +0,0 @@
|
||||
hello.text = Hello
|
||||
13
i18n/src/main/resources/templates/home.html
Normal file
13
i18n/src/main/resources/templates/home.html
Normal file
@@ -0,0 +1,13 @@
|
||||
<!doctype html>
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
|
||||
<head>
|
||||
<meta charset="UTF-8"/>
|
||||
<title>Sample</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>i18n</h1>
|
||||
<p th:text="#{hello.text}">HELLO_TEXT</p>
|
||||
<p th:text="#{only.text}">Mmm... 뭥</p>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -1,2 +0,0 @@
|
||||
<h1>i18n</h1>
|
||||
<p>{{#i18n}}hello.text{{/i18n}}</p>
|
||||
Reference in New Issue
Block a user