mingle-website/404.html
68893236+KINDNICK@users.noreply.github.com c2c2376fc5 Add: 다국어(i18n) 시스템 구축 (ko/en/zh/ja)
- i18n 엔진 구현 (js/i18n.js): 언어 감지, JSON 로드, DOM 번역, 한국어 복원 지원
- 번역 JSON 파일 생성 (i18n/ko.json, en.json, zh.json, ja.json) - 517키 동기화
- 전체 HTML 페이지 data-i18n 태깅 (8개 페이지 + header/footer 컴포넌트)
- 언어 스위처 UI 및 CSS 추가 (header + common.css)
- JS 동적 문자열 번역 적용 (common/contact/gallery/main/portfolio.js)
- 한국어 복원 버그 수정: 원본 텍스트를 data-i18n-ko 속성에 저장하여 복원
- 일본어 브랜드명 통일: ミングルスタジオ → Mingle Studio

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 12:35:24 +09:00

251 lines
9.4 KiB
HTML

<!DOCTYPE html>
<html lang="ko">
<head>
<!-- Google Tag Manager -->
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-PPTNN6WD');</script>
<!-- End Google Tag Manager -->
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-R0PBYHVQBS"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-R0PBYHVQBS');
</script>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>페이지를 찾을 수 없습니다 - 밍글 스튜디오</title>
<!-- 파비콘 -->
<link rel="icon" type="image/x-icon" href="/images/logo/mingle-logo.ico">
<link rel="shortcut icon" href="/images/logo/mingle-logo.ico">
<link rel="icon" type="image/webp" href="/images/logo/mingle-logo.webp">
<!-- 폰트 -->
<link href="https://hangeul.pstatic.net/hangeul_static/css/nanum-square.css" rel="stylesheet">
<!-- CSS -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.0/css/all.min.css" integrity="sha512-Avb2QiuDEEvB4bZJYdft2mNjVShBftLGPg8YJ04IY4YZ7C7BC9XkjsTBdQ1B8TAVxT2BOxqIRkVvNs/FNRs0w==" crossorigin="anonymous" referrerpolicy="no-referrer" />
<link rel="stylesheet" href="css/common.css">
<style>
.error-container {
min-height: 100vh;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
text-align: center;
background: linear-gradient(135deg, #f8fafc 0%, #fff7ed 100%);
padding: var(--spacing-2xl);
}
.error-code {
font-size: 8rem;
font-weight: 800;
background: var(--gradient-main);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
margin-bottom: var(--spacing-lg);
line-height: 1;
}
.error-title {
font-size: var(--font-3xl);
color: var(--text-primary);
margin-bottom: var(--spacing-md);
font-weight: 700;
}
.error-description {
font-size: var(--font-lg);
color: var(--text-secondary);
margin-bottom: var(--spacing-2xl);
max-width: 600px;
}
.error-actions {
display: flex;
gap: var(--spacing-md);
flex-wrap: wrap;
justify-content: center;
margin-bottom: var(--spacing-2xl);
}
.search-container {
margin-top: var(--spacing-xl);
max-width: 400px;
width: 100%;
}
.search-input {
width: 100%;
padding: var(--spacing-md) var(--spacing-lg);
border: 2px solid #e5e7eb;
border-radius: var(--border-radius-full);
font-size: var(--font-base);
transition: var(--transition);
}
.search-input:focus {
outline: none;
border-color: var(--primary-color);
}
.helpful-links {
margin-top: var(--spacing-2xl);
text-align: left;
}
.helpful-links h3 {
color: var(--text-primary);
margin-bottom: var(--spacing-md);
font-size: var(--font-xl);
}
.helpful-links ul {
list-style: none;
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: var(--spacing-md);
}
.helpful-links li {
background: var(--bg-white);
padding: var(--spacing-md);
border-radius: var(--border-radius);
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.08);
}
.helpful-links a {
color: var(--primary-color);
text-decoration: none;
font-weight: 500;
display: flex;
align-items: center;
gap: var(--spacing-sm);
}
.helpful-links a:hover {
color: var(--primary-hover);
}
/* 다크모드 */
[data-theme="dark"] .error-container {
background: linear-gradient(135deg, var(--dark-bg) 0%, #1a1520 100%);
}
[data-theme="dark"] .error-title {
color: rgba(255, 255, 255, 0.95);
}
[data-theme="dark"] .error-description {
color: rgba(255, 255, 255, 0.65);
}
[data-theme="dark"] .search-input {
background: rgba(255, 255, 255, 0.05);
border-color: var(--glass-border);
color: rgba(255, 255, 255, 0.9);
}
[data-theme="dark"] .search-input::placeholder {
color: rgba(255, 255, 255, 0.35);
}
[data-theme="dark"] .search-input:focus {
border-color: var(--primary-color);
}
[data-theme="dark"] .helpful-links h3 {
color: rgba(255, 255, 255, 0.95);
}
[data-theme="dark"] .helpful-links li {
background: rgba(255, 255, 255, 0.04);
border: 1px solid var(--glass-border);
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
}
[data-theme="dark"] .helpful-links a {
color: var(--primary-color);
}
@media (max-width: 768px) {
.error-code {
font-size: 6rem;
}
.error-title {
font-size: var(--font-2xl);
}
.error-actions {
flex-direction: column;
align-items: center;
}
.helpful-links ul {
grid-template-columns: 1fr;
}
}
</style>
</head>
<body>
<!-- Google Tag Manager (noscript) -->
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-PPTNN6WD"
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<!-- End Google Tag Manager (noscript) -->
<div class="error-container">
<div class="error-code">404</div>
<h1 class="error-title" data-i18n="error404.title">페이지를 찾을 수 없습니다</h1>
<p class="error-description" data-i18n-html="error404.desc">
죄송합니다. 요청하신 페이지가 존재하지 않거나 이동되었을 수 있습니다.<br>
아래 링크를 통해 원하시는 정보를 찾아보세요.
</p>
<div class="error-actions">
<a href="index.html" class="btn btn-primary btn-lg"><i class="fa-solid fa-house" aria-hidden="true"></i> <span data-i18n="error404.btnHome">홈으로 돌아가기</span></a>
<a href="contact.html" class="btn btn-outline btn-lg"><i class="fa-solid fa-phone" aria-hidden="true"></i> <span data-i18n="error404.btnContact">문의하기</span></a>
</div>
<div class="search-container">
<label for="errorSearch" class="sr-only">검색</label>
<input type="text" class="search-input" placeholder="원하는 내용을 검색해보세요..." id="errorSearch" data-i18n-placeholder="error404.searchPlaceholder">
</div>
<div class="helpful-links">
<h3 data-i18n="error404.helpfulLinks">도움이 될 수 있는 페이지</h3>
<ul>
<li><a href="about.html"><i class="fa-solid fa-building" aria-hidden="true"></i> <span data-i18n="error404.linkAbout">회사 소개</span></a></li>
<li><a href="services.html"><i class="fa-solid fa-clapperboard" aria-hidden="true"></i> <span data-i18n="error404.linkServices">서비스 안내</span></a></li>
<li><a href="portfolio.html"><i class="fa-solid fa-bullseye" aria-hidden="true"></i> <span data-i18n="error404.linkPortfolio">포트폴리오</span></a></li>
<li><a href="gallery.html"><i class="fa-solid fa-images" aria-hidden="true"></i> <span data-i18n="error404.linkGallery">스튜디오 갤러리</span></a></li>
<li><a href="qna.html"><i class="fa-solid fa-circle-question" aria-hidden="true"></i> <span data-i18n="error404.linkQna">자주하는 질문</span></a></li>
<li><a href="contact.html"><i class="fa-solid fa-envelope" aria-hidden="true"></i> <span data-i18n="error404.linkContact">연락처 및 위치</span></a></li>
</ul>
</div>
</div>
<script src="js/i18n.js"></script>
<script src="js/common.js"></script>
<script>
// 검색 기능
document.getElementById('errorSearch').addEventListener('keypress', function(e) {
if (e.key === 'Enter') {
const query = this.value.trim();
if (query) {
// Q&A 페이지로 검색어와 함께 이동
window.location.href = `qna.html?search=${encodeURIComponent(query)}`;
}
}
});
</script>
</body>
</html>