Kord/apps/bot/src/i18n/locales/ko.ts

471 lines
23 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { TranslationSchema } from '../types';
/**
* 한국어 번역. en.ts와 키 구조가 1:1로 대응해야 합니다.
*/
export const ko: TranslationSchema = {
// ── 에러 메시지 ─────────────────────────────────────────
errors: {
E1001: {
userMessage: '사용자 제한 값이 올바르지 않습니다.',
resolution: '0에서 99 사이의 숫자를 입력해 주세요. (0 = 무제한)',
},
E1002: {
userMessage: '채널 이름 형식이 올바르지 않습니다.',
resolution: '올바른 채널 이름을 입력해 주세요. (최대 100자)',
},
E1003: {
userMessage: '자기 자신에게는 이 작업을 수행할 수 없습니다.',
},
E1004: {
userMessage: '선택한 사용자가 음성 채널에 없습니다.',
resolution: '작업 전에 해당 사용자가 채널에 있는지 확인해 주세요.',
},
E2001: {
userMessage: '봇에게 채널을 관리할 권한이 부족합니다.',
resolution: '서버 관리자에게 봇에게 「채널 관리」 권한을 부여해 달라고 요청해 주세요.',
},
E2002: {
userMessage: '봇에게 음성 채널 관련 권한이 부족합니다.',
resolution:
'서버 관리자에게 봇에게 「채널 관리」, 「역할 관리」, 「멤버 이동」 권한을 부여해 달라고 요청해 주세요.',
},
E2003: {
userMessage: '이 명령을 사용할 권한이 없습니다.',
resolution: '이 명령은 관리자 권한이 필요합니다.',
},
E2004: {
userMessage: '채널 소유자만 이 컨트롤을 사용할 수 있습니다.',
},
E2005: {
userMessage: '활성화된 임시 음성 채널에 있어야 이 기능을 사용할 수 있습니다.',
resolution: '임시 음성 채널에 참가한 뒤 다시 시도해 주세요.',
},
E3001: {
userMessage: '요청을 처리하는 중 내부 오류가 발생했습니다.',
resolution: '잠시 후 다시 시도해 주세요. 문제가 계속되면 봇 관리자에게 문의해 주세요.',
},
E3002: {
userMessage: '요청을 처리하는 중 내부 오류가 발생했습니다.',
resolution: '잠시 후 다시 시도해 주세요.',
},
E3003: {
userMessage: '명령을 실행하는 중 오류가 발생했습니다.',
resolution: '다시 시도해 주세요. 문제가 계속되면 봇 관리자에게 문의해 주세요.',
},
E3999: {
userMessage: '예상치 못한 오류가 발생했습니다.',
resolution: '잠시 후 다시 시도해 주세요. 문제가 계속되면 봇 관리자에게 문의해 주세요.',
},
E4001: {
userMessage: 'Discord에 의해 요청이 제한되었습니다.',
resolution: '잠시 기다린 뒤 다시 시도해 주세요.',
},
E4002: {
userMessage: '권한 부족으로 Discord가 작업을 거부했습니다.',
resolution: '서버 관리자에게 봇의 역할 및 채널 권한을 확인해 달라고 요청해 주세요.',
},
E4003: {
userMessage: 'Discord 측 일시적인 문제가 발생했습니다.',
resolution:
'잠시 후 다시 시도해 주세요. 문제가 계속되면 https://discordstatus.com 에서 상태를 확인해 주세요.',
},
},
errorTitles: {
USER_INPUT: '입력을 확인해주세요',
PERMISSION: '권한이 부족합니다',
BOT_INTERNAL: '내부 오류가 발생했습니다.',
DISCORD_API: '일시적인 문제입니다.',
},
errorFields: {
resolution: '💡 해결 방법',
},
// ── 음성 채널 ───────────────────────────────────────────
voice: {
channelReady: '{{owner}}, 임시 채널이 준비되었습니다! 아래 드롭다운 메뉴로 관리하세요.',
defaultRoomName: '{{username}}의 방',
controlPanel: {
placeholder: '⚙️ 채널 설정 관리',
rename: '채널 이름 변경',
limit: '인원 제한 설정',
lock: '채널 잠금 / 해제',
kick: '유저 내보내기',
ban: '유저 차단 / 숨기기',
transfer: '소유권 이전',
},
responses: {
channelLocked: '채널이 잠겼습니다! 초대된 멤버만 참여할 수 있습니다.',
channelUnlocked: '채널 잠금이 해제되었습니다! 누구나 참여할 수 있습니다.',
channelRenamed: '채널 이름이 **{{name}}**(으)로 변경되었습니다!',
limitSet: '인원 제한이 **{{limit}}**명으로 설정되었습니다!',
limitUnlimited: '무제한',
kicked: '{{user}} 님을 채널에서 내보냈습니다.',
banned: '{{user}} 님에게 채널이 보이지 않도록 차단했습니다.',
transferPrompt: '채널의 새 소유자가 될 사용자를 선택하세요.',
transferDone: '소유권이 {{user}} 님에게 이전되었습니다.',
banPrompt: '차단하면 해당 사용자에게 채널이 보이지 않게 됩니다.',
},
},
commands: {
voiceSetup: {
description: '임시 음성 채널을 위한 생성기 채널을 설정합니다.',
setDescription: '기존 음성 채널을 생성기로 설정합니다.',
createDescription: '새 음성 채널을 만들고 생성기로 설정합니다.',
channelOptionDescription: '생성기로 사용할 음성 채널',
categoryOptionDescription: '(선택) 임시 채널이 생성될 카테고리',
nameOptionDescription: '새 생성기 음성 채널 이름',
setSuccess: '{{channel}}을(를) 음성 생성기 채널로 설정했습니다!',
createSuccess: '{{channel}}을(를) 음성 생성기 채널로 생성·설정했습니다!',
},
voiceConfig: {
description: '서버의 임시 음성 채널 설정을 관리합니다.',
setNameTitle: '기본 이름 템플릿 설정',
setNameDesc: '임시 채널 생성 시 사용할 기본 이름 형식을 설정합니다. (사용자명: {{username}})',
setLimitTitle: '기본 인원 제한 설정',
setLimitDesc: '임시 채널 생성 시 적용할 기본 인원 제한을 설정합니다.',
statusTitle: '현재 서버 음성 설정',
templateLabel: '이름 템플릿',
limitLabel: '기본 인원 제한',
setSuccess: '서버 임시 채널 설정이 업데이트되었습니다.',
limitValue: '{{limit}}명 (0 = 무제한)',
},
language: {
description: '봇의 언어를 설정합니다.',
scopeDescription: '본인에게만 또는 서버 전체에 적용',
localeDescription: '사용할 언어',
scopeUser: '나만 적용',
scopeServer: '서버 전체 (관리자 전용)',
userSet: '개인 언어가 **{{locale}}**(으)로 설정되었습니다.',
serverSet: '서버 언어가 **{{locale}}**(으)로 설정되었습니다.',
serverPermissionDenied: '서버 언어 변경은 서버 관리자만 할 수 있습니다.',
},
event: {
description: '서버 이벤트 일정을 관리합니다.',
createDescription: '새 서버 이벤트를 생성합니다.',
listDescription: '예정된 서버 이벤트 목록을 조회합니다.',
cancelDescription: '예약된 서버 이벤트를 취소합니다.',
announceDescription: '이벤트 공지 Embed를 다시 게시합니다.',
titleDescription: '이벤트 제목',
dateDescription: 'YYYY-MM-DD 형식의 날짜',
timeDescription: 'HH:mm 형식의 시간 (24시간제, Asia/Seoul 기준)',
descriptionOptionDescription: '선택 사항인 이벤트 설명',
channelDescription: '선택 사항인 공지 채널',
reminderDescription: '리마인더 메시지 사용 여부',
remindersDescription: '분 단위 리마인더 목록, 예: 0,10,60',
idDescription: '취소할 이벤트 ID',
createSuccessTitle: '이벤트 생성 완료',
createSuccessBody: '**{{title}}** 이벤트가 예약되었습니다.',
listTitle: '예정된 이벤트 목록',
listEmpty: '예정된 이벤트가 없습니다.',
listItemValue:
'**시작 시각:** {{startsAt}}\n**상대 시간:** {{relative}}\n**상태:** {{status}}\n**리마인더:** {{reminder}}\n**채널:** {{channel}}',
cancelSuccess: '`{{id}}` 이벤트가 취소되었습니다.',
cancelNotFound: 'ID가 `{{id}}`인 예약 이벤트를 찾을 수 없습니다.',
announceSuccess: '`{{id}}` 이벤트를 {{channel}} 채널에 공지했습니다.',
announceNotAvailable: '이 이벤트에는 사용할 수 있는 공지 채널이 설정되어 있지 않습니다.',
startAnnouncementTitle: '이벤트 시작',
startAnnouncementLead: '이 이벤트가 지금 시작됩니다.',
invalidDateTime: '이벤트 날짜 또는 시간 형식이 올바르지 않습니다.',
invalidDateTimeResolution: '날짜는 `YYYY-MM-DD`, 시간은 `HH:mm` 24시간 형식으로 입력해 주세요.',
invalidReminderOffsets: '리마인더 간격 입력 형식이 올바르지 않습니다.',
invalidReminderOffsetsResolution:
'`0,10,60`처럼 0 이상의 분을 쉼표로 구분해 입력해 주세요. 비우면 자동 공지를 사용하지 않습니다.',
invalidPastDateTime: '과거 시각으로는 이벤트를 예약할 수 없습니다.',
invalidPastDateTimeResolution: '미래 시각을 선택한 뒤 다시 시도해 주세요.',
statusScheduled: '예약됨',
statusCancelled: '취소됨',
statusCompleted: '완료됨',
reminderOn: '사용',
reminderOff: '사용 안 함',
reminderNone: '자동 공지 없음',
announcementChannelNone: '미설정',
fields: {
eventId: '이벤트 ID',
startsAt: '시작 시각',
reminder: '리마인더',
announcementChannel: '공지 채널',
status: '상태',
},
},
autorole: {
description: '입장 시 역할을 자동으로 부여하는 기능을 설정합니다.',
statusTitle: '자동 역할 부여 설정 상태',
userRoleLabel: '일반 유저 역할',
botRoleLabel: '봇 역할',
statusLabel: '유저 자동 부여',
botStatusLabel: '봇 자동 부여',
userRolePlaceholder: '유저 기본 역할을 선택하세요',
botRolePlaceholder: '봇 기본 역할을 선택하세요',
toggleUserEnable: '🟢 유저 자동부여 켜기',
toggleUserDisable: '🔴 유저 자동부여 끄기',
toggleBotEnable: '🟢 봇 자동부여 켜기',
toggleBotDisable: '🔴 봇 자동부여 끄기',
notSet: '미설정',
enabled: '활성',
disabled: '비활성',
updateSuccess: '자동 역할 설정이 업데이트되었습니다.',
permissionsError: '봇의 역할 순위가 낮거나 권한이 부족하여 역할을 부여할 수 없습니다.',
suspendNotice: '권한 부족으로 인해 자동 역할 부여 기능이 일시 중지되었습니다. 봇의 권한과 역할 순위를 확인해 주세요.',
},
music: {
description: '음성 채널에서 YouTube 오디오를 재생합니다.',
addDescription: 'YouTube를 검색하거나 영상 URL을 재생 목록에 추가합니다.',
queueDescription: '현재 음악 재생 목록을 표시합니다.',
removeDescription: '대기열에서 곡을 삭제합니다.',
pauseDescription: '현재 재생 중인 곡을 일시정지합니다.',
resumeDescription: '일시정지된 곡의 재생을 다시 시작합니다.',
skipDescription: '현재 재생 중인 곡을 건너뜁니다.',
stopDescription: '재생을 중지하고 대기열을 비웁니다.',
leaveDescription: '봇을 음성 채널에서 내보냅니다.',
queryDescription: 'YouTube 검색어',
urlDescription: 'YouTube 영상 URL',
indexDescription: '대기열에서 삭제할 인덱스',
addMutuallyExclusive: '검색어와 YouTube URL 중 하나만 선택하세요.',
addMutuallyExclusiveResolution: '`query` 또는 `url` 중 정확히 하나만 입력하세요.',
notInVoice: '음악 명령을 사용하려면 음성 채널에 있어야 합니다.',
notInVoiceResolution: '먼저 음성 채널에 참가한 뒤 다시 시도하세요.',
differentVoiceChannel: '다른 음성 채널에서 이미 음악이 재생 중입니다.',
differentVoiceChannelResolution: '봇과 같은 음성 채널에 들어가거나, 현재 세션이 끝날 때까지 기다리세요.',
noSearchResults: '해당 검색어로 YouTube 결과를 찾지 못했습니다.',
noSearchResultsResolution: '검색어를 구체적으로 바꾸거나 YouTube URL을 직접 지정하세요.',
invalidUrl: '제공한 YouTube URL이 올바르지 않습니다.',
invalidUrlResolution: '일반적인 `youtube.com` 또는 `youtu.be` 영상 링크를 사용하세요.',
noActiveSession: '이 서버에 활성 음악 세션이 없습니다.',
noActiveSessionResolution: '먼저 곡을 추가해 재생을 시작하세요.',
queueAddedNowPlaying: '**{{title}}**을(를) 추가하고 {{channel}}에서 재생을 시작했습니다.',
queueAddedLater: '**{{title}}**을(를) 대기열에 추가했습니다. 순번: `#{{position}}`.',
playlistAddedNowPlaying: '플레이리스트에서 **{{count}}**곡을 추가하고 {{channel}}에서 재생을 시작했습니다.',
playlistAddedLater: '플레이리스트에서 **{{count}}**곡을 대기열에 추가했습니다.',
queueTitle: '음악 대기열',
queueEmpty: '대기열이 비어 있습니다.',
queueNowPlaying: '지금 재생 중',
queueUpcoming: '다음 재생',
queueMoreItems: '… 외 **{{count}}**곡 더 있음',
queueRemoved: '대기열에서 **{{title}}**을(를) 제거했습니다.',
queueRemoveOutOfRange: '해당 대기열 번호가 없습니다.',
queueRemoveOutOfRangeResolution: '먼저 `/music queue`로 현재 대기열 번호를 확인하세요.',
pauseSuccess: '현재 곡을 일시정지했습니다.',
resumeSuccess: '재생을 재개했습니다.',
skipSuccess: '현재 곡을 건너뛰었습니다.',
leaveSuccess: '음성 채널에서 나가고 대기열을 비웠습니다.',
stopSuccess: '재생을 중지하고 대기열을 비웠습니다.',
playbackStartedTitle: '지금 재생 중',
playbackIdleTitle: '대기열 종료',
playbackIdleBody: '대기열에 더 이상 곡이 없습니다.',
playbackFailed: '**{{title}}** 재생에 실패했습니다. 다음 곡으로 넘어갑니다.',
playbackFailedResolution: 'YouTube에서 스트림을 불러오지 못했습니다.',
streamUnavailable: '이 영상의 재생 가능한 오디오 스트림을 불러올 수 없습니다.',
streamUnavailableResolution: '다른 영상을 시도하거나 나중에 다시 추가해 보세요.',
requestedBy: '요청자',
duration: '길이',
progress: '진행',
source: '출처',
status: '상태',
queueLength: '대기열 길이',
nextTrack: '다음 곡',
statusPlaying: '재생 중',
statusPaused: '일시정지',
unknownDuration: '알 수 없음',
buttons: {
pause: '일시정지',
resume: '재개',
skip: '건너뛰기',
stop: '중지',
leave: '나가기',
},
},
fishing: {
description: '낚시 미니게임을 플레이합니다.',
enterDescription: '낚시 전용 스레드를 생성하거나 다시 엽니다.',
castDescription: '자신의 낚시 스레드 안에서 낚시 세션을 시작합니다.',
endDescription: '낚시 스레드를 종료하고 삭제합니다.',
statusDescription: '낚시 통계를 확인합니다.',
dexDescription: '낚시 도감을 확인합니다.',
rankingDescription: '이 서버의 물고기 크기 랭킹을 확인합니다.',
disabled: '이 서버에서는 낚시 미니게임이 비활성화되어 있습니다.',
restrictedChannel: '낚시는 {{channel}} 채널에서만 시작할 수 있습니다.',
enterTextChannelOnly: '낚시 스레드는 일반 텍스트 채널에서만 열 수 있습니다.',
enterExistingThread: '이미 {{thread}}에 자신의 낚시 스레드가 열려 있습니다.',
enterCreated: '{{thread}}에 낚시 스레드를 만들었습니다.',
castThreadOnly: '/fishing cast는 자신의 낚시 스레드 안에서만 사용할 수 있습니다.',
startExistingSession: '이미 {{thread}}에서 진행 중인 낚시 세션이 있습니다.',
startCreated: '{{thread}}에서 낚시 세션을 시작했습니다.',
noActiveSession: '종료할 낚시 세션이나 스레드가 없습니다.',
ownerOnly: '이 낚시 세션의 소유자만 조작할 수 있습니다.',
wrongThread: '이 조작은 자신의 낚시 스레드 안에서만 사용할 수 있습니다.',
endDeleted: '낚시 스레드를 종료했습니다. 스레드를 삭제합니다.',
profileTitle: '{{user}}의 낚시 프로필',
profileEmpty: '아직 낚시 기록이 없습니다.',
dexTitle: '{{user}}의 낚시 도감',
dexEmpty: '아직 발견한 물고기가 없습니다.',
rankingTitle: '낚시 크기 랭킹',
rankingEmpty: '아직 이 서버에 낚시 기록이 없습니다.',
titleActive: '낚시 세션',
titleEnded: '낚시 세션 종료',
status: '상태',
rarity: '레어도',
size: '크기',
catchCount: '포획 수',
bestRarity: '최고 레어도',
bestSize: '최고 크기',
targetFish: '대상 물고기',
distance: '거리',
tension: '끊어짐 게이지',
reward: '보상',
successRate: '성공률',
totalCasts: '총 시도',
totalGoldEarned: '누적 골드',
bestCatchReward: '최고 보상',
rarityBreakdown: '레어도별 포획',
lastCastAt: '최근 낚시',
noRecord: '기록 없음',
threadHint: '/fishing cast로 다시 시작하거나 /fishing end로 스레드를 삭제할 수 있습니다.',
catchResultTitle: '낚시 성공!',
catchResultBody: '**{{rarity}} {{fish}}**를 낚았습니다. 크기는 **{{sizeCm}} cm**, 보상은 **{{reward}} G**입니다.',
states: {
hooked: '입질 중',
resting: '휴식 중',
tense: '당기는 중',
missed: '타이밍 빗나감',
success: '낚시 성공',
failed: '줄이 끊어짐',
},
},
permissionAudit: {
title: '봇 권한 진단 보고서',
channel: '채널',
noResults: '진단할 기능이 없습니다. 봇이 아직 설정되지 않았을 수 있습니다.',
summaryLabel: '진단 결과 요약',
summaryOk: '모든 항목 정상. 문제가 없습니다.',
summaryIssue: '{{fail}}건 실패 · {{warn}}건 경고가 있습니다.',
hierarchyWarning:
"봇 역할(위치: {{botPos}})이 '{{role}}'(위치: {{targetPos}})보다 위에 있어야 해당 역할을 관리할 수 있습니다.",
features: {
BASIC: '기본 봇 기능',
VOICE_GLOBAL: '임시 음성 채널 (전역)',
VOICE_GENERATOR_CHANNEL: '음성 생성기 채널',
VOICE_GENERATOR_CATEGORY: '음성 생성기 카테고리',
MIMIC_WEBHOOK: '메시지 흉내 (Webhook)',
},
},
setup: {
description: '설정 마법사를 실행해 봇의 필수 기능을 단계별로 설정합니다.',
step0: {
title: '봇 설정 마법사 시작',
desc:
'환영합니다! 이 마법사로 아래 4가지 항목을 설정합니다.\n\n1단계 **언어 설정**\n2단계 **필수 권한 확인**\n3단계 **감사 채널 설정**\n4단계 **임시 음성 채널 설정**',
startBtn: '설정 시작하기',
},
step1: {
title: '1단계 언어 설정',
desc: '서버 전체에 적용될 봇의 기본 언어를 선택하세요. (현재: **{{locale}}**)',
placeholder: '언어를 선택하세요',
nextBtn: '다음 단계',
skipBtn: '건너뛰기',
},
step2: {
title: '2단계 필수 권한 확인',
descOk: '**필요한 권한이 모두 부여되어 있습니다.**',
descFail:
'**일부 권한이 부족합니다.**\n결과를 확인하고 봇 역할에 필요한 기능 권한을 부여해 주세요.',
recheckBtn: '다시 검사하기',
nextBtn: '다음 단계',
},
step3: {
title: '3단계 감사 채널 설정',
desc: '봇 이벤트와 오류 로그를 받을 채널을 선택하세요.',
placeholder: '감사 로그 채널 선택',
disableBtn: '감사 로그 끄기',
nextBtn: '다음 단계',
},
step4: {
title: '3-1단계 감사 로그 카테고리',
desc: '받을 로그 카테고리를 선택하세요. **초록**은 켜짐, **빨강**은 꺼짐입니다.',
nextBtn: '다음 단계',
},
step5: {
title: '4단계 임시 음성 채널 설정',
desc:
'임시 음성 채널의 「생성기 채널」을 선택하세요.\n기존 채널을 고르거나 카테고리/채널을 봇이 **자동 생성**하게 할 수도 있습니다.',
placeholder: '생성기로 쓸 음성 채널 선택',
autoBtn: '자동 생성하기',
skipBtn: '임시 음성 사용 안 함',
nextBtn: '설정 완료',
},
step6: {
title: '설정 요약',
desc: '**1. 언어**: {{lang}}\n**2. 감사 채널**: {{audit}}\n**3. 감사 카테고리**: {{categories}}\n**4. 임시 음성 채널**: {{voice}}',
finishBtn: '마치기',
},
finished: '설정 마법사를 완료했습니다.',
expired: '시간이 만료되었습니다. `/setup`을 다시 실행해 주세요.',
defaultCategoryName: '음성 채널',
defaultGeneratorName: '채널 생성하기',
auditCategories: {
SYSTEM: '시스템',
BOOT: '부팅',
VOICE: '음성',
PERMISSION: '권한',
},
},
config: {
title: '기능 설정 변경 결과',
noOptions: '변경할 옵션을 하나 이상 선택해 주세요.',
mimic: {
label: '흉내(Mimic)',
enabled: '활성',
disabled: '비활성',
},
emoji: {
label: '큰 이모지(Big Emoji)',
enabled: '활성',
disabled: '비활성',
},
},
},
// ── 모달 ────────────────────────────────────────────────
modals: {
renameTitle: '음성 채널 이름 변경',
renameLabel: '새 채널 이름',
limitTitle: '인원 제한 설정',
limitLabel: '인원 제한 (0 = 무제한, 199)',
},
// ── 셀렉트 메뉴 플레이스홀더 ────────────────────────────
selects: {
kickUser: '추방할 유저를 선택하세요',
banUser: '차단할 유저를 선택하세요',
transferOwner: '소유권을 이전할 유저를 선택하세요',
},
// ── 상태 메시지 ──────────────────────────────────────────
presence: {
servers: '{{guildCount}}개의 서버에서 작동 중',
help: '/help 명령어를 확인하세요',
managing: '임시 음성 채널 관리 중',
version: 'Kord v1.0.0',
},
};