diff --git a/lib/i18n/strings.g.dart b/lib/i18n/strings.g.dart index 3f7ca5b6..0d4fdd6c 100644 --- a/lib/i18n/strings.g.dart +++ b/lib/i18n/strings.g.dart @@ -3,10 +3,10 @@ /// Original: lib/i18n /// To regenerate, run: `dart run slang` /// -/// Locales: 6 -/// Strings: 3004 (500 per locale) +/// Locales: 7 +/// Strings: 3505 (500 per locale) /// -/// Built on 2025-12-20 at 14:39 UTC +/// Built on 2025-12-21 at 14:43 UTC // coverage:ignore-file // ignore_for_file: type=lint @@ -28,6 +28,7 @@ enum AppLocale with BaseAppLocale { en(languageCode: 'en', build: Translations.build), de(languageCode: 'de', build: _StringsDe.build), it(languageCode: 'it', build: _StringsIt.build), + ko(languageCode: 'ko', build: _StringsKo.build), nl(languageCode: 'nl', build: _StringsNl.build), sv(languageCode: 'sv', build: _StringsSv.build), zh(languageCode: 'zh', build: _StringsZh.build); @@ -3926,6 +3927,1448 @@ class _StringsLibrariesGroupingsIt implements _StringsLibrariesGroupingsEn { String get folders => 'Cartelle'; } +// Path: +class _StringsKo implements Translations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + _StringsKo.build({Map? overrides, PluralResolver? cardinalResolver, PluralResolver? ordinalResolver}) + : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = TranslationMetadata( + locale: AppLocale.ko, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ) { + $meta.setFlatMapFunction(_flatMapFunction); + } + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + /// Access flat map + @override + dynamic operator [](String key) => $meta.getTranslation(key); + + @override + late final _StringsKo _root = this; // ignore: unused_field + + // Translations + @override + late final _StringsAppKo app = _StringsAppKo._(_root); + @override + late final _StringsAuthKo auth = _StringsAuthKo._(_root); + @override + late final _StringsCommonKo common = _StringsCommonKo._(_root); + @override + late final _StringsScreensKo screens = _StringsScreensKo._(_root); + @override + late final _StringsUpdateKo update = _StringsUpdateKo._(_root); + @override + late final _StringsSettingsKo settings = _StringsSettingsKo._(_root); + @override + late final _StringsSearchKo search = _StringsSearchKo._(_root); + @override + late final _StringsHotkeysKo hotkeys = _StringsHotkeysKo._(_root); + @override + late final _StringsPinEntryKo pinEntry = _StringsPinEntryKo._(_root); + @override + late final _StringsFileInfoKo fileInfo = _StringsFileInfoKo._(_root); + @override + late final _StringsMediaMenuKo mediaMenu = _StringsMediaMenuKo._(_root); + @override + late final _StringsAccessibilityKo accessibility = _StringsAccessibilityKo._(_root); + @override + late final _StringsTooltipsKo tooltips = _StringsTooltipsKo._(_root); + @override + late final _StringsVideoControlsKo videoControls = _StringsVideoControlsKo._(_root); + @override + late final _StringsUserStatusKo userStatus = _StringsUserStatusKo._(_root); + @override + late final _StringsMessagesKo messages = _StringsMessagesKo._(_root); + @override + late final _StringsSubtitlingStylingKo subtitlingStyling = _StringsSubtitlingStylingKo._(_root); + @override + late final _StringsMpvConfigKo mpvConfig = _StringsMpvConfigKo._(_root); + @override + late final _StringsDialogKo dialog = _StringsDialogKo._(_root); + @override + late final _StringsDiscoverKo discover = _StringsDiscoverKo._(_root); + @override + late final _StringsErrorsKo errors = _StringsErrorsKo._(_root); + @override + late final _StringsLibrariesKo libraries = _StringsLibrariesKo._(_root); + @override + late final _StringsAboutKo about = _StringsAboutKo._(_root); + @override + late final _StringsServerSelectionKo serverSelection = _StringsServerSelectionKo._(_root); + @override + late final _StringsHubDetailKo hubDetail = _StringsHubDetailKo._(_root); + @override + late final _StringsLogsKo logs = _StringsLogsKo._(_root); + @override + late final _StringsLicensesKo licenses = _StringsLicensesKo._(_root); + @override + late final _StringsNavigationKo navigation = _StringsNavigationKo._(_root); + @override + late final _StringsCollectionsKo collections = _StringsCollectionsKo._(_root); + @override + late final _StringsPlaylistsKo playlists = _StringsPlaylistsKo._(_root); + @override + late final _StringsWatchTogetherKo watchTogether = _StringsWatchTogetherKo._(_root); + @override + late final _StringsDownloadsKo downloads = _StringsDownloadsKo._(_root); +} + +// Path: app +class _StringsAppKo implements _StringsAppEn { + _StringsAppKo._(this._root); + + @override + final _StringsKo _root; // ignore: unused_field + + // Translations + @override + String get title => 'Plezy'; + @override + String get loading => '로딩 중...'; +} + +// Path: auth +class _StringsAuthKo implements _StringsAuthEn { + _StringsAuthKo._(this._root); + + @override + final _StringsKo _root; // ignore: unused_field + + // Translations + @override + String get signInWithPlex => 'Plex 계정으로 로그인'; + @override + String get showQRCode => 'QR 코드'; + @override + String get cancel => '취소'; + @override + String get authenticate => '인증'; + @override + String get retry => '재시도'; + @override + String get debugEnterToken => '디버깅을 위해 Plex 토큰을 입력하세요.'; + @override + String get plexTokenLabel => 'Plex 인증 토큰'; + @override + String get plexTokenHint => 'Plex.tv 토큰을 입력하세요'; + @override + String get authenticationTimeout => '인증 시간이 초과되었습니다. 다시 시도해 주세요.'; + @override + String get scanQRCodeInstruction => 'Plex 계정에 로그인된 기기에서 이 QR 코드를 스캔하여 본인 인증을 해주세요.'; + @override + String get waitingForAuth => '인증 대기 중... 브라우저에서 로그인을 완료해 주세요.'; +} + +// Path: common +class _StringsCommonKo implements _StringsCommonEn { + _StringsCommonKo._(this._root); + + @override + final _StringsKo _root; // ignore: unused_field + + // Translations + @override + String get cancel => '취소'; + @override + String get save => '저장'; + @override + String get close => '닫기'; + @override + String get clear => '지우기'; + @override + String get reset => '초기화'; + @override + String get later => '나중에'; + @override + String get submit => '보내기'; + @override + String get confirm => '확인'; + @override + String get retry => '재시도'; + @override + String get logout => '로그아웃'; + @override + String get unknown => '알 수 없는'; + @override + String get refresh => '새로고침'; + @override + String get yes => '예'; + @override + String get no => '아니오'; + @override + String get delete => '삭제'; + @override + String get shuffle => '무작위 재생'; + @override + String get addTo => '추가하기...'; +} + +// Path: screens +class _StringsScreensKo implements _StringsScreensEn { + _StringsScreensKo._(this._root); + + @override + final _StringsKo _root; // ignore: unused_field + + // Translations + @override + String get licenses => '라이선스'; + @override + String get selectServer => '서버 선택'; + @override + String get switchProfile => '프로필 전환'; + @override + String get subtitleStyling => '자막 스타일 설정'; + @override + String get mpvConfig => 'MPV 설정'; + @override + String get search => '검색'; + @override + String get logs => '로그'; +} + +// Path: update +class _StringsUpdateKo implements _StringsUpdateEn { + _StringsUpdateKo._(this._root); + + @override + final _StringsKo _root; // ignore: unused_field + + // Translations + @override + String get available => '사용 가능한 업데이트'; + @override + String versionAvailable({required Object version}) => '버전 ${version} 출시됨'; + @override + String currentVersion({required Object version}) => '현재 버전: ${version}'; + @override + String get skipVersion => '이 버전 건너뛰기'; + @override + String get viewRelease => '릴리스 정보 보기'; + @override + String get latestVersion => '최신 버전을 사용 중입니다'; + @override + String get checkFailed => '업데이트 확인 실패'; +} + +// Path: settings +class _StringsSettingsKo implements _StringsSettingsEn { + _StringsSettingsKo._(this._root); + + @override + final _StringsKo _root; // ignore: unused_field + + // Translations + @override + String get title => '설정'; + @override + String get language => '언어'; + @override + String get theme => '테마'; + @override + String get appearance => '외관'; + @override + String get videoPlayback => '비디오 재생'; + @override + String get advanced => '고급'; + @override + String get useSeasonPostersDescription => '에피소드에 시리즈 포스터 대신 시즌 포스터 표시'; + @override + String get showHeroSectionDescription => '홈 화면에 주요 콘텐츠 캐러셀(슬라이드) 표시'; + @override + String get secondsLabel => '초'; + @override + String get minutesLabel => '분'; + @override + String get secondsShort => '초'; + @override + String get minutesShort => '분'; + @override + String durationHint({required Object min, required Object max}) => '기간 입력 (${min}-${max})'; + @override + String get systemTheme => '시스템 설정'; + @override + String get systemThemeDescription => '시스템 설정에 따름'; + @override + String get lightTheme => '라이트 모드'; + @override + String get darkTheme => '다크 모드'; + @override + String get libraryDensity => '라이브러리 표시 밀도'; + @override + String get compact => '좁게'; + @override + String get compactDescription => '카드를 작게 표시하여 더 많은 항목을 보여줍니다.'; + @override + String get normal => '보통'; + @override + String get normalDescription => '기본 크기'; + @override + String get comfortable => '넓게'; + @override + String get comfortableDescription => '카드를 크게 표시하여 더 적은 항목을 보여줍니다.'; + @override + String get viewMode => '보기 모드'; + @override + String get gridView => '그리드 보기'; + @override + String get gridViewDescription => '항목을 그리드 레이아웃으로 표시합니다'; + @override + String get listView => '목록 보기'; + @override + String get listViewDescription => '항목을 목록 레이아웃으로 표시합니다'; + @override + String get useSeasonPosters => '시즌 포스터 사용'; + @override + String get showHeroSection => '주요 추천 영역 표시'; + @override + String get hardwareDecoding => '하드웨어 디코딩'; + @override + String get hardwareDecodingDescription => '가능한 경우 하드웨어 가속을 사용합니다'; + @override + String get bufferSize => '버퍼 크기'; + @override + String bufferSizeMB({required Object size}) => '${size}MB'; + @override + String get subtitleStyling => '자막 스타일'; + @override + String get subtitleStylingDescription => '자막의 외형을 사용자 설정'; + @override + String get smallSkipDuration => '짧은 건너뛰기 시간'; + @override + String get largeSkipDuration => '긴 건너뛰기 시간'; + @override + String secondsUnit({required Object seconds}) => '${seconds}초'; + @override + String get defaultSleepTimer => '기본 취침 타이머'; + @override + String minutesUnit({required Object minutes}) => '${minutes}분'; + @override + String get rememberTrackSelections => '에피소드/영화별 트랙 선택 기억'; + @override + String get rememberTrackSelectionsDescription => '재생 중 트랙을 변경할 때 오디오 및 자막 언어 설정을 자동으로 저장합니다'; + @override + String get videoPlayerControls => '비디오 플레이어 컨트롤'; + @override + String get keyboardShortcuts => '키보드 단축키'; + @override + String get keyboardShortcutsDescription => '사용자 정의 키보드 단축키'; + @override + String get videoPlayerNavigation => '비디오 플레이어 탐색'; + @override + String get videoPlayerNavigationDescription => '방향 키를 사용하여 비디오 플레이어 컨트롤 탐색'; + @override + String get debugLogging => '디버그 로깅'; + @override + String get debugLoggingDescription => '문제 해결을 위해 상세 로깅 활성화'; + @override + String get viewLogs => '로그 보기'; + @override + String get viewLogsDescription => '애플리케이션 로그 확인'; + @override + String get clearCache => '캐시 삭제'; + @override + String get clearCacheDescription => '모든 캐시된 이미지와 데이터를 지웁니다. 캐시를 지우면 애플리케이션 콘텐츠 로딩 속도가 느려질 수 있습니다.'; + @override + String get clearCacheSuccess => '캐시 삭제 성공'; + @override + String get resetSettings => '설정 재설정'; + @override + String get resetSettingsDescription => '모든 설정을 기본값으로 재설정합니다. 이 작업은 되돌릴 수 없습니다.'; + @override + String get resetSettingsSuccess => '설정 재설정 성공'; + @override + String get shortcutsReset => '단축키가 기본값으로 재설정되었습니다'; + @override + String get about => '정보'; + @override + String get aboutDescription => '응용 프로그램 정보 및 라이선스'; + @override + String get updates => '업데이트'; + @override + String get updateAvailable => '사용 가능한 업데이트 있음'; + @override + String get checkForUpdates => '업데이트 확인'; + @override + String get validationErrorEnterNumber => '유효한 숫자를 입력하세요'; + @override + String validationErrorDuration({required Object min, required Object max, required Object unit}) => + '기간은 ${min}과 ${max} ${unit} 사이여야 합니다'; + @override + String shortcutAlreadyAssigned({required Object action}) => '단축키가 이미 ${action}에 할당 되었습니다'; + @override + String shortcutUpdated({required Object action}) => '단축키가 ${action}에 대해 업데이트 되었습니다'; + @override + String get autoSkip => '자동 건너뛰기'; + @override + String get autoSkipIntro => '자동으로 오프닝 건너뛰기'; + @override + String get autoSkipIntroDescription => '몇 초 후 오프닝을 자동으로 건너뛰기'; + @override + String get autoSkipCredits => '자동으로 엔딩 건너뛰기'; + @override + String get autoSkipCreditsDescription => '엔딩 크레딧 자동 건너뛰기 후 다음 에피소드 재생'; + @override + String get autoSkipDelay => '자동 건너뛰기 지연'; + @override + String autoSkipDelayDescription({required Object seconds}) => '자동 건너뛰기 전 ${seconds} 초 대기'; + @override + String get downloads => '다운로드'; + @override + String get downloadLocationDescription => '다운로드 콘텐츠 저장 위치 선택'; + @override + String get downloadLocationDefault => '기본값 (앱 저장소)'; + @override + String get downloadLocationCustom => '사용자 지정 위치'; + @override + String get selectFolder => '폴더 선택'; + @override + String get resetToDefault => '기본값으로 재설정'; + @override + String currentPath({required Object path}) => '현재: ${path}'; + @override + String get downloadLocationChanged => '다운로드 위치가 변경 되었습니다'; + @override + String get downloadLocationReset => '다운로드 위치가 기본값으로 재설정 되었습니다'; + @override + String get downloadLocationInvalid => '선택한 폴더에 쓰기 권한이 없습니다'; + @override + String get downloadLocationSelectError => '폴더 선택 실패'; + @override + String get downloadOnWifiOnly => 'WiFi 연결 시에만 다운로드'; + @override + String get downloadOnWifiOnlyDescription => '셀룰러 데이터 사용 시 다운로드 불가'; + @override + String get cellularDownloadBlocked => '셀룰러 데이터에서 다운로드가 차단 되었습니다. WiFi에 연결하거나 설정을 변경하세요.'; +} + +// Path: search +class _StringsSearchKo implements _StringsSearchEn { + _StringsSearchKo._(this._root); + + @override + final _StringsKo _root; // ignore: unused_field + + // Translations + @override + String get hint => '영화, 시리즈, 음악 등을 검색하세요...'; + @override + String get tryDifferentTerm => '다른 검색어를 시도해 보세요'; + @override + String get searchYourMedia => '미디어 검색'; + @override + String get enterTitleActorOrKeyword => '제목, 배우 또는 키워드를 입력하세요'; +} + +// Path: hotkeys +class _StringsHotkeysKo implements _StringsHotkeysEn { + _StringsHotkeysKo._(this._root); + + @override + final _StringsKo _root; // ignore: unused_field + + // Translations + @override + String setShortcutFor({required Object actionName}) => '${actionName}에 대한 단축키 설정'; + @override + String get clearShortcut => '단축키 삭제'; +} + +// Path: pinEntry +class _StringsPinEntryKo implements _StringsPinEntryEn { + _StringsPinEntryKo._(this._root); + + @override + final _StringsKo _root; // ignore: unused_field + + // Translations + @override + String get enterPin => 'PIN 입력'; + @override + String get showPin => 'PIN 표시'; + @override + String get hidePin => 'PIN 숨기기'; +} + +// Path: fileInfo +class _StringsFileInfoKo implements _StringsFileInfoEn { + _StringsFileInfoKo._(this._root); + + @override + final _StringsKo _root; // ignore: unused_field + + // Translations + @override + String get title => '파일 정보'; + @override + String get video => '비디오'; + @override + String get audio => '오디오'; + @override + String get file => '파일'; + @override + String get advanced => '고급'; + @override + String get codec => '코덱'; + @override + String get resolution => '해상도'; + @override + String get bitrate => '비트레이트'; + @override + String get frameRate => '프레임 속도'; + @override + String get aspectRatio => '종횡비'; + @override + String get profile => '프로파일'; + @override + String get bitDepth => '비트 심도'; + @override + String get colorSpace => '색 공간'; + @override + String get colorRange => '색 범위'; + @override + String get colorPrimaries => '색상 원색'; + @override + String get chromaSubsampling => '채도 서브샘플링'; + @override + String get channels => '채널'; + @override + String get path => '경로'; + @override + String get size => '크기'; + @override + String get container => '컨테이너'; + @override + String get duration => '재생 시간'; + @override + String get optimizedForStreaming => '스트리밍 최적화'; + @override + String get has64bitOffsets => '64비트 오프셋'; +} + +// Path: mediaMenu +class _StringsMediaMenuKo implements _StringsMediaMenuEn { + _StringsMediaMenuKo._(this._root); + + @override + final _StringsKo _root; // ignore: unused_field + + // Translations + @override + String get markAsWatched => '시청 완료로 표시'; + @override + String get markAsUnwatched => '시청 안 함으로 표시'; + @override + String get removeFromContinueWatching => '계속 보기에서 제거'; + @override + String get goToSeries => '시리즈로 이동'; + @override + String get goToSeason => '시즌으로 이동'; + @override + String get shufflePlay => '무작위 재생'; + @override + String get fileInfo => '파일 정보'; +} + +// Path: accessibility +class _StringsAccessibilityKo implements _StringsAccessibilityEn { + _StringsAccessibilityKo._(this._root); + + @override + final _StringsKo _root; // ignore: unused_field + + // Translations + @override + String mediaCardMovie({required Object title}) => '${title}, 영화'; + @override + String mediaCardShow({required Object title}) => '${title}, TV 프로그램'; + @override + String mediaCardEpisode({required Object title, required Object episodeInfo}) => '${title}, ${episodeInfo}'; + @override + String mediaCardSeason({required Object title, required Object seasonInfo}) => '${title}, ${seasonInfo}'; + @override + String get mediaCardWatched => '시청 완료'; + @override + String mediaCardPartiallyWatched({required Object percent}) => '${percent} 퍼센트 시청 완료'; + @override + String get mediaCardUnwatched => '미시청'; + @override + String get tapToPlay => '터치 하여 재생'; +} + +// Path: tooltips +class _StringsTooltipsKo implements _StringsTooltipsEn { + _StringsTooltipsKo._(this._root); + + @override + final _StringsKo _root; // ignore: unused_field + + // Translations + @override + String get shufflePlay => '무작위 재생'; + @override + String get markAsWatched => '시청 완료로 표시'; + @override + String get markAsUnwatched => '시청 안 함으로 표시'; +} + +// Path: videoControls +class _StringsVideoControlsKo implements _StringsVideoControlsEn { + _StringsVideoControlsKo._(this._root); + + @override + final _StringsKo _root; // ignore: unused_field + + // Translations + @override + String get audioLabel => '오디오'; + @override + String get subtitlesLabel => '자막'; + @override + String get resetToZero => '0ms로 재설정'; + @override + String addTime({required Object amount, required Object unit}) => '+${amount}${unit}'; + @override + String minusTime({required Object amount, required Object unit}) => '-${amount}${unit}'; + @override + String playsLater({required Object label}) => '${label} 나중에 재생됨'; + @override + String playsEarlier({required Object label}) => '${label} 더 먼저 재생됨'; + @override + String get noOffset => '오프셋 없음'; + @override + String get letterbox => '레터박스 모드'; + @override + String get fillScreen => '화면 채우기'; + @override + String get stretch => '확장'; + @override + String get lockRotation => '회전 잠금'; + @override + String get unlockRotation => '회전 잠금 해제'; + @override + String get sleepTimer => '수면 타이머'; + @override + String get timerActive => '타이머 활성화됨'; + @override + String playbackWillPauseIn({required Object duration}) => '재생이 ${duration} 후에 일시 중지 됩니다'; + @override + String get sleepTimerCompleted => '수면 타이머 완료됨 - 재생이 일시 중지되었습니다'; + @override + String get playButton => '재생'; + @override + String get pauseButton => '일시정지'; + @override + String seekBackwardButton({required Object seconds}) => '${seconds} 초 뒤로'; + @override + String seekForwardButton({required Object seconds}) => '${seconds} 초 앞으로'; + @override + String get previousButton => '이전 에피소드'; + @override + String get nextButton => '다음 에피소드'; + @override + String get previousChapterButton => '이전 챕터'; + @override + String get nextChapterButton => '다음 챕터'; + @override + String get muteButton => '음소거'; + @override + String get unmuteButton => '음소거 해제'; + @override + String get settingsButton => '동영상 설정'; + @override + String get audioTrackButton => '음원 트랙'; + @override + String get subtitlesButton => '자막'; + @override + String get chaptersButton => '챕터'; + @override + String get versionsButton => '동영상 버전'; + @override + String get aspectRatioButton => '화면비율'; + @override + String get fullscreenButton => '전체화면'; + @override + String get exitFullscreenButton => '전체화면 종료'; + @override + String get alwaysOnTopButton => '창 최상위 고정'; + @override + String get rotationLockButton => '회전 잠금'; + @override + String get timelineSlider => '타임라인'; + @override + String get volumeSlider => '볼륨 조절'; + @override + String get backButton => '뒤로 가기'; +} + +// Path: userStatus +class _StringsUserStatusKo implements _StringsUserStatusEn { + _StringsUserStatusKo._(this._root); + + @override + final _StringsKo _root; // ignore: unused_field + + // Translations + @override + String get admin => '관리자'; + @override + String get restricted => '제한됨'; + @override + String get protected => '보호됨'; + @override + String get current => '현재'; +} + +// Path: messages +class _StringsMessagesKo implements _StringsMessagesEn { + _StringsMessagesKo._(this._root); + + @override + final _StringsKo _root; // ignore: unused_field + + // Translations + @override + String get markedAsWatched => '시청 완료로 표시됨'; + @override + String get markedAsUnwatched => '시청 안 함으로 표시됨'; + @override + String get markedAsWatchedOffline => '시청 완료로 표시됨 (연결 시 동기화됨)'; + @override + String get markedAsUnwatchedOffline => '미시청으로 표시됨 (연결 시 동기화됨)'; + @override + String get removedFromContinueWatching => '계속 시청 목록에서 제거됨'; + @override + String errorLoading({required Object error}) => '오류: ${error}'; + @override + String get fileInfoNotAvailable => '파일 정보가 없습니다'; + @override + String errorLoadingFileInfo({required Object error}) => '파일 정보 로딩 중 오류: ${error}'; + @override + String get errorLoadingSeries => '시리즈 로딩 중 오류'; + @override + String get errorLoadingSeason => '시즌 로딩 중 오류'; + @override + String get musicNotSupported => '음악 재생 미지원'; + @override + String get logsCleared => '로그가 삭제 되었습니다'; + @override + String get logsCopied => '로그가 클립보드에 복사 되었습니다'; + @override + String get noLogsAvailable => '사용 가능한 로그가 없습니다'; + @override + String libraryScanning({required Object title}) => '"${title}"을(를) 스캔 중입니다...'; + @override + String libraryScanStarted({required Object title}) => '"${title}" 미디어 라이브러리 스캔 시작'; + @override + String libraryScanFailed({required Object error}) => '미디어 라이브러리 스캔 실패: ${error}'; + @override + String metadataRefreshing({required Object title}) => '"${title}" 메타데이터 새로고침 중...'; + @override + String metadataRefreshStarted({required Object title}) => '"${title}" 메타데이터 새로고침 시작됨'; + @override + String metadataRefreshFailed({required Object error}) => '메타데이터 새로고침 실패: ${error}'; + @override + String get logoutConfirm => '로그아웃 하시겠습니까?'; + @override + String get noSeasonsFound => '시즌을 찾을 수 없음'; + @override + String get noEpisodesFound => '시즌 1에서 에피소드를 찾을 수 없습니다'; + @override + String get noEpisodesFoundGeneral => '에피소드를 찾을 수 없습니다'; + @override + String get noResultsFound => '결과를 찾을 수 없습니다'; + @override + String sleepTimerSet({required Object label}) => '수면 타이머가 ${label}로 설정 되었습니다'; + @override + String get noItemsAvailable => '사용 가능한 항목이 없습니다'; + @override + String get failedToCreatePlayQueue => '재생 대기열 생성 실패'; + @override + String get failedToCreatePlayQueueNoItems => '재생 대기열 생성 실패 - 항목 없음'; + @override + String failedPlayback({required Object action, required Object error}) => '${action}을(를) 수행할 수 없습니다: ${error}'; +} + +// Path: subtitlingStyling +class _StringsSubtitlingStylingKo implements _StringsSubtitlingStylingEn { + _StringsSubtitlingStylingKo._(this._root); + + @override + final _StringsKo _root; // ignore: unused_field + + // Translations + @override + String get stylingOptions => '스타일 옵션'; + @override + String get fontSize => '글자 크기'; + @override + String get textColor => '텍스트 색상'; + @override + String get borderSize => '테두리 크기'; + @override + String get borderColor => '테두리 색상'; + @override + String get backgroundOpacity => '배경 불투명도'; + @override + String get backgroundColor => '배경색'; +} + +// Path: mpvConfig +class _StringsMpvConfigKo implements _StringsMpvConfigEn { + _StringsMpvConfigKo._(this._root); + + @override + final _StringsKo _root; // ignore: unused_field + + // Translations + @override + String get title => 'MPV 설정'; + @override + String get description => '고급 비디오 플레이어 설정'; + @override + String get properties => '속성'; + @override + String get presets => '사전 설정'; + @override + String get noProperties => '설정된 속성이 없습니다'; + @override + String get noPresets => '저장된 사전 설정이 없습니다'; + @override + String get addProperty => '속성 추가'; + @override + String get editProperty => '속성 편집'; + @override + String get deleteProperty => '속성 삭제'; + @override + String get propertyKey => '속성 키'; + @override + String get propertyKeyHint => '예: hwdec, demuxer-max-bytes'; + @override + String get propertyValue => '속성값'; + @override + String get propertyValueHint => '예: auto, 256000000'; + @override + String get saveAsPreset => '프리셋으로 저장...'; + @override + String get presetName => '프리셋 이름'; + @override + String get presetNameHint => '이 프리셋의 이름을 입력하세요'; + @override + String get loadPreset => '로드'; + @override + String get deletePreset => '삭제'; + @override + String get presetSaved => '프리셋이 저장 되었습니다'; + @override + String get presetLoaded => '프리셋이 로드 되었습니다'; + @override + String get presetDeleted => '프리셋이 삭제 되었습니다'; + @override + String get confirmDeletePreset => '이 프리셋을 삭제 하시겠습니까?'; + @override + String get confirmDeleteProperty => '이 속성을 삭제 하시겠습니까?'; + @override + String entriesCount({required Object count}) => '${count} 항목'; +} + +// Path: dialog +class _StringsDialogKo implements _StringsDialogEn { + _StringsDialogKo._(this._root); + + @override + final _StringsKo _root; // ignore: unused_field + + // Translations + @override + String get confirmAction => '확인'; + @override + String get cancel => '취소'; + @override + String get playNow => '지금 재생'; +} + +// Path: discover +class _StringsDiscoverKo implements _StringsDiscoverEn { + _StringsDiscoverKo._(this._root); + + @override + final _StringsKo _root; // ignore: unused_field + + // Translations + @override + String get title => '발견'; + @override + String get switchProfile => '사용자 전환'; + @override + String get switchServer => '서버 전환'; + @override + String get logout => '로그아웃'; + @override + String get noContentAvailable => '사용 가능한 콘텐츠가 없습니다'; + @override + String get addMediaToLibraries => '미디어 라이브러리에 미디어를 추가해 주세요'; + @override + String get continueWatching => '계속 시청'; + @override + String get play => '재생'; + @override + String playEpisode({required Object season, required Object episode}) => 'S${season}E${episode}'; + @override + String get pause => '일시정지'; + @override + String get overview => '개요'; + @override + String get cast => '출연진'; + @override + String get seasons => '시즌 수'; + @override + String get studio => '제작사'; + @override + String get rating => '연령 등급'; + @override + String get watched => '시청 완료'; + @override + String episodeCount({required Object count}) => '${count} 편'; + @override + String watchedProgress({required Object watched, required Object total}) => '${watched}/${total} 편 시청 완료'; + @override + String get movie => '영화'; + @override + String get tvShow => 'TV 시리즈'; + @override + String minutesLeft({required Object minutes}) => '${minutes}분 남음'; +} + +// Path: errors +class _StringsErrorsKo implements _StringsErrorsEn { + _StringsErrorsKo._(this._root); + + @override + final _StringsKo _root; // ignore: unused_field + + // Translations + @override + String searchFailed({required Object error}) => '검색 실패: ${error}'; + @override + String connectionTimeout({required Object context}) => '${context} 로드 중 연결 시간 초과'; + @override + String get connectionFailed => 'Plex 서버에 연결할 수 없음'; + @override + String failedToLoad({required Object context, required Object error}) => '${context} 로드 실패: ${error}'; + @override + String get noClientAvailable => '사용 가능한 클라이언트가 없습니다'; + @override + String authenticationFailed({required Object error}) => '인증 실패: ${error}'; + @override + String get couldNotLaunchUrl => '인증 URL을 열 수 없습니다'; + @override + String get pleaseEnterToken => '토큰을 입력해 주세요'; + @override + String get invalidToken => '토큰이 유효하지 않습니다'; + @override + String failedToVerifyToken({required Object error}) => '토큰을 확인할 수 없습니다: ${error}'; + @override + String failedToSwitchProfile({required Object displayName}) => '${displayName}으로 전환할 수 없습니다'; +} + +// Path: libraries +class _StringsLibrariesKo implements _StringsLibrariesEn { + _StringsLibrariesKo._(this._root); + + @override + final _StringsKo _root; // ignore: unused_field + + // Translations + @override + String get title => '미디어 라이브러리'; + @override + String get scanLibraryFiles => '미디어 라이브러리 파일 스캔'; + @override + String get scanLibrary => '미디어 라이브러리 스캔'; + @override + String get analyze => '분석'; + @override + String get analyzeLibrary => '미디어 라이브러리 분석'; + @override + String get refreshMetadata => '메타데이터 새로 고침'; + @override + String get emptyTrash => '휴지통 비우기'; + @override + String emptyingTrash({required Object title}) => '「${title}」의 휴지통을 비우고 있습니다...'; + @override + String trashEmptied({required Object title}) => '「${title}」의 휴지통을 비웠습니다'; + @override + String failedToEmptyTrash({required Object error}) => '휴지통 비우기 실패: ${error}'; + @override + String analyzing({required Object title}) => '"${title}" 분석 중...'; + @override + String analysisStarted({required Object title}) => '"${title}" 분석 시작됨'; + @override + String failedToAnalyze({required Object error}) => '미디어 라이브러리 분석 실패: ${error}'; + @override + String get noLibrariesFound => '미디어 라이브러리 없음'; + @override + String get thisLibraryIsEmpty => '이 미디어 라이브러리는 비어 있습니다'; + @override + String get all => '전체'; + @override + String get clearAll => '모두 삭제'; + @override + String scanLibraryConfirm({required Object title}) => '「${title}」를 스캔 하시겠습니까?'; + @override + String analyzeLibraryConfirm({required Object title}) => '「${title}」를 분석 하시겠습니까?'; + @override + String refreshMetadataConfirm({required Object title}) => '「${title}」의 메타데이터를 새로고침 하시겠습니까?'; + @override + String emptyTrashConfirm({required Object title}) => '${title}의 휴지통을 비우시겠습니까?'; + @override + String get manageLibraries => '미디어 라이브러리 관리'; + @override + String get sort => '정렬'; + @override + String get sortBy => '정렬 기준'; + @override + String get filters => '필터'; + @override + String get confirmActionMessage => '이 작업을 실행 하시겠습니까?'; + @override + String get showLibrary => '미디어 라이브러리 표시'; + @override + String get hideLibrary => '미디어 라이브러리 숨기기'; + @override + String get libraryOptions => '미디어 라이브러리 옵션'; + @override + String get content => '미디어 라이브러리 콘텐츠'; + @override + String get selectLibrary => '미디어 라이브러리 선택'; + @override + String filtersWithCount({required Object count}) => '필터 (${count})'; + @override + String get noRecommendations => '추천 없음'; + @override + String get noCollections => '이 미디어 라이브러리에는 컬렉션이 없습니다'; + @override + String get noFoldersFound => '폴더를 찾을 수 없습니다'; + @override + String get folders => '폴더'; + @override + late final _StringsLibrariesTabsKo tabs = _StringsLibrariesTabsKo._(_root); + @override + late final _StringsLibrariesGroupingsKo groupings = _StringsLibrariesGroupingsKo._(_root); +} + +// Path: about +class _StringsAboutKo implements _StringsAboutEn { + _StringsAboutKo._(this._root); + + @override + final _StringsKo _root; // ignore: unused_field + + // Translations + @override + String get title => '소개'; + @override + String get openSourceLicenses => '오픈소스 라이선스'; + @override + String versionLabel({required Object version}) => '버전 ${version}'; + @override + String get appDescription => '아름다운 Flutter Plex 클라이언트'; + @override + String get viewLicensesDescription => '타사 라이브러리 라이선스 보기'; +} + +// Path: serverSelection +class _StringsServerSelectionKo implements _StringsServerSelectionEn { + _StringsServerSelectionKo._(this._root); + + @override + final _StringsKo _root; // ignore: unused_field + + // Translations + @override + String get allServerConnectionsFailed => '어떤 서버에도 연결할 수 없습니다. 네트워크를 확인하고 다시 시도하세요.'; + @override + String get noServersFound => '서버를 찾을 수 없습니다.'; + @override + String noServersFoundForAccount({required Object username, required Object email}) => + '${username} (${email})의 서버를 찾을 수 없습니다.'; + @override + String failedToLoadServers({required Object error}) => '서버를 로드할 수 없습니다: ${error}'; +} + +// Path: hubDetail +class _StringsHubDetailKo implements _StringsHubDetailEn { + _StringsHubDetailKo._(this._root); + + @override + final _StringsKo _root; // ignore: unused_field + + // Translations + @override + String get title => '제목'; + @override + String get releaseYear => '출시 연도'; + @override + String get dateAdded => '추가 날짜'; + @override + String get rating => '평점'; + @override + String get noItemsFound => '항목이 없습니다'; +} + +// Path: logs +class _StringsLogsKo implements _StringsLogsEn { + _StringsLogsKo._(this._root); + + @override + final _StringsKo _root; // ignore: unused_field + + // Translations + @override + String get clearLogs => '로그 지우기'; + @override + String get copyLogs => '로그 복사'; + @override + String get error => '오류:'; + @override + String get stackTrace => '스택 추적 (Stack Trace):'; +} + +// Path: licenses +class _StringsLicensesKo implements _StringsLicensesEn { + _StringsLicensesKo._(this._root); + + @override + final _StringsKo _root; // ignore: unused_field + + // Translations + @override + String get relatedPackages => '관련 소프트웨어 패키지'; + @override + String get license => '라이선스'; + @override + String licenseNumber({required Object number}) => '라이선스 ${number}'; + @override + String licensesCount({required Object count}) => '${count} 개의 라이선스'; +} + +// Path: navigation +class _StringsNavigationKo implements _StringsNavigationEn { + _StringsNavigationKo._(this._root); + + @override + final _StringsKo _root; // ignore: unused_field + + // Translations + @override + String get home => '홈'; + @override + String get search => '검색'; + @override + String get libraries => '미디어 라이브러리'; + @override + String get settings => '설정'; + @override + String get downloads => '다운로드'; +} + +// Path: collections +class _StringsCollectionsKo implements _StringsCollectionsEn { + _StringsCollectionsKo._(this._root); + + @override + final _StringsKo _root; // ignore: unused_field + + // Translations + @override + String get title => '컬렉션'; + @override + String get collection => '컬렉션'; + @override + String get empty => '컬렉션이 비어 있습니다'; + @override + String get unknownLibrarySection => '삭제할 수 없습니다: 알 수 없는 미디어 라이브러리 섹션입니다'; + @override + String get deleteCollection => '컬렉션 삭제'; + @override + String deleteConfirm({required Object title}) => '"${title}"을(를) 삭제 하시겠습니까? 이 작업은 되돌릴 수 없습니다.'; + @override + String get deleted => '컬렉션 삭제됨'; + @override + String get deleteFailed => '컬렉션 삭제 실패'; + @override + String deleteFailedWithError({required Object error}) => '컬렉션 삭제 실패: ${error}'; + @override + String failedToLoadItems({required Object error}) => '컬렉션 항목 로드 실패: ${error}'; + @override + String get selectCollection => '컬렉션 선택'; + @override + String get createNewCollection => '새 컬렉션 생성'; + @override + String get collectionName => '컬렉션 이름'; + @override + String get enterCollectionName => '컬렉션 이름 입력'; + @override + String get addedToCollection => '컬렉션에 추가됨'; + @override + String get errorAddingToCollection => '컬렉션에 추가 실패'; + @override + String get created => '컬렉션 생성됨'; + @override + String get removeFromCollection => '컬렉션에서 제거'; + @override + String removeFromCollectionConfirm({required Object title}) => '${title}을/를 이 컬렉션에서 제거 하시겠습니까?'; + @override + String get removedFromCollection => '컬렉션에서 제거됨'; + @override + String get removeFromCollectionFailed => '컬렉션에서 제거 실패'; + @override + String removeFromCollectionError({required Object error}) => '컬렉션에서 제거 중 오류 발생: ${error}'; +} + +// Path: playlists +class _StringsPlaylistsKo implements _StringsPlaylistsEn { + _StringsPlaylistsKo._(this._root); + + @override + final _StringsKo _root; // ignore: unused_field + + // Translations + @override + String get title => '플레이리스트'; + @override + String get playlist => '재생 목록'; + @override + String get noPlaylists => '재생 목록을 찾을 수 없습니다'; + @override + String get create => '재생 목록 생성'; + @override + String get playlistName => '재생 목록 이름'; + @override + String get enterPlaylistName => '재생 목록 이름 입력'; + @override + String get delete => '재생 목록 삭제'; + @override + String get removeItem => '재생 목록에서 항목 제거'; + @override + String get smartPlaylist => '스마트 재생 목록'; + @override + String itemCount({required Object count}) => '${count}개 항목'; + @override + String get oneItem => '1개 항목'; + @override + String get emptyPlaylist => '이 재생 목록은 비어 있습니다'; + @override + String get deleteConfirm => '재생 목록을 삭제 하시겠습니까?'; + @override + String deleteMessage({required Object name}) => '"${name}"을(를) 삭제 하시겠습니까?'; + @override + String get created => '재생 목록이 생성 되었습니다'; + @override + String get deleted => '재생 목록이 삭제 되었습니다'; + @override + String get itemAdded => '재생 목록에 추가 되었습니다'; + @override + String get itemRemoved => '재생 목록에서 제거됨'; + @override + String get selectPlaylist => '재생 목록 선택'; + @override + String get createNewPlaylist => '새 재생 목록 생성'; + @override + String get errorCreating => '재생 목록 생성 실패'; + @override + String get errorDeleting => '재생 목록 삭제 실패'; + @override + String get errorLoading => '재생 목록 로드 실패'; + @override + String get errorAdding => '재생 목록에 추가 실패'; + @override + String get errorReordering => '재생 목록 항목 재정렬 실패'; + @override + String get errorRemoving => '재생 목록에서 제거 실패'; +} + +// Path: watchTogether +class _StringsWatchTogetherKo implements _StringsWatchTogetherEn { + _StringsWatchTogetherKo._(this._root); + + @override + final _StringsKo _root; // ignore: unused_field + + // Translations + @override + String get title => '함께 보기'; + @override + String get description => '친구 및 가족과 콘텐츠를 동시에 시청하세요'; + @override + String get createSession => '세션 생성'; + @override + String get creating => '생성 중...'; + @override + String get joinSession => '세션 참여'; + @override + String get joining => '참가 중...'; + @override + String get controlMode => '제어 모드'; + @override + String get controlModeQuestion => '누가 재생을 제어할 수 있나요?'; + @override + String get hostOnly => '호스트만'; + @override + String get anyone => '누구나'; + @override + String get hostingSession => '세션 호스팅'; + @override + String get inSession => '세션 중'; + @override + String get sessionCode => '세션 코드'; + @override + String get hostControlsPlayback => '호스트 재생 제어'; + @override + String get anyoneCanControl => '누구나 재생 제어 가능'; + @override + String get hostControls => '호스트 제어'; + @override + String get anyoneControls => '누구나 제어'; + @override + String get participants => '참가자'; + @override + String get host => '호스트'; + @override + String get hostBadge => '호스트'; + @override + String get youAreHost => '당신은 호스트 입니다'; + @override + String get watchingWithOthers => '다른 사람과 함께 시청 중'; + @override + String get endSession => '세션 종료'; + @override + String get leaveSession => '세션 탈퇴'; + @override + String get endSessionQuestion => '세션을 종료 하시겠습니까?'; + @override + String get leaveSessionQuestion => '세션을 탈퇴 하시겠습니까?'; + @override + String get endSessionConfirm => '이 작업은 모든 참가자의 세션을 종료합니다.'; + @override + String get leaveSessionConfirm => '당신은 세션에서 제거됩니다.'; + @override + String get endSessionConfirmOverlay => '이것은 모든 참가자의 시청 세션을 종료합니다.'; + @override + String get leaveSessionConfirmOverlay => '시청 세션 연결이 끊어집니다.'; + @override + String get end => '종료'; + @override + String get leave => '이탈'; + @override + String get syncing => '동기화 중...'; + @override + String get participant => '참여자'; + @override + String get joinWatchSession => '시청 세션에 참여'; + @override + String get enterCodeHint => '8자리 코드 입력'; + @override + String get pasteFromClipboard => '클립보드에서 붙여넣기'; + @override + String get pleaseEnterCode => '세션 코드를 입력하세요'; + @override + String get codeMustBe8Chars => '세션 코드는 반드시 8자리여야 합니다'; + @override + String get joinInstructions => '호스트가 공유한 세션 코드를 입력하여 시청 세션에 참여하세요.'; + @override + String get failedToCreate => '세션 생성 실패'; + @override + String get failedToJoin => '세션 참여 실패'; +} + +// Path: downloads +class _StringsDownloadsKo implements _StringsDownloadsEn { + _StringsDownloadsKo._(this._root); + + @override + final _StringsKo _root; // ignore: unused_field + + // Translations + @override + String get title => '다운로드'; + @override + String get manage => '관리'; + @override + String get tvShows => 'TV 프로그램'; + @override + String get movies => '영화'; + @override + String get noDownloads => '다운로드 없음'; + @override + String get noDownloadsDescription => '다운로드한 콘텐츠는 오프라인 시청을 위해 여기에 표시됩니다'; + @override + String get downloadNow => '다운로드'; + @override + String get deleteDownload => '다운로드 삭제'; + @override + String get retryDownload => '다운로드 재시도'; + @override + String get downloadQueued => '다운로드 대기 중'; + @override + String episodesQueued({required Object count}) => '${count} 에피소드가 다운로드 대기열에 추가 되었습니다'; + @override + String get downloadDeleted => '다운로드 삭제됨'; + @override + String deleteConfirm({required Object title}) => '"${title}"를 삭제 하시겠습니까? 다운로드한 파일이 기기에서 삭제됩니다.'; + @override + String deletingWithProgress({required Object title, required Object current, required Object total}) => + '${title} 삭제 중... (${current}/${total})'; +} + +// Path: libraries.tabs +class _StringsLibrariesTabsKo implements _StringsLibrariesTabsEn { + _StringsLibrariesTabsKo._(this._root); + + @override + final _StringsKo _root; // ignore: unused_field + + // Translations + @override + String get recommended => '추천'; + @override + String get browse => '찾아보기'; + @override + String get collections => '컬렉션'; + @override + String get playlists => '재생 목록'; +} + +// Path: libraries.groupings +class _StringsLibrariesGroupingsKo implements _StringsLibrariesGroupingsEn { + _StringsLibrariesGroupingsKo._(this._root); + + @override + final _StringsKo _root; // ignore: unused_field + + // Translations + @override + String get all => '전체'; + @override + String get movies => '영화'; + @override + String get shows => 'TV 프로그램'; + @override + String get seasons => '시즌'; + @override + String get episodes => '화'; + @override + String get folders => '폴더'; +} + // Path: class _StringsNl implements Translations { /// You can call this constructor and build your own translation instance of this locale. @@ -11317,6 +12760,1019 @@ extension on _StringsIt { } } +extension on _StringsKo { + dynamic _flatMapFunction(String path) { + switch (path) { + case 'app.title': + return 'Plezy'; + case 'app.loading': + return '로딩 중...'; + case 'auth.signInWithPlex': + return 'Plex 계정으로 로그인'; + case 'auth.showQRCode': + return 'QR 코드'; + case 'auth.cancel': + return '취소'; + case 'auth.authenticate': + return '인증'; + case 'auth.retry': + return '재시도'; + case 'auth.debugEnterToken': + return '디버깅을 위해 Plex 토큰을 입력하세요.'; + case 'auth.plexTokenLabel': + return 'Plex 인증 토큰'; + case 'auth.plexTokenHint': + return 'Plex.tv 토큰을 입력하세요'; + case 'auth.authenticationTimeout': + return '인증 시간이 초과되었습니다. 다시 시도해 주세요.'; + case 'auth.scanQRCodeInstruction': + return 'Plex 계정에 로그인된 기기에서 이 QR 코드를 스캔하여 본인 인증을 해주세요.'; + case 'auth.waitingForAuth': + return '인증 대기 중... 브라우저에서 로그인을 완료해 주세요.'; + case 'common.cancel': + return '취소'; + case 'common.save': + return '저장'; + case 'common.close': + return '닫기'; + case 'common.clear': + return '지우기'; + case 'common.reset': + return '초기화'; + case 'common.later': + return '나중에'; + case 'common.submit': + return '보내기'; + case 'common.confirm': + return '확인'; + case 'common.retry': + return '재시도'; + case 'common.logout': + return '로그아웃'; + case 'common.unknown': + return '알 수 없는'; + case 'common.refresh': + return '새로고침'; + case 'common.yes': + return '예'; + case 'common.no': + return '아니오'; + case 'common.delete': + return '삭제'; + case 'common.shuffle': + return '무작위 재생'; + case 'common.addTo': + return '추가하기...'; + case 'screens.licenses': + return '라이선스'; + case 'screens.selectServer': + return '서버 선택'; + case 'screens.switchProfile': + return '프로필 전환'; + case 'screens.subtitleStyling': + return '자막 스타일 설정'; + case 'screens.mpvConfig': + return 'MPV 설정'; + case 'screens.search': + return '검색'; + case 'screens.logs': + return '로그'; + case 'update.available': + return '사용 가능한 업데이트'; + case 'update.versionAvailable': + return ({required Object version}) => '버전 ${version} 출시됨'; + case 'update.currentVersion': + return ({required Object version}) => '현재 버전: ${version}'; + case 'update.skipVersion': + return '이 버전 건너뛰기'; + case 'update.viewRelease': + return '릴리스 정보 보기'; + case 'update.latestVersion': + return '최신 버전을 사용 중입니다'; + case 'update.checkFailed': + return '업데이트 확인 실패'; + case 'settings.title': + return '설정'; + case 'settings.language': + return '언어'; + case 'settings.theme': + return '테마'; + case 'settings.appearance': + return '외관'; + case 'settings.videoPlayback': + return '비디오 재생'; + case 'settings.advanced': + return '고급'; + case 'settings.useSeasonPostersDescription': + return '에피소드에 시리즈 포스터 대신 시즌 포스터 표시'; + case 'settings.showHeroSectionDescription': + return '홈 화면에 주요 콘텐츠 캐러셀(슬라이드) 표시'; + case 'settings.secondsLabel': + return '초'; + case 'settings.minutesLabel': + return '분'; + case 'settings.secondsShort': + return '초'; + case 'settings.minutesShort': + return '분'; + case 'settings.durationHint': + return ({required Object min, required Object max}) => '기간 입력 (${min}-${max})'; + case 'settings.systemTheme': + return '시스템 설정'; + case 'settings.systemThemeDescription': + return '시스템 설정에 따름'; + case 'settings.lightTheme': + return '라이트 모드'; + case 'settings.darkTheme': + return '다크 모드'; + case 'settings.libraryDensity': + return '라이브러리 표시 밀도'; + case 'settings.compact': + return '좁게'; + case 'settings.compactDescription': + return '카드를 작게 표시하여 더 많은 항목을 보여줍니다.'; + case 'settings.normal': + return '보통'; + case 'settings.normalDescription': + return '기본 크기'; + case 'settings.comfortable': + return '넓게'; + case 'settings.comfortableDescription': + return '카드를 크게 표시하여 더 적은 항목을 보여줍니다.'; + case 'settings.viewMode': + return '보기 모드'; + case 'settings.gridView': + return '그리드 보기'; + case 'settings.gridViewDescription': + return '항목을 그리드 레이아웃으로 표시합니다'; + case 'settings.listView': + return '목록 보기'; + case 'settings.listViewDescription': + return '항목을 목록 레이아웃으로 표시합니다'; + case 'settings.useSeasonPosters': + return '시즌 포스터 사용'; + case 'settings.showHeroSection': + return '주요 추천 영역 표시'; + case 'settings.hardwareDecoding': + return '하드웨어 디코딩'; + case 'settings.hardwareDecodingDescription': + return '가능한 경우 하드웨어 가속을 사용합니다'; + case 'settings.bufferSize': + return '버퍼 크기'; + case 'settings.bufferSizeMB': + return ({required Object size}) => '${size}MB'; + case 'settings.subtitleStyling': + return '자막 스타일'; + case 'settings.subtitleStylingDescription': + return '자막의 외형을 사용자 설정'; + case 'settings.smallSkipDuration': + return '짧은 건너뛰기 시간'; + case 'settings.largeSkipDuration': + return '긴 건너뛰기 시간'; + case 'settings.secondsUnit': + return ({required Object seconds}) => '${seconds}초'; + case 'settings.defaultSleepTimer': + return '기본 취침 타이머'; + case 'settings.minutesUnit': + return ({required Object minutes}) => '${minutes}분'; + case 'settings.rememberTrackSelections': + return '에피소드/영화별 트랙 선택 기억'; + case 'settings.rememberTrackSelectionsDescription': + return '재생 중 트랙을 변경할 때 오디오 및 자막 언어 설정을 자동으로 저장합니다'; + case 'settings.videoPlayerControls': + return '비디오 플레이어 컨트롤'; + case 'settings.keyboardShortcuts': + return '키보드 단축키'; + case 'settings.keyboardShortcutsDescription': + return '사용자 정의 키보드 단축키'; + case 'settings.videoPlayerNavigation': + return '비디오 플레이어 탐색'; + case 'settings.videoPlayerNavigationDescription': + return '방향 키를 사용하여 비디오 플레이어 컨트롤 탐색'; + case 'settings.debugLogging': + return '디버그 로깅'; + case 'settings.debugLoggingDescription': + return '문제 해결을 위해 상세 로깅 활성화'; + case 'settings.viewLogs': + return '로그 보기'; + case 'settings.viewLogsDescription': + return '애플리케이션 로그 확인'; + case 'settings.clearCache': + return '캐시 삭제'; + case 'settings.clearCacheDescription': + return '모든 캐시된 이미지와 데이터를 지웁니다. 캐시를 지우면 애플리케이션 콘텐츠 로딩 속도가 느려질 수 있습니다.'; + case 'settings.clearCacheSuccess': + return '캐시 삭제 성공'; + case 'settings.resetSettings': + return '설정 재설정'; + case 'settings.resetSettingsDescription': + return '모든 설정을 기본값으로 재설정합니다. 이 작업은 되돌릴 수 없습니다.'; + case 'settings.resetSettingsSuccess': + return '설정 재설정 성공'; + case 'settings.shortcutsReset': + return '단축키가 기본값으로 재설정되었습니다'; + case 'settings.about': + return '정보'; + case 'settings.aboutDescription': + return '응용 프로그램 정보 및 라이선스'; + case 'settings.updates': + return '업데이트'; + case 'settings.updateAvailable': + return '사용 가능한 업데이트 있음'; + case 'settings.checkForUpdates': + return '업데이트 확인'; + case 'settings.validationErrorEnterNumber': + return '유효한 숫자를 입력하세요'; + case 'settings.validationErrorDuration': + return ({required Object min, required Object max, required Object unit}) => + '기간은 ${min}과 ${max} ${unit} 사이여야 합니다'; + case 'settings.shortcutAlreadyAssigned': + return ({required Object action}) => '단축키가 이미 ${action}에 할당 되었습니다'; + case 'settings.shortcutUpdated': + return ({required Object action}) => '단축키가 ${action}에 대해 업데이트 되었습니다'; + case 'settings.autoSkip': + return '자동 건너뛰기'; + case 'settings.autoSkipIntro': + return '자동으로 오프닝 건너뛰기'; + case 'settings.autoSkipIntroDescription': + return '몇 초 후 오프닝을 자동으로 건너뛰기'; + case 'settings.autoSkipCredits': + return '자동으로 엔딩 건너뛰기'; + case 'settings.autoSkipCreditsDescription': + return '엔딩 크레딧 자동 건너뛰기 후 다음 에피소드 재생'; + case 'settings.autoSkipDelay': + return '자동 건너뛰기 지연'; + case 'settings.autoSkipDelayDescription': + return ({required Object seconds}) => '자동 건너뛰기 전 ${seconds} 초 대기'; + case 'settings.downloads': + return '다운로드'; + case 'settings.downloadLocationDescription': + return '다운로드 콘텐츠 저장 위치 선택'; + case 'settings.downloadLocationDefault': + return '기본값 (앱 저장소)'; + case 'settings.downloadLocationCustom': + return '사용자 지정 위치'; + case 'settings.selectFolder': + return '폴더 선택'; + case 'settings.resetToDefault': + return '기본값으로 재설정'; + case 'settings.currentPath': + return ({required Object path}) => '현재: ${path}'; + case 'settings.downloadLocationChanged': + return '다운로드 위치가 변경 되었습니다'; + case 'settings.downloadLocationReset': + return '다운로드 위치가 기본값으로 재설정 되었습니다'; + case 'settings.downloadLocationInvalid': + return '선택한 폴더에 쓰기 권한이 없습니다'; + case 'settings.downloadLocationSelectError': + return '폴더 선택 실패'; + case 'settings.downloadOnWifiOnly': + return 'WiFi 연결 시에만 다운로드'; + case 'settings.downloadOnWifiOnlyDescription': + return '셀룰러 데이터 사용 시 다운로드 불가'; + case 'settings.cellularDownloadBlocked': + return '셀룰러 데이터에서 다운로드가 차단 되었습니다. WiFi에 연결하거나 설정을 변경하세요.'; + case 'search.hint': + return '영화, 시리즈, 음악 등을 검색하세요...'; + case 'search.tryDifferentTerm': + return '다른 검색어를 시도해 보세요'; + case 'search.searchYourMedia': + return '미디어 검색'; + case 'search.enterTitleActorOrKeyword': + return '제목, 배우 또는 키워드를 입력하세요'; + case 'hotkeys.setShortcutFor': + return ({required Object actionName}) => '${actionName}에 대한 단축키 설정'; + case 'hotkeys.clearShortcut': + return '단축키 삭제'; + case 'pinEntry.enterPin': + return 'PIN 입력'; + case 'pinEntry.showPin': + return 'PIN 표시'; + case 'pinEntry.hidePin': + return 'PIN 숨기기'; + case 'fileInfo.title': + return '파일 정보'; + case 'fileInfo.video': + return '비디오'; + case 'fileInfo.audio': + return '오디오'; + case 'fileInfo.file': + return '파일'; + case 'fileInfo.advanced': + return '고급'; + case 'fileInfo.codec': + return '코덱'; + case 'fileInfo.resolution': + return '해상도'; + case 'fileInfo.bitrate': + return '비트레이트'; + case 'fileInfo.frameRate': + return '프레임 속도'; + case 'fileInfo.aspectRatio': + return '종횡비'; + case 'fileInfo.profile': + return '프로파일'; + case 'fileInfo.bitDepth': + return '비트 심도'; + case 'fileInfo.colorSpace': + return '색 공간'; + case 'fileInfo.colorRange': + return '색 범위'; + case 'fileInfo.colorPrimaries': + return '색상 원색'; + case 'fileInfo.chromaSubsampling': + return '채도 서브샘플링'; + case 'fileInfo.channels': + return '채널'; + case 'fileInfo.path': + return '경로'; + case 'fileInfo.size': + return '크기'; + case 'fileInfo.container': + return '컨테이너'; + case 'fileInfo.duration': + return '재생 시간'; + case 'fileInfo.optimizedForStreaming': + return '스트리밍 최적화'; + case 'fileInfo.has64bitOffsets': + return '64비트 오프셋'; + case 'mediaMenu.markAsWatched': + return '시청 완료로 표시'; + case 'mediaMenu.markAsUnwatched': + return '시청 안 함으로 표시'; + case 'mediaMenu.removeFromContinueWatching': + return '계속 보기에서 제거'; + case 'mediaMenu.goToSeries': + return '시리즈로 이동'; + case 'mediaMenu.goToSeason': + return '시즌으로 이동'; + case 'mediaMenu.shufflePlay': + return '무작위 재생'; + case 'mediaMenu.fileInfo': + return '파일 정보'; + case 'accessibility.mediaCardMovie': + return ({required Object title}) => '${title}, 영화'; + case 'accessibility.mediaCardShow': + return ({required Object title}) => '${title}, TV 프로그램'; + case 'accessibility.mediaCardEpisode': + return ({required Object title, required Object episodeInfo}) => '${title}, ${episodeInfo}'; + case 'accessibility.mediaCardSeason': + return ({required Object title, required Object seasonInfo}) => '${title}, ${seasonInfo}'; + case 'accessibility.mediaCardWatched': + return '시청 완료'; + case 'accessibility.mediaCardPartiallyWatched': + return ({required Object percent}) => '${percent} 퍼센트 시청 완료'; + case 'accessibility.mediaCardUnwatched': + return '미시청'; + case 'accessibility.tapToPlay': + return '터치 하여 재생'; + case 'tooltips.shufflePlay': + return '무작위 재생'; + case 'tooltips.markAsWatched': + return '시청 완료로 표시'; + case 'tooltips.markAsUnwatched': + return '시청 안 함으로 표시'; + case 'videoControls.audioLabel': + return '오디오'; + case 'videoControls.subtitlesLabel': + return '자막'; + case 'videoControls.resetToZero': + return '0ms로 재설정'; + case 'videoControls.addTime': + return ({required Object amount, required Object unit}) => '+${amount}${unit}'; + case 'videoControls.minusTime': + return ({required Object amount, required Object unit}) => '-${amount}${unit}'; + case 'videoControls.playsLater': + return ({required Object label}) => '${label} 나중에 재생됨'; + case 'videoControls.playsEarlier': + return ({required Object label}) => '${label} 더 먼저 재생됨'; + case 'videoControls.noOffset': + return '오프셋 없음'; + case 'videoControls.letterbox': + return '레터박스 모드'; + case 'videoControls.fillScreen': + return '화면 채우기'; + case 'videoControls.stretch': + return '확장'; + case 'videoControls.lockRotation': + return '회전 잠금'; + case 'videoControls.unlockRotation': + return '회전 잠금 해제'; + case 'videoControls.sleepTimer': + return '수면 타이머'; + case 'videoControls.timerActive': + return '타이머 활성화됨'; + case 'videoControls.playbackWillPauseIn': + return ({required Object duration}) => '재생이 ${duration} 후에 일시 중지 됩니다'; + case 'videoControls.sleepTimerCompleted': + return '수면 타이머 완료됨 - 재생이 일시 중지되었습니다'; + case 'videoControls.playButton': + return '재생'; + case 'videoControls.pauseButton': + return '일시정지'; + case 'videoControls.seekBackwardButton': + return ({required Object seconds}) => '${seconds} 초 뒤로'; + case 'videoControls.seekForwardButton': + return ({required Object seconds}) => '${seconds} 초 앞으로'; + case 'videoControls.previousButton': + return '이전 에피소드'; + case 'videoControls.nextButton': + return '다음 에피소드'; + case 'videoControls.previousChapterButton': + return '이전 챕터'; + case 'videoControls.nextChapterButton': + return '다음 챕터'; + case 'videoControls.muteButton': + return '음소거'; + case 'videoControls.unmuteButton': + return '음소거 해제'; + case 'videoControls.settingsButton': + return '동영상 설정'; + case 'videoControls.audioTrackButton': + return '음원 트랙'; + case 'videoControls.subtitlesButton': + return '자막'; + case 'videoControls.chaptersButton': + return '챕터'; + case 'videoControls.versionsButton': + return '동영상 버전'; + case 'videoControls.aspectRatioButton': + return '화면비율'; + case 'videoControls.fullscreenButton': + return '전체화면'; + case 'videoControls.exitFullscreenButton': + return '전체화면 종료'; + case 'videoControls.alwaysOnTopButton': + return '창 최상위 고정'; + case 'videoControls.rotationLockButton': + return '회전 잠금'; + case 'videoControls.timelineSlider': + return '타임라인'; + case 'videoControls.volumeSlider': + return '볼륨 조절'; + case 'videoControls.backButton': + return '뒤로 가기'; + case 'userStatus.admin': + return '관리자'; + case 'userStatus.restricted': + return '제한됨'; + case 'userStatus.protected': + return '보호됨'; + case 'userStatus.current': + return '현재'; + case 'messages.markedAsWatched': + return '시청 완료로 표시됨'; + case 'messages.markedAsUnwatched': + return '시청 안 함으로 표시됨'; + case 'messages.markedAsWatchedOffline': + return '시청 완료로 표시됨 (연결 시 동기화됨)'; + case 'messages.markedAsUnwatchedOffline': + return '미시청으로 표시됨 (연결 시 동기화됨)'; + case 'messages.removedFromContinueWatching': + return '계속 시청 목록에서 제거됨'; + case 'messages.errorLoading': + return ({required Object error}) => '오류: ${error}'; + case 'messages.fileInfoNotAvailable': + return '파일 정보가 없습니다'; + case 'messages.errorLoadingFileInfo': + return ({required Object error}) => '파일 정보 로딩 중 오류: ${error}'; + case 'messages.errorLoadingSeries': + return '시리즈 로딩 중 오류'; + case 'messages.errorLoadingSeason': + return '시즌 로딩 중 오류'; + case 'messages.musicNotSupported': + return '음악 재생 미지원'; + case 'messages.logsCleared': + return '로그가 삭제 되었습니다'; + case 'messages.logsCopied': + return '로그가 클립보드에 복사 되었습니다'; + case 'messages.noLogsAvailable': + return '사용 가능한 로그가 없습니다'; + case 'messages.libraryScanning': + return ({required Object title}) => '"${title}"을(를) 스캔 중입니다...'; + case 'messages.libraryScanStarted': + return ({required Object title}) => '"${title}" 미디어 라이브러리 스캔 시작'; + case 'messages.libraryScanFailed': + return ({required Object error}) => '미디어 라이브러리 스캔 실패: ${error}'; + case 'messages.metadataRefreshing': + return ({required Object title}) => '"${title}" 메타데이터 새로고침 중...'; + case 'messages.metadataRefreshStarted': + return ({required Object title}) => '"${title}" 메타데이터 새로고침 시작됨'; + case 'messages.metadataRefreshFailed': + return ({required Object error}) => '메타데이터 새로고침 실패: ${error}'; + case 'messages.logoutConfirm': + return '로그아웃 하시겠습니까?'; + case 'messages.noSeasonsFound': + return '시즌을 찾을 수 없음'; + case 'messages.noEpisodesFound': + return '시즌 1에서 에피소드를 찾을 수 없습니다'; + case 'messages.noEpisodesFoundGeneral': + return '에피소드를 찾을 수 없습니다'; + case 'messages.noResultsFound': + return '결과를 찾을 수 없습니다'; + case 'messages.sleepTimerSet': + return ({required Object label}) => '수면 타이머가 ${label}로 설정 되었습니다'; + case 'messages.noItemsAvailable': + return '사용 가능한 항목이 없습니다'; + case 'messages.failedToCreatePlayQueue': + return '재생 대기열 생성 실패'; + case 'messages.failedToCreatePlayQueueNoItems': + return '재생 대기열 생성 실패 - 항목 없음'; + case 'messages.failedPlayback': + return ({required Object action, required Object error}) => '${action}을(를) 수행할 수 없습니다: ${error}'; + case 'subtitlingStyling.stylingOptions': + return '스타일 옵션'; + case 'subtitlingStyling.fontSize': + return '글자 크기'; + case 'subtitlingStyling.textColor': + return '텍스트 색상'; + case 'subtitlingStyling.borderSize': + return '테두리 크기'; + case 'subtitlingStyling.borderColor': + return '테두리 색상'; + case 'subtitlingStyling.backgroundOpacity': + return '배경 불투명도'; + case 'subtitlingStyling.backgroundColor': + return '배경색'; + case 'mpvConfig.title': + return 'MPV 설정'; + case 'mpvConfig.description': + return '고급 비디오 플레이어 설정'; + case 'mpvConfig.properties': + return '속성'; + case 'mpvConfig.presets': + return '사전 설정'; + case 'mpvConfig.noProperties': + return '설정된 속성이 없습니다'; + case 'mpvConfig.noPresets': + return '저장된 사전 설정이 없습니다'; + case 'mpvConfig.addProperty': + return '속성 추가'; + case 'mpvConfig.editProperty': + return '속성 편집'; + case 'mpvConfig.deleteProperty': + return '속성 삭제'; + case 'mpvConfig.propertyKey': + return '속성 키'; + case 'mpvConfig.propertyKeyHint': + return '예: hwdec, demuxer-max-bytes'; + case 'mpvConfig.propertyValue': + return '속성값'; + case 'mpvConfig.propertyValueHint': + return '예: auto, 256000000'; + case 'mpvConfig.saveAsPreset': + return '프리셋으로 저장...'; + case 'mpvConfig.presetName': + return '프리셋 이름'; + case 'mpvConfig.presetNameHint': + return '이 프리셋의 이름을 입력하세요'; + case 'mpvConfig.loadPreset': + return '로드'; + case 'mpvConfig.deletePreset': + return '삭제'; + case 'mpvConfig.presetSaved': + return '프리셋이 저장 되었습니다'; + case 'mpvConfig.presetLoaded': + return '프리셋이 로드 되었습니다'; + case 'mpvConfig.presetDeleted': + return '프리셋이 삭제 되었습니다'; + case 'mpvConfig.confirmDeletePreset': + return '이 프리셋을 삭제 하시겠습니까?'; + case 'mpvConfig.confirmDeleteProperty': + return '이 속성을 삭제 하시겠습니까?'; + case 'mpvConfig.entriesCount': + return ({required Object count}) => '${count} 항목'; + case 'dialog.confirmAction': + return '확인'; + case 'dialog.cancel': + return '취소'; + case 'dialog.playNow': + return '지금 재생'; + case 'discover.title': + return '발견'; + case 'discover.switchProfile': + return '사용자 전환'; + case 'discover.switchServer': + return '서버 전환'; + case 'discover.logout': + return '로그아웃'; + case 'discover.noContentAvailable': + return '사용 가능한 콘텐츠가 없습니다'; + case 'discover.addMediaToLibraries': + return '미디어 라이브러리에 미디어를 추가해 주세요'; + case 'discover.continueWatching': + return '계속 시청'; + case 'discover.play': + return '재생'; + case 'discover.playEpisode': + return ({required Object season, required Object episode}) => 'S${season}E${episode}'; + case 'discover.pause': + return '일시정지'; + case 'discover.overview': + return '개요'; + case 'discover.cast': + return '출연진'; + case 'discover.seasons': + return '시즌 수'; + case 'discover.studio': + return '제작사'; + case 'discover.rating': + return '연령 등급'; + case 'discover.watched': + return '시청 완료'; + case 'discover.episodeCount': + return ({required Object count}) => '${count} 편'; + case 'discover.watchedProgress': + return ({required Object watched, required Object total}) => '${watched}/${total} 편 시청 완료'; + case 'discover.movie': + return '영화'; + case 'discover.tvShow': + return 'TV 시리즈'; + case 'discover.minutesLeft': + return ({required Object minutes}) => '${minutes}분 남음'; + case 'errors.searchFailed': + return ({required Object error}) => '검색 실패: ${error}'; + case 'errors.connectionTimeout': + return ({required Object context}) => '${context} 로드 중 연결 시간 초과'; + case 'errors.connectionFailed': + return 'Plex 서버에 연결할 수 없음'; + case 'errors.failedToLoad': + return ({required Object context, required Object error}) => '${context} 로드 실패: ${error}'; + case 'errors.noClientAvailable': + return '사용 가능한 클라이언트가 없습니다'; + case 'errors.authenticationFailed': + return ({required Object error}) => '인증 실패: ${error}'; + case 'errors.couldNotLaunchUrl': + return '인증 URL을 열 수 없습니다'; + case 'errors.pleaseEnterToken': + return '토큰을 입력해 주세요'; + case 'errors.invalidToken': + return '토큰이 유효하지 않습니다'; + case 'errors.failedToVerifyToken': + return ({required Object error}) => '토큰을 확인할 수 없습니다: ${error}'; + case 'errors.failedToSwitchProfile': + return ({required Object displayName}) => '${displayName}으로 전환할 수 없습니다'; + case 'libraries.title': + return '미디어 라이브러리'; + case 'libraries.scanLibraryFiles': + return '미디어 라이브러리 파일 스캔'; + case 'libraries.scanLibrary': + return '미디어 라이브러리 스캔'; + case 'libraries.analyze': + return '분석'; + case 'libraries.analyzeLibrary': + return '미디어 라이브러리 분석'; + case 'libraries.refreshMetadata': + return '메타데이터 새로 고침'; + case 'libraries.emptyTrash': + return '휴지통 비우기'; + case 'libraries.emptyingTrash': + return ({required Object title}) => '「${title}」의 휴지통을 비우고 있습니다...'; + case 'libraries.trashEmptied': + return ({required Object title}) => '「${title}」의 휴지통을 비웠습니다'; + case 'libraries.failedToEmptyTrash': + return ({required Object error}) => '휴지통 비우기 실패: ${error}'; + case 'libraries.analyzing': + return ({required Object title}) => '"${title}" 분석 중...'; + case 'libraries.analysisStarted': + return ({required Object title}) => '"${title}" 분석 시작됨'; + case 'libraries.failedToAnalyze': + return ({required Object error}) => '미디어 라이브러리 분석 실패: ${error}'; + case 'libraries.noLibrariesFound': + return '미디어 라이브러리 없음'; + case 'libraries.thisLibraryIsEmpty': + return '이 미디어 라이브러리는 비어 있습니다'; + case 'libraries.all': + return '전체'; + case 'libraries.clearAll': + return '모두 삭제'; + case 'libraries.scanLibraryConfirm': + return ({required Object title}) => '「${title}」를 스캔 하시겠습니까?'; + case 'libraries.analyzeLibraryConfirm': + return ({required Object title}) => '「${title}」를 분석 하시겠습니까?'; + case 'libraries.refreshMetadataConfirm': + return ({required Object title}) => '「${title}」의 메타데이터를 새로고침 하시겠습니까?'; + case 'libraries.emptyTrashConfirm': + return ({required Object title}) => '${title}의 휴지통을 비우시겠습니까?'; + case 'libraries.manageLibraries': + return '미디어 라이브러리 관리'; + case 'libraries.sort': + return '정렬'; + case 'libraries.sortBy': + return '정렬 기준'; + case 'libraries.filters': + return '필터'; + case 'libraries.confirmActionMessage': + return '이 작업을 실행 하시겠습니까?'; + case 'libraries.showLibrary': + return '미디어 라이브러리 표시'; + case 'libraries.hideLibrary': + return '미디어 라이브러리 숨기기'; + case 'libraries.libraryOptions': + return '미디어 라이브러리 옵션'; + case 'libraries.content': + return '미디어 라이브러리 콘텐츠'; + case 'libraries.selectLibrary': + return '미디어 라이브러리 선택'; + case 'libraries.filtersWithCount': + return ({required Object count}) => '필터 (${count})'; + case 'libraries.noRecommendations': + return '추천 없음'; + case 'libraries.noCollections': + return '이 미디어 라이브러리에는 컬렉션이 없습니다'; + case 'libraries.noFoldersFound': + return '폴더를 찾을 수 없습니다'; + case 'libraries.folders': + return '폴더'; + case 'libraries.tabs.recommended': + return '추천'; + case 'libraries.tabs.browse': + return '찾아보기'; + case 'libraries.tabs.collections': + return '컬렉션'; + case 'libraries.tabs.playlists': + return '재생 목록'; + case 'libraries.groupings.all': + return '전체'; + case 'libraries.groupings.movies': + return '영화'; + case 'libraries.groupings.shows': + return 'TV 프로그램'; + case 'libraries.groupings.seasons': + return '시즌'; + case 'libraries.groupings.episodes': + return '화'; + case 'libraries.groupings.folders': + return '폴더'; + case 'about.title': + return '소개'; + case 'about.openSourceLicenses': + return '오픈소스 라이선스'; + case 'about.versionLabel': + return ({required Object version}) => '버전 ${version}'; + case 'about.appDescription': + return '아름다운 Flutter Plex 클라이언트'; + case 'about.viewLicensesDescription': + return '타사 라이브러리 라이선스 보기'; + case 'serverSelection.allServerConnectionsFailed': + return '어떤 서버에도 연결할 수 없습니다. 네트워크를 확인하고 다시 시도하세요.'; + case 'serverSelection.noServersFound': + return '서버를 찾을 수 없습니다.'; + case 'serverSelection.noServersFoundForAccount': + return ({required Object username, required Object email}) => '${username} (${email})의 서버를 찾을 수 없습니다.'; + case 'serverSelection.failedToLoadServers': + return ({required Object error}) => '서버를 로드할 수 없습니다: ${error}'; + case 'hubDetail.title': + return '제목'; + case 'hubDetail.releaseYear': + return '출시 연도'; + case 'hubDetail.dateAdded': + return '추가 날짜'; + case 'hubDetail.rating': + return '평점'; + case 'hubDetail.noItemsFound': + return '항목이 없습니다'; + case 'logs.clearLogs': + return '로그 지우기'; + case 'logs.copyLogs': + return '로그 복사'; + case 'logs.error': + return '오류:'; + case 'logs.stackTrace': + return '스택 추적 (Stack Trace):'; + case 'licenses.relatedPackages': + return '관련 소프트웨어 패키지'; + case 'licenses.license': + return '라이선스'; + case 'licenses.licenseNumber': + return ({required Object number}) => '라이선스 ${number}'; + case 'licenses.licensesCount': + return ({required Object count}) => '${count} 개의 라이선스'; + case 'navigation.home': + return '홈'; + case 'navigation.search': + return '검색'; + case 'navigation.libraries': + return '미디어 라이브러리'; + case 'navigation.settings': + return '설정'; + case 'navigation.downloads': + return '다운로드'; + case 'collections.title': + return '컬렉션'; + case 'collections.collection': + return '컬렉션'; + case 'collections.empty': + return '컬렉션이 비어 있습니다'; + case 'collections.unknownLibrarySection': + return '삭제할 수 없습니다: 알 수 없는 미디어 라이브러리 섹션입니다'; + case 'collections.deleteCollection': + return '컬렉션 삭제'; + case 'collections.deleteConfirm': + return ({required Object title}) => '"${title}"을(를) 삭제 하시겠습니까? 이 작업은 되돌릴 수 없습니다.'; + case 'collections.deleted': + return '컬렉션 삭제됨'; + case 'collections.deleteFailed': + return '컬렉션 삭제 실패'; + case 'collections.deleteFailedWithError': + return ({required Object error}) => '컬렉션 삭제 실패: ${error}'; + case 'collections.failedToLoadItems': + return ({required Object error}) => '컬렉션 항목 로드 실패: ${error}'; + case 'collections.selectCollection': + return '컬렉션 선택'; + case 'collections.createNewCollection': + return '새 컬렉션 생성'; + case 'collections.collectionName': + return '컬렉션 이름'; + case 'collections.enterCollectionName': + return '컬렉션 이름 입력'; + case 'collections.addedToCollection': + return '컬렉션에 추가됨'; + case 'collections.errorAddingToCollection': + return '컬렉션에 추가 실패'; + case 'collections.created': + return '컬렉션 생성됨'; + case 'collections.removeFromCollection': + return '컬렉션에서 제거'; + case 'collections.removeFromCollectionConfirm': + return ({required Object title}) => '${title}을/를 이 컬렉션에서 제거 하시겠습니까?'; + case 'collections.removedFromCollection': + return '컬렉션에서 제거됨'; + case 'collections.removeFromCollectionFailed': + return '컬렉션에서 제거 실패'; + case 'collections.removeFromCollectionError': + return ({required Object error}) => '컬렉션에서 제거 중 오류 발생: ${error}'; + case 'playlists.title': + return '플레이리스트'; + case 'playlists.playlist': + return '재생 목록'; + case 'playlists.noPlaylists': + return '재생 목록을 찾을 수 없습니다'; + case 'playlists.create': + return '재생 목록 생성'; + case 'playlists.playlistName': + return '재생 목록 이름'; + case 'playlists.enterPlaylistName': + return '재생 목록 이름 입력'; + case 'playlists.delete': + return '재생 목록 삭제'; + case 'playlists.removeItem': + return '재생 목록에서 항목 제거'; + case 'playlists.smartPlaylist': + return '스마트 재생 목록'; + case 'playlists.itemCount': + return ({required Object count}) => '${count}개 항목'; + case 'playlists.oneItem': + return '1개 항목'; + case 'playlists.emptyPlaylist': + return '이 재생 목록은 비어 있습니다'; + case 'playlists.deleteConfirm': + return '재생 목록을 삭제 하시겠습니까?'; + case 'playlists.deleteMessage': + return ({required Object name}) => '"${name}"을(를) 삭제 하시겠습니까?'; + case 'playlists.created': + return '재생 목록이 생성 되었습니다'; + case 'playlists.deleted': + return '재생 목록이 삭제 되었습니다'; + case 'playlists.itemAdded': + return '재생 목록에 추가 되었습니다'; + case 'playlists.itemRemoved': + return '재생 목록에서 제거됨'; + case 'playlists.selectPlaylist': + return '재생 목록 선택'; + case 'playlists.createNewPlaylist': + return '새 재생 목록 생성'; + case 'playlists.errorCreating': + return '재생 목록 생성 실패'; + case 'playlists.errorDeleting': + return '재생 목록 삭제 실패'; + case 'playlists.errorLoading': + return '재생 목록 로드 실패'; + case 'playlists.errorAdding': + return '재생 목록에 추가 실패'; + case 'playlists.errorReordering': + return '재생 목록 항목 재정렬 실패'; + case 'playlists.errorRemoving': + return '재생 목록에서 제거 실패'; + case 'watchTogether.title': + return '함께 보기'; + case 'watchTogether.description': + return '친구 및 가족과 콘텐츠를 동시에 시청하세요'; + case 'watchTogether.createSession': + return '세션 생성'; + case 'watchTogether.creating': + return '생성 중...'; + case 'watchTogether.joinSession': + return '세션 참여'; + case 'watchTogether.joining': + return '참가 중...'; + case 'watchTogether.controlMode': + return '제어 모드'; + case 'watchTogether.controlModeQuestion': + return '누가 재생을 제어할 수 있나요?'; + case 'watchTogether.hostOnly': + return '호스트만'; + case 'watchTogether.anyone': + return '누구나'; + case 'watchTogether.hostingSession': + return '세션 호스팅'; + case 'watchTogether.inSession': + return '세션 중'; + case 'watchTogether.sessionCode': + return '세션 코드'; + case 'watchTogether.hostControlsPlayback': + return '호스트 재생 제어'; + case 'watchTogether.anyoneCanControl': + return '누구나 재생 제어 가능'; + case 'watchTogether.hostControls': + return '호스트 제어'; + case 'watchTogether.anyoneControls': + return '누구나 제어'; + case 'watchTogether.participants': + return '참가자'; + case 'watchTogether.host': + return '호스트'; + case 'watchTogether.hostBadge': + return '호스트'; + case 'watchTogether.youAreHost': + return '당신은 호스트 입니다'; + case 'watchTogether.watchingWithOthers': + return '다른 사람과 함께 시청 중'; + case 'watchTogether.endSession': + return '세션 종료'; + case 'watchTogether.leaveSession': + return '세션 탈퇴'; + case 'watchTogether.endSessionQuestion': + return '세션을 종료 하시겠습니까?'; + case 'watchTogether.leaveSessionQuestion': + return '세션을 탈퇴 하시겠습니까?'; + case 'watchTogether.endSessionConfirm': + return '이 작업은 모든 참가자의 세션을 종료합니다.'; + case 'watchTogether.leaveSessionConfirm': + return '당신은 세션에서 제거됩니다.'; + case 'watchTogether.endSessionConfirmOverlay': + return '이것은 모든 참가자의 시청 세션을 종료합니다.'; + case 'watchTogether.leaveSessionConfirmOverlay': + return '시청 세션 연결이 끊어집니다.'; + case 'watchTogether.end': + return '종료'; + case 'watchTogether.leave': + return '이탈'; + case 'watchTogether.syncing': + return '동기화 중...'; + case 'watchTogether.participant': + return '참여자'; + case 'watchTogether.joinWatchSession': + return '시청 세션에 참여'; + case 'watchTogether.enterCodeHint': + return '8자리 코드 입력'; + case 'watchTogether.pasteFromClipboard': + return '클립보드에서 붙여넣기'; + case 'watchTogether.pleaseEnterCode': + return '세션 코드를 입력하세요'; + case 'watchTogether.codeMustBe8Chars': + return '세션 코드는 반드시 8자리여야 합니다'; + case 'watchTogether.joinInstructions': + return '호스트가 공유한 세션 코드를 입력하여 시청 세션에 참여하세요.'; + case 'watchTogether.failedToCreate': + return '세션 생성 실패'; + case 'watchTogether.failedToJoin': + return '세션 참여 실패'; + case 'downloads.title': + return '다운로드'; + case 'downloads.manage': + return '관리'; + case 'downloads.tvShows': + return 'TV 프로그램'; + case 'downloads.movies': + return '영화'; + case 'downloads.noDownloads': + return '다운로드 없음'; + case 'downloads.noDownloadsDescription': + return '다운로드한 콘텐츠는 오프라인 시청을 위해 여기에 표시됩니다'; + case 'downloads.downloadNow': + return '다운로드'; + case 'downloads.deleteDownload': + return '다운로드 삭제'; + case 'downloads.retryDownload': + return '다운로드 재시도'; + case 'downloads.downloadQueued': + return '다운로드 대기 중'; + case 'downloads.episodesQueued': + return ({required Object count}) => '${count} 에피소드가 다운로드 대기열에 추가 되었습니다'; + case 'downloads.downloadDeleted': + return '다운로드 삭제됨'; + case 'downloads.deleteConfirm': + return ({required Object title}) => '"${title}"를 삭제 하시겠습니까? 다운로드한 파일이 기기에서 삭제됩니다.'; + case 'downloads.deletingWithProgress': + return ({required Object title, required Object current, required Object total}) => + '${title} 삭제 중... (${current}/${total})'; + default: + return null; + } + } +} + extension on _StringsNl { dynamic _flatMapFunction(String path) { switch (path) { diff --git a/lib/i18n/strings_ko.i18n.json b/lib/i18n/strings_ko.i18n.json new file mode 100644 index 00000000..6ecb9dd0 --- /dev/null +++ b/lib/i18n/strings_ko.i18n.json @@ -0,0 +1,571 @@ +{ + "app": { + "title": "Plezy", + "loading": "로딩 중..." + }, + "auth": { + "signInWithPlex": "Plex 계정으로 로그인", + "showQRCode": "QR 코드", + "cancel": "취소", + "authenticate": "인증", + "retry": "재시도", + "debugEnterToken": "디버깅을 위해 Plex 토큰을 입력하세요.", + "plexTokenLabel": "Plex 인증 토큰", + "plexTokenHint": "Plex.tv 토큰을 입력하세요", + "authenticationTimeout": "인증 시간이 초과되었습니다. 다시 시도해 주세요.", + "scanQRCodeInstruction": "Plex 계정에 로그인된 기기에서 이 QR 코드를 스캔하여 본인 인증을 해주세요.", + "waitingForAuth": "인증 대기 중... 브라우저에서 로그인을 완료해 주세요." + }, + "common": { + "cancel": "취소", + "save": "저장", + "close": "닫기", + "clear": "지우기", + "reset": "초기화", + "later": "나중에", + "submit": "보내기", + "confirm": "확인", + "retry": "재시도", + "logout": "로그아웃", + "unknown": "알 수 없는", + "refresh": "새로고침", + "yes": "예", + "no": "아니오", + "delete": "삭제", + "shuffle": "무작위 재생", + "addTo": "추가하기..." + }, + "screens": { + "licenses": "라이선스", + "selectServer": "서버 선택", + "switchProfile": "프로필 전환", + "subtitleStyling": "자막 스타일 설정", + "mpvConfig": "MPV 설정", + "search": "검색", + "logs": "로그" + }, + "update": { + "available": "사용 가능한 업데이트", + "versionAvailable": "버전 ${version} 출시됨", + "currentVersion": "현재 버전: ${version}", + "skipVersion": "이 버전 건너뛰기", + "viewRelease": "릴리스 정보 보기", + "latestVersion": "최신 버전을 사용 중입니다", + "checkFailed": "업데이트 확인 실패" + }, + "settings": { + "title": "설정", + "language": "언어", + "theme": "테마", + "appearance": "외관", + "videoPlayback": "비디오 재생", + "advanced": "고급", + "useSeasonPostersDescription": "에피소드에 시리즈 포스터 대신 시즌 포스터 표시", + "showHeroSectionDescription": "홈 화면에 주요 콘텐츠 캐러셀(슬라이드) 표시", + "secondsLabel": "초", + "minutesLabel": "분", + "secondsShort": "초", + "minutesShort": "분", + "durationHint": "기간 입력 (${min}-${max})", + "systemTheme": "시스템 설정", + "systemThemeDescription": "시스템 설정에 따름", + "lightTheme": "라이트 모드", + "darkTheme": "다크 모드", + "libraryDensity": "라이브러리 표시 밀도", + "compact": "좁게", + "compactDescription": "카드를 작게 표시하여 더 많은 항목을 보여줍니다.", + "normal": "보통", + "normalDescription": "기본 크기", + "comfortable": "넓게", + "comfortableDescription": "카드를 크게 표시하여 더 적은 항목을 보여줍니다.", + "viewMode": "보기 모드", + "gridView": "그리드 보기", + "gridViewDescription": "항목을 그리드 레이아웃으로 표시합니다", + "listView": "목록 보기", + "listViewDescription": "항목을 목록 레이아웃으로 표시합니다", + "useSeasonPosters": "시즌 포스터 사용", + "showHeroSection": "주요 추천 영역 표시", + "hardwareDecoding": "하드웨어 디코딩", + "hardwareDecodingDescription": "가능한 경우 하드웨어 가속을 사용합니다", + "bufferSize": "버퍼 크기", + "bufferSizeMB": "${size}MB", + "subtitleStyling": "자막 스타일", + "subtitleStylingDescription": "자막의 외형을 사용자 설정", + "smallSkipDuration": "짧은 건너뛰기 시간", + "largeSkipDuration": "긴 건너뛰기 시간", + "secondsUnit": "${seconds}초", + "defaultSleepTimer": "기본 취침 타이머", + "minutesUnit": "${minutes}분", + "rememberTrackSelections": "에피소드/영화별 트랙 선택 기억", + "rememberTrackSelectionsDescription": "재생 중 트랙을 변경할 때 오디오 및 자막 언어 설정을 자동으로 저장합니다", + "videoPlayerControls": "비디오 플레이어 컨트롤", + "keyboardShortcuts": "키보드 단축키", + "keyboardShortcutsDescription": "사용자 정의 키보드 단축키", + "videoPlayerNavigation": "비디오 플레이어 탐색", + "videoPlayerNavigationDescription": "방향 키를 사용하여 비디오 플레이어 컨트롤 탐색", + "debugLogging": "디버그 로깅", + "debugLoggingDescription": "문제 해결을 위해 상세 로깅 활성화", + "viewLogs": "로그 보기", + "viewLogsDescription": "애플리케이션 로그 확인", + "clearCache": "캐시 삭제", + "clearCacheDescription": "모든 캐시된 이미지와 데이터를 지웁니다. 캐시를 지우면 애플리케이션 콘텐츠 로딩 속도가 느려질 수 있습니다.", + "clearCacheSuccess": "캐시 삭제 성공", + "resetSettings": "설정 재설정", + "resetSettingsDescription": "모든 설정을 기본값으로 재설정합니다. 이 작업은 되돌릴 수 없습니다.", + "resetSettingsSuccess": "설정 재설정 성공", + "shortcutsReset": "단축키가 기본값으로 재설정되었습니다", + "about": "정보", + "aboutDescription": "응용 프로그램 정보 및 라이선스", + "updates": "업데이트", + "updateAvailable": "사용 가능한 업데이트 있음", + "checkForUpdates": "업데이트 확인", + "validationErrorEnterNumber": "유효한 숫자를 입력하세요", + "validationErrorDuration": "기간은 ${min}과 ${max} ${unit} 사이여야 합니다", + "shortcutAlreadyAssigned": "단축키가 이미 ${action}에 할당 되었습니다", + "shortcutUpdated": "단축키가 ${action}에 대해 업데이트 되었습니다", + "autoSkip": "자동 건너뛰기", + "autoSkipIntro": "자동으로 오프닝 건너뛰기", + "autoSkipIntroDescription": "몇 초 후 오프닝을 자동으로 건너뛰기", + "autoSkipCredits": "자동으로 엔딩 건너뛰기", + "autoSkipCreditsDescription": "엔딩 크레딧 자동 건너뛰기 후 다음 에피소드 재생", + "autoSkipDelay": "자동 건너뛰기 지연", + "autoSkipDelayDescription": "자동 건너뛰기 전 ${seconds} 초 대기", + "downloads": "다운로드", + "downloadLocationDescription": "다운로드 콘텐츠 저장 위치 선택", + "downloadLocationDefault": "기본값 (앱 저장소)", + "downloadLocationCustom": "사용자 지정 위치", + "selectFolder": "폴더 선택", + "resetToDefault": "기본값으로 재설정", + "currentPath": "현재: ${path}", + "downloadLocationChanged": "다운로드 위치가 변경 되었습니다", + "downloadLocationReset": "다운로드 위치가 기본값으로 재설정 되었습니다", + "downloadLocationInvalid": "선택한 폴더에 쓰기 권한이 없습니다", + "downloadLocationSelectError": "폴더 선택 실패", + "downloadOnWifiOnly": "WiFi 연결 시에만 다운로드", + "downloadOnWifiOnlyDescription": "셀룰러 데이터 사용 시 다운로드 불가", + "cellularDownloadBlocked": "셀룰러 데이터에서 다운로드가 차단 되었습니다. WiFi에 연결하거나 설정을 변경하세요." + }, + "search": { + "hint": "영화, 시리즈, 음악 등을 검색하세요...", + "tryDifferentTerm": "다른 검색어를 시도해 보세요", + "searchYourMedia": "미디어 검색", + "enterTitleActorOrKeyword": "제목, 배우 또는 키워드를 입력하세요" + }, + "hotkeys": { + "setShortcutFor": "${actionName}에 대한 단축키 설정", + "clearShortcut": "단축키 삭제" + }, + "pinEntry": { + "enterPin": "PIN 입력", + "showPin": "PIN 표시", + "hidePin": "PIN 숨기기" + }, + "fileInfo": { + "title": "파일 정보", + "video": "비디오", + "audio": "오디오", + "file": "파일", + "advanced": "고급", + "codec": "코덱", + "resolution": "해상도", + "bitrate": "비트레이트", + "frameRate": "프레임 속도", + "aspectRatio": "종횡비", + "profile": "프로파일", + "bitDepth": "비트 심도", + "colorSpace": "색 공간", + "colorRange": "색 범위", + "colorPrimaries": "색상 원색", + "chromaSubsampling": "채도 서브샘플링", + "channels": "채널", + "path": "경로", + "size": "크기", + "container": "컨테이너", + "duration": "재생 시간", + "optimizedForStreaming": "스트리밍 최적화", + "has64bitOffsets": "64비트 오프셋" + }, + "mediaMenu": { + "markAsWatched": "시청 완료로 표시", + "markAsUnwatched": "시청 안 함으로 표시", + "removeFromContinueWatching": "계속 보기에서 제거", + "goToSeries": "시리즈로 이동", + "goToSeason": "시즌으로 이동", + "shufflePlay": "무작위 재생", + "fileInfo": "파일 정보" + }, + "accessibility": { + "mediaCardMovie": "${title}, 영화", + "mediaCardShow": "${title}, TV 프로그램", + "mediaCardEpisode": "${title}, ${episodeInfo}", + "mediaCardSeason": "${title}, ${seasonInfo}", + "mediaCardWatched": "시청 완료", + "mediaCardPartiallyWatched": "${percent} 퍼센트 시청 완료", + "mediaCardUnwatched": "미시청", + "tapToPlay": "터치 하여 재생" + }, + "tooltips": { + "shufflePlay": "무작위 재생", + "markAsWatched": "시청 완료로 표시", + "markAsUnwatched": "시청 안 함으로 표시" + }, + "videoControls": { + "audioLabel": "오디오", + "subtitlesLabel": "자막", + "resetToZero": "0ms로 재설정", + "addTime": "+${amount}${unit}", + "minusTime": "-${amount}${unit}", + "playsLater": "${label} 나중에 재생됨", + "playsEarlier": "${label} 더 먼저 재생됨", + "noOffset": "오프셋 없음", + "letterbox": "레터박스 모드", + "fillScreen": "화면 채우기", + "stretch": "확장", + "lockRotation": "회전 잠금", + "unlockRotation": "회전 잠금 해제", + "sleepTimer": "수면 타이머", + "timerActive": "타이머 활성화됨", + "playbackWillPauseIn": "재생이 ${duration} 후에 일시 중지 됩니다", + "sleepTimerCompleted": "수면 타이머 완료됨 - 재생이 일시 중지되었습니다", + "playButton": "재생", + "pauseButton": "일시정지", + "seekBackwardButton": "${seconds} 초 뒤로", + "seekForwardButton": "${seconds} 초 앞으로", + "previousButton": "이전 에피소드", + "nextButton": "다음 에피소드", + "previousChapterButton": "이전 챕터", + "nextChapterButton": "다음 챕터", + "muteButton": "음소거", + "unmuteButton": "음소거 해제", + "settingsButton": "동영상 설정", + "audioTrackButton": "음원 트랙", + "subtitlesButton": "자막", + "chaptersButton": "챕터", + "versionsButton": "동영상 버전", + "aspectRatioButton": "화면비율", + "fullscreenButton": "전체화면", + "exitFullscreenButton": "전체화면 종료", + "alwaysOnTopButton": "창 최상위 고정", + "rotationLockButton": "회전 잠금", + "timelineSlider": "타임라인", + "volumeSlider": "볼륨 조절", + "backButton": "뒤로 가기" + }, + "userStatus": { + "admin": "관리자", + "restricted": "제한됨", + "protected": "보호됨", + "current": "현재" + }, + "messages": { + "markedAsWatched": "시청 완료로 표시됨", + "markedAsUnwatched": "시청 안 함으로 표시됨", + "markedAsWatchedOffline": "시청 완료로 표시됨 (연결 시 동기화됨)", + "markedAsUnwatchedOffline": "미시청으로 표시됨 (연결 시 동기화됨)", + "removedFromContinueWatching": "계속 시청 목록에서 제거됨", + "errorLoading": "오류: ${error}", + "fileInfoNotAvailable": "파일 정보가 없습니다", + "errorLoadingFileInfo": "파일 정보 로딩 중 오류: ${error}", + "errorLoadingSeries": "시리즈 로딩 중 오류", + "errorLoadingSeason": "시즌 로딩 중 오류", + "musicNotSupported": "음악 재생 미지원", + "logsCleared": "로그가 삭제 되었습니다", + "logsCopied": "로그가 클립보드에 복사 되었습니다", + "noLogsAvailable": "사용 가능한 로그가 없습니다", + "libraryScanning": "\"${title}\"을(를) 스캔 중입니다...", + "libraryScanStarted": "\"${title}\" 미디어 라이브러리 스캔 시작", + "libraryScanFailed": "미디어 라이브러리 스캔 실패: ${error}", + "metadataRefreshing": "\"${title}\" 메타데이터 새로고침 중...", + "metadataRefreshStarted": "\"${title}\" 메타데이터 새로고침 시작됨", + "metadataRefreshFailed": "메타데이터 새로고침 실패: ${error}", + "logoutConfirm": "로그아웃 하시겠습니까?", + "noSeasonsFound": "시즌을 찾을 수 없음", + "noEpisodesFound": "시즌 1에서 에피소드를 찾을 수 없습니다", + "noEpisodesFoundGeneral": "에피소드를 찾을 수 없습니다", + "noResultsFound": "결과를 찾을 수 없습니다", + "sleepTimerSet": "수면 타이머가 ${label}로 설정 되었습니다", + "noItemsAvailable": "사용 가능한 항목이 없습니다", + "failedToCreatePlayQueue": "재생 대기열 생성 실패", + "failedToCreatePlayQueueNoItems": "재생 대기열 생성 실패 - 항목 없음", + "failedPlayback": "${action}을(를) 수행할 수 없습니다: ${error}" + }, + "subtitlingStyling": { + "stylingOptions": "스타일 옵션", + "fontSize": "글자 크기", + "textColor": "텍스트 색상", + "borderSize": "테두리 크기", + "borderColor": "테두리 색상", + "backgroundOpacity": "배경 불투명도", + "backgroundColor": "배경색" + }, + "mpvConfig": { + "title": "MPV 설정", + "description": "고급 비디오 플레이어 설정", + "properties": "속성", + "presets": "사전 설정", + "noProperties": "설정된 속성이 없습니다", + "noPresets": "저장된 사전 설정이 없습니다", + "addProperty": "속성 추가", + "editProperty": "속성 편집", + "deleteProperty": "속성 삭제", + "propertyKey": "속성 키", + "propertyKeyHint": "예: hwdec, demuxer-max-bytes", + "propertyValue": "속성값", + "propertyValueHint": "예: auto, 256000000", + "saveAsPreset": "프리셋으로 저장...", + "presetName": "프리셋 이름", + "presetNameHint": "이 프리셋의 이름을 입력하세요", + "loadPreset": "로드", + "deletePreset": "삭제", + "presetSaved": "프리셋이 저장 되었습니다", + "presetLoaded": "프리셋이 로드 되었습니다", + "presetDeleted": "프리셋이 삭제 되었습니다", + "confirmDeletePreset": "이 프리셋을 삭제 하시겠습니까?", + "confirmDeleteProperty": "이 속성을 삭제 하시겠습니까?", + "entriesCount": "${count} 항목" + }, + "dialog": { + "confirmAction": "확인", + "cancel": "취소", + "playNow": "지금 재생" + }, + "discover": { + "title": "발견", + "switchProfile": "사용자 전환", + "switchServer": "서버 전환", + "logout": "로그아웃", + "noContentAvailable": "사용 가능한 콘텐츠가 없습니다", + "addMediaToLibraries": "미디어 라이브러리에 미디어를 추가해 주세요", + "continueWatching": "계속 시청", + "play": "재생", + "playEpisode": "S${season}E${episode}", + "pause": "일시정지", + "overview": "개요", + "cast": "출연진", + "seasons": "시즌 수", + "studio": "제작사", + "rating": "연령 등급", + "watched": "시청 완료", + "episodeCount": "${count} 편", + "watchedProgress": "${watched}/${total} 편 시청 완료", + "movie": "영화", + "tvShow": "TV 시리즈", + "minutesLeft": "${minutes}분 남음" + }, + "errors": { + "searchFailed": "검색 실패: ${error}", + "connectionTimeout": "${context} 로드 중 연결 시간 초과", + "connectionFailed": "Plex 서버에 연결할 수 없음", + "failedToLoad": "${context} 로드 실패: ${error}", + "noClientAvailable": "사용 가능한 클라이언트가 없습니다", + "authenticationFailed": "인증 실패: ${error}", + "couldNotLaunchUrl": "인증 URL을 열 수 없습니다", + "pleaseEnterToken": "토큰을 입력해 주세요", + "invalidToken": "토큰이 유효하지 않습니다", + "failedToVerifyToken": "토큰을 확인할 수 없습니다: ${error}", + "failedToSwitchProfile": "${displayName}으로 전환할 수 없습니다" + }, + "libraries": { + "title": "미디어 라이브러리", + "scanLibraryFiles": "미디어 라이브러리 파일 스캔", + "scanLibrary": "미디어 라이브러리 스캔", + "analyze": "분석", + "analyzeLibrary": "미디어 라이브러리 분석", + "refreshMetadata": "메타데이터 새로 고침", + "emptyTrash": "휴지통 비우기", + "emptyingTrash": "「${title}」의 휴지통을 비우고 있습니다...", + "trashEmptied": "「${title}」의 휴지통을 비웠습니다", + "failedToEmptyTrash": "휴지통 비우기 실패: ${error}", + "analyzing": "\"${title}\" 분석 중...", + "analysisStarted": "\"${title}\" 분석 시작됨", + "failedToAnalyze": "미디어 라이브러리 분석 실패: ${error}", + "noLibrariesFound": "미디어 라이브러리 없음", + "thisLibraryIsEmpty": "이 미디어 라이브러리는 비어 있습니다", + "all": "전체", + "clearAll": "모두 삭제", + "scanLibraryConfirm": "「${title}」를 스캔 하시겠습니까?", + "analyzeLibraryConfirm": "「${title}」를 분석 하시겠습니까?", + "refreshMetadataConfirm": "「${title}」의 메타데이터를 새로고침 하시겠습니까?", + "emptyTrashConfirm": "${title}의 휴지통을 비우시겠습니까?", + "manageLibraries": "미디어 라이브러리 관리", + "sort": "정렬", + "sortBy": "정렬 기준", + "filters": "필터", + "confirmActionMessage": "이 작업을 실행 하시겠습니까?", + "showLibrary": "미디어 라이브러리 표시", + "hideLibrary": "미디어 라이브러리 숨기기", + "libraryOptions": "미디어 라이브러리 옵션", + "content": "미디어 라이브러리 콘텐츠", + "selectLibrary": "미디어 라이브러리 선택", + "filtersWithCount": "필터 (${count})", + "noRecommendations": "추천 없음", + "noCollections": "이 미디어 라이브러리에는 컬렉션이 없습니다", + "noFoldersFound": "폴더를 찾을 수 없습니다", + "folders": "폴더", + "tabs": { + "recommended": "추천", + "browse": "찾아보기", + "collections": "컬렉션", + "playlists": "재생 목록" + }, + "groupings": { + "all": "전체", + "movies": "영화", + "shows": "TV 프로그램", + "seasons": "시즌", + "episodes": "화", + "folders": "폴더" + } + }, + "about": { + "title": "소개", + "openSourceLicenses": "오픈소스 라이선스", + "versionLabel": "버전 ${version}", + "appDescription": "아름다운 Flutter Plex 클라이언트", + "viewLicensesDescription": "타사 라이브러리 라이선스 보기" + }, + "serverSelection": { + "allServerConnectionsFailed": "어떤 서버에도 연결할 수 없습니다. 네트워크를 확인하고 다시 시도하세요.", + "noServersFound": "서버를 찾을 수 없습니다.", + "noServersFoundForAccount": "${username} (${email})의 서버를 찾을 수 없습니다.", + "failedToLoadServers": "서버를 로드할 수 없습니다: ${error}" + }, + "hubDetail": { + "title": "제목", + "releaseYear": "출시 연도", + "dateAdded": "추가 날짜", + "rating": "평점", + "noItemsFound": "항목이 없습니다" + }, + "logs": { + "clearLogs": "로그 지우기", + "copyLogs": "로그 복사", + "error": "오류:", + "stackTrace": "스택 추적 (Stack Trace):" + }, + "licenses": { + "relatedPackages": "관련 소프트웨어 패키지", + "license": "라이선스", + "licenseNumber": "라이선스 ${number}", + "licensesCount": "${count} 개의 라이선스" + }, + "navigation": { + "home": "홈", + "search": "검색", + "libraries": "미디어 라이브러리", + "settings": "설정", + "downloads": "다운로드" + }, + "collections": { + "title": "컬렉션", + "collection": "컬렉션", + "empty": "컬렉션이 비어 있습니다", + "unknownLibrarySection": "삭제할 수 없습니다: 알 수 없는 미디어 라이브러리 섹션입니다", + "deleteCollection": "컬렉션 삭제", + "deleteConfirm": "\"${title}\"을(를) 삭제 하시겠습니까? 이 작업은 되돌릴 수 없습니다.", + "deleted": "컬렉션 삭제됨", + "deleteFailed": "컬렉션 삭제 실패", + "deleteFailedWithError": "컬렉션 삭제 실패: ${error}", + "failedToLoadItems": "컬렉션 항목 로드 실패: ${error}", + "selectCollection": "컬렉션 선택", + "createNewCollection": "새 컬렉션 생성", + "collectionName": "컬렉션 이름", + "enterCollectionName": "컬렉션 이름 입력", + "addedToCollection": "컬렉션에 추가됨", + "errorAddingToCollection": "컬렉션에 추가 실패", + "created": "컬렉션 생성됨", + "removeFromCollection": "컬렉션에서 제거", + "removeFromCollectionConfirm": "${title}을/를 이 컬렉션에서 제거 하시겠습니까?", + "removedFromCollection": "컬렉션에서 제거됨", + "removeFromCollectionFailed": "컬렉션에서 제거 실패", + "removeFromCollectionError": "컬렉션에서 제거 중 오류 발생: ${error}" + }, + "playlists": { + "title": "플레이리스트", + "playlist": "재생 목록", + "noPlaylists": "재생 목록을 찾을 수 없습니다", + "create": "재생 목록 생성", + "playlistName": "재생 목록 이름", + "enterPlaylistName": "재생 목록 이름 입력", + "delete": "재생 목록 삭제", + "removeItem": "재생 목록에서 항목 제거", + "smartPlaylist": "스마트 재생 목록", + "itemCount": "${count}개 항목", + "oneItem": "1개 항목", + "emptyPlaylist": "이 재생 목록은 비어 있습니다", + "deleteConfirm": "재생 목록을 삭제 하시겠습니까?", + "deleteMessage": "\"${name}\"을(를) 삭제 하시겠습니까?", + "created": "재생 목록이 생성 되었습니다", + "deleted": "재생 목록이 삭제 되었습니다", + "itemAdded": "재생 목록에 추가 되었습니다", + "itemRemoved": "재생 목록에서 제거됨", + "selectPlaylist": "재생 목록 선택", + "createNewPlaylist": "새 재생 목록 생성", + "errorCreating": "재생 목록 생성 실패", + "errorDeleting": "재생 목록 삭제 실패", + "errorLoading": "재생 목록 로드 실패", + "errorAdding": "재생 목록에 추가 실패", + "errorReordering": "재생 목록 항목 재정렬 실패", + "errorRemoving": "재생 목록에서 제거 실패" + }, + "watchTogether": { + "title": "함께 보기", + "description": "친구 및 가족과 콘텐츠를 동시에 시청하세요", + "createSession": "세션 생성", + "creating": "생성 중...", + "joinSession": "세션 참여", + "joining": "참가 중...", + "controlMode": "제어 모드", + "controlModeQuestion": "누가 재생을 제어할 수 있나요?", + "hostOnly": "호스트만", + "anyone": "누구나", + "hostingSession": "세션 호스팅", + "inSession": "세션 중", + "sessionCode": "세션 코드", + "hostControlsPlayback": "호스트 재생 제어", + "anyoneCanControl": "누구나 재생 제어 가능", + "hostControls": "호스트 제어", + "anyoneControls": "누구나 제어", + "participants": "참가자", + "host": "호스트", + "hostBadge": "호스트", + "youAreHost": "당신은 호스트 입니다", + "watchingWithOthers": "다른 사람과 함께 시청 중", + "endSession": "세션 종료", + "leaveSession": "세션 탈퇴", + "endSessionQuestion": "세션을 종료 하시겠습니까?", + "leaveSessionQuestion": "세션을 탈퇴 하시겠습니까?", + "endSessionConfirm": "이 작업은 모든 참가자의 세션을 종료합니다.", + "leaveSessionConfirm": "당신은 세션에서 제거됩니다.", + "endSessionConfirmOverlay": "이것은 모든 참가자의 시청 세션을 종료합니다.", + "leaveSessionConfirmOverlay": "시청 세션 연결이 끊어집니다.", + "end": "종료", + "leave": "이탈", + "syncing": "동기화 중...", + "participant": "참여자", + "joinWatchSession": "시청 세션에 참여", + "enterCodeHint": "8자리 코드 입력", + "pasteFromClipboard": "클립보드에서 붙여넣기", + "pleaseEnterCode": "세션 코드를 입력하세요", + "codeMustBe8Chars": "세션 코드는 반드시 8자리여야 합니다", + "joinInstructions": "호스트가 공유한 세션 코드를 입력하여 시청 세션에 참여하세요.", + "failedToCreate": "세션 생성 실패", + "failedToJoin": "세션 참여 실패" + }, + "downloads": { + "title": "다운로드", + "manage": "관리", + "tvShows": "TV 프로그램", + "movies": "영화", + "noDownloads": "다운로드 없음", + "noDownloadsDescription": "다운로드한 콘텐츠는 오프라인 시청을 위해 여기에 표시됩니다", + "downloadNow": "다운로드", + "deleteDownload": "다운로드 삭제", + "retryDownload": "다운로드 재시도", + "downloadQueued": "다운로드 대기 중", + "episodesQueued": "${count} 에피소드가 다운로드 대기열에 추가 되었습니다", + "downloadDeleted": "다운로드 삭제됨", + "deleteConfirm": "\"${title}\"를 삭제 하시겠습니까? 다운로드한 파일이 기기에서 삭제됩니다.", + "deletingWithProgress": "${title} 삭제 중... (${current}/${total})" + } +} diff --git a/lib/screens/settings/settings_screen.dart b/lib/screens/settings/settings_screen.dart index 9e8f546e..621dd10e 100644 --- a/lib/screens/settings/settings_screen.dart +++ b/lib/screens/settings/settings_screen.dart @@ -937,6 +937,8 @@ class _SettingsScreenState extends State { return 'Deutsch'; case AppLocale.zh: return '中文'; + case AppLocale.ko: + return '한국어'; } }