108 lines
3.5 KiB
TypeScript
108 lines
3.5 KiB
TypeScript
export default defineNuxtPlugin(() => {
|
|
// 클라이언트 사이드에서 gameData를 가져와서 i18n 설정 업데이트
|
|
const { $i18n } = useNuxtApp();
|
|
|
|
// gameData에서 언어 코드 추출
|
|
const getGameDataLangCodes = (gameData: any) => {
|
|
try {
|
|
console.log("🚀 ~ getGameDataLangCodes ~ gameData:", gameData);
|
|
|
|
if (gameData?.lang_codes) {
|
|
console.log("🚀 ~ getGameDataLangCodes ~ gameData.lang_codes:", gameData.lang_codes);
|
|
console.log("🚀 ~ getGameDataLangCodes ~ lang_codes type:", typeof gameData.lang_codes);
|
|
console.log("🚀 ~ getGameDataLangCodes ~ lang_codes isArray:", Array.isArray(gameData.lang_codes));
|
|
return Array.isArray(gameData.lang_codes) ? gameData.lang_codes : [gameData.lang_codes];
|
|
} else {
|
|
console.log("🚀 ~ getGameDataLangCodes ~ gameData.lang_codes is undefined or null");
|
|
}
|
|
} catch (error) {
|
|
console.warn('Failed to get gameData lang codes:', error);
|
|
}
|
|
|
|
console.log("🚀 ~ getGameDataLangCodes ~ returning default ['ko']");
|
|
return ['ko']; // 기본값
|
|
};
|
|
|
|
// i18n 설정 업데이트
|
|
const updateI18nLocales = async (gameData?: any) => {
|
|
const langCodes = getGameDataLangCodes(gameData);
|
|
|
|
if (langCodes && langCodes.length > 0) {
|
|
// 새로운 로케일 설정 생성
|
|
const newLocales = langCodes.map(code => ({
|
|
code,
|
|
file: `${code}.ts`,
|
|
name: getLocaleName(code),
|
|
iso: getLocaleIso(code),
|
|
dir: 'ltr'
|
|
}));
|
|
|
|
// i18n 설정 업데이트
|
|
if ($i18n) {
|
|
// 로케일 메시지 동적 로드
|
|
for (const code of langCodes) {
|
|
try {
|
|
const messages = await import(`../../i18n/locales/${code}.ts`);
|
|
// defineI18nLocale 함수를 실행하여 실제 메시지 데이터 가져오기
|
|
const localeMessages = await messages.default(code);
|
|
console.log(`🚀 ~ loaded messages for ${code}:`, localeMessages);
|
|
($i18n as any).setLocaleMessage(code, localeMessages);
|
|
} catch (error) {
|
|
console.warn(`Failed to load locale messages for ${code}:`, error);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
// 로케일 이름 가져오기
|
|
const getLocaleName = (code: string): string => {
|
|
const localeNames: Record<string, string> = {
|
|
en: 'English',
|
|
'zh-tw': '繁體中文',
|
|
ja: '日本語',
|
|
ko: '한국어',
|
|
fr: 'Français',
|
|
de: 'Deutsch',
|
|
es: 'Español',
|
|
pt: 'Português',
|
|
th: 'ภาษาไทย',
|
|
'zh-cn': '简体中文'
|
|
};
|
|
return localeNames[code] || code;
|
|
};
|
|
|
|
// 로케일 ISO 코드 가져오기
|
|
const getLocaleIso = (code: string): string => {
|
|
const localeIsos: Record<string, string> = {
|
|
en: 'en',
|
|
'zh-tw': 'zh-tw',
|
|
ja: 'ja',
|
|
ko: 'ko-KR',
|
|
fr: 'fr',
|
|
de: 'de',
|
|
es: 'es',
|
|
pt: 'pt',
|
|
th: 'th',
|
|
'zh-cn': 'zh-cn'
|
|
};
|
|
return localeIsos[code] || code;
|
|
};
|
|
|
|
// gameData가 설정될 때까지 기다리거나 즉시 실행
|
|
const gameDataStore = useGameDataStore();
|
|
|
|
// gameData가 이미 설정되어 있으면 즉시 실행
|
|
if (gameDataStore.gameData) {
|
|
updateI18nLocales(gameDataStore.gameData);
|
|
}
|
|
|
|
// gameData가 변경될 때마다 실행
|
|
watch(() => gameDataStore.gameData, async (newGameData) => {
|
|
if (newGameData) {
|
|
console.log("🚀 ~ gameData changed, updating i18n locales");
|
|
await updateI18nLocales(newGameData);
|
|
}
|
|
}, { immediate: true });
|
|
});
|