(function () { // ===== ¼³Á¤ ===== var LANG_SUFFIX = { ko: "", en: "_en", zh: "_zh", ja: "_ja" }; var SUFFIXES = ["_en", "_zh", "_ja"]; // ko´Â Á¢¹Ì»ç ¾øÀ½ var INDEX_NAME = "index.php"; // µð·ºÅ丮 Á¢±Ù ½Ã °¡Á¤ÇÒ À妽º ÆÄÀϸí var ALLOW_EXT = /\.(php|html?|asp|aspx)$/i; // ¾ð¾î Á¢¹Ì»ç ºÙÀÏ ´ë»ó È®ÀåÀÚ // ===== ÄíŰ À¯Æ¿ ===== function setCookie(name, value, days, path) { var d = new Date(); d.setTime(d.getTime() + (days * 24 * 60 * 60 * 1000)); document.cookie = name + "=" + encodeURIComponent(value) + ";expires=" + d.toUTCString() + ";path=" + (path || "/"); } function getCookie(name) { var m = document.cookie.match(new RegExp("(?:^|; )" + name.replace(/([.$?*|{}()[\]\\/+^])/g, '\\$1') + "=([^;]*)")); return m ? decodeURIComponent(m[1]) : null; } // ===== ÆÄÀÏ¸í ÆÄ½Ì À¯Æ¿ ===== function splitBaseExt(filename) { var dot = filename.lastIndexOf("."); return { base: dot > -1 ? filename.slice(0, dot) : filename, ext: dot > -1 ? filename.slice(dot) : "" }; } function stripLangSuffix(base) { for (var i = 0; i < SUFFIXES.length; i++) { var sfx = SUFFIXES[i]; if (base.endsWith(sfx)) return base.slice(0, -sfx.length); } return base; } function inferLangFromFilename(filename) { if (/_en\.[a-z0-9]+$/i.test(filename)) return "en"; if (/_zh\.[a-z0-9]+$/i.test(filename)) return "zh"; if (/_ja\.[a-z0-9]+$/i.test(filename)) return "ja"; return "ko"; } function buildFileNameForLang(filename, lang) { var pe = splitBaseExt(filename); var baseNoLang = stripLangSuffix(pe.base); var suffix = LANG_SUFFIX[lang] || ""; return baseNoLang + suffix + pe.ext; } function ensureFilenameForLang(pathname, lang) { // "/dir/" ¡æ "/dir/index.php" var path = pathname; if (path.endsWith("/")) path += INDEX_NAME; var parts = path.split("/"); var file = parts[parts.length - 1] || ""; if (!file) file = INDEX_NAME; // È®ÀåÀÚ ÇÊÅÍ(php, html µî¸¸ º¯È¯) if (!ALLOW_EXT.test(file)) return path; var desired = buildFileNameForLang(file, lang); parts[parts.length - 1] = desired; return parts.join("/"); } // ===== ¸µÅ© ¸®¶óÀÌÆ® À¯Æ¿ ===== function rewriteHrefToLang(href, lang) { var url; try { url = new URL(href, location.href); } catch (e) { return href; } // ¿ÜºÎ µµ¸ÞÀÎÀº º¯°æÇÏÁö ¾ÊÀ½ if (url.origin !== location.origin) return href; // Äõ¸®/ÇØ½Ã´Â À¯Áö var newPath = ensureFilenameForLang(url.pathname, lang); url.pathname = newPath; // lang ÆÄ¶ó¹ÌÅÍ´Â »ç¿ë ¾È ÇÔ url.searchParams.delete("lang"); return url.toString(); } // ===== URL Á¸Àç È®ÀÎ (HEAD ¡æ GET Æú¹é) & ¾ð¾î Ȩ ===== function urlExists(urlStr) { try { return fetch(urlStr, { method: 'HEAD', cache: 'no-store', redirect: 'manual' }) .then(function (res) { if (res.ok) return true; // ÀϺΠ¼­¹ö°¡ HEAD¸¦ ¸·´Â °æ¿ì(405 µî) ¡æ GETÀ¸·Î ÀçÈ®ÀÎ return fetch(urlStr, { method: 'GET', cache: 'no-store', redirect: 'manual' }) .then(function (r) { return r.ok; }) .catch(function () { return false; }); }) .catch(function () { return false; }); } catch (e) { return Promise.resolve(false); } } function langHome(lang) { // ko´Â Á¢¹Ì»ç ¾øÀ½, ±× ¿Ü index_??.php °¡Á¤ if (lang === 'ko') return '/default/index.php'; return '/default/index_' + lang + '.php'; } // ===== a[data-lang-*] ¶óº§ Àû¿ë ===== var LANG_ORDER = ['ko','en','zh','ja']; function pickLabelFromAttrs(a, lang) { var t = a.getAttribute('data-lang-' + lang); if (t && t.trim) return t.trim(); // ¼±ÅÃÇÑ ¾ð¾î°¡ ¾øÀ¸¸é ko ¡æ en ¡æ zh ¡æ ja ¼øÀ¸·Î Æú¹é for (var i = 0; i < LANG_ORDER.length; i++) { var v = a.getAttribute('data-lang-' + LANG_ORDER[i]); if (v && v.trim) return v.trim(); } return null; } function applyAnchorsLang(lang) { var list = document.querySelectorAll( 'a[data-lang-ko],a[data-lang-en],a[data-lang-zh],a[data-lang-ja]' ); for (var i = 0; i < list.length; i++) { var a = list[i]; var label = pickLabelFromAttrs(a, lang); if (label != null) a.textContent = label; // ¼ø¼ö ÅØ½ºÆ®ÀÏ ¶§ ¾ÈÀü } } // ===== ÃʱâÈ­ ===== function init() { var sel = document.getElementById("site-lang"); // ÇöÀç °æ·Î/ÆÄÀÏ var pathname = location.pathname; var pathParts = pathname.split("/"); var filename = pathParts[pathParts.length - 1]; var currentFile = filename || INDEX_NAME; // ÇöÀç ÆÄÀϷκÎÅÍ ¾ð¾î ÃßÁ¤ var inferred = inferLangFromFilename(currentFile); // ÄíŰ ¾ð¾î ¿ì¼± var cookieLang = getCookie("site_lang"); var activeLang = (cookieLang && LANG_SUFFIX.hasOwnProperty(cookieLang)) ? cookieLang : inferred; // µå·Ó´Ù¿î ÃʱⰪ µ¿±âÈ­ + ÄíŰ ÃÖ½ÅÈ­ if (sel) sel.value = activeLang; setCookie("site_lang", activeLang, 365, "/"); // a[data-lang-*] ¶óº§ Àû¿ë applyAnchorsLang(activeLang); // 1) µå·Ó´Ù¿î º¯°æ: ´ë»ó ¾øÀ¸¸é ¹Ù·Î ¾ð¾î À妽º·Î (·çÇÁ °¡µå Á¦°Å) if (sel) { sel.addEventListener("change", function () { var lang = sel.value || "ko"; setCookie("site_lang", lang, 365, "/"); applyAnchorsLang(lang); // È­¸é Áï½Ã ¹Ý¿µ var url = new URL(location.href); url.pathname = ensureFilenameForLang(location.pathname, lang); url.searchParams.delete("lang"); urlExists(url.toString()).then(function (ok) { if (ok) { location.href = url.toString(); } else { location.href = langHome(lang); } }); }); } // 2) ³»ºÎ ¸µÅ© Ŭ¸¯: ´ë»ó ¾øÀ¸¸é ¹Ù·Î ¾ð¾î À妽º·Î document.addEventListener("click", function (e) { var a = e.target.closest && e.target.closest("a[href]"); if (!a) return; // »õÅÇ/¼öÁ¤Å°/ÇØ½Ã/ÀüÈ­/¸ÞÀÏ µîÀº ±×´ë·Î µÒ if (e.defaultPrevented || a.target === "_blank" || e.metaKey || e.ctrlKey || e.shiftKey || e.altKey || e.button !== 0) return; if (a.hasAttribute("data-lang-ignore")) return; var href = a.getAttribute("href"); if (!href || href.startsWith("#") || href.startsWith("mailto:") || href.startsWith("tel:")) return; var lang = getCookie("site_lang") || activeLang || "ko"; var newHref = rewriteHrefToLang(href, lang); // µ¿ÀÏÀÌ¸é ±×³É ÁøÇà(ºê¶ó¿ìÀú ±âº» À̵¿) if (newHref === a.href) return; e.preventDefault(); urlExists(newHref).then(function (ok) { if (ok) { location.href = newHref; } else { location.href = langHome(lang); } }); }, true); } if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", init); } else { init(); } })();