60 lines
1.6 KiB
JavaScript
60 lines
1.6 KiB
JavaScript
// 계층구조 사용시
|
|
async function loadTranslations(lang) {
|
|
try {
|
|
const response = await fetch(`/i18n/translations.${lang}.json`);
|
|
if (!response.ok) {
|
|
throw new Error(`Failed to load translations for ${lang}`);
|
|
}
|
|
return await response.json();
|
|
} catch (error) {
|
|
console.error(error);
|
|
return {};
|
|
}
|
|
}
|
|
|
|
async function localizePage(lang) {
|
|
const translations = await loadTranslations(lang);
|
|
|
|
const elements = document.querySelectorAll('[data-i18n]');
|
|
elements.forEach(element => {
|
|
const key = element.dataset.i18n;
|
|
const localizedText = findNestedValue(translations, key);
|
|
if (localizedText) {
|
|
element.textContent = localizedText;
|
|
}
|
|
});
|
|
}
|
|
|
|
function findNestedValue(obj, key) {
|
|
if (obj.hasOwnProperty(key)) {
|
|
return obj[key];
|
|
}
|
|
for (const prop in obj) {
|
|
if (typeof obj[prop] === 'object' && obj[prop] !== null) {
|
|
const result = findNestedValue(obj[prop], key);
|
|
if (result) {
|
|
return result;
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
document.addEventListener('DOMContentLoaded', async () => {
|
|
const storedLang = localStorage.getItem('lang');
|
|
|
|
if (storedLang) {
|
|
await localizePage(storedLang);
|
|
return;
|
|
}
|
|
|
|
const urlParams = new URLSearchParams(window.location.search);
|
|
const queryLang = urlParams.get('lang');
|
|
|
|
const lang = queryLang || 'ko';
|
|
|
|
localStorage.setItem('lang', lang);
|
|
await localizePage(lang);
|
|
});
|
|
|
|
// 계층구조 미사용시 코드는 주석 처리된 상태로 유지
|