From 531c6e4be6c9f5550f7c29f432a255b61dc4056f Mon Sep 17 00:00:00 2001 From: Jay Sheen Date: Thu, 30 Oct 2025 14:41:14 +0900 Subject: [PATCH] =?UTF-8?q?Fix:=20=EC=95=B1=20=EC=96=B8=EC=96=B4=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=EC=9D=B4=20=EC=9B=B9=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=EC=97=90=20=EC=9E=90=EB=8F=99=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9=EB=90=98=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - i18n 초기화 시 네이티브 앱 언어 설정을 확인하여 적용 - 네이티브 환경: 앱 언어를 가져와 localStorage에 저장 - 웹 환경: localStorage에서 저장된 언어 사용 - setting-page에서 언어 동기화 시 localStorage 업데이트 추가 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- src/locales/i18n.ts | 31 +++++++++++++++++++++++++++++- src/pages/setting/setting-page.tsx | 1 + 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/locales/i18n.ts b/src/locales/i18n.ts index 390c757..7d9b0e8 100644 --- a/src/locales/i18n.ts +++ b/src/locales/i18n.ts @@ -1,10 +1,39 @@ import i18n from 'i18next'; import { initReactI18next } from 'react-i18next'; import LanguageDetector from 'i18next-browser-languagedetector'; +import appBridge from '@/utils/appBridge'; import ko from './ko.json'; import en from './en.json'; +// 초기 언어 설정 +let initialLanguage = 'ko'; + +// 네이티브 환경이 아닐 때는 localStorage에서 확인 +if (!appBridge.isNativeEnvironment()) { + const storedLanguage = localStorage.getItem('i18nextLng'); + if (storedLanguage && (storedLanguage === 'ko' || storedLanguage === 'en')) { + initialLanguage = storedLanguage; + } +} else { + // 네이티브 환경에서는 네이티브 언어를 가져와 localStorage에 설정 + try { + appBridge.getLanguage().then((language) => { + if (language && typeof language === 'string' && (language === 'ko' || language === 'en')) { + localStorage.setItem('i18nextLng', language); + // i18n이 이미 초기화된 경우 언어 변경 + if (i18n.isInitialized && i18n.language !== language) { + i18n.changeLanguage(language); + } + } + }).catch((error) => { + console.warn('Failed to get native language during init:', error); + }); + } catch (error) { + console.warn('Failed to get native language:', error); + } +} + i18n .use(LanguageDetector) .use(initReactI18next) @@ -13,7 +42,7 @@ i18n en: {translation: en}, ko: {translation: ko}, }, - lng: 'ko', + lng: initialLanguage, fallbackLng: 'ko', debug: true, interpolation: { diff --git a/src/pages/setting/setting-page.tsx b/src/pages/setting/setting-page.tsx index d31d5ed..bdc6f42 100644 --- a/src/pages/setting/setting-page.tsx +++ b/src/pages/setting/setting-page.tsx @@ -87,6 +87,7 @@ export const SettingPage = () => { // i18n 언어도 동기화 if (i18n.language !== language) { i18n.changeLanguage(language); + localStorage.setItem('i18nextLng', language); } }); }, [getLanguage, i18n]);