Files
TREK/shared/src/i18n/ko/settings.ts
T
Maurice 56655d53b4 AirTrail integration: import flights & two-way sync (#214) (#1158)
* feat(admin): register AirTrail as an integration addon

Off by default; toggle lives in Admin -> Addons with a Plane icon. The
per-user connection (URL + API key) follows in integration settings.

* feat(integrations): add per-user AirTrail connection

Settings -> Integrations gains an AirTrail section: instance URL + Bearer
API key (encrypted at rest via apiKeyCrypto), a self-signed-TLS opt-in and
a test-connection check. Served by a small Nest controller under
/api/integrations/airtrail, gated on the airtrail addon and SSRF-guarded.
The key is per-user, so it only ever returns that user's own flights.

* feat(transport): import flights from AirTrail

Adds an AirTrail Import button next to Manual Transport that lists the
user's AirTrail flights and highlights the ones inside the trip dates.
Selected flights become reservations linked to their AirTrail origin
(external_* columns), deduped against flights already in the trip, then
broadcast to every member. The mapping resolves airports, airport-local
times and flight metadata; the linkage is what the two-way sync rides on.

* feat(transport): badge AirTrail-linked flights as synced

Linked reservations show an 'AirTrail synced' badge, or 'no longer
synced' once the flight is gone from AirTrail.

* feat(transport): keep TREK and AirTrail flights in sync both ways

A scheduled poll reconciles each connected owner's flights: field edits
(detected by snapshot hash, since AirTrail has no updated_at) flow into
the linked reservation and broadcast live; a flight deleted in AirTrail
keeps the TREK row but stops syncing. Editing a linked flight in TREK
pushes back to AirTrail under the importer's credentials, preserving the
existing seat manifest; if the owner disconnected the link detaches so the
poll can't revert the local edit. Deleting in TREK never touches AirTrail.

* i18n(airtrail): add AirTrail strings across all locales

* test(airtrail): cover flight mapping, timezones and snapshot hashing

* fix(airtrail): reduce airline/aircraft objects to codes

The flight list/get response returns airline and aircraft as joined
objects ({icao, iata, name, ...}), not bare codes. Mapping them straight
through produced '[object Object]' titles and stored objects in metadata,
which crashed reservation rendering. Extract the ICAO/IATA code instead,
and title flights by their flight number.

* fix(airtrail): clear error on non-JSON responses, tolerate /api in URL

A misconfigured instance URL made AirTrail serve its SPA/login HTML, and
the raw JSON.parse failure surfaced as 'Unexpected token <'. Surface an
actionable message instead, and strip a pasted trailing /api so the base
URL still resolves.

* feat(transport): sync AirTrail edits on trip open, not just on the poll

Add a per-user on-demand sync (POST /integrations/airtrail/sync) triggered
when a connected user opens a trip, so AirTrail-side edits appear right away
instead of waiting up to a full poll cycle. Lower the background poll from 15
to 5 minutes as a safety net.

* fix(transport): refresh imported AirTrail flights without a reload

loadTrip doesn't fetch reservations, so a freshly imported flight only
appeared after a full page reload — use loadReservations instead. Also show
flight dates in the user's locale format (e.g. 13.06.2026) rather than the
raw ISO string.

* style(settings): align AirTrail connection with the photo-provider layout

Match the Immich section: stacked URL/key fields, a ToggleSwitch for
self-signed TLS, and a Save / Test-connection row with a status badge.

* feat(transport): add a seat field when editing flights

The transport editor only offered a seat field for trains; flights had
none even though imports store metadata.seat. Show and persist a seat for
flights too.

* style(transport): match the AirTrail button height to Manual Transport

* feat(transport): put the flight seat next to flight number and sync it to AirTrail

Move the seat from a standalone row to the per-leg flight details (beside
the flight number), stored per leg in metadata.legs[].seat with the first
leg mirrored to metadata.seat. On push, set the seat number on the user's
own AirTrail seat (the one with a userId), leaving co-passengers untouched;
import/poll read that same seat back.

* refactor(planner): move the AirTrail trip-open sync into useTripPlanner

Page containers must not own state/effects (lint:pages). Same logic,
relocated from the page into its data hook.

* test(db): pin the region-reconciliation test to its schema version

The test re-ran 'the last migration' assuming the reconciliation is last;
it no longer is once later migrations are appended. Pin to version 135 and
re-run from there (the appended migrations are idempotent).
2026-06-13 13:11:35 +02:00

343 lines
22 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.tabs.account': '계정',
'settings.tabs.offline': '오프라인',
'settings.tabs.about': '정보',
'settings.map': '지도',
'settings.mapTemplate': '지도 템플릿',
'settings.mapTemplatePlaceholder.select': '템플릿 선택...',
'settings.mapDefaultHint': '비워두면 OpenStreetMap (기본값) 사용',
'settings.mapTemplatePlaceholder':
'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
'settings.mapHint': '지도 타일 URL 템플릿',
'settings.mapProvider': '지도 공급자',
'settings.mapProviderHint':
'여행 플래너 및 Journey 지도에 영향을 줍니다. Atlas는 항상 Leaflet을 사용합니다.',
'settings.mapLeafletSubtitle': '클래식 2D, 모든 래스터 타일',
'settings.mapMapboxSubtitle': '벡터 타일, 3D 건물 및 지형',
'settings.mapExperimental': '실험적',
'settings.mapMapboxToken': 'Mapbox 액세스 토큰',
'settings.mapMapboxTokenHint': '공개 토큰 (pk.*) 출처',
'settings.mapMapboxTokenLink': 'mapbox.com → 액세스 토큰',
'settings.mapStyle': '지도 스타일',
'settings.mapStylePlaceholder': 'Mapbox 스타일 선택',
'settings.mapStyleHint': '프리셋 또는 mapbox://styles/USER/ID URL 직접 입력',
'settings.map3dBuildings': '3D 건물 및 지형',
'settings.map3dHint':
'기울기 + 실제 3D 건물 돌출 — 위성 포함 모든 스타일에서 작동합니다.',
'settings.mapHighQuality': '고품질 모드',
'settings.mapHighQualityHint':
'안티앨리어싱 + 구형 투영으로 선명한 경계와 현실적인 지구 뷰를 제공합니다.',
'settings.mapHighQualityWarning':
'저사양 기기에서 성능에 영향을 줄 수 있습니다.',
'settings.mapTipLabel': '팁:',
'settings.mapTip':
'우클릭 후 드래그하여 지도를 회전/기울이세요. 가운데 클릭으로 장소를 추가할 수 있습니다 (우클릭은 회전 전용).',
'settings.latitude': '위도',
'settings.longitude': '경도',
'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.timeFormat': '시간 형식',
'settings.bookingLabels': '예약 경로 레이블',
'settings.bookingLabelsHint':
'지도에 역 / 공항 이름을 표시합니다. 끄면 아이콘만 표시됩니다.',
'settings.blurBookingCodes': '예약 코드 흐리게',
'settings.optimizeFromAccommodation': '숙소 기준으로 경로 최적화',
'settings.optimizeFromAccommodationHint':
'하루 일정을 최적화할 때, 아침에 머무는 숙소에서 경로를 시작하고 그날 저녁에 체크인하는 숙소에서 경로를 끝냅니다.',
'settings.notifications': '알림',
'settings.notifyTripInvite': '여행 초대',
'settings.notifyBookingChange': '예약 변경',
'settings.notifyTripReminder': '여행 리마인더',
'settings.notifyTodoDue': '할 일 마감 임박',
'settings.notifyVacayInvite': 'Vacay 퓨전 초대',
'settings.notifyPhotosShared': '공유된 사진 (Immich)',
'settings.notifyCollabMessage': '채팅 메시지 (Collab)',
'settings.notifyPackingTagged': '짐 목록: 배정',
'settings.notifyWebhook': '웹훅 알림',
'settings.notifyVersionAvailable': '새 버전 사용 가능',
'settings.notificationPreferences.email': '이메일',
'settings.notificationPreferences.webhook': '웹훅',
'settings.notificationPreferences.inapp': '앱 내',
'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.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.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": "Currency",
"settings.currencyHint": "All amounts in Costs are converted to and shown in this currency.",
'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.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': '연결에 실패했습니다',
};
export default settings;