diff --git a/LanMountainDesktop/App.axaml b/LanMountainDesktop/App.axaml index 2f801bc..cf50593 100644 --- a/LanMountainDesktop/App.axaml +++ b/LanMountainDesktop/App.axaml @@ -10,6 +10,8 @@ avares://LanMountainDesktop/Assets/Fonts#MiSans + avares://LanMountainDesktop/Assets/Fonts#MiSans JP + avares://LanMountainDesktop/Assets/Fonts#MiSans KR diff --git a/LanMountainDesktop/App.axaml.cs b/LanMountainDesktop/App.axaml.cs index 94b2912..8ebf6b0 100644 --- a/LanMountainDesktop/App.axaml.cs +++ b/LanMountainDesktop/App.axaml.cs @@ -47,6 +47,7 @@ public partial class App : Application private readonly IAppearanceThemeService _appearanceThemeService = HostAppearanceThemeProvider.GetOrCreate(); private readonly IAppLogoService _appLogoService = HostAppLogoProvider.GetOrCreate(); private readonly LocalizationService _localizationService = new(); + private readonly FontFamilyService _fontFamilyService = new(); private readonly IHostApplicationLifecycle _hostApplicationLifecycle = new HostApplicationLifecycleService(); private readonly IDetachedComponentLibraryWindowService _detachedComponentLibraryWindowService = new DetachedComponentLibraryWindowService(); private readonly ILocationService _locationService = HostLocationServiceProvider.GetOrCreate(); @@ -448,6 +449,21 @@ public partial class App : Application CultureInfo.DefaultThreadCurrentUICulture = culture; Thread.CurrentThread.CurrentCulture = culture; Thread.CurrentThread.CurrentUICulture = culture; + + ApplyLanguageSpecificFont(languageCode); + } + + private void ApplyLanguageSpecificFont(string languageCode) + { + var fontFamily = _fontFamilyService.GetFontFamilyForLanguage(languageCode); + if (Resources.TryGetValue("AppFontFamily", out var currentFont) && + currentFont is FontFamily currentFontFamily && + currentFontFamily.Name == fontFamily.Name) + { + return; + } + + Resources["AppFontFamily"] = fontFamily; } private void ActivateMainWindow() diff --git a/LanMountainDesktop/Localization/ko-KR.json b/LanMountainDesktop/Localization/ko-KR.json new file mode 100644 index 0000000..e520245 --- /dev/null +++ b/LanMountainDesktop/Localization/ko-KR.json @@ -0,0 +1,971 @@ +{ + "app.title": "LanMountainDesktop", + "tray.tooltip": "LanMountainDesktop", + "tray.menu.show_desktop": "바탕화면 열기", + "tray.menu.settings": "설정", + "tray.menu.component_library": "위젯 라이브러리", + "tray.menu.restart": "앱 재시작", + "tray.menu.exit": "앱 종료", + "button.back_to_windows": "Windows로 돌아가기", + "button.back_to_platform": "{0}로 돌아가기", + "tooltip.back_to_windows": "Windows로 돌아가기", + "tooltip.back_to_platform": "{0}로 돌아가기", + "platform.windows": "Windows", + "platform.linux": "Linux", + "platform.macos": "macOS", + "tooltip.open_settings": "설정", + "settings.title": "설정", + "settings.shell.title": "설정", + "settings.shell.subtitle": "LanMountainDesktop 독립 설정 모듈", + "settings.shell.sidebar_hint": "카테고리를 선택하여 앱 동작, 바탕화면 레이아웃 및 외관을 조정합니다.", + "settings.shell.footer_hint": "트레이에서 열리는 설정은 이 독립 설정 모듈에서 관리됩니다.", + "settings.back_to_desktop": "바탕화면으로 돌아가기", + "settings.nav_header": "설정", + "settings.nav.group_desktop": "바탕화면", + "settings.nav.group_system": "시스템", + "settings.nav.group_extensions": "확장", + "settings.nav.wallpaper": "배경화면", + "settings.nav.grid": "컴포넌트", + "settings.nav.color": "색상", + "settings.nav.status_bar": "상태 표시줄", + "settings.nav.weather": "날씨", + "settings.nav.region": "지역", + "settings.nav.update": "업데이트", + "settings.nav.privacy": "개인정보", + "settings.nav.launcher": "앱 런처", + "settings.nav.plugins": "플러그인", + "settings.nav.about": "정보", + "settings.wallpaper.title": "배경화면", + "settings.wallpaper.description": "이미지 또는 비디오를 선택하여 앱 창의 배경화면으로 즉시 적용합니다.", + "settings.wallpaper.current_label": "현재 배경화면", + "settings.wallpaper.type_label": "배경화면 유형", + "settings.wallpaper.type.image": "이미지", + "settings.wallpaper.type.solid_color": "단색", + "settings.wallpaper.type.system": "시스템 배경화면", + "settings.wallpaper.system.label": "시스템 배경화면", + "settings.wallpaper.system.unavailable": "시스템 배경화면을 불러올 수 없습니다", + "settings.wallpaper.refresh_interval": "새로고침 간격", + "settings.wallpaper.refresh_now": "지금 새로고침", + "settings.wallpaper.refresh.30s": "30초", + "settings.wallpaper.refresh.1m": "1분", + "settings.wallpaper.refresh.5m": "5분", + "settings.wallpaper.refresh.10m": "10분", + "settings.wallpaper.refresh.15m": "15분", + "settings.wallpaper.refresh.30m": "30분", + "settings.wallpaper.refresh.1h": "1시간", + "settings.wallpaper.refresh.2h": "2시간", + "settings.wallpaper.refresh.4h": "4시간", + "settings.wallpaper.refresh.8h": "8시간", + "settings.wallpaper.refresh.12h": "12시간", + "settings.wallpaper.refresh.24h": "24시간", + "settings.wallpaper.color_label": "배경화면 색상", + "settings.wallpaper.placement_label": "배치", + "settings.wallpaper.placement_desc": "이미지가 바탕화면에 표시되는 방식을 조정합니다.", + "settings.wallpaper.pick_button": "파일 찾아보기", + "settings.wallpaper.clear_button": "단색으로 재설정", + "settings.wallpaper.no_selection": "배경화면이 선택되지 않았습니다.", + "settings.wallpaper.storage_unavailable": "저장소 제공자를 사용할 수 없습니다.", + "settings.wallpaper.import_failed": "배경화면 파일 가져오기에 실패했습니다.", + "settings.wallpaper.image_applied": "이미지 배경화면이 적용되었습니다.", + "settings.wallpaper.video_applied": "비디오 배경화면이 적용되었습니다.", + "settings.wallpaper.unsupported_file": "선택한 파일 형식은 지원되지 않습니다.", + "settings.wallpaper.apply_failed_format": "배경화면 적용 실패: {0}", + "settings.wallpaper.mode_format": "배경화면 모드: {0}.", + "settings.wallpaper.video_mode": "비디오 배경화면은 자동 채우기 모드를 사용합니다.", + "settings.wallpaper.cleared": "배경이 단색으로 재설정되었습니다.", + "settings.wallpaper.default_status": "현재 배경은 단색을 사용합니다.", + "settings.wallpaper.saved_not_found": "저장된 배경화면 파일을 찾을 수 없습니다. 단색 배경을 사용합니다.", + "settings.wallpaper.restored": "저장된 설정에서 배경화면이 복원되었습니다.", + "settings.wallpaper.video_restored": "저장된 설정에서 비디오 배경화면이 복원되었습니다.", + "settings.wallpaper.restore_failed": "저장된 배경화면 복원에 실패했습니다. 단색 배경을 사용합니다.", + "settings.wallpaper.video_not_found": "비디오 배경화면 파일을 찾을 수 없습니다.", + "settings.wallpaper.video_player_unavailable": "비디오 플레이어를 사용할 수 없습니다.", + "settings.wallpaper.video_play_failed_format": "비디오 배경화면 재생 실패: {0}", + "settings.grid.title": "그리드 레이아웃", + "settings.grid.description": "모든 컴포넌트는 최소 하나의 셀을 차지해야 합니다 (최소 1x1).", + "settings.grid.short_side_label": "짧은 쪽 셀 수", + "settings.grid.spacing_label": "그리드 간격", + "settings.grid.spacing_relaxed": "여유 있음 (iOS)", + "settings.grid.spacing_compact": "컴팩트 (Android)", + "settings.grid.edge_inset_label": "화면 여백", + "settings.grid.edge_inset_px_format": "≈ {0:F1}px", + "settings.grid.apply_button": "적용", + "settings.grid.info_format": "그리드: {0}열 x {1}행 | 셀 {2:F1}px (1:1)", + "settings.color.title": "색상", + "settings.color.description": "주야간 모드를 전환하고 앱 강조 색상을 선택합니다.", + "settings.color.day_night_label": "주야간 모드", + "settings.color.day_night_on": "야간", + "settings.color.day_night_off": "주간", + "settings.color.recommended_label": "추천 색상", + "settings.color.system_monet_label": "시스템 Monet 색상", + "settings.color.refresh_button": "새로고침", + "settings.color.mode_night": "야간 모드 활성화됨", + "settings.color.mode_day": "주간 모드 활성화됨", + "settings.color.mode_status_format": "테마 모드: {0}.", + "settings.color.monet_refreshed": "Monet 색상이 새로고침되었습니다.", + "settings.color.theme_ready_format": "테마 색상 준비됨: {0}.", + "settings.color.theme_applied_format": "{0} 테마 색상 적용됨: {1}.", + "settings.color.theme_updated_wallpaper": "배경화면이 업데이트되어 Monet 색상이 새로고침되었습니다.", + "settings.color.theme_cleared_wallpaper": "배경화면이 제거되어 Monet 색상이 새로고침되었습니다.", + "settings.status_bar.title": "상태 표시줄", + "settings.status_bar.description": "상단 상태 표시줄에 표시할 컴포넌트를 선택합니다.", + "settings.status_bar.clock_header": "시계 컴포넌트", + "settings.status_bar.clock_description": "상단 상태 표시줄에 시계를 표시합니다.", + "settings.status_bar.clock_transparent_background_label": "투명 배경", + "settings.status_bar.clock_transparent_background_desc": "캡슐 배경을 제거하고 시계 텍스트만 유지합니다.", + "settings.status_bar.spacing_header": "컴포넌트 간격", + "settings.status_bar.spacing_desc": "상태 표시줄 컴포넌트 사이의 간격을 조정합니다.", + "settings.status_bar.spacing_mode_compact": "컴팩트", + "settings.status_bar.spacing_mode_relaxed": "여유 있음", + "settings.status_bar.spacing_mode_custom": "사용자 지정", + "settings.status_bar.spacing_custom_label": "사용자 지정 간격 (%)", + "settings.status_bar.spacing_custom_px_format": "≈ {0:F1}px", + "settings.privacy.title": "개인정보", + "settings.privacy.description": "선택적 익명 업로드 설정을 관리하여 앱 경험을 점진적으로 개선하는 데 도움을 줍니다.", + "settings.privacy.crash_upload_title": "익명 충돌 데이터 업로드", + "settings.privacy.crash_upload_description": "앱 안정성 향상에 도움을 줍니다.", + "settings.privacy.usage_upload_title": "익명 사용 데이터 업로드", + "settings.privacy.usage_upload_description": "앱 기능 개선에 도움을 줍니다.", + "settings.privacy.device_id_title": "기기 식별자", + "settings.privacy.device_id_description": "이 기기의 고유 식별자입니다. 새로고침을 클릭하여 재생성합니다.", + "settings.privacy.refresh_device_id": "새로고침", + "settings.privacy.policy_hint_prefix": "자세한 내용은", + "settings.privacy.view_policy": "개인정보 처리방침 보기", + "settings.weather.title": "날씨", + "settings.weather.description": "날씨 위치, Xiaomi 날씨 미리보기 및 시작 시 위치 새로고침 동작을 구성합니다.", + "settings.weather.location_source_header": "위치 소스", + "settings.weather.location_source_desc": "날씨 컴포넌트가 현재 위치를 해석하는 방법을 선택합니다.", + "settings.weather.mode_city_search": "도시 검색", + "settings.weather.mode_coordinates": "좌표 입력", + "settings.weather.auto_refresh": "시작 시 위치 자동 새로고침", + "settings.weather.city_search_header": "도시 검색", + "settings.weather.city_search_desc": "도시를 검색하고 날씨 위치를 적용합니다.", + "settings.weather.search_placeholder": "예: 서울", + "settings.weather.search_button": "검색", + "settings.weather.apply_city_button": "도시 적용", + "settings.weather.search_hint": "도시 이름을 입력하여 검색한 후 결과를 적용합니다.", + "settings.weather.search_required": "먼저 도시 키워드를 입력하세요.", + "settings.weather.search_no_results": "일치하는 위치를 찾을 수 없습니다.", + "settings.weather.search_failed_format": "검색 실패: {0}", + "settings.weather.search_result_count_format": "총 {0}개 위치를 찾았습니다.", + "settings.weather.search_select_required": "먼저 검색 결과에서 위치를 선택하세요.", + "settings.weather.search_applied_format": "위치 적용됨: {0}", + "settings.weather.coordinates_header": "좌표 입력", + "settings.weather.coordinates_desc": "위도와 경도를 설정하고 선택적으로 위치 키와 표시 이름을 입력합니다.", + "settings.weather.latitude_label": "위도", + "settings.weather.longitude_label": "경도", + "settings.weather.location_key_placeholder": "위치 키 (선택)", + "settings.weather.location_name_placeholder": "표시 이름 (선택)", + "settings.weather.apply_coordinates_button": "좌표 적용", + "settings.weather.coordinates_saved_format": "좌표 저장됨: {0:F4}, {1:F4}", + "settings.weather.coordinates_default_name_format": "좌표 {0:F4}, {1:F4}", + "settings.weather.location_services_header": "위치 서비스", + "settings.weather.location_services_desc": "현재 Windows 위치를 사용하고 시작 시 날씨 위치를 자동으로 새로고침할지 결정합니다.", + "settings.weather.use_current_location": "현재 위치 사용", + "settings.weather.location_unsupported": "현재 플랫폼에서 현재 위치 가져오기를 지원하지 않습니다.", + "settings.weather.location_ready": "현재 Windows 위치를 사용할 수 있습니다.", + "settings.weather.location_refreshing": "현재 위치 가져오는 중...", + "settings.weather.location_refresh_success_format": "현재 위치 적용됨: {0}", + "settings.weather.location_refresh_failed_format": "현재 위치 가져오기 실패: {0}", + "settings.weather.preview_header": "연결 테스트", + "settings.weather.preview_desc": "테스트 요청을 보내 현재 구성이 사용 가능한지 확인합니다.", + "settings.weather.preview_button": "테스트 가져오기", + "settings.weather.preview_section": "날씨 미리보기", + "settings.weather.settings_section": "설정", + "settings.weather.preview_panel_header": "날씨 미리보기", + "settings.weather.preview_panel_desc": "현재 날씨 서비스 상태를 새로고침하고 확인합니다.", + "settings.weather.refresh_button": "새로고침", + "settings.weather.preview_updated_format": "{0}에 업데이트됨", + "settings.weather.preview_hint": "테스트 가져오기를 통해 날씨 구성을 빠르게 확인할 수 있습니다.", + "settings.weather.preview_missing_location": "테스트 전에 먼저 날씨 위치를 적용하세요.", + "settings.weather.preview_success_format": "테스트 성공: {0} · {1} · {2}", + "settings.weather.preview_failed_format": "테스트 실패: {0}", + "settings.weather.preview_unknown": "알 수 없음", + "settings.weather.alert_filter_header": "제외된 날씨 경보", + "settings.weather.alert_filter_desc": "다음 키워드가 포함된 경보는 표시되지 않습니다. 한 줄에 하나의 규칙.", + "settings.weather.alert_filter_placeholder": "한 줄에 하나의 키워드 입력", + "settings.weather.icon_style_header": "날씨 아이콘 스타일", + "settings.weather.icon_style_desc": "날씨 기호에 사용할 Fluent Icon 스타일을 선택합니다.", + "settings.weather.icon_style_fluent_regular": "Fluent 윤곽선", + "settings.weather.icon_style_fluent_filled": "Fluent 채우기", + "settings.weather.no_tls_header": "TLS 없이 날씨 가져오기", + "settings.weather.no_tls_desc": "권장하지 않음, 네트워크 호환성이 낮을 때만 시도하세요.", + "settings.weather.status_city_empty": "도시 위치가 아직 구성되지 않았습니다.", + "settings.weather.status_city_format": "모드: {0}|{1}|키: {2}", + "settings.weather.status_coordinates_format": "모드: {0}|위도 {1:F4}, 경도 {2:F4}|키: {3}", + "settings.weather.city_selection_label": "도시 선택", + "settings.weather.coordinates_selection_label": "좌표 위치", + "settings.weather.location_city_summary_desc": "날씨 조회에 사용할 현재 도시를 선택합니다.", + "settings.weather.location_coordinates_summary_desc": "날씨 조회에 사용할 위도와 경도 및 선택적 위치 이름을 설정합니다.", + "settings.weather.location_not_selected": "위치가 선택되지 않음", + "settings.weather.alert_list_label": "제외 목록", + "settings.weather.alert_list_desc": "한 줄에 하나의 제외 항목.", + "settings.weather.no_tls_toggle": "호환성이 낮은 네트워크 환경에서 비 TLS 요청으로 대체 허용", + "settings.weather.footer_hint": "바탕화면의 날씨 컴포넌트는 여기서 구성한 날씨 위치와 경보 제외 규칙을 공유합니다.", + "settings.weather.location_header": "날씨 위치", + "settings.weather.location_desc": "날씨 컴포넌트에 사용할 위치를 설정합니다.", + "settings.weather.location_placeholder": "예: 서울", + "settings.weather.location_apply": "저장", + "settings.weather.location_empty": "날씨 위치가 아직 설정되지 않았습니다.", + "settings.weather.location_required": "날씨 위치는 비워둘 수 없습니다.", + "settings.weather.location_current_format": "현재 날씨 위치: {0}", + "settings.weather.location_saved_format": "날씨 위치 저장됨: {0}", + "weather.widget.location_not_configured": "날씨 위치가 구성되지 않음", + "weather.widget.configure_hint": "설정 > 날씨에서 구성을 완료하세요", + "weather.widget.loading": "로딩 중...", + "weather.widget.fetch_failed": "날씨 가져오기 실패", + "weather.widget.retrying": "나중에 자동으로 재시도", + "weather.widget.location_unknown": "알 수 없는 위치", + "weather.widget.condition_clear": "맑음", + "weather.widget.condition_cloudy": "흐림", + "weather.widget.condition_rain": "비", + "weather.widget.condition_storm": "뇌우", + "weather.widget.condition_snow": "눈", + "weather.widget.condition_fog": "안개", + "weather.widget.condition_unknown": "알 수 없는 날씨", + "weather.widget.range_unknown": "-- / --", + "weather.widget.range_format": "{0} / {1}", + "schedule.widget.no_source": "ClassIsland 시간표를 읽지 못함", + "schedule.widget.no_class_today": "오늘 수업 없음", + "schedule.widget.layout_missing": "시간표 레이아웃 누락", + "schedule.widget.subject_fallback": "이름 없는 수업", + "schedule.widget.detail_fallback": "상세 정보 없음", + "schedule.settings.title": "시간표 가져오기", + "schedule.settings.desc": "ClassIsland CSES 시간표 파일을 가져오고 활성화 항목을 선택합니다.", + "schedule.settings.add": "시간표 추가", + "schedule.settings.empty": "가져온 시간표 없음", + "schedule.settings.unnamed": "이름 없는 시간표", + "schedule.settings.delete": "삭제", + "schedule.settings.picker_title": "ClassIsland 시간표 파일 선택", + "schedule.settings.picker_file_type.all": "ClassIsland 시간표 파일", + "schedule.settings.picker_file_type.json": "ClassIsland 아카이브 (JSON)", + "schedule.settings.picker_file_type.cses": "CSES 시간표 (YAML)", + "schedule.settings.semester.title": "학기 설정", + "schedule.settings.semester.start_date": "학기 시작일", + "schedule.settings.semester.week_cycle": "주 순환", + "schedule.settings.semester.week_cycle_desc": "다주 시간표 순환 주기를 설정하여 현재 몇 주차인지 계산합니다.", + "schedule.settings.semester.week_cycle_format": "{0}주 순환", + "worldclock.settings.title": "세계 시계 설정", + "worldclock.settings.desc": "네 개의 시계에 대해 각각 시간대를 선택합니다.", + "worldclock.settings.clock_1": "시계 1", + "worldclock.settings.clock_2": "시계 2", + "worldclock.settings.clock_3": "시계 3", + "worldclock.settings.clock_4": "시계 4", + "worldclock.settings.second_mode_label": "초침 방식", + "worldclock.widget.today": "오늘", + "worldclock.widget.yesterday": "어제", + "worldclock.widget.tomorrow": "내일", + "worldclock.widget.offset_same": "0시간", + "worldclock.widget.offset_ahead_hours": "{0}시간 빠름", + "worldclock.widget.offset_behind_hours": "{0}시간 늦음", + "worldclock.widget.offset_ahead_hm": "{0}시간 {1}분 빠름", + "worldclock.widget.offset_behind_hm": "{0}시간 {1}분 늦음", + "weather.widget.aqi_unknown": "AQI --", + "weather.widget.aqi_format": "AQI {0}", + "weather.widget.updated_format": "{0:HH:mm}에 업데이트됨", + "weather.hourly.now": "현재", + "weather.hourly.sunset": "일몰", + "weather.multiday.today": "오늘", + "weather.multiday.tomorrow": "내일", + "weather.multiday.aqi_format": "공기 좋음 {0}", + "weather.multiday.aqi_unknown": "공기 --", + "settings.region.title": "지역", + "settings.region.description": "언어를 선택하고 설정 및 주요 인터페이스에 즉시 적용합니다.", + "settings.region.language_header": "언어", + "settings.region.language_label": "언어", + "settings.region.language_zh": "중국어", + "settings.region.language_en": "영어", + "settings.region.language_ja": "일본어", + "settings.region.language_ko": "한국어", + "settings.region.timezone_header": "시간대", + "settings.region.timezone_desc": "시간대를 선택합니다. 시계와 달력 컴포넌트가 이 시간대를 사용합니다.", + "settings.region.applied_format": "언어가 {0}(으)로 전환되었습니다", + "settings.region.follow_system": "시스템 기본값 따르기", + "settings.general.title": "일반 설정", + "settings.general.description": "언어, 시간대 및 런타임 동작을 조정합니다.", + "settings.general.basic_header": "기본 설정", + "settings.general.runtime_header": "런타임 설정", + "settings.general.preview_header": "날짜 및 시간 미리보기", + "settings.general.preview_time_label": "시간", + "settings.general.preview_date_label": "날짜", + "settings.general.render_mode_restart_message": "렌더링 모드 변경은 앱 재시작이 필요합니다.", + "settings.appearance.title": "외관", + "settings.appearance.description": "테마 소스, 시스템 소재 및 창 외관을 조정합니다.", + "settings.appearance.theme_header": "테마", + "settings.color.enable_night_mode_toggle": "야간 모드 활성화", + "settings.color.use_system_chrome_toggle": "시스템 창 제목 표시줄 사용", + "settings.color.theme_color_label": "테마 강조 색상", + "settings.appearance.theme_color_mode_label": "테마 색상 소스", + "settings.appearance.theme_color_mode.neutral": "기본 중성", + "settings.appearance.theme_color_mode.user": "사용자 테마 색상 Monet", + "settings.appearance.theme_color_mode.wallpaper": "배경화면 Monet 색상", + "settings.appearance.theme_color_mode_desc.neutral": "표준 주간 흰색 배경 검은 텍스트와 야간 검은 배경 흰색 텍스트 중성색 표면을 사용합니다.", + "settings.appearance.theme_color_mode_desc.user": "사용자가 선택한 테마 색상을 전체 바탕화면 셸의 Monet 시드 색상으로 사용합니다.", + "settings.appearance.theme_color_mode_desc.wallpaper": "배경화면 색상을 사용합니다. 앱 배경화면을 우선하고 실패 시 시스템 바탕화면 배경화면으로 대체합니다.", + "settings.appearance.theme_color_preview.app": "현재 앱 배경화면에서 추출한 색상을 미리보고 있습니다.", + "settings.appearance.theme_color_preview.system": "현재 시스템 배경화면에서 추출한 색상을 미리보고 있습니다.", + "settings.appearance.theme_color_preview.fallback": "사용 가능한 배경화면이 없어 현재 대체 강조 색상을 사용합니다.", + "component.color_scheme.follow_system": "시스템 색상 구성 따르기", + "component.color_scheme.native": "컴포넌트 사용자 지정 색상 구성 사용", + "settings.appearance.system_material.none": "없음", + "settings.appearance.system_material.mica": "Mica", + "settings.appearance.system_material.acrylic": "Acrylic", + "settings.appearance.system_material_desc.switchable": "선택한 소재를 창, Dock, 상태 표시줄 및 컴포넌트 호스트 배경에 적용합니다.", + "settings.appearance.system_material_desc.fixed": "현재 시스템은 여기에 나열된 소재 모드만 제공합니다.", + "settings.appearance.restart_message": "테마 색상 소스 및 시스템 소재 변경은 앱 재시작이 필요합니다.", + "settings.appearance.preview.primary": "주 색상", + "settings.appearance.preview.secondary": "보조 색상", + "settings.appearance.preview.tertiary": "제3 색상", + "settings.appearance.preview.neutral": "중성 색상", + "settings.appearance.preview.seed": "시드 색상", + "settings.appearance.preview.neutral_light": "흰색", + "settings.appearance.preview.neutral_dark": "검은색", + "settings.appearance.preview.apply_seed": "적용", + "settings.appearance.preview.wallpaper_candidates": "배경화면 후보 테마 색상", + "settings.appearance.preview.wallpaper_current": "현재", + "settings.wallpaper.placement.fill": "채우기", + "settings.wallpaper.placement.fit": "맞추기", + "settings.wallpaper.placement.stretch": "늘리기", + "settings.wallpaper.placement.center": "가운데", + "settings.wallpaper.placement.tile": "바둑판", + "settings.status_bar.clock_format_label": "시계 형식", + "settings.status_bar.clock_format.hm": "시:분", + "settings.status_bar.clock_format.hms": "시:분:초", + "settings.components.title": "컴포넌트", + "settings.components.description": "컴포넌트 레이아웃과 모서리 디자인을 조정합니다.", + "settings.components.grid_header": "그리드 설정", + "settings.components.header": "그리드 설정", + "settings.components.short_side_label": "짧은 쪽 셀 수", + "settings.components.edge_inset_label": "화면 여백", + "settings.components.spacing_label": "컴포넌트 간격", + "settings.components.spacing_compact": "컴팩트", + "settings.components.spacing_relaxed": "여유 있음", + "settings.components.corner_radius.header": "모서리 디자인", + "settings.components.corner_radius.label": "컴포넌트 모서리", + "settings.components.corner_radius.description": "컴포넌트 컨테이너 모서리를 직각에서 캡슐 모양에 가깝게 연속 조정하고 모서리가 커짐에 따라 내부 안전 영역도 확장합니다.", + "settings.update.title": "업데이트", + "settings.update.current_version_label": "현재 버전", + "settings.update.latest_version_label": "최신 릴리스", + "settings.update.published_at_label": "게시일", + "settings.update.options_header": "업데이트 옵션", + "settings.update.options_desc": "업데이트 확인과 릴리스 채널을 구성합니다.", + "settings.update.auto_check_toggle": "시작 시 자동 업데이트 확인", + "settings.update.include_prerelease_toggle": "사전 릴리스 버전 포함", + "settings.update.channel_label": "업데이트 채널", + "settings.update.channel_stable": "정식 버전", + "settings.update.channel_preview": "미리보기 버전", + "settings.update.actions_header": "업데이트 작업", + "settings.update.actions_desc": "릴리스 확인, 설치 패키지 다운로드 및 업데이트 시작.", + "settings.update.check_button": "업데이트 확인", + "settings.update.download_install_button": "다운로드 및 설치", + "settings.update.download_progress_idle": "다운로드 진행률: -", + "settings.update.download_progress_format": "다운로드 진행률: {0:F0}%", + "settings.update.status_ready": "업데이트 확인을 시작할 수 있습니다.", + "settings.update.status_channel_changed": "업데이트 채널이 변경되었습니다. 다시 업데이트를 확인하세요.", + "settings.update.status_channel_changed_format": "업데이트 채널이 {0}(으)로 전환되었습니다. 다시 업데이트를 확인하세요.", + "settings.update.status_windows_only": "자동 설치 패키지 업데이트는 현재 Windows만 지원합니다.", + "settings.update.status_checking": "GitHub Release 확인 중...", + "settings.update.status_check_failed_format": "업데이트 확인 실패: {0}", + "settings.update.status_up_to_date": "현재 최신 버전입니다.", + "settings.update.status_asset_missing": "새 버전이 발견되었지만 호환되는 설치 패키지를 찾을 수 없습니다.", + "settings.update.status_available_format": "새 버전 {0}이(가) 발견되었습니다. \"다운로드 및 설치\"를 클릭하여 계속하세요.", + "settings.update.status_downloading": "설치 패키지 다운로드 중...", + "settings.update.status_download_failed_format": "다운로드 실패: {0}", + "settings.update.status_launching_installer": "다운로드 완료, 설치 프로그램 시작 중...", + "settings.update.status_installer_missing": "다운로드 후 설치 패키지 파일을 찾을 수 없습니다.", + "settings.update.status_installer_started": "설치 프로그램이 시작되었습니다. 앱이 업데이트를 위해 종료됩니다.", + "settings.update.status_elevation_cancelled": "관리자 권한이 부여되지 않아 업데이트가 취소되었습니다.", + "settings.update.status_launch_failed_format": "설치 프로그램 시작 실패: {0}", + "settings.about.title": "정보", + "settings.about.version_format": "버전: {0}", + "settings.about.codename_format": "버전 코드명: {0}", + "settings.about.font_format": "글꼴: {0}", + "settings.about.startup_header": "Windows 자동 시작", + "settings.about.startup_desc": "Windows 로그인 시 앱을 자동으로 시작합니다.", + "settings.about.startup_toggle": "Windows 로그인 시 시작", + "settings.about.render_mode_header": "앱 렌더링 모드", + "settings.about.render_mode_desc": "앱 렌더링 백엔드를 선택합니다. 변경 후 앱 재시작이 필요합니다. 지원하지 않는 모드는 소프트웨어 렌더링으로 대체됩니다.", + "settings.about.render_mode.default": "기본", + "settings.about.render_mode.software": "소프트웨어", + "settings.about.render_mode.angle_egl": "angleEgl", + "settings.about.render_mode.wgl": "WGL", + "settings.about.render_mode.vulkan": "Vulkan", + "settings.about.render_mode.unknown": "알 수 없음", + "settings.about.render_mode.current_label": "현재 실제 렌더링 백엔드", + "settings.about.render_mode.current_format": "현재 백엔드: {0}", + "settings.about.render_mode.impl_format": "런타임 구현: {0}", + "settings.about.render_mode.impl_unavailable": "현재 런타임 구현 정보를 가져올 수 없습니다.", + "settings.about.description": "앱 정보.", + "settings.update.description": "업데이트 확인, 릴리스 채널 및 다운로드 소스 선택, 업데이트 설치 방법 제어.", + "settings.update.status_card_title": "업데이트 상태", + "settings.update.status_card_description": "새 버전 확인, 릴리스 정보 보기, 업데이트 시 다운로드 또는 설치 계속.", + "settings.update.preferences_header": "업데이트 설정", + "settings.update.preferences_description": "릴리스 채널, 설치 패키지 다운로드 소스, 설치 방법 및 다운로드 병렬 스레드 수를 선택합니다.", + "settings.update.last_checked_label": "마지막 확인", + "settings.update.source_label": "다운로드 소스", + "settings.update.source_github": "GitHub", + "settings.update.source_ghproxy": "gh-proxy", + "settings.update.source_github_desc": "GitHub에서 직접 릴리스 설치 패키지를 다운로드합니다.", + "settings.update.source_ghproxy_desc": "GitHub 릴리스 설치 패키지를 다운로드할 때 gh-proxy 미러를 사용합니다.", + "settings.update.mode_label": "업데이트 모드", + "settings.update.mode_manual": "수동 업데이트", + "settings.update.mode_download_then_confirm": "자동 다운로드", + "settings.update.mode_silent_on_exit": "자동 설치", + "settings.update.mode_manual_desc": "업데이트만 확인합니다. 다운로드와 설치 시기는 사용자가 결정합니다.", + "settings.update.mode_download_then_confirm_desc": "백그라운드에서 업데이트를 다운로드하고 완료 후 설치 여부를 확인합니다.", + "settings.update.mode_silent_on_exit_desc": "백그라운드에서 업데이트를 다운로드하고 다음 앱 종료 시 자동으로 설치합니다.", + "settings.update.channel_stable_desc": "정식 버전은 안정성을 우선하며 대부분의 사용자에게 적합합니다.", + "settings.update.channel_preview_desc": "미리보기 버전은 더 빠른 새 기능을 포함할 수 있지만 안정성이 낮을 수 있습니다.", + "settings.update.download_threads_label": "다운로드 스레드 수", + "settings.update.download_threads_desc": "앱 업데이트 설치 패키지에 사용할 병렬 다운로드 스레드 수를 설정합니다.", + "settings.update.install_now_button": "지금 설치", + "settings.update.status_downloaded_confirm": "업데이트가 다운로드되었습니다. 확인 후 설치 시기를 선택하세요.", + "settings.update.status_downloaded_exit": "업데이트가 다운로드되었습니다. 앱 종료 시 설치됩니다.", + "settings.about.app_info_header": "앱 정보", + "settings.about.update_header": "업데이트", + "settings.about.version_label": "버전", + "settings.about.codename_label": "버전 코드명", + "settings.about.render_backend_label": "렌더링 백엔드", + "settings.about.render_backend_format": "렌더링 백엔드: {0}", + "settings.restart_dialog.title": "앱 재시작 필요", + "settings.restart_dialog.render_mode_message": "렌더링 모드를 \"{0}\"에서 \"{1}\"(으)로 변경하려면 앱을 재시작해야 합니다. 지금 재시작하시겠습니까?", + "settings.restart_dialog.restart": "지금 재시작", + "settings.restart_dialog.later": "나중에", + "settings.restart_dialog.cancel": "취소", + "settings.restart_dock.title": "앱 재시작 필요", + "settings.restart_dock.description": "일부 변경 사항은 앱 재시작 후에 적용됩니다.", + "settings.restart_dock.button": "앱 재시작", + "settings.footer": "LanMountainDesktop 설정", + "filepicker.title": "배경화면 선택", + "filepicker.image_files": "이미지 파일", + "common.day": "주간", + "common.night": "야간", + "common.back": "뒤로", + "common.close": "닫기", + "common.unknown": "알 수 없는 오류", + "common.recommended": "추천", + "common.monet": "Monet", + "desktop.page_index_format": "바탕화면 {0}", + "launcher.title": "앱 런처", + "launcher.folder": "폴더", + "launcher.subtitle": "Windows 시작 메뉴 구조에 따라 모든 앱과 폴더 표시", + "launcher.subtitle_linux": "Linux .desktop 항목에서 스캔한 설치된 앱 표시", + "launcher.empty": "시작 메뉴 항목을 찾을 수 없습니다.", + "launcher.empty_linux": "Linux .desktop 앱 항목을 찾을 수 없습니다.", + "launcher.empty_folder": "이 폴더는 비어 있습니다.", + "launcher.folder_items_format": "{0}개 앱", + "launcher.context.hide_icon": "아이콘 숨기기", + "launcher.action.hide": "숨기기", + "settings.launcher.title": "앱 런처", + "settings.launcher.description": "앱 런처에서 숨겨진 앱과 폴더를 관리합니다.", + "settings.launcher.hidden_header": "숨겨진 항목", + "settings.launcher.hidden_desc": "숨겨진 런처 항목을 보고 다시 표시합니다.", + "settings.launcher.hidden_hint": "바탕화면 편집 모드에서 런처 아이콘을 선택하고 \"숨기기\"를 클릭하면 숨겨진 항목이 여기에 표시됩니다.", + "settings.launcher.hidden_empty": "숨겨진 항목이 없습니다.", + "settings.launcher.hidden_summary_format": "총 {0}개 숨겨진 항목", + "settings.launcher.hidden_type_folder": "폴더", + "settings.launcher.hidden_type_shortcut": "앱", + "settings.launcher.restore_button": "숨기기 해제", + "settings.plugins.title": "플러그인", + "settings.plugins.runtime_header": "플러그인 런타임", + "settings.plugins.runtime_desc": "플러그인 런타임 상태, 로드 결과 및 진단 정보를 확인합니다.", + "settings.plugins.runtime_hint": "설치된 플러그인의 발견 결과, 로드 상태 및 런타임 진단 정보가 여기에 표시됩니다.", + "settings.plugins.runtime_status": "플러그인 스캔이 완료되면 런타임 상태가 여기에 표시됩니다.", + "settings.plugins.description": "설치된 플러그인을 관리하고 런타임 상태를 확인합니다.", + "settings.plugins.initial_status": "플러그인 상태를 새로고침하여 최신 설치된 플러그인을 확인하세요.", + "settings.plugins.refresh_button": "플러그인 새로고침", + "settings.plugins.refresh_success_installed_format": "{0}개 설치된 플러그인을 로드했습니다.", + "settings.plugins.refresh_success_format": "{0}개 설치된 플러그인과 {1}개 마켓 항목을 로드했습니다.", + "settings.plugins.refresh_failed": "플러그인 마켓 인덱스 로드 실패.", + "settings.plugins.marketplace_header": "플러그인 마켓", + "settings.plugins.marketplace_empty": "현재 사용 가능한 마켓 플러그인이 없습니다.", + "settings.plugins.delete_button_short": "삭제", + "settings.plugins.install_button_short": "설치", + "settings.plugins.restart_required": "플러그인 변경 사항은 재시작 후 적용됩니다.", + "settings.plugins.toggle_unchanged_format": "플러그인 \"{0}\"에 변경 사항이 없습니다.", + "settings.plugins.delete_failed_name_format": "플러그인 \"{0}\" 제거 실패.", + "settings.plugins.install_failed_name_format": "플러그인 \"{0}\" 설치 실패.", + "settings.plugins.installed_header": "설치된 플러그인", + "settings.plugins.installed_desc": "여기서 설치된 플러그인을 보고 삭제합니다.", + "settings.plugins.import_header": "설치 패키지에서 가져오기", + "settings.plugins.import_desc": ".laapp 플러그인 패키지를 열고 로컬 플러그인 디렉토리에 스테이징합니다.", + "settings.plugins.restart_hint": "플러그인 설치 및 삭제 변경 사항은 앱 재시작 후 적용됩니다.", + "settings.plugins.empty": "플러그인을 찾을 수 없습니다.", + "settings.plugins.runtime_unavailable": "플러그인 런타임을 사용할 수 없습니다.", + "settings.plugins.summary_format": "총 {0}개 플러그인 감지됨; {1}개 활성화됨; {2}개 로드됨; {3}개 설정 페이지; {4}개 컴포넌트; {5}개 실패.", + "settings.plugins.summary_item_format": "{0} v{1} | {2}", + "settings.plugins.state.enabled": "활성화됨", + "settings.plugins.state.enabled_failed": "활성화됨 / 로드 실패", + "settings.plugins.state.disabled": "비활성화됨", + "settings.plugins.state.loaded": "로드됨", + "settings.plugins.state.load_failed": "로드 실패", + "settings.plugins.toggle_on": "활성화", + "settings.plugins.toggle_off": "비활성화", + "settings.plugins.toggle_result_format": "플러그인 \"{0}\"이(가) 다음 시작 시 {1}(으)로 설정되었습니다. 앱 재시작 후 설정 페이지와 컴포넌트 변경 사항이 적용됩니다.", + "settings.plugins.toggle_state_enabled": "활성화", + "settings.plugins.toggle_state_disabled": "비활성화", + "settings.plugins.toggle_failed_detail_format": "플러그인 \"{0}\" 상태 업데이트 실패: {1}", + "settings.plugins.install_button": ".laapp 플러그인 패키지 열기", + "settings.plugins.install_unavailable": "플러그인 런타임을 사용할 수 없어 일시적으로 .laapp 플러그인 패키지를 설치할 수 없습니다.", + "settings.plugins.install_hint_format": ".laapp 플러그인 패키지를 열어 설치: {0}", + "settings.plugins.install_picker_title": "플러그인 설치 패키지 선택", + "settings.plugins.install_file_type": ".laapp 플러그인 패키지", + "settings.plugins.install_picker_unavailable": "파일 저장소 제공자를 사용할 수 없습니다.", + "settings.plugins.install_copy_failed": "선택한 .laapp 플러그인 패키지 복사 실패.", + "settings.plugins.install_success_format": "플러그인 \"{0}\" 설치 완료. 앱 재시작 후 새 설정 페이지와 컴포넌트가 적용됩니다.", + "settings.plugins.install_failed_format": "플러그인 패키지 설치 실패: {0}", + "settings.plugins.delete_button": "플러그인 삭제", + "settings.plugins.delete_success_format": "플러그인 \"{0}\"이(가) 삭제 예정입니다. 앱 재시작 후 제거가 완료됩니다.", + "settings.plugins.delete_failed_format": "플러그인 삭제 실패: {0}", + "settings.plugins.delete_failed_detail_format": "플러그인 \"{0}\" 삭제 실패: {1}", + "settings.plugins.publisher_format": "게시자: {0}", + "settings.plugins.publisher_unknown": "알 수 없는 게시자", + "settings.plugins.source_package": ".laapp 패키지", + "settings.plugins.source_manifest": "매니페스트 파일", + "settings.plugins.subtitle_format": "{0} | {1} | {2}", + "settings.plugins.detail_format": "설정 페이지: {0} | 컴포넌트: {1}", + "settings.nav.plugin_market": "플러그인 마켓", + "settings.plugin_market.title": "플러그인 마켓", + "settings.plugin_market.subtitle": "LanAirApp 공식 소스의 플러그인을 탐색하고 로컬에 설치 스테이징합니다.", + "settings.plugin_market.unavailable": "플러그인 런타임을 사용할 수 없어 일시적으로 공식 마켓을 열 수 없습니다.", + "settings.update.status_idle": "아직 업데이트 확인이 수행되지 않았습니다.", + "settings.update.status_preferences_saved": "업데이트 설정이 저장되었습니다.", + "settings.update.status_check_failed": "업데이트 확인 실패.", + "settings.update.status_available_summary_format": "업데이트 발견: {0} (현재: {1}).", + "settings.update.status_up_to_date_format": "현재 최신 버전입니다 ({0}).", + "settings.window.drawer_default": "상세 정보", + "market.toolbar.search_placeholder": "플러그인 검색", + "market.toolbar.refresh": "새로고침", + "market.status.loading": "공식 플러그인 마켓 로딩 중...", + "market.status.loaded_network_format": "공식 소스에서 {0}개 플러그인을 로드했습니다.", + "market.status.loaded_cache_format": "공식 소스를 일시적으로 사용할 수 없어 캐시에서 {0}개 플러그인을 로드했습니다. 원인: {1}", + "market.status.load_failed_format": "플러그인 마켓 로드 실패: {0}", + "market.status.installing_format": "플러그인 \"{0}\" 다운로드 및 스테이징 중...", + "market.status.install_success_format": "플러그인 \"{0}\" 스테이징 완료. 앱 재시작 후 적용됩니다.", + "market.status.install_failed_format": "플러그인 설치 실패: {0}", + "market.status.host_incompatible_format": "현재 호스트 버전이 너무 낮습니다. 최소 {0}이(가) 필요합니다.", + "market.list.empty": "플러그인 마켓이 아직 로드되지 않았습니다.", + "market.list.no_results": "현재 검색과 일치하는 플러그인이 없습니다.", + "market.card.subtitle_format": "{0} | v{1}", + "market.card.loaded": "로드됨", + "market.card.pending_restart": "재시작 필요", + "market.detail.placeholder": "왼쪽에서 플러그인을 선택하여 상세 정보를 확인하세요.", + "market.detail.author": "게시자", + "market.detail.version": "버전", + "market.detail.api_version": "API 버전", + "market.detail.min_host_version": "최소 호스트 버전", + "market.detail.installed_version": "설치된 버전", + "market.detail.not_installed": "미설치", + "market.detail.readme": "README", + "market.detail.plugin_information": "플러그인 정보", + "market.detail.author_subtitle_format": "작성자: {0}", + "market.detail.package_size": "패키지 크기", + "market.detail.published_at": "최초 게시", + "market.detail.updated_at": "최근 업데이트", + "market.detail.tags": "태그", + "market.detail.project": "프로젝트", + "market.detail.state": "설치 상태", + "market.detail.market_source": "마켓 소스", + "market.detail.homepage": "홈페이지", + "market.detail.repository": "저장소", + "market.detail.release_notes": "릴리스 노트", + "market.detail.dependencies": "의존성", + "market.detail.dependencies_empty": "이 플러그인은 SharedContracts 의존성을 선언하지 않았습니다.", + "market.detail.readme_loading": "README 로딩 중...", + "market.detail.readme_empty": "README가 비어 있습니다.", + "market.detail.readme_error_format": "README 로드 실패: {0}", + "market.detail.state.not_installed": "미설치", + "market.detail.state.update_available": "업데이트 가능", + "market.detail.state.installed": "설치됨", + "market.detail.unknown": "알 수 없음", + "market.button.install": "설치", + "market.button.update": "업데이트", + "market.button.installed": "설치됨", + "market.button.installing": "설치 중...", + "market.button.restart": "재시작 후 적용", + "button.component_library": "바탕화면 편집", + "tooltip.component_library": "바탕화면 편집", + "component_library.title": "바탕화면 편집", + "component_library.empty": "좌우로 스와이프하여 카테고리를 선택하고 클릭하여 진입한 후 컴포넌트를 바탕화면에 드래그하여 배치하세요.", + "component_library.drag_hint": "드래그하여 배치", + "component.delete": "삭제", + "component.edit": "편집", + "component.editor.instance_scope": "설정은 현재 컴포넌트 인스턴스에만 적용됩니다.", + "component.editor.info_header": "컴포넌트 정보", + "component.editor.id_label": "컴포넌트 ID", + "component.editor.placement_label": "인스턴스 ID", + "component.editor.scope_label": "범위", + "component.editor.scope_instance": "인스턴스 수준 편집기", + "component_category.clock": "시계", + "component_category.date": "달력", + "component_category.weather": "날씨", + "component_category.board": "화이트보드", + "component_category.media": "미디어", + "component_category.info": "정보 추천", + "component_category.calculator": "계산기", + "component_category.study": "공부", + "component_category.file": "파일", + "component.date": "달력", + "component.month_calendar": "월간 달력", + "component.lunar_calendar": "음력", + "component.desktop_clock": "시계", + "component.weather_clock": "날씨 시계", + "component.world_clock": "세계 시계", + "component.desktop_timer": "타이머", + "component.desktop_weather": "날씨", + "component.hourly_weather": "시간별 날씨", + "component.multiday_weather": "다일 날씨", + "component.extended_weather": "확장 날씨", + "component.class_schedule": "시간표", + "component.music_control": "음악 제어", + "component.audio_recorder": "녹음", + "component.daily_poetry": "매일 시", + "component.daily_artwork": "매일 명화", + "component.daily_word": "매일 단어", + "component.daily_word_2x2": "매일 단어 2x2", + "component.cnr_daily_news": "CNR 뉴스", + "component.ifeng_news": "Ifeng 뉴스", + "component.bilibili_hot_search": "Bilibili 인기 검색", + "component.baidu_hot_search": "Baidu 인기 검색", + "component.stcn24_forum": "STCN 24", + "component.exchange_rate_converter": "환율 변환기", + "component.whiteboard": "세로 작은 칠판", + "component.blackboard_landscape": "가로 작은 칠판", + "component.browser": "브라우저", + "component.office_recent_documents": "최근 문서", + "whiteboard.settings.desc": "각 작은 칠판은 독립적으로 자신의 노트 기록을 저장합니다.", + "whiteboard.settings.retention.title": "노트 보존 기간", + "whiteboard.settings.retention.desc": "이 작은 칠판에서 만료된 노트가 자동 삭제되기 전에 저장된 노트를 얼마나 오래 보존할지 선택합니다.", + "whiteboard.settings.retention.option": "{0}일", + "whiteboard.settings.instance_scope": "이 보존 기간 설정은 각 작은 칠판 컴포넌트 인스턴스별로 개별 저장됩니다.", + "office_recent_documents.settings.desc": "이 위젯이 스캔할 Windows 및 Office 최근 문서 소스를 선택합니다.", + "office_recent_documents.settings.sources_title": "최근 문서 소스", + "office_recent_documents.settings.sources_desc": "여러 소스를 동시에 선택할 수 있습니다. 레지스트리 소스를 선택하면 Office interop MRU 대체도 유지됩니다.", + "office_recent_documents.settings.source.registry": "Office 레지스트리 MRU", + "office_recent_documents.settings.source.recent_folders": "Windows 최근 폴더", + "office_recent_documents.settings.source.jump_lists": "Windows 점프 목록", + "office_recent_documents.settings.hint": "모든 소스를 끄면 최소 하나의 소스를 다시 활성화할 때까지 이 위젯은 비어 있게 됩니다.", + "component.holiday_calendar": "공휴일 달력", + "component.study_environment": "환경", + "component.study_session_control": "공부 시간 제어", + "component.study_session_history": "기록 시간 데이터", + "component.study_noise_curve": "소음 곡선", + "component.study_noise_distribution": "소음 레벨 분포", + "component.study_score_overview": "공부 점수 개요", + "component.study_deduction_reasons": "감점 원인", + "component.study_interrupt_density": "방해 밀도", + "desktop_clock.settings.title": "시계 설정", + "desktop_clock.settings.desc": "단일 시계의 시간대를 선택합니다.", + "desktop_clock.settings.timezone_label": "시간대", + "desktop_clock.settings.second_mode_label": "초침 방식", + "clock.second_mode.tick": "똑딱이", + "clock.second_mode.sweep": "스윕", + "poetry.widget.loading_content": "시 불러오는 중", + "poetry.widget.loading_author": "로딩 중", + "poetry.widget.fetch_failed": "시 가져오기 실패", + "poetry.widget.fallback_content": "오늘의 시를 사용할 수 없습니다", + "poetry.widget.fallback_author": "나중에 다시 시도하세요", + "poetry.widget.unknown_author": "익명", + "artwork.widget.loading": "로딩 중", + "artwork.widget.loading_title": "매일 명화", + "artwork.widget.loading_subtitle": "오늘의 명화 가져오는 중", + "artwork.widget.fetch_failed": "명화 가져오기 실패", + "artwork.widget.fallback_title": "매일 명화", + "artwork.widget.fallback_artist": "추천 서비스를 사용할 수 없습니다", + "artwork.widget.fallback_year": "나중에 다시 시도하세요", + "artwork.widget.unknown_artist": "알 수 없는 작가", + "dailyword.widget.loading": "로딩 중...", + "dailyword.widget.loading_word": "매일 단어", + "dailyword.widget.loading_pronunciation": "발음 가져오는 중", + "dailyword.widget.loading_meaning": "뜻 가져오는 중", + "dailyword.widget.loading_example": "예문 가져오는 중", + "dailyword.widget.loading_example_translation": "로딩 중", + "dailyword.widget.fetch_failed": "매일 단어 가져오기 실패", + "dailyword.widget.fallback_word": "매일 단어", + "dailyword.widget.fallback_pronunciation": "발음을 사용할 수 없습니다", + "dailyword.widget.fallback_meaning": "Youdao 사전을 사용할 수 없습니다", + "dailyword.widget.fallback_example": "오른쪽 상단 새로고침을 클릭하여 다시 시도하세요", + "dailyword.widget.fallback_example_translation": "네트워크 복구 후 자동 업데이트됩니다", + "dailyword2x2.widget.tap_to_show": "탭하여 뜻 보기", + "cnrnews.widget.loading": "로딩 중...", + "cnrnews.widget.loading_title": "뉴스 헤드라인 가져오는 중", + "cnrnews.widget.loading_subtitle": "잠시 기다려주세요", + "cnrnews.widget.fetch_failed": "뉴스 가져오기 실패", + "cnrnews.widget.fallback_title": "CNR 뉴스를 사용할 수 없습니다", + "cnrnews.widget.fallback_subtitle": "오른쪽 상단을 클릭하여 나중에 다시 시도하세요", + "cnrnews.widget.hot_label": "핫", + "bilihot.widget.brand": "bilibili 인기 검색", + "bilihot.widget.top_right_label": "bilibili 인기 검색", + "bilihot.widget.search_entry": "검색", + "bilihot.widget.search_placeholder": "인기 검색어 검색", + "bilihot.widget.loading": "로딩 중...", + "bilihot.widget.loading_item": "로딩 중...", + "bilihot.widget.fetch_failed": "인기 검색 가져오기 실패", + "bilihot.widget.fallback_item": "인기 검색 없음", + "bilihot.widget.more_hot": "더 많은 인기 검색", + "baiduhot.widget.brand": "Baidu 인기 검색", + "baiduhot.widget.loading": "로딩 중...", + "baiduhot.widget.loading_item": "로딩 중...", + "baiduhot.widget.fetch_failed": "인기 검색 가져오기 실패", + "baiduhot.widget.fallback_item": "인기 검색 없음", + "baiduhot.widget.refresh_tooltip": "새로고침", + "ifeng.widget.brand": "Ifeng 뉴스", + "ifeng.widget.loading": "로딩 중...", + "ifeng.widget.loading_item": "로딩 중...", + "ifeng.widget.fetch_failed": "뉴스 가져오기 실패", + "ifeng.widget.fallback_item": "뉴스 없음", + "ifeng.widget.refresh_tooltip": "새로고침", + "dailyword.settings.title": "매일 단어 설정", + "dailyword.settings.desc": "자동 새로고침 설정과 새로고침 빈도를 구성합니다.", + "dailyword.settings.auto_refresh_label": "자동 새로고침", + "dailyword.settings.auto_refresh_enabled": "자동 새로고침 활성화", + "dailyword.settings.frequency_label": "새로고침 빈도", + "bilihot.settings.title": "Bilibili 인기 검색 설정", + "bilihot.settings.desc": "자동 새로고침 설정과 새로고침 빈도를 구성합니다.", + "bilihot.settings.auto_refresh_label": "자동 새로고침", + "bilihot.settings.auto_refresh_enabled": "자동 새로고침 활성화", + "bilihot.settings.frequency_label": "새로고침 빈도", + "baiduhot.settings.title": "Baidu 인기 검색 설정", + "baiduhot.settings.desc": "데이터 소스, 자동 새로고침 설정과 새로고침 빈도를 구성합니다.", + "baiduhot.settings.source_label": "데이터 소스", + "baiduhot.settings.source_official": "Baidu 공식 소스", + "baiduhot.settings.source_rss": "타사 RSS 소스", + "baiduhot.settings.auto_refresh_label": "자동 새로고침", + "baiduhot.settings.auto_refresh_enabled": "자동 새로고침 활성화", + "baiduhot.settings.frequency_label": "새로고침 빈도", + "ifeng.settings.title": "Ifeng 뉴스 설정", + "ifeng.settings.desc": "채널, 자동 새로고침 설정과 새로고침 빈도를 구성합니다.", + "ifeng.settings.channel_label": "뉴스 채널", + "ifeng.settings.channel_comprehensive": "종합", + "ifeng.settings.channel_mainland": "중국 본토", + "ifeng.settings.channel_taiwan": "대만", + "ifeng.settings.auto_refresh_label": "자동 새로고침", + "ifeng.settings.auto_refresh_enabled": "자동 새로고침 활성화", + "ifeng.settings.frequency_label": "새로고침 빈도", + "refresh.frequency.5m": "5분", + "refresh.frequency.10m": "10분", + "refresh.frequency.12m": "12분", + "refresh.frequency.15m": "15분", + "refresh.frequency.20m": "20분", + "refresh.frequency.30m": "30분", + "refresh.frequency.40m": "40분", + "refresh.frequency.1h": "1시간", + "refresh.frequency.3h": "3시간", + "refresh.frequency.6h": "6시간", + "refresh.frequency.12h": "12시간", + "refresh.frequency.24h": "24시간", + "weather.widget.settings.title": "날씨 컴포넌트 설정", + "weather.widget.settings.desc": "모든 날씨 컴포넌트의 자동 새로고침 설정과 새로고침 빈도를 구성합니다.", + "weather.widget.settings.auto_refresh_label": "자동 새로고침", + "weather.widget.settings.auto_refresh_enabled": "자동 새로고침 활성화", + "weather.widget.settings.frequency_label": "새로고침 빈도", + "weather.widget.settings.frequency_10m": "10분", + "weather.widget.settings.frequency_12m": "12분", + "weather.widget.settings.frequency_15m": "15분", + "weather.widget.settings.frequency_30m": "30분", + "weather.widget.settings.frequency_1h": "1시간", + "weather.widget.settings.frequency_3h": "3시간", + "stcn24.widget.loading": "로딩 중...", + "stcn24.widget.loading_item": "로딩 중...", + "stcn24.widget.fetch_failed": "게시물 가져오기 실패", + "stcn24.widget.fallback_item": "게시물 없음", + "stcn24.settings.title": "STCN 24 설정", + "stcn24.settings.desc": "정보 소스, 자동 새로고침 설정과 새로고침 빈도를 구성합니다.", + "stcn24.settings.source_label": "정보 소스", + "stcn24.settings.source_latest_created": "최신 게시", + "stcn24.settings.source_latest_activity": "최신 답변", + "stcn24.settings.source_most_replies": "답변 많음", + "stcn24.settings.source_earliest_created": "가장 오래된 게시", + "stcn24.settings.source_earliest_activity": "가장 오래된 답변", + "stcn24.settings.source_least_replies": "답변 적음", + "stcn24.settings.source_frontpage_latest": "프론트 추천 (신규)", + "stcn24.settings.source_frontpage_earliest": "프론트 추천 (구형)", + "stcn24.settings.auto_refresh_label": "자동 새로고침", + "stcn24.settings.auto_refresh_enabled": "자동 새로고침 활성화", + "stcn24.settings.frequency_label": "새로고침 빈도", + "stcn24.settings.frequency_5m": "5분", + "stcn24.settings.frequency_10m": "10분", + "stcn24.settings.frequency_20m": "20분", + "stcn24.settings.frequency_30m": "30분", + "stcn24.settings.frequency_1h": "1시간", + "stcn24.settings.frequency_3h": "3시간", + "exchange.widget.loading": "환율 로딩 중...", + "exchange.widget.fetch_failed": "환율 가져오기 실패", + "cnrnews.settings.title": "CNR 뉴스 설정", + "cnrnews.settings.desc": "뉴스 자동 순환과 새로고침 빈도를 구성합니다.", + "cnrnews.settings.auto_rotate_label": "자동 순환", + "cnrnews.settings.auto_rotate_enabled": "자동 순환 활성화", + "cnrnews.settings.frequency_label": "순환 빈도", + "cnrnews.settings.frequency_5m": "5분", + "cnrnews.settings.frequency_10m": "10분", + "cnrnews.settings.frequency_40m": "40분", + "cnrnews.settings.frequency_1h": "1시간", + "cnrnews.settings.frequency_12h": "12시간", + "cnrnews.settings.frequency_24h": "24시간", + "artwork.settings.title": "매일 이미지 설정", + "artwork.settings.desc": "매일 이미지의 데이터 소스를 전환합니다.", + "artwork.settings.source_label": "미러 소스", + "artwork.settings.source_domestic": "국내 미러", + "artwork.settings.source_overseas": "해외 미러", + "artwork.settings.source_status_domestic": "현재 소스: 국내 미러 (중국 네트워크 우선)", + "artwork.settings.source_status_overseas": "현재 소스: 해외 미러 (미술관 추천)", + "music.widget.unsupported": "현재 플랫폼에서 음악 제어를 지원하지 않습니다", + "music.widget.unsupported_hint": "이 컴포넌트는 Windows SMTC만 지원합니다", + "music.widget.no_session": "음원 없음", + "music.widget.no_session_hint": "앱 스토어에서 \"QQ Music/Kugou Music/NetEase Cloud Music\"을 다운로드한 후 사용하세요", + "music.widget.open_player": "플레이어 열기", + "music.widget.unknown_title": "알 수 없는 곡", + "music.widget.unknown_artist": "알 수 없는 아티스트", + "music.widget.status.opened": "열림", + "music.widget.status.changing": "전환 중", + "music.widget.status.stopped": "정지됨", + "music.widget.status.playing": "재생 중", + "music.widget.status.paused": "일시정지됨", + "recording.widget.title": "녹음", + "recording.widget.hint.ready": "빨간 버튼을 클릭하여 시작", + "recording.widget.hint.recording": "녹음 중", + "recording.widget.hint.paused": "일시정지됨", + "recording.widget.hint.unsupported": "마이크를 사용할 수 없음", + "recording.widget.hint.error": "녹음 실패", + "recording.widget.hint.saved_format": "{0} 저장됨", + "recording.widget.save_picker_title": "녹음 파일 저장", + "recording.widget.save_picker_type": "WAV 오디오", + "study.environment.status_label": "환경 상태", + "study.environment.status.initializing": "초기화 중", + "study.environment.status.ready": "대기", + "study.environment.status.quiet": "조용함", + "study.environment.status.noisy": "시끄러움", + "study.environment.status.paused": "일시정지됨", + "study.environment.status.error": "오류", + "study.environment.status.unsupported": "지원하지 않음", + "study.environment.value.unavailable": "--", + "study.environment.value.display_format": "{0:F1} dB", + "study.environment.value.dbfs_format": "{0:F1} dBFS", + "component.removable_storage": "이동식 저장소", + "removable_storage.settings.desc": "연결된 USB 드라이브를 바탕화면에 표시하고 열기 및 꺼내기 작업을 제공합니다.", + "removable_storage.settings.behavior_title": "동작", + "removable_storage.settings.behavior_desc": "컴포넌트는 이동식 저장 장치를 자동으로 모니터링하고 가장 최근에 연결된 USB 드라이브를 우선 표시합니다.", + "removable_storage.action.open": "열기", + "removable_storage.action.eject": "꺼내기", + "removable_storage.widget.default_name": "이동식 디스크", + "removable_storage.widget.empty_title": "연결된 기기 없음", + "removable_storage.widget.empty_subtitle": "USB 드라이브를 연결하면 여기에 자동으로 표시됩니다.", + "removable_storage.widget.empty_hint": "이동식 기기를 연결하기 전까지 하단 버튼은 비활성화됩니다.", + "removable_storage.widget.ready": "준비 완료, 바로 열거나 꺼낼 수 있습니다.", + "removable_storage.widget.ejecting": "기기 꺼내는 중...", + "removable_storage.widget.eject_failed": "이 기기를 꺼낼 수 없습니다. 사용 중인 파일을 닫은 후 다시 시도하세요.", + "removable_storage.widget.open_failed": "이 기기를 열지 못했습니다.", + "removable_storage.widget.refresh_failed": "이동식 저장소 목록 새로고침 실패.", + "study.environment.settings.title": "환경 컴포넌트 설정", + "study.environment.settings.desc": "오른쪽 실시간 소음 값 표시 내용을 구성합니다.", + "study.environment.settings.show_display_db": "display dB 표시", + "study.environment.settings.show_dbfs": "dBFS 표시", + "study.environment.settings.hint": "최소 하나의 표시 방식을 활성화하세요.", + "study.session_control.action.start": "공부 시간 시작", + "study.session_control.action.stop": "공부 시간 종료", + "study.session_control.idle_hint": "오른쪽 버튼을 클릭하여 시작", + "study.session_control.report_preview": "보고서 미리보기", + "study.session_control.report_confirm_hint": "오른쪽을 클릭하여 보기 종료 확인", + "study.session_control.running_elapsed_format": "{0} 진행됨", + "study.session_control.last_session_format": "마지막 시간 {0}", + "study.session_control.start_failed": "시작 실패", + "study.session_control.stop_failed": "종료 실패", + "study.session_history.title": "기록 시간", + "study.session_history.empty": "기록 시간 없음", + "study.session_history.select_failed": "전환 실패", + "study.session_history.rename_failed": "이름 변경 실패", + "study.session_history.delete_failed": "삭제 실패", + "study.session_history.rename_placeholder": "시간 이름 입력", + "study.session_history.rename_confirm": "이름 변경 확인", + "study.session_history.rename_cancel": "이름 변경 취소", + "study.session_history.loading": "데이터 로딩 중...", + "study.session_history.loaded": "데이터 로드됨", + "study.session_history.duration_format": "{0:hh\\:mm\\:ss}", + "study.session_history.meta_format": "{0} · 평균 {1:F1}", + "study.session_history.action.view": "보기", + "study.session_history.action.rename": "이름 변경", + "study.session_history.action.delete": "삭제", + "study.session_history.dialog.rename_title": "시간 이름 변경", + "study.session_history.dialog.rename_message": "\"{0}\"의 새 이름을 입력하세요.", + "study.session_history.dialog.delete_title": "시간 삭제", + "study.session_history.dialog.delete_message": "\"{0}\"을(를) 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.", + "study.session_history.dialog.delete_confirm": "삭제 확인", + "study.noise_curve.value_format": "{0:F1} dB", + "study.noise_curve.axis.now": "현재", + "study.noise_distribution.title": "소음 레벨 분포", + "study.noise_distribution.mode.realtime": "실시간", + "study.noise_distribution.mode.session": "시간", + "study.noise_distribution.summary.mainly_format": "주로: {0}", + "study.noise_distribution.summary.latest_format": "최신: {0}", + "study.noise_distribution.summary.compact_format": "주 {0} · 신 {1}", + "study.noise_distribution.level.quiet": "조용함", + "study.noise_distribution.level.normal": "보통", + "study.noise_distribution.level.noisy": "시끄러움", + "study.noise_distribution.level.extreme": "매우 시끄러움", + "study.noise_distribution.axis.extreme": "매우 시끄러움", + "study.noise_distribution.axis.noisy": "시끄러움", + "study.noise_distribution.axis.normal": "보통", + "study.noise_distribution.axis.quiet": "조용함", + "study.noise_distribution.axis.now": "현재", + "study.score_overview.title": "공부 점수", + "study.score_overview.mode.realtime": "실시간", + "study.score_overview.mode.session": "시간", + "study.score_overview.current": "현재", + "study.score_overview.average": "평균", + "study.score_overview.minimum": "최저", + "study.score_overview.maximum": "최고", + "study.score_overview.average_short": "평", + "study.score_overview.minimum_short": "저", + "study.score_overview.maximum_short": "고", + "study.score_overview.unavailable": "--", + "study.deduction.title": "감점 원인", + "study.deduction.mode.realtime": "실시간", + "study.deduction.mode.session": "시간", + "study.deduction.reason.sustained": "지속적 소음", + "study.deduction.reason.time": "임계 초과 시간", + "study.deduction.reason.segment": "방해 빈도", + "study.deduction.reason.sustained_short": "지속", + "study.deduction.reason.time_short": "시간", + "study.deduction.reason.segment_short": "방해", + "study.deduction.metric.sustained_format": "p50 {0:F1} dBFS", + "study.deduction.metric.sustained_short_format": "p50 {0:F1}", + "study.deduction.metric.time_format": "임계 초과 {0:F1}%", + "study.deduction.metric.time_short_format": "{0:F1}%", + "study.deduction.metric.segment_format": "{0:F1}회/분", + "study.deduction.metric.segment_short_format": "{0:F1}/분", + "study.deduction.loss_format": "-{0:F1}", + "study.deduction.total_loss_format": "총 감점 -{0:F1}", + "study.deduction.total_score_format": "점수 {0:F1}", + "study.deduction.total_loss_unavailable": "총 감점 {0}", + "study.deduction.total_score_unavailable": "점수 {0}", + "study.deduction.unavailable": "--", + "study.interrupt_density.title": "방해 밀도", + "study.interrupt_density.mode.realtime": "실시간", + "study.interrupt_density.mode.session": "시간", + "study.interrupt_density.unit": "회/분", + "study.interrupt_density.segment_count": "방해 횟수", + "study.interrupt_density.segment_count_short": "횟수", + "study.interrupt_density.duration": "통계 시간", + "study.interrupt_density.duration_short": "시간", + "study.interrupt_density.density_value_format": "{0:F1}", + "study.interrupt_density.segment_count_value_format": "{0}", + "study.interrupt_density.level_format": "방해 레벨: {0}", + "study.interrupt_density.level.calm": "낮음", + "study.interrupt_density.level.normal": "보통", + "study.interrupt_density.level.frequent": "높음", + "study.interrupt_density.level.severe": "매우 높음", + "study.interrupt_density.threshold_format": "최대 감점 임계값 {0:F1}회/분", + "study.interrupt_density.unavailable": "--", + "desktop.add_page": "새 페이지 추가", + "desktop.delete_page": "페이지 삭제", + "placement.fill": "채우기", + "placement.fit": "맞추기", + "placement.stretch": "늘리기", + "placement.center": "가운데", + "placement.tile": "바둑판", + "single_instance.notice.title": "앱이 이미 실행 중입니다", + "single_instance.notice.description": "앱이 이미 실행 중이므로 여러 번 클릭하여 열 필요가 없습니다.", + "single_instance.notice.button": "확인", + "market.status.install_success_restart_format": "✓ 플러그인 '{0}' 설치 성공! 활성화하려면 앱을 재시작하세요.", + "market.dialog.restart_message_format": "플러그인 '{0}'이(가) 성공적으로 설치되었습니다.\n\n이 플러그인을 사용하려면 앱을 즉시 재시작해야 합니다.\n\n지금 재시작하시겠습니까?" + } diff --git a/LanMountainDesktop/Services/FontFamilyService.cs b/LanMountainDesktop/Services/FontFamilyService.cs new file mode 100644 index 0000000..8afd7ce --- /dev/null +++ b/LanMountainDesktop/Services/FontFamilyService.cs @@ -0,0 +1,48 @@ +using System; +using Avalonia.Media; + +namespace LanMountainDesktop.Services; + +public sealed class FontFamilyService +{ + private const string FontsBasePath = "avares://LanMountainDesktop/Assets/Fonts"; + + public static readonly FontFamily DefaultFontFamily = + new($"{FontsBasePath}#MiSans"); + + public static readonly FontFamily JapaneseFontFamily = + new($"{FontsBasePath}#MiSans"); + + public static readonly FontFamily KoreanFontFamily = + new($"Malgun Gothic, {FontsBasePath}#MiSans"); + + public FontFamily GetFontFamilyForLanguage(string? languageCode) + { + if (string.IsNullOrWhiteSpace(languageCode)) + { + return DefaultFontFamily; + } + + return languageCode.ToLowerInvariant() switch + { + "ja-jp" or "ja" => JapaneseFontFamily, + "ko-kr" or "ko" => KoreanFontFamily, + _ => DefaultFontFamily + }; + } + + public string GetFontFamilyResourceKey(string? languageCode) + { + if (string.IsNullOrWhiteSpace(languageCode)) + { + return "AppFontFamily"; + } + + return languageCode.ToLowerInvariant() switch + { + "ja-jp" or "ja" => "AppFontFamilyJP", + "ko-kr" or "ko" => "AppFontFamilyKR", + _ => "AppFontFamily" + }; + } +} diff --git a/LanMountainDesktop/Services/LocalizationService.cs b/LanMountainDesktop/Services/LocalizationService.cs index 961d907..0ce65e5 100644 --- a/LanMountainDesktop/Services/LocalizationService.cs +++ b/LanMountainDesktop/Services/LocalizationService.cs @@ -45,6 +45,7 @@ public sealed class LocalizationService { "en-us" or "en" => "en-US", "ja-jp" or "ja" => "ja-JP", + "ko-kr" or "ko" => "ko-KR", _ => "zh-CN" }; } diff --git a/LanMountainDesktop/ViewModels/SettingsViewModels.cs b/LanMountainDesktop/ViewModels/SettingsViewModels.cs index b46b755..58b5892 100644 --- a/LanMountainDesktop/ViewModels/SettingsViewModels.cs +++ b/LanMountainDesktop/ViewModels/SettingsViewModels.cs @@ -327,7 +327,8 @@ public sealed partial class GeneralSettingsPageViewModel : ViewModelBase [ new SelectionOption("zh-CN", L("settings.region.language_zh", "中文")), new SelectionOption("en-US", L("settings.region.language_en", "English")), - new SelectionOption("ja-JP", L("settings.region.language_ja", "日本語")) + new SelectionOption("ja-JP", L("settings.region.language_ja", "日本語")), + new SelectionOption("ko-KR", L("settings.region.language_ko", "한국어")) ]; }