2021-08-16

This commit is contained in:
2021-08-16 13:47:25 +09:00
parent 68ea844c69
commit 827351bdf5
22 changed files with 365 additions and 20 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -0,0 +1,2 @@
hello.text = Hello
only.text = Root Only

View File

@@ -1 +0,0 @@
hello.text = Hello

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

View File

@@ -1,2 +0,0 @@
<h1>i18n</h1>
<p>{{#i18n}}hello.text{{/i18n}}</p>