mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-10-22 06:56:35 +00:00
1f66ef1d32
CARTO stamps an "API KEY REQUIRED" watermark onto every basemap tile fetched without a key since 26.08.2026, and both CartoDB presets plus the built-in fallback are CARTO. The key is free and needs no account, so add it as a setting rather than dropping the provider. carto_api_key sits next to mapbox_access_token: per user in Settings/Map, instance-wide under Admin/User Defaults, encrypted at rest, injected from CARTO_API_KEY on managed instances. Unlike Mapbox it never switches the map provider, since a raster key says nothing about the renderer. The key is appended as ?key= at render time instead of being stored in the template, so a saved URL stays portable and survives a rotation. That is also what reaches the four maps that pinned CARTO and ignored the user's tile setting: atlas, collections, the public trip share and the public journey. The two share pages read it from their token-gated payload, the same way baseCurrency already travels. Also lifts the release notice above page chrome. Its overlay sat at z-index 50, under the Vacay mode toolbar at 61, so the dialog was neither on top nor modal. Adds a six-step layer scale to index.css and moves the three notice shells onto it. Closes #2054 Closes #2052
525 lines
35 KiB
TypeScript
525 lines
35 KiB
TypeScript
import type { TranslationStrings } from '../types';
|
|
|
|
const settings: TranslationStrings = {
|
|
'settings.title': '설정',
|
|
'settings.subtitle': '개인 설정을 구성하세요',
|
|
'settings.tabs.display': '화면',
|
|
'settings.tabs.map': '지도',
|
|
'settings.tabs.notifications': '알림',
|
|
'settings.tabs.integrations': '통합',
|
|
'settings.plugins.oauth.connected': '연결됨',
|
|
'settings.plugins.oauth.notConnected': '연결 안 됨',
|
|
'settings.plugins.oauth.connect': '연결',
|
|
'settings.plugins.oauth.disconnect': '연결 해제',
|
|
'settings.tabs.plugins': '플러그인',
|
|
'settings.plugins.title': '플러그인 설정',
|
|
'settings.plugins.subtitle': '사용 중인 플러그인의 개인 설정(API 키, 환경설정).',
|
|
'settings.plugins.empty': '활성화된 플러그인이 없습니다.',
|
|
'settings.plugins.saved': '설정이 저장되었습니다',
|
|
'settings.tabs.account': '계정',
|
|
'settings.tabs.offline': '오프라인',
|
|
'settings.tabs.about': '정보',
|
|
'settings.map': '지도',
|
|
'settings.mapTemplate': '지도 템플릿',
|
|
'settings.mapTemplatePlaceholder.select': '템플릿 선택...',
|
|
'settings.mapDefaultHint': '비워두면 OpenStreetMap (기본값) 사용',
|
|
'settings.mapHint': '지도 타일 URL 템플릿',
|
|
'settings.mapProvider': '지도 공급자',
|
|
'settings.mapProviderHint': '여행 플래너 및 Journey 지도에 영향을 줍니다. Atlas는 항상 Leaflet을 사용합니다.',
|
|
'settings.mapLeafletSubtitle': '클래식 2D, 모든 래스터 타일',
|
|
'settings.mapMapboxSubtitle': '벡터 타일, 3D 건물 및 지형',
|
|
'settings.mapMapLibreSubtitle': 'OpenFreeMap 벡터 타일, 토큰 불필요',
|
|
'settings.mapExperimental': '실험적',
|
|
'settings.mapMapboxToken': 'Mapbox 액세스 토큰',
|
|
'settings.mapMapboxTokenHint': '공개 토큰 (pk.*) 출처',
|
|
'settings.mapMapboxTokenLink': 'mapbox.com → 액세스 토큰',
|
|
'settings.mapCartoKey': 'CARTO API 키',
|
|
'settings.mapCartoKeyHint':
|
|
'CARTO 배경 지도는 키가 없으면 워터마크가 표시됩니다. 무료이며 계정도 필요 없습니다. 출처',
|
|
'settings.mapCartoKeyLink': 'carto.com 배경 지도 API 키',
|
|
'settings.mapCartoKeyMissing':
|
|
'이 템플릿은 CARTO 배경 지도입니다. 키가 없으면 CARTO가 모든 타일에 "API KEY REQUIRED"를 새깁니다.',
|
|
'settings.mapStyle': '지도 스타일',
|
|
'settings.mapStylePlaceholder': 'Mapbox 스타일 선택',
|
|
'settings.mapStyleHint': '프리셋 또는 mapbox://styles/USER/ID URL 직접 입력',
|
|
'settings.mapOpenFreeMapStylePlaceholder': 'OpenFreeMap 스타일 선택',
|
|
'settings.mapOpenFreeMapStyleHint': '프리셋 또는 OpenFreeMap 스타일 URL. OpenFreeMap 스타일은 토큰 없이 작동합니다.',
|
|
'settings.map3dBuildings': '3D 건물 및 지형',
|
|
'settings.map3dHint': '기울기 + 실제 3D 건물 돌출 — 위성 포함 모든 스타일에서 작동합니다.',
|
|
'settings.mapHighQuality': '고품질 모드',
|
|
'settings.mapHighQualityHint': '안티앨리어싱 + 구형 투영으로 선명한 경계와 현실적인 지구 뷰를 제공합니다.',
|
|
'settings.mapHighQualityWarning': '저사양 기기에서 성능에 영향을 줄 수 있습니다.',
|
|
'settings.mapTipLabel': '팁:',
|
|
'settings.mapTip':
|
|
'우클릭 후 드래그하여 지도를 회전/기울이세요. 가운데 클릭으로 장소를 추가할 수 있습니다 (우클릭은 회전 전용).',
|
|
'settings.saveMap': '지도 저장',
|
|
'settings.apiKeys': 'API 키',
|
|
'settings.mapsKey': 'Google Maps API 키',
|
|
'settings.mapsKeyHint': '장소 검색용. Places API (New) 필요. console.cloud.google.com에서 발급',
|
|
'settings.weatherKey': 'OpenWeatherMap API 키',
|
|
'settings.weatherKeyHint': '날씨 데이터용. openweathermap.org/api에서 무료 발급',
|
|
'settings.keyPlaceholder': '키 입력...',
|
|
'settings.configured': '설정됨',
|
|
'settings.saveKeys': '키 저장',
|
|
'settings.display': '화면',
|
|
'settings.colorMode': '색상 모드',
|
|
'settings.light': '라이트',
|
|
'settings.dark': '다크',
|
|
'settings.auto': '자동',
|
|
'settings.language': '언어',
|
|
'settings.temperature': '온도 단위',
|
|
'settings.distance': '거리 단위',
|
|
'settings.timeFormat': '시간 형식',
|
|
'settings.bookingLabels': '예약 경로 레이블',
|
|
'settings.bookingLabelsHint': '지도에 역 / 공항 이름을 표시합니다. 끄면 아이콘만 표시됩니다.',
|
|
'settings.blurBookingCodes': '예약 코드 흐리게',
|
|
'settings.aiAlwaysRetry': 'Always retry booking imports with AI',
|
|
'settings.aiAlwaysRetryHint': 'When a file cannot be read by the standard parser, automatically retry it with AI.',
|
|
'settings.optimizeFromAccommodation': '숙소 기준으로 경로 최적화',
|
|
'settings.optimizeFromAccommodationHint':
|
|
'하루 일정을 최적화할 때, 아침에 머무는 숙소에서 경로를 시작하고 그날 저녁에 체크인하는 숙소에서 경로를 끝냅니다.',
|
|
'settings.notifications': '알림',
|
|
'settings.notifyTripInvite': '여행 초대',
|
|
'settings.notifyBookingChange': '예약 변경',
|
|
'settings.notifyTripReminder': '여행 리마인더',
|
|
'settings.notifyTodoDue': '할 일 마감 임박',
|
|
'settings.notifyVacayInvite': 'Vacay 퓨전 초대',
|
|
'settings.notifyVacayShare': 'Vacay 캘린더 공유',
|
|
'settings.notifyPhotosShared': '공유된 사진 (Immich)',
|
|
'settings.notifyCollabMessage': '채팅 메시지 (Collab)',
|
|
'settings.notifyPackingTagged': '짐 목록: 배정',
|
|
'settings.notifyWebhook': '웹훅 알림',
|
|
'settings.notifyVersionAvailable': '새 버전 사용 가능',
|
|
'settings.notificationPreferences.email': '이메일',
|
|
'settings.notificationPreferences.webhook': '웹훅',
|
|
'settings.notificationPreferences.inapp': '앱 내',
|
|
'settings.notificationPreferences.notConfigured': '아직 설정되지 않았습니다 — 플러그인 설정에서 구성하세요',
|
|
'settings.plugins.actions': '작업',
|
|
'settings.plugins.actions.confirm': '이 작업을 실행할까요?',
|
|
'settings.notificationPreferences.sendTest': '테스트 전송',
|
|
'settings.notificationPreferences.configure': '설정하기',
|
|
'settings.notificationPreferences.testSuccess': '테스트 알림을 보냈습니다.',
|
|
'settings.notificationPreferences.testFailed': '테스트에 실패했습니다.',
|
|
'settings.notificationPreferences.pluginConfigured': '설정됨. 자격 증명은 플러그인 설정 페이지에서 관리하세요.',
|
|
'settings.notificationPreferences.ntfy': 'Ntfy',
|
|
'settings.notificationPreferences.noChannels':
|
|
'알림 채널이 설정되지 않았습니다. 관리자에게 이메일 또는 웹훅 알림 설정을 요청하세요.',
|
|
'settings.webhookUrl.label': '웹훅 URL',
|
|
'settings.webhookUrl.placeholder': 'https://discord.com/api/webhooks/...',
|
|
'settings.webhookUrl.hint': 'Discord, Slack 또는 사용자 지정 웹훅 URL을 입력하여 알림을 받으세요.',
|
|
'settings.webhookUrl.saved': '웹훅 URL이 저장되었습니다',
|
|
'settings.webhookUrl.test': '테스트',
|
|
'settings.webhookUrl.testSuccess': '테스트 웹훅이 성공적으로 전송되었습니다',
|
|
'settings.webhookUrl.testFailed': '테스트 웹훅 실패',
|
|
'settings.ntfyUrl.topicLabel': 'Ntfy 토픽',
|
|
'settings.ntfyUrl.topicPlaceholder': 'my-trek-alerts',
|
|
'settings.ntfyUrl.serverLabel': 'Ntfy 서버 URL (선택)',
|
|
'settings.ntfyUrl.serverPlaceholder': 'https://ntfy.sh',
|
|
'settings.ntfyUrl.hint':
|
|
'ntfy 토픽을 입력하여 푸시 알림을 받으세요. 서버를 비워두면 관리자가 설정한 기본값을 사용합니다.',
|
|
'settings.ntfyUrl.tokenLabel': '액세스 토큰 (선택)',
|
|
'settings.ntfyUrl.tokenHint': '비밀번호로 보호된 토픽에 필요합니다.',
|
|
'settings.ntfyUrl.saved': 'Ntfy 설정이 저장되었습니다',
|
|
'settings.ntfyUrl.test': '테스트',
|
|
'settings.ntfyUrl.testSuccess': '테스트 ntfy 알림이 성공적으로 전송되었습니다',
|
|
'settings.ntfyUrl.testFailed': '테스트 ntfy 알림 실패',
|
|
'settings.ntfyUrl.tokenCleared': '액세스 토큰이 삭제되었습니다',
|
|
'settings.notificationsDisabled': '알림이 설정되지 않았습니다. 관리자에게 이메일 또는 웹훅 알림 활성화를 요청하세요.',
|
|
'settings.notificationsActive': '활성 채널',
|
|
'settings.notificationsManagedByAdmin': '알림 이벤트는 관리자가 설정합니다.',
|
|
'settings.on': '켜기',
|
|
'settings.off': '끄기',
|
|
'settings.mcp.title': 'MCP 설정',
|
|
'settings.mcp.endpoint': 'MCP 엔드포인트',
|
|
'settings.mcp.clientConfig': '클라이언트 설정',
|
|
'settings.mcp.clientConfigHint':
|
|
'<your_token>을 아래 목록의 API 토큰으로 교체하세요. npx 경로는 시스템에 따라 조정해야 할 수 있습니다 (예: Windows의 경우 C:\\PROGRA~1\\nodejs\\npx.cmd).',
|
|
'settings.mcp.clientConfigHintOAuth':
|
|
'<your_client_id>와 <your_client_secret>을 위에서 생성한 OAuth 2.1 클라이언트 자격 증명으로 교체하세요. mcp-remote가 처음 연결 시 브라우저를 열어 인증을 완료합니다. npx 경로는 시스템에 따라 조정해야 할 수 있습니다 (예: Windows의 경우 C:\\PROGRA~1\\nodejs\\npx.cmd).',
|
|
'settings.mcp.copy': '복사',
|
|
'settings.mcp.copied': '복사됨!',
|
|
'settings.mcp.apiTokens': 'API 토큰',
|
|
'settings.mcp.createToken': '새 토큰 만들기',
|
|
'settings.mcp.noTokens': '토큰이 없습니다. MCP 클라이언트 연결을 위해 토큰을 만드세요.',
|
|
'settings.mcp.tokenCreatedAt': '생성일',
|
|
'settings.mcp.tokenUsedAt': '사용일',
|
|
'settings.mcp.deleteTokenTitle': '토큰 삭제',
|
|
'settings.mcp.deleteTokenMessage':
|
|
'이 토큰은 즉시 무효화됩니다. 이 토큰을 사용하는 MCP 클라이언트는 접근 권한을 잃게 됩니다.',
|
|
'settings.mcp.modal.createTitle': 'API 토큰 만들기',
|
|
'settings.mcp.modal.tokenName': '토큰 이름',
|
|
'settings.mcp.modal.tokenNamePlaceholder': '예: Claude Desktop, 업무용 노트북',
|
|
'settings.mcp.modal.creating': '생성 중…',
|
|
'settings.mcp.modal.create': '토큰 만들기',
|
|
'settings.mcp.modal.createdTitle': '토큰이 생성되었습니다',
|
|
'settings.mcp.modal.createdWarning':
|
|
'이 토큰은 한 번만 표시됩니다. 지금 복사하여 저장하세요 — 다시 복구할 수 없습니다.',
|
|
'settings.mcp.modal.done': '완료',
|
|
'settings.mcp.toast.created': '토큰이 생성되었습니다',
|
|
'settings.mcp.toast.createError': '토큰 생성 실패',
|
|
'settings.mcp.toast.deleted': '토큰이 삭제되었습니다',
|
|
'settings.mcp.toast.deleteError': '토큰 삭제 실패',
|
|
'settings.mcp.apiTokensDeprecated':
|
|
'API 토큰은 더 이상 사용되지 않으며 향후 버전에서 제거될 예정입니다. 대신 OAuth 2.1 클라이언트를 사용하세요.',
|
|
'settings.oauth.clients': 'OAuth 2.1 클라이언트',
|
|
'settings.oauth.clientsHint':
|
|
'OAuth 2.1 클라이언트를 등록하여 타사 MCP 앱 (Claude Web, Cursor 등)이 정적 토큰 없이 연결할 수 있도록 하세요.',
|
|
'settings.oauth.createClient': '새 클라이언트',
|
|
'settings.oauth.noClients': '등록된 OAuth 클라이언트가 없습니다.',
|
|
'settings.oauth.clientId': '클라이언트 ID',
|
|
'settings.oauth.clientSecret': '클라이언트 시크릿',
|
|
'settings.oauth.deleteClient': '클라이언트 삭제',
|
|
'settings.oauth.deleteClientMessage':
|
|
'이 클라이언트와 모든 활성 세션이 영구 삭제됩니다. 이 클라이언트를 사용하는 앱은 즉시 접근 권한을 잃게 됩니다.',
|
|
'settings.oauth.rotateSecret': '시크릿 교체',
|
|
'settings.oauth.rotateSecretMessage':
|
|
'새 클라이언트 시크릿이 생성되고 기존 세션은 즉시 무효화됩니다. 이 대화창을 닫기 전에 앱을 업데이트하세요.',
|
|
'settings.oauth.rotateSecretConfirm': '교체',
|
|
'settings.oauth.rotateSecretConfirming': '교체 중…',
|
|
'settings.oauth.rotateSecretDoneTitle': '새 시크릿이 생성되었습니다',
|
|
'settings.oauth.rotateSecretDoneWarning':
|
|
'이 시크릿은 한 번만 표시됩니다. 지금 복사하여 앱을 업데이트하세요 — 이전 세션은 모두 무효화되었습니다.',
|
|
'settings.oauth.activeSessions': '활성 OAuth 세션',
|
|
'settings.oauth.sessionScopes': '권한 범위',
|
|
'settings.oauth.sessionExpires': '만료',
|
|
'settings.oauth.revoke': '취소',
|
|
'settings.oauth.revokeSession': '세션 취소',
|
|
'settings.oauth.revokeSessionMessage': '이 OAuth 세션의 접근 권한이 즉시 취소됩니다.',
|
|
'settings.oauth.modal.createTitle': 'OAuth 클라이언트 등록',
|
|
'settings.oauth.modal.presets': '빠른 프리셋',
|
|
'settings.oauth.modal.clientName': '앱 이름',
|
|
'settings.oauth.modal.clientNamePlaceholder': '예: Claude Web, My MCP App',
|
|
'settings.oauth.modal.redirectUris': '리디렉션 URI',
|
|
'settings.oauth.modal.redirectUrisPlaceholder': 'https://your-app.com/callback\nhttps://your-app.com/auth',
|
|
'settings.oauth.modal.redirectUrisHint': '한 줄에 URI 하나. HTTPS 필수 (localhost 예외). 정확히 일치해야 합니다.',
|
|
'settings.oauth.modal.scopes': '허용 권한 범위',
|
|
'settings.oauth.modal.scopesHint':
|
|
'list_trips 및 get_trip_summary는 항상 사용 가능합니다 — 권한 범위 불필요. AI가 다른 도구를 사용하는 데 필요한 여행 ID를 찾을 수 있습니다.',
|
|
'settings.oauth.modal.selectAll': '전체 선택',
|
|
'settings.oauth.modal.deselectAll': '전체 해제',
|
|
'settings.oauth.modal.creating': '등록 중…',
|
|
'settings.oauth.modal.create': '클라이언트 등록',
|
|
'settings.oauth.modal.createdTitle': '클라이언트가 등록되었습니다',
|
|
'settings.oauth.modal.createdWarning':
|
|
'클라이언트 시크릿은 한 번만 표시됩니다. 지금 복사하세요 — 다시 복구할 수 없습니다.',
|
|
'settings.oauth.toast.createError': 'OAuth 클라이언트 등록 실패',
|
|
'settings.oauth.toast.deleted': 'OAuth 클라이언트가 삭제되었습니다',
|
|
'settings.oauth.toast.deleteError': 'OAuth 클라이언트 삭제 실패',
|
|
'settings.oauth.toast.revoked': '세션이 취소되었습니다',
|
|
'settings.oauth.toast.revokeError': '세션 취소 실패',
|
|
'settings.oauth.toast.rotateError': '클라이언트 시크릿 교체 실패',
|
|
'settings.account': '계정',
|
|
'settings.about': '정보',
|
|
'settings.about.reportBug': '버그 신고',
|
|
'settings.about.reportBugHint': '문제를 발견하셨나요? 알려주세요',
|
|
'settings.about.featureRequest': '기능 요청',
|
|
'settings.about.featureRequestHint': '새로운 기능을 제안하세요',
|
|
'settings.about.wikiHint': '문서 및 가이드',
|
|
'settings.about.descriptionManaged':
|
|
'TREK helps you organize your trips from the first idea to the last memory. Day planning, budget, packing lists, photos and much more — all in one place.',
|
|
'settings.about.sourceTitle': 'Source code',
|
|
'settings.about.sourceHint': 'TREK is open source, licensed AGPL-3.0',
|
|
'settings.about.supporters.badge': '월간 후원자',
|
|
'settings.about.supporters.title': 'TREK의 여행 동반자',
|
|
'settings.about.supporters.subtitle':
|
|
'다음 여정을 계획하는 동안, 이분들이 TREK의 미래를 함께 만들어가고 있습니다. 월간 후원금은 개발과 실제 작업 시간에 직접 사용되어 TREK이 오픈 소스로 유지될 수 있게 합니다.',
|
|
'settings.about.supporters.since': '{date}부터 후원자',
|
|
'settings.about.supporters.tierEmpty': '첫 번째 후원자가 되어보세요',
|
|
'settings.about.supporter.tier.noReturnTicket': '편도 티켓',
|
|
'settings.about.supporter.tier.lostLuggageVip': '분실 수하물 VIP',
|
|
'settings.about.supporter.tier.businessClassDreamer': '비즈니스 클래스 꿈꾸기',
|
|
'settings.about.supporter.tier.budgetTraveller': '알뜰 여행자',
|
|
'settings.about.supporter.tier.hostelBunkmate': '호스텔 룸메이트',
|
|
'settings.about.description':
|
|
'TREK은 첫 아이디어부터 마지막 추억까지 여행을 체계적으로 관리하는 자체 호스팅 여행 플래너입니다. 일별 계획, 예산, 짐 목록, 사진 등 모든 것이 하나의 서버에 담겨 있습니다.',
|
|
'settings.about.madeWith': '으로 만들어졌습니다',
|
|
'settings.about.madeBy': 'Maurice와 성장하는 오픈 소스 커뮤니티가 함께',
|
|
'settings.username': '사용자 이름',
|
|
'settings.email': '이메일',
|
|
'settings.role': '역할',
|
|
'settings.roleAdmin': '관리자',
|
|
'settings.oidcLinked': '연결됨',
|
|
'settings.changePassword': '비밀번호 변경',
|
|
'settings.currentPassword': '현재 비밀번호',
|
|
'settings.currentPasswordRequired': '현재 비밀번호를 입력하세요',
|
|
'settings.newPassword': '새 비밀번호',
|
|
'settings.confirmPassword': '새 비밀번호 확인',
|
|
'settings.updatePassword': '비밀번호 업데이트',
|
|
'settings.passwordRequired': '현재 비밀번호와 새 비밀번호를 입력하세요',
|
|
'settings.passwordTooShort': '비밀번호는 최소 8자 이상이어야 합니다',
|
|
'settings.passwordMismatch': '비밀번호가 일치하지 않습니다',
|
|
'settings.passwordWeak': '비밀번호는 대문자, 소문자, 숫자, 특수문자를 포함해야 합니다',
|
|
'settings.passwordChanged': '비밀번호가 성공적으로 변경되었습니다',
|
|
'settings.mustChangePassword': '계속하기 전에 비밀번호를 변경해야 합니다. 아래에서 새 비밀번호를 설정하세요.',
|
|
'settings.deleteAccount': '계정 삭제',
|
|
'settings.deleteAccountTitle': '계정을 삭제할까요?',
|
|
'settings.deleteAccountWarning': '계정과 모든 여행, 장소, 파일이 영구 삭제됩니다. 이 작업은 취소할 수 없습니다.',
|
|
'settings.deleteAccountConfirm': '영구 삭제',
|
|
'settings.deleteBlockedTitle': '삭제 불가',
|
|
'settings.deleteBlockedMessage': '유일한 관리자입니다. 계정을 삭제하기 전에 다른 사용자를 관리자로 승격하세요.',
|
|
'settings.roleUser': '사용자',
|
|
'settings.saveProfile': '프로필 저장',
|
|
'settings.toast.mapSaved': '지도 설정이 저장되었습니다',
|
|
'settings.toast.keysSaved': 'API 키가 저장되었습니다',
|
|
'settings.toast.displaySaved': '화면 설정이 저장되었습니다',
|
|
'settings.toast.profileSaved': '프로필이 저장되었습니다',
|
|
'settings.uploadAvatar': '프로필 사진 업로드',
|
|
'settings.removeAvatar': '프로필 사진 삭제',
|
|
'settings.avatarUploaded': '프로필 사진이 업데이트되었습니다',
|
|
'settings.avatarRemoved': '프로필 사진이 삭제되었습니다',
|
|
'settings.avatarError': '업로드 실패',
|
|
'settings.avatarRemoveError': '삭제 실패',
|
|
'settings.mfa.title': '2단계 인증 (2FA)',
|
|
'settings.mfa.description':
|
|
'이메일 및 비밀번호로 로그인할 때 두 번째 단계를 추가합니다. 인증 앱 (Google Authenticator, Authy 등)을 사용하세요.',
|
|
'settings.mfa.requiredByPolicy':
|
|
'관리자가 2단계 인증을 요구합니다. 앱을 계속 사용하려면 아래에서 인증 앱을 설정하세요.',
|
|
'settings.mfa.backupTitle': '백업 코드',
|
|
'settings.mfa.backupDescription': '인증 앱에 접근할 수 없을 때 이 일회용 백업 코드를 사용하세요.',
|
|
'settings.mfa.backupWarning': '지금 이 코드를 저장하세요. 각 코드는 한 번만 사용할 수 있습니다.',
|
|
'settings.mfa.backupCopy': '코드 복사',
|
|
'settings.mfa.backupDownload': 'TXT 다운로드',
|
|
'settings.mfa.backupPrint': '인쇄 / PDF',
|
|
'settings.mfa.backupCopied': '백업 코드가 복사되었습니다',
|
|
'settings.mfa.enabled': '계정에 2FA가 활성화되어 있습니다.',
|
|
'settings.mfa.disabled': '2FA가 활성화되지 않았습니다.',
|
|
'settings.mfa.setup': '인증 앱 설정',
|
|
'settings.mfa.scanQr': '앱으로 이 QR 코드를 스캔하거나 시크릿을 수동으로 입력하세요.',
|
|
'settings.mfa.secretLabel': '시크릿 키 (수동 입력)',
|
|
'settings.mfa.codePlaceholder': '6자리 코드',
|
|
'settings.mfa.enable': '2FA 활성화',
|
|
'settings.mfa.cancelSetup': '취소',
|
|
'settings.mfa.disableTitle': '2FA 비활성화',
|
|
'settings.mfa.disableHint': '계정 비밀번호와 인증 앱의 현재 코드를 입력하세요.',
|
|
'settings.mfa.disable': '2FA 비활성화',
|
|
'settings.mfa.toastEnabled': '2단계 인증이 활성화되었습니다',
|
|
'settings.mfa.toastDisabled': '2단계 인증이 비활성화되었습니다',
|
|
'settings.mfa.demoBlocked': '데모 모드에서는 사용할 수 없습니다',
|
|
'settings.oauth.modal.machineClient': '머신 클라이언트(브라우저 로그인 없음)',
|
|
'settings.oauth.modal.machineClientHint':
|
|
'client_credentials 권한 부여를 사용합니다 — 리디렉션 URI가 필요하지 않습니다. 토큰은 client_id + client_secret을 통해 직접 발급되며 선택한 범위 내에서 사용자로 작동합니다.',
|
|
'settings.oauth.modal.machineClientUsage':
|
|
'토큰 받기: grant_type=client_credentials, client_id, client_secret으로 POST /oauth/token을 호출하세요. 브라우저도 새로 고침 토큰도 필요 없습니다.',
|
|
'settings.oauth.badge.machine': '머신',
|
|
'settings.currency': '표시 통화',
|
|
'settings.currencyHint': '비용의 금액은 표시 목적으로만 이 통화로 환산되어 표시되며, 원래 금액은 변경되지 않습니다.',
|
|
'settings.currencyTrip': '여행 통화',
|
|
'settings.passkey.title': '패스키',
|
|
'settings.passkey.description':
|
|
'지문, 얼굴, PIN 또는 하드웨어 키 같은 패스키로 더 빠르고 피싱에 강하게 로그인하세요. 비밀번호는 백업으로 그대로 유지됩니다.',
|
|
'settings.passkey.notConfigured':
|
|
'패스키가 활성화되어 있지만 이 서버에 아직 완전히 설정되지 않았습니다. 관리자에게 WebAuthn 도메인 설정을 요청하세요.',
|
|
'settings.passkey.add': '패스키 추가',
|
|
'settings.passkey.addTitle': '패스키 추가',
|
|
'settings.passkey.passwordPrompt': '현재 비밀번호를 확인한 뒤 기기 안내에 따라 진행하세요.',
|
|
'settings.passkey.passwordRequired': '현재 비밀번호가 필요합니다.',
|
|
'settings.passkey.namePlaceholder': '이름 (선택, 예: "iPhone")',
|
|
'settings.passkey.addedToast': '패스키가 추가되었습니다',
|
|
'settings.passkey.added': '추가됨',
|
|
'settings.passkey.addError': '패스키를 추가할 수 없습니다',
|
|
'settings.passkey.cancelled': '패스키 설정이 취소되었습니다',
|
|
'settings.passkey.deleted': '패스키가 삭제되었습니다',
|
|
'settings.passkey.deleteConfirm': '이 패스키를 삭제할까요? 비밀번호로 확인하세요.',
|
|
'settings.passkey.rename': '이름 변경',
|
|
'settings.passkey.defaultName': '패스키',
|
|
'settings.passkey.synced': '동기화됨',
|
|
'settings.passkey.deviceBound': '이 기기',
|
|
'settings.passkey.lastUsed': '마지막 사용',
|
|
'settings.passkey.neverUsed': '사용한 적 없음',
|
|
'settings.mapPoiPill': '지도에서 장소 탐색',
|
|
'settings.mapPoiPillHint': '여행 지도에 카테고리 칩을 표시하여 OpenStreetMap에서 주변 음식점, 숙소 등을 찾아보세요.',
|
|
'settings.airtrail.title': 'AirTrail',
|
|
'settings.airtrail.hint':
|
|
'자체 호스팅한 AirTrail을 연결하여 항공편을 가져오고 동기화하세요. AirTrail의 설정 → 보안에서 API 키를 생성하세요.',
|
|
'settings.airtrail.url': '인스턴스 URL',
|
|
'settings.airtrail.apiKey': 'API 키',
|
|
'settings.airtrail.apiKeyPlaceholder': 'Bearer API 키',
|
|
'settings.airtrail.apiKeyHint': 'AirTrail의 설정 → 보안에서 생성됩니다. 암호화하여 저장됩니다.',
|
|
'settings.airtrail.allowInsecureTls': '자체 서명 인증서 허용',
|
|
'settings.airtrail.allowInsecureTlsHint': '자체 네트워크의 신뢰할 수 있는 인스턴스에서만 활성화하세요.',
|
|
'settings.airtrail.writeBack': '변경 사항을 AirTrail에 다시 기록',
|
|
'settings.airtrail.writeBackHint':
|
|
'기본적으로 꺼져 있음: AirTrail이 신뢰할 수 있는 원본이며 TREK은 읽기만 합니다. TREK에서 변경한 내용을 AirTrail로 다시 보내려면 켜세요.',
|
|
'settings.airtrail.connected': '연결됨',
|
|
'settings.airtrail.notConnected': '연결되지 않음',
|
|
'settings.airtrail.toast.saved': 'AirTrail 연결이 저장되었습니다',
|
|
'settings.airtrail.toast.saveError': '연결을 저장할 수 없습니다',
|
|
'settings.airtrail.test.button': '연결 테스트',
|
|
'settings.airtrail.test.success': '연결됨 — {count}개 항공편을 찾았습니다',
|
|
'settings.airtrail.test.failed': '연결에 실패했습니다',
|
|
'settings.aiParsing.title': 'AI 분석',
|
|
'settings.aiParsing.hint':
|
|
'업로드한 파일에서 예약 정보를 추출할 AI 모델을 선택하세요. 이 설정은 관리자가 인스턴스 전체에 모델을 설정하지 않은 경우에만 적용됩니다.',
|
|
'settings.aiParsing.provider': '제공자',
|
|
'settings.aiParsing.providerLocal': '로컬 (Ollama)',
|
|
'settings.aiParsing.providerOpenai': 'OpenAI',
|
|
'settings.aiParsing.providerAnthropic': 'Anthropic',
|
|
'settings.aiParsing.localAdminOnly':
|
|
'로컬 (Ollama) 엔드포인트는 관리자 설정에서 인스턴스 전체에 대해 한 번만 설정합니다. 본인의 OpenAI 또는 Anthropic 키는 여기서 계속 사용할 수 있습니다.',
|
|
'settings.aiParsing.model': '모델',
|
|
'settings.aiParsing.baseUrl': '기본 URL',
|
|
'settings.aiParsing.baseUrlHint': '모델이 실행되는 위치 — 로컬 Ollama 서버 또는 OpenAI 호환 엔드포인트입니다.',
|
|
'settings.aiParsing.apiKey': 'API 키',
|
|
'settings.aiParsing.apiKeyHint': '암호화되어 저장됩니다. 현재 키를 유지하려면 비워 두세요.',
|
|
'settings.aiParsing.multimodal': '문서를 이미지로 전송',
|
|
'settings.aiParsing.multimodalHint': '비전 지원 모델용 — 추출된 텍스트 대신 원본 PDF를 전송합니다.',
|
|
'settings.aiParsing.toast.saved': 'AI 설정이 저장되었습니다',
|
|
'settings.aiParsing.toast.saveError': 'AI 설정을 저장할 수 없습니다',
|
|
'settings.tabs.appearance': 'Appearance',
|
|
'settings.appearance.theme': 'Theme',
|
|
'settings.appearance.scheme': 'Color scheme',
|
|
'settings.appearance.scheme.default': 'Default',
|
|
'settings.appearance.scheme.highContrast': 'High contrast',
|
|
'settings.appearance.scheme.indigo': 'Indigo',
|
|
'settings.appearance.scheme.teal': 'Teal',
|
|
'settings.appearance.scheme.rose': 'Rose',
|
|
'settings.appearance.scheme.amber': 'Amber',
|
|
'settings.appearance.scheme.violet': 'Violet',
|
|
'settings.appearance.scheme.custom': 'Custom',
|
|
'settings.appearance.customAccent': 'Custom accent',
|
|
'settings.appearance.contrastOk': 'Good contrast',
|
|
'settings.appearance.contrastLow': 'Low contrast',
|
|
'settings.appearance.readability': 'Readability',
|
|
'settings.appearance.transparency': 'Transparency',
|
|
'settings.appearance.transparencyHint':
|
|
'Glassy translucent surfaces. Turn off for solid, higher-contrast backgrounds.',
|
|
'settings.appearance.reduceMotion': 'Reduce motion',
|
|
'settings.appearance.reduceMotionHint': 'Minimize animations and transitions.',
|
|
'settings.appearance.density': 'Density',
|
|
'settings.appearance.comfortable': 'Comfortable',
|
|
'settings.appearance.compact': 'Compact',
|
|
'settings.appearance.textSize': 'Text size',
|
|
'settings.appearance.advancedTextSizes': 'Advanced text sizes',
|
|
'settings.appearance.hideAdvanced': 'Hide advanced',
|
|
'settings.appearance.tier.title': 'Titles',
|
|
'settings.appearance.tier.subtitle': 'Subtitles',
|
|
'settings.appearance.tier.body': 'Body',
|
|
'settings.appearance.tier.caption': 'Captions',
|
|
'settings.appearance.dashboardWidgets': 'Dashboard widgets',
|
|
'settings.appearance.dashboardWidgetsHint': 'Show or hide dashboard widgets independently on desktop and mobile.',
|
|
'settings.appearance.desktop': 'Desktop',
|
|
'settings.appearance.mobile': 'Mobile',
|
|
'settings.appearance.widget.sidebar': 'Right sidebar',
|
|
'settings.appearance.widget.currency': 'Currency',
|
|
'settings.appearance.widget.collections': '컬렉션',
|
|
'settings.appearance.widget.timezones': 'Timezones',
|
|
'settings.appearance.widget.upcomingReservations': 'Upcoming reservations',
|
|
'settings.appearance.widget.atlas': 'Atlas / countries',
|
|
'settings.appearance.widget.tripsTotal': 'Trips total',
|
|
'settings.appearance.widget.daysTraveled': 'Days traveled',
|
|
'settings.appearance.widget.distanceFlown': 'Distance flown',
|
|
'settings.appearance.reset': 'Reset to defaults',
|
|
'settings.appearance.group.belowHero': 'Below the hero',
|
|
'settings.appearance.group.bottomOfPage': 'Bottom of page',
|
|
'settings.appearance.sidebarHint': 'The whole right column. Turn off and the dashboard centers.',
|
|
'settings.appearance.densityHint':
|
|
'Compact tightens spacing and padding for a denser layout that fits more on screen.',
|
|
'settings.appearance.textSizeAll': 'Everything',
|
|
'settings.appearance.perSize': 'Adjust each size separately',
|
|
'settings.appearance.size.large': 'Large',
|
|
'settings.appearance.size.medium': 'Medium',
|
|
'settings.appearance.size.normal': 'Normal',
|
|
'settings.appearance.size.small': 'Small',
|
|
'settings.appearance.preview.large': 'Large heading',
|
|
'settings.appearance.preview.medium': 'Medium subtitle',
|
|
'settings.appearance.preview.normal': 'Normal body text',
|
|
'settings.appearance.preview.small': 'Small caption / address',
|
|
'settings.appearance.example.large': 'Headings, big numbers',
|
|
'settings.appearance.example.medium': 'Sub-headings',
|
|
'settings.appearance.example.normal': 'Place names, descriptions',
|
|
'settings.appearance.example.small': 'Addresses, labels',
|
|
'settings.appearance.experimental': 'Experimental',
|
|
'settings.appearance.mobileNav': '하단 내비게이션 바',
|
|
'settings.appearance.mobileNav.hint':
|
|
'바에 표시할 항목과 「더보기」에 넣을 항목을 선택하세요. 대시보드는 항상 맨 앞에 고정됩니다.',
|
|
'settings.appearance.mobileNav.inBar': '바에 표시',
|
|
'settings.appearance.mobileNav.underMore': '「더보기」에 표시',
|
|
'settings.appearance.mobileNav.moreEmpty': '아직 비어 있습니다 — 모든 항목이 바에 들어갑니다.',
|
|
'settings.appearance.mobileNav.pinned': '고정됨',
|
|
'settings.appearance.mobileNav.toMore': '「더보기」에 넣기',
|
|
'settings.appearance.mobileNav.toBar': '바에 넣기',
|
|
'settings.appearance.dashOrder': '대시보드 순서',
|
|
'settings.appearance.dashOrder.hint':
|
|
'휴대폰 대시보드에서 여행 목록과 위젯이 표시되는 순서를 조정하세요. 대표 여행은 항상 맨 위에 고정됩니다.',
|
|
'settings.appearance.dashOrder.trips': '여행',
|
|
'settings.appearance.dashOrder.hidden': '숨김',
|
|
'settings.general.languageRegion': 'Language & region',
|
|
'settings.general.travelMap': 'Travel & map',
|
|
'settings.general.startup': '시작',
|
|
'settings.startPage': '시작 화면',
|
|
'settings.startPageDashboard': '대시보드',
|
|
'settings.startPageActiveTrip': '진행 중인 여행',
|
|
'settings.startPageHint':
|
|
'TREK을 열면 지금 진행 중인 여행, 없으면 다음에 시작하는 여행으로 바로 이동합니다. 대시보드가 강조하는 여행과 같습니다.',
|
|
'settings.startTripTab': '시작 탭',
|
|
'settings.startTripTabHint': '여행이 열릴 탭입니다. 꺼 둔 애드온의 탭이면 대신 계획이 열립니다.',
|
|
|
|
// ── Offline (#1135)
|
|
'settings.offline.cache.title': '오프라인 캐시',
|
|
'settings.offline.mode.title': '오프라인 모드',
|
|
'settings.offline.mode.force': '오프라인 모드 강제 사용',
|
|
'settings.offline.mode.forceHint':
|
|
'캐시된 데이터만 사용하고 변경 사항을 대기열에 넣습니다. 다시 연결하여 동기화하려면 끄세요.',
|
|
'settings.offline.mode.active':
|
|
'오프라인 모드가 켜져 있습니다 — 변경 사항이 대기열에 있으며 모드를 끄면 동기화됩니다.',
|
|
'settings.offline.prepare.title': '오프라인 준비',
|
|
'settings.offline.prepare.hint':
|
|
'연결이 끊기기 전에 필요한 모든 것 — 여행 데이터, 문서, 지도 타일 — 을 다운로드하세요.',
|
|
'settings.offline.prepare.button': '오프라인 사용을 위해 다운로드',
|
|
'settings.offline.prepare.running': '다운로드 중…',
|
|
'settings.offline.prepare.done': '오프라인 사용 준비 완료',
|
|
'settings.offline.prepare.phase.trips': '여행 데이터',
|
|
'settings.offline.prepare.phase.files': '문서',
|
|
'settings.offline.prepare.phase.tiles': '지도 타일',
|
|
'settings.offline.resync': '지금 다시 동기화',
|
|
'settings.offline.resyncing': '동기화 중…',
|
|
'settings.offline.storage.title': '오프라인에 저장할 항목',
|
|
'settings.offline.storage.tiles': '지도 타일을 오프라인에 저장',
|
|
'settings.offline.storage.tilesHint':
|
|
'지도 타일은 저장 공간을 가장 많이 사용합니다. 끄면 여행 데이터와 문서만 오프라인에 저장합니다.',
|
|
'settings.offline.storage.tripsTitle': '여행',
|
|
'settings.offline.storage.tripOn': '오프라인에 저장됨',
|
|
'settings.offline.storage.tripOff': '저장 안 됨',
|
|
'settings.offline.clear': '캐시 지우기',
|
|
'settings.offline.clearConfirm':
|
|
'모든 오프라인 여행 데이터를 지울까요? 온라인일 때 언제든지 다시 동기화할 수 있습니다.',
|
|
'settings.offline.stats.trips': '캐시된 여행',
|
|
'settings.offline.stats.pending': '대기 중인 변경 사항',
|
|
'settings.offline.stats.failed': '실패한 변경 사항',
|
|
'settings.offline.stats.conflicts': '충돌',
|
|
'settings.offline.empty': '아직 캐시된 여행이 없습니다. 인터넷에 연결하여 동기화하세요.',
|
|
'settings.offline.loading': '불러오는 중…',
|
|
'settings.offline.conflicts.title': '동기화 충돌',
|
|
'settings.offline.conflicts.hint':
|
|
'오프라인에서 변경한 내용이 서버의 최신 변경 내용과 충돌합니다. 보관할 버전을 선택하세요.',
|
|
'settings.offline.conflicts.keepMine': '내 버전 유지',
|
|
'settings.offline.conflicts.keepServer': '상대 버전 유지',
|
|
'settings.offline.conflicts.mine': '내 버전',
|
|
'settings.offline.conflicts.server': '서버 버전',
|
|
'settings.offline.conflicts.item': '“{name}” 변경',
|
|
'settings.offline.conflicts.strategyTitle': '충돌이 발생하면',
|
|
'settings.offline.conflicts.strategy.ask': '매번 묻기',
|
|
'settings.offline.conflicts.strategy.mine': '항상 내 버전 유지',
|
|
'settings.offline.conflicts.strategy.server': '항상 서버 버전 유지',
|
|
'settings.offline.banner.offline': '오프라인',
|
|
'settings.offline.banner.forced': '오프라인 모드',
|
|
'settings.offline.banner.queued': '오프라인 · {count}개 대기 중',
|
|
'settings.offline.banner.syncing': '{count}개 동기화 중…',
|
|
'settings.offline.banner.failed': '동기화 실패: {count}',
|
|
'settings.offline.banner.conflicts': '충돌: {count}',
|
|
'settings.pluginActivity.title': '플러그인 활동',
|
|
'settings.pluginActivity.description': '플러그인이 사용자를 대신해 수행한 모든 작업을 최신순으로 보여줍니다.',
|
|
'settings.pluginActivity.empty': '아직 플러그인 활동이 없습니다.',
|
|
'settings.pluginActivity.refresh': '새로고침',
|
|
'settings.pluginActivity.columns.plugin': '플러그인',
|
|
'settings.pluginActivity.columns.action': '작업',
|
|
'settings.pluginActivity.columns.resource': '리소스',
|
|
'settings.pluginActivity.columns.when': '시간',
|
|
'settings.pluginActivity.columns.status': '결과',
|
|
'settings.alwaysShowRoutes': '예약 경로 항상 표시',
|
|
'settings.alwaysShowRoutesHint':
|
|
'항공편, 기차 등 모든 예약의 경로를 개별적으로 켤 필요 없이 지도에 자동으로 표시합니다.',
|
|
};
|
|
|
|
export default settings;
|