- src/shared/i18n.ts: 공용 i18n 로더 (dotted-key + {{placeholder}} 보간)
- locales/server/ko-kr.json: 사이트 + 라우터 + 데이터팩 출력 사전
- EJS 뷰는 res.locals.t 미들웨어로 일괄 적용
- listEditor.js 등 클라이언트 JS 는 사전을 inline <script> 로 주입받아 tt() 헬퍼 사용
167 lines
7.8 KiB
JSON
167 lines
7.8 KiB
JSON
{
|
||
"common": {
|
||
"back": "← 돌아가기",
|
||
"backToList": "목록으로",
|
||
"save": "저장",
|
||
"cancel": "취소",
|
||
"ok": "확인",
|
||
"delete": "삭제",
|
||
"edit": "수정",
|
||
"close": "×",
|
||
"loading": "불러오는 중..."
|
||
},
|
||
"site": {
|
||
"indexTitle": "음악퀴즈 목록",
|
||
"heroTitle": "마인크래프트 음악퀴즈",
|
||
"heroSubtitle": "설치기에서 사용 가능한 음악퀴즈 목록입니다.",
|
||
"empty": "등록된 음악퀴즈가 없습니다.",
|
||
"fileLabel": "파일: {{file}}.json",
|
||
"mcVersion": "마인크래프트",
|
||
"platform": "플랫폼",
|
||
"modsFolder": "모드 폴더",
|
||
"resourcepack": "리소스팩",
|
||
"noneFallback": "없음"
|
||
},
|
||
"nav": {
|
||
"brand": "관리자 페이지",
|
||
"logout": "로그아웃"
|
||
},
|
||
"login": {
|
||
"title": "관리자 로그인",
|
||
"password": "비밀번호",
|
||
"submit": "로그인",
|
||
"wrongPassword": "비밀번호가 올바르지 않습니다."
|
||
},
|
||
"dashboard": {
|
||
"title": "음악퀴즈 목록",
|
||
"browserTitle": "관리자 대시보드",
|
||
"editList": "음악목록 수정",
|
||
"editDatapack": "데이터팩 수정",
|
||
"addPack": "음악퀴즈 추가",
|
||
"deletePack": "음악퀴즈 삭제",
|
||
"emptyHint": "등록된 음악퀴즈가 없습니다. \"음악퀴즈 추가\" 버튼으로 새로 만들어 보세요.",
|
||
"select": "선택",
|
||
"confirmDelete": "삭제 확인",
|
||
"mcShort": "MC"
|
||
},
|
||
"list": {
|
||
"browserTitle": "음악목록 수정",
|
||
"title": "음악목록 수정"
|
||
},
|
||
"listEditor": {
|
||
"browserTitle": "{{name}} — 음악/사진 목록",
|
||
"dirtyTooltip": "저장되지 않은 변경사항이 있습니다",
|
||
"tabMusic": "음악목록",
|
||
"tabImage": "사진목록",
|
||
"saveList": "목록 저장",
|
||
"clearList": "목록 초기화",
|
||
"playlistPlaceholder": "유튜브 플레이리스트 URL",
|
||
"fetchPlaylist": "플레이리스트 불러오기",
|
||
"imageFromMusic": "음악목록에서 가져오기",
|
||
"modalConfirmTitle": "확인",
|
||
"musicEditTitle": "음악 항목 수정",
|
||
"musicEditUrl": "유튜브 영상 주소",
|
||
"musicEditHint": "저장하면 yt-dlp 로 제목·가수·재생시간을 자동으로 갱신합니다.",
|
||
"imageEditTitle": "사진 항목 수정",
|
||
"imageSegYt": "유튜브 주소",
|
||
"imageSegImg": "이미지 주소",
|
||
"imageEditUrl": "주소",
|
||
"titleFallback": "(제목 없음)",
|
||
"artistFallback": "(가수 미상)",
|
||
"rowEditTooltip": "더블클릭해서 수정",
|
||
"metaLoading": "메타데이터 가져오는 중…",
|
||
"metaFailedShort": "메타 조회 실패",
|
||
"metaFailedTitle": "메타데이터 조회 실패",
|
||
"metaFailedAsk": "{{message}}\n주소만 변경하고 제목/가수/시간은 그대로 둘까요?",
|
||
"saving": "저장 중…",
|
||
"saved": "저장 완료",
|
||
"saveFailed": "저장 실패: {{message}}",
|
||
"fetchEnterUrl": "플레이리스트 주소를 입력해 주세요.",
|
||
"fetchTitle": "플레이리스트 불러오기",
|
||
"fetchConfirm": "현재 {{type}}목록 순서가 모두 사라집니다. 진행할까요?",
|
||
"fetchTypeMusic": "음악",
|
||
"fetchTypeImage": "사진",
|
||
"fetchLoading": "불러오는 중…",
|
||
"fetchedCount": "{{count}}개 항목을 불러왔습니다.",
|
||
"failed": "실패: {{message}}",
|
||
"clearTitle": "목록 초기화",
|
||
"clearConfirm": "\"{{type}}목록\"을 비웁니다. 진행할까요?",
|
||
"imageFromMusicEmpty": "음악목록이 비어 있어 가져올 수 없습니다.",
|
||
"imageFromMusicTitle": "사진목록 가져오기",
|
||
"imageFromMusicConfirm": "저장된 음악목록의 영상 {{count}}개를 그대로 사진목록으로 가져옵니다.\n현재 사진목록은 모두 사라집니다. 진행할까요?",
|
||
"leaveTitle": "저장되지 않은 변경사항",
|
||
"leaveConfirm": "저장하지 않은 변경사항이 있습니다.\n저장 없이 이 페이지를 떠나시겠습니까?"
|
||
},
|
||
"editor": {
|
||
"browserTitle": "{{name}} 편집",
|
||
"eyebrow": "PACK EDITOR",
|
||
"displayName": "음악퀴즈 이름",
|
||
"fileName": "JSON 파일 이름 (확장자 제외)",
|
||
"mcVersion": "마인크래프트 버전",
|
||
"platformType": "모드 플랫폼",
|
||
"platformDownloadUrl": "플랫폼 설치파일 URL",
|
||
"platformDownloadHint": "도메인 없이 입력하면 manifest.json 도메인의 <code>/file/platforms/<파일명></code>으로 해석됩니다.",
|
||
"platformLoaderVersion": "Fabric Loader 버전",
|
||
"platformLoaderHint": "선택한 마인크래프트 버전 기준 Fabric Loader 목록입니다. 설치기는 최신 fabric-installer 를 받아 자동으로 CLI 설치합니다.",
|
||
"platformLoaderEmpty": "호환 로더 없음",
|
||
"platformLoaderPickMc": "마인크래프트 버전을 먼저 선택하세요",
|
||
"platformLoaderLoadFailed": "로더 목록 로드 실패: {{message}}",
|
||
"serverMinRam": "서버 최소 램 (MB)",
|
||
"serverMaxRam": "서버 최대 램 (MB)",
|
||
"clientMinRam": "클라이언트 최소 램 (MB)",
|
||
"clientRecommendedRam": "클라이언트 권장 램 (MB)",
|
||
"mapPath": "맵 파일 (.zip)",
|
||
"mapPathHint": "/file/maps/ 아래 zip 파일 이름.",
|
||
"serverPath": "서버 파일 (.zip)",
|
||
"serverPathHint": "/file/servers/ 아래 zip 파일 이름. 멀티 모드 전용.",
|
||
"modsFolder": "모드 폴더 이름",
|
||
"modsFolderHint": "/file/mods/<폴더이름>/ 안의 모든 .jar을 자동으로 받습니다. 비워두면 모드를 받지 않습니다.",
|
||
"resourcepackPath": "리소스팩 (.zip)",
|
||
"resourcepackHint": "/file/resourcepacks/ 아래 .zip 파일 이름. 비워두면 리소스팩을 받지 않습니다.",
|
||
"ramOrderInvalid": "클라이언트 최소 램은 권장 램보다 클 수 없습니다.",
|
||
"fabricLoaderRequired": "Fabric 로더 버전을 선택해 주세요."
|
||
},
|
||
"datapack": {
|
||
"browserTitle": "데이터팩 수정",
|
||
"title": "데이터팩 수정",
|
||
"pickPack": "음악퀴즈 선택",
|
||
"pickedNone": "선택된 음악퀴즈 없음",
|
||
"pickedLabel": "선택: {{name}}",
|
||
"totalCount": "총 {{count}}개의 음악을 찾았습니다.",
|
||
"export": "데이터팩 출력",
|
||
"copy": "복사",
|
||
"copied": "복사됨",
|
||
"exporting": "출력 중…",
|
||
"exported": "출력 완료",
|
||
"failed": "실패: {{message}}",
|
||
"modalPickTitle": "음악퀴즈 선택"
|
||
},
|
||
"errors": {
|
||
"packNotFound": "해당 음악퀴즈를 찾을 수 없습니다.",
|
||
"packNotFoundJson": "음악퀴즈를 찾을 수 없습니다.",
|
||
"videoUrlRequired": "영상 주소를 입력해 주세요.",
|
||
"playlistUrlRequired": "플레이리스트 주소를 입력해 주세요.",
|
||
"metaNotFound": "메타데이터를 찾을 수 없습니다.",
|
||
"ramOrderInvalid": "clientMinRam은 clientRecommendedRam보다 클 수 없습니다.",
|
||
"unknown": "알 수 없는 오류",
|
||
"serverError": "서버 오류: {{message}}"
|
||
},
|
||
"youtube": {
|
||
"ytdlpUnavailable": "yt-dlp 를 준비하지 못했습니다. (수동 입력으로 진행)",
|
||
"ytdlpVerifyFailed": "yt-dlp 다운로드는 됐지만 실행 검증에 실패했습니다.",
|
||
"ytdlpInstallFailed": "yt-dlp 자동 설치에 실패했습니다: {{message}}",
|
||
"ytdlpVideoFailed": "yt-dlp 영상 조회 실패 (code={{code}}): {{detail}}",
|
||
"ytdlpPlaylistFailed": "yt-dlp 플레이리스트 조회 실패 (code={{code}}): {{detail}}",
|
||
"tooManyRedirects": "redirect 가 너무 많습니다."
|
||
},
|
||
"datapackOutput": {
|
||
"header": "# === musicquiz: {{name}} ===",
|
||
"summary": "# 총 {{musicCount}}곡 / 사진 {{imageCount}}장",
|
||
"initLine": "say [musicquiz] 데이터팩 초기화",
|
||
"placeholder": "# 곡별 placeholder. 실제 포맷 확정되면 교체 예정.",
|
||
"trackLine": "# {{index}}. {{title}} - {{artist}} ({{duration}}s)",
|
||
"titleFallback": "(제목 없음)",
|
||
"artistFallback": "(가수 미상)"
|
||
}
|
||
}
|