- src/shared/i18n.ts: 공용 i18n 로더 (dotted-key + {{placeholder}} 보간)
- locales/server/ko-kr.json: 사이트 + 라우터 + 데이터팩 출력 사전
- EJS 뷰는 res.locals.t 미들웨어로 일괄 적용
- listEditor.js 등 클라이언트 JS 는 사전을 inline <script> 로 주입받아 tt() 헬퍼 사용
31 lines
1.0 KiB
Plaintext
31 lines
1.0 KiB
Plaintext
<header class="topNav">
|
|
<a class="navBrand" href="/op/dashboard">
|
|
<span class="navLogo">🎵</span>
|
|
<span class="navTitle"><%= t('nav.brand') %></span>
|
|
</a>
|
|
<div class="navUser">
|
|
<button type="button" class="navUserButton" id="userMenuToggle"><%= userId %></button>
|
|
<div class="navUserMenu" id="userMenu" hidden>
|
|
<form method="post" action="/op/logout">
|
|
<button type="submit" class="dangerLink"><%= t('nav.logout') %></button>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</header>
|
|
<script>
|
|
(function () {
|
|
var toggle = document.getElementById('userMenuToggle')
|
|
var menu = document.getElementById('userMenu')
|
|
if (!toggle || !menu) return
|
|
toggle.addEventListener('click', function () {
|
|
var hidden = menu.hasAttribute('hidden')
|
|
if (hidden) menu.removeAttribute('hidden')
|
|
else menu.setAttribute('hidden', '')
|
|
})
|
|
document.addEventListener('click', function (event) {
|
|
if (event.target === toggle || menu.contains(event.target)) return
|
|
menu.setAttribute('hidden', '')
|
|
})
|
|
})()
|
|
</script>
|