From 2ea8b69f7bd594a9a7ee132de2b115bad35b378e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Chyeonggkim=E2=80=9D?= <โ€œhyeonggkim@smilegate.comโ€> Date: Fri, 19 Sep 2025 19:11:01 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=96=B8=EC=96=B4=20=EB=B3=80=EA=B2=BD?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/pages/[d1]/[d2]/index.vue | 1 + layers/components/blocks/LanguageSwitcher.vue | 37 +++- layers/composables/useGetGameAlias.ts | 2 +- layers/composables/usePathResolver.ts | 12 +- layers/layouts/promotion.vue | 4 +- layers/middleware/pageData.global.ts | 10 +- layers/server/middleware/gameInfo.ts | 30 ++-- layers/stores/useGameDataStore.ts | 7 + layers/utils/dataUtil.ts | 1 - layers/utils/localeUtil.ts | 166 ++++++++++++++++++ 10 files changed, 238 insertions(+), 32 deletions(-) create mode 100644 layers/utils/localeUtil.ts diff --git a/app/pages/[d1]/[d2]/index.vue b/app/pages/[d1]/[d2]/index.vue index dceae28..9013128 100644 --- a/app/pages/[d1]/[d2]/index.vue +++ b/app/pages/[d1]/[d2]/index.vue @@ -4,6 +4,7 @@ import { getLayoutType } from '#layers/utils/dataUtil' const pageDataStore = usePageDataStore() const { pageData } = storeToRefs(pageDataStore) +console.log("๐Ÿš€ d2 index ~ pageData:", pageData) const currentLayout = computed(() => getLayoutType(pageData.value)) diff --git a/layers/components/blocks/LanguageSwitcher.vue b/layers/components/blocks/LanguageSwitcher.vue index da81a41..245d386 100644 --- a/layers/components/blocks/LanguageSwitcher.vue +++ b/layers/components/blocks/LanguageSwitcher.vue @@ -2,7 +2,9 @@
+ + ๋ณ€๊ฒฝ ์ค‘... +
@@ -24,24 +29,40 @@ const availableLanguages = computed(() => { return gameDataStore.gameData?.lang_codes || ['ko'] }) -const { locale } = useI18n() +const { locale, setLocale } = useI18n() const switchLocalePath = useSwitchLocalePath() const router = useRouter() +const pageDataStore = usePageDataStore() const selectedLocale = ref(locale.value) +const isChanging = ref(false) -// ์–ธ์–ด ๋ณ€๊ฒฝ ํ•จ์ˆ˜ +// ์–ธ์–ด ๋ณ€๊ฒฝ ํ•จ์ˆ˜ (CSR ๋ฐฉ์‹) const switchLanguage = async () => { - console.log( - '๐Ÿš€ ~ switchLanguage ~ selectedLocale.value:', - selectedLocale.value - ) - if (selectedLocale.value) { + if (!selectedLocale.value || isChanging.value) return + + isChanging.value = true + + try { // URL ๊ฒฝ๋กœ๋ฅผ ํ†ตํ•ด ์–ธ์–ด ๋ณ€๊ฒฝ const path = switchLocalePath(selectedLocale.value) if (path) { - await router.push(path) + // ํŽ˜์ด์ง€ ๋ฐ์ดํ„ฐ ์ดˆ๊ธฐํ™” (์ƒˆ๋กœ์šด ์–ธ์–ด๋กœ ๋‹ค์‹œ ๋กœ๋“œ๋˜๋„๋ก) + pageDataStore.clearPageData() + + // ์–ธ์–ด ๋ณ€๊ฒฝ ๋ฐ ๋ผ์šฐํŒ… + await setLocale(selectedLocale.value) + // await router.push(path) + + // ํŽ˜์ด์ง€ ์ƒˆ๋กœ๊ณ ์นจ์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ์žฌ๋กœ๋“œ ๋ณด์žฅ + await nextTick() + window.location.reload() } + } catch { + // ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ ์ด์ „ ์–ธ์–ด๋กœ ๋ณต์› + selectedLocale.value = locale.value + } finally { + isChanging.value = false } } diff --git a/layers/composables/useGetGameAlias.ts b/layers/composables/useGetGameAlias.ts index 55c6c46..20d3cd4 100644 --- a/layers/composables/useGetGameAlias.ts +++ b/layers/composables/useGetGameAlias.ts @@ -12,7 +12,7 @@ const extractGameAliasFromHost = (host: string, baseDomain: string): string => { return '' } - const subdomain = host.split('.')[0] + const subdomain = host.split(':')[0] return subdomain && subdomain !== 'www' ? subdomain : '' } diff --git a/layers/composables/usePathResolver.ts b/layers/composables/usePathResolver.ts index 2b3707d..c5122a4 100644 --- a/layers/composables/usePathResolver.ts +++ b/layers/composables/usePathResolver.ts @@ -7,16 +7,18 @@ export const usePathResolver = () => { // URL์—์„œ ์–ธ์–ด ์ฝ”๋“œ ํŒจํ„ด์„ ์ฐพ์•„์„œ ๊ทธ ๋’ค์˜ ๊ฒฝ๋กœ๋ฅผ ์ถ”์ถœ // ์˜ˆ: /ko/about/story -> /about/story // ์˜ˆ: /en/test/page -> /test/page + // ์˜ˆ: /zh-tw/about/story -> /about/story + // ์˜ˆ: /zh-cn/test/page -> /test/page // ์˜ˆ: /ko -> "" (๋นˆ ๋ฌธ์ž์—ด) - const languagePattern = /^\/[a-z]{2}\/(.+)$/ + const languagePattern = /^\/[a-z]{2}(-[a-z]{2})?\/(.+)$/ const match = targetUrl.match(languagePattern) - if (match && match[1]) { - return `/${match[1]}` + if (match && match[2]) { + return `/${match[2]}` } - // ์–ธ์–ด ์ฝ”๋“œ๋งŒ ์žˆ๊ณ  ๋’ค์— ์•„๋ฌด๊ฒƒ๋„ ์—†๋Š” ๊ฒฝ์šฐ (์˜ˆ: /ko, /en) - const languageOnlyPattern = /^\/[a-z]{2}$/ + // ์–ธ์–ด ์ฝ”๋“œ๋งŒ ์žˆ๊ณ  ๋’ค์— ์•„๋ฌด๊ฒƒ๋„ ์—†๋Š” ๊ฒฝ์šฐ (์˜ˆ: /ko, /en, /zh-tw, /zh-cn) + const languageOnlyPattern = /^\/[a-z]{2}(-[a-z]{2})?$/ if (languageOnlyPattern.test(targetUrl)) { return '' } diff --git a/layers/layouts/promotion.vue b/layers/layouts/promotion.vue index 674bc39..add72a8 100644 --- a/layers/layouts/promotion.vue +++ b/layers/layouts/promotion.vue @@ -1,4 +1,6 @@ - +