From 679e50bed03e66ab42732913ea73c498d87578d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dhji=28=EC=A7=80=EB=8C=80=ED=95=9C=29?= Date: Fri, 12 Jan 2024 16:19:10 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20header=20Accept-Language=20=EC=96=B8?= =?UTF-8?q?=EC=96=B4=20=EA=B0=95=EC=A0=9C=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../co/palnet/kac/app/config/WebConfig.java | 19 ++++++ .../web/BaseAcceptHeaderLocaleResolver.java | 68 +++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 app/kac-app/src/main/java/kr/co/palnet/kac/app/config/WebConfig.java create mode 100644 app/kac-app/src/main/java/kr/co/palnet/kac/app/core/web/BaseAcceptHeaderLocaleResolver.java diff --git a/app/kac-app/src/main/java/kr/co/palnet/kac/app/config/WebConfig.java b/app/kac-app/src/main/java/kr/co/palnet/kac/app/config/WebConfig.java new file mode 100644 index 0000000..9065dba --- /dev/null +++ b/app/kac-app/src/main/java/kr/co/palnet/kac/app/config/WebConfig.java @@ -0,0 +1,19 @@ +package kr.co.palnet.kac.app.config; + +import kr.co.palnet.kac.app.core.web.BaseAcceptHeaderLocaleResolver; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.LocaleResolver; +import org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver; + +import java.util.Locale; + +@Configuration +public class WebConfig { + @Bean + public LocaleResolver localeResolver() { + AcceptHeaderLocaleResolver localeResolver = new BaseAcceptHeaderLocaleResolver(); + localeResolver.setDefaultLocale(Locale.KOREA); + return localeResolver; + } +} diff --git a/app/kac-app/src/main/java/kr/co/palnet/kac/app/core/web/BaseAcceptHeaderLocaleResolver.java b/app/kac-app/src/main/java/kr/co/palnet/kac/app/core/web/BaseAcceptHeaderLocaleResolver.java new file mode 100644 index 0000000..98d05cb --- /dev/null +++ b/app/kac-app/src/main/java/kr/co/palnet/kac/app/core/web/BaseAcceptHeaderLocaleResolver.java @@ -0,0 +1,68 @@ +package kr.co.palnet.kac.app.core.web; + +import jakarta.servlet.http.HttpServletRequest; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.StringUtils; +import org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver; + +import java.util.Arrays; +import java.util.List; +import java.util.Locale; + +@Slf4j +public class BaseAcceptHeaderLocaleResolver extends AcceptHeaderLocaleResolver { + private final List LOCALES = Arrays.asList( + new Locale("ko"), + new Locale("ko", "KR"), + new Locale("en"), + new Locale("en", "US") + ); + private final String LOCALE_HEADER_KEY = "Accept-Language"; + + /** + * resolve locale 구성 + * + * @param request the request to resolve the locale for + * @return + */ + @Override + public Locale resolveLocale(HttpServletRequest request) { + if (!StringUtils.hasText(request.getHeader(LOCALE_HEADER_KEY))) { + return this.getDefaultLocale(); + } + try { + + Locale locale = LOCALES.stream().filter(_locale -> { + String defaultLocale = _locale.toString() + .replaceAll("-", "") + .replaceAll("_", "") + .toLowerCase(); + String headerLocale = request.getHeader(LOCALE_HEADER_KEY).toString() + .replaceAll("-", "") + .replaceAll("_", "") + .toLowerCase(); + return defaultLocale.equals(headerLocale); + }).findFirst().orElse(null); + + if (locale == null) { + locale = LOCALES.stream() + .filter(_locale -> { + String language = _locale.getLanguage(); + return request.getHeader(LOCALE_HEADER_KEY).contains(language); + }) + .map(_locale -> { + String language = _locale.getLanguage(); + return new Locale(language); + }) + .distinct() + .findFirst().orElse(Locale.KOREAN); + } + + log.info("{}, {}", request.getHeader(LOCALE_HEADER_KEY), locale); + return locale; + } catch (IllegalArgumentException e) { + log.warn("{}", e.getMessage()); + return this.getDefaultLocale(); + } + } +}