diff --git a/DevLog/Presentation/ViewModel/ProfileViewModel.swift b/DevLog/Presentation/ViewModel/ProfileViewModel.swift index 647c2f4c..143d3937 100644 --- a/DevLog/Presentation/ViewModel/ProfileViewModel.swift +++ b/DevLog/Presentation/ViewModel/ProfileViewModel.swift @@ -262,7 +262,11 @@ extension ProfileViewModel { let year = calendar.component(.year, from: start) let month = calendar.component(.month, from: start) let quarter = ((month - 1) / 3) + 1 - return "\(year) Q\(quarter)" + return String.localizedStringWithFormat( + String(localized: "profile_year_quarter_format"), + String(year), + String(quarter) + ) } var selectedDayActivities: [ProfileSelectedDayActivity] { diff --git a/DevLog/Resource/Localizable.xcstrings b/DevLog/Resource/Localizable.xcstrings index 88bdc7b0..67dd6dbd 100644 --- a/DevLog/Resource/Localizable.xcstrings +++ b/DevLog/Resource/Localizable.xcstrings @@ -2,71 +2,37 @@ "sourceLanguage" : "ko", "strings" : { "" : { - - }, - "#%lld" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "#%1$lld" - } - } - } - }, - "%@ 검색" : { - "extractionState" : "stale", "localizations" : { "en" : { "stringUnit" : { "state" : "translated", - "value" : "Search %1$@" + "value" : "" } } - } + }, + "shouldTranslate" : false }, - "%@의 제목이나 내용을 검색해 보세요." : { - "extractionState" : "stale", + "#%lld" : { "localizations" : { "en" : { "stringUnit" : { "state" : "translated", - "value" : "Search titles or content in %1$@." + "value" : "#%lld" } } - } + }, + "shouldTranslate" : false }, "%lld" : { "localizations" : { "en" : { "stringUnit" : { "state" : "translated", - "value" : "%1$lld" - } - } - } - }, - "%lld개 필터가 적용됨" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "%1$lld filters applied" - } - } - } - }, - "%lld주" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Week %1$lld" + "value" : "%lld" } } - } + }, + "shouldTranslate" : false }, "account_alert_already_linked_message" : { "extractionState" : "manual", @@ -238,23 +204,6 @@ } } }, - "account_title" : { - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Account" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "계정 연동" - } - } - } - }, "account_toast_link_success" : { "extractionState" : "manual", "localizations" : { @@ -267,7 +216,7 @@ "ko" : { "stringUnit" : { "state" : "translated", - "value" : "계정이 성공적으로 연결되었습니다." + "value" : "계정이 성공적으로 연결됐어요." } } } @@ -284,7 +233,7 @@ "ko" : { "stringUnit" : { "state" : "translated", - "value" : "계정 연결이 성공적으로 해제되었습니다." + "value" : "계정 연결이 성공적으로 해제됐어요." } } } @@ -425,23 +374,6 @@ } } }, - "home_content_title" : { - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Content" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "컨텐츠" - } - } - } - }, "home_invalid_url_message" : { "extractionState" : "manual", "localizations" : { @@ -488,7 +420,7 @@ "ko" : { "stringUnit" : { "state" : "translated", - "value" : "최근 수정한 Todo가 없습니다." + "value" : "최근 수정한 Todo가 없어요." } } } @@ -510,36 +442,19 @@ } } }, - "home_title" : { - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Home" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "홈" - } - } - } - }, "home_web_empty" : { "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Saved web pages appear here." } }, "ko" : { "stringUnit" : { "state" : "translated", - "value" : "저장한 Web Page가 표시됩니다." + "value" : "저장한 웹 페이지가 표시돼요." } } } @@ -588,23 +503,6 @@ } } }, - "lime_green" : { - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Lime Green" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "라임 그린" - } - } - } - }, "login_apple_sign_in" : { "extractionState" : "manual", "localizations" : { @@ -668,7 +566,7 @@ "ko" : { "stringUnit" : { "state" : "translated", - "value" : "로그인하면 사용 약관 및 개인 정보 취급 방침에 동의하게 됩니다." + "value" : "로그인하면 사용 약관 및 개인 정보 취급 방침에 동의하게 돼요." } } } @@ -685,46 +583,58 @@ "ko" : { "stringUnit" : { "state" : "translated", - "value" : "알림 배지를 불러오는 중 문제가 발생했습니다." + "value" : "알림 배지를 불러오는 중 문제가 발생했어요." } } } }, - "Markdown 미리보기" : { - "extractionState" : "stale", + "nav_account" : { + "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { "state" : "translated", - "value" : "Markdown Preview" + "value" : "Account" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "계정 연동" } } } }, - "Markdown 지원 · 예: # 제목, - 목록, **굵게**, - refs #번호" : { - "extractionState" : "stale", + "nav_home" : { + "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { "state" : "translated", - "value" : "Markdown supported, e.g. # Heading, - List, **Bold**, - refs #123" + "value" : "Home" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "홈" } } } }, - "nav_home" : { + "nav_home_content" : { "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { "state" : "translated", - "value" : "Home" + "value" : "Content" } }, "ko" : { "stringUnit" : { "state" : "translated", - "value" : "홈" + "value" : "컨텐츠" } } } @@ -763,87 +673,104 @@ } } }, - "nav_today" : { + "nav_push_notifications" : { "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { "state" : "translated", - "value" : "Today" + "value" : "Notifications" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "받은 푸시 알람" + } + } + } + }, + "nav_push_settings" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Notifications" } }, "ko" : { "stringUnit" : { "state" : "translated", - "value" : "오늘" + "value" : "알람" } } } }, - "night_sky" : { + "nav_settings" : { "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { "state" : "translated", - "value" : "Night Sky" + "value" : "Settings" } }, "ko" : { "stringUnit" : { "state" : "translated", - "value" : "밤하늘" + "value" : "설정" } } } }, - "orange" : { + "nav_theme" : { "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { "state" : "translated", - "value" : "Orange" + "value" : "Theme" } }, "ko" : { "stringUnit" : { "state" : "translated", - "value" : "오렌지" + "value" : "테마" } } } }, - "pink" : { + "nav_today" : { "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { "state" : "translated", - "value" : "Pink" + "value" : "Today" } }, "ko" : { "stringUnit" : { "state" : "translated", - "value" : "핑크" + "value" : "투데이" } } } }, - "primary" : { + "nav_todo_manage" : { "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { "state" : "translated", - "value" : "Default" + "value" : "Edit TODO" } }, "ko" : { "stringUnit" : { "state" : "translated", - "value" : "기본" + "value" : "TODO 편집" } } } @@ -984,87 +911,104 @@ } } }, - "profile_quarterly_activity" : { + "profile_quarter_format" : { "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { "state" : "translated", - "value" : "Quarterly Activity" + "value" : "Q%1$lld" } }, "ko" : { "stringUnit" : { "state" : "translated", - "value" : "분기별 활동" + "value" : "%1$lld분기" } } } }, - "profile_select_quarter" : { + "profile_year_quarter_format" : { "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { "state" : "translated", - "value" : "Select Quarter" + "value" : "Q%2$@ %1$@" } }, "ko" : { "stringUnit" : { "state" : "translated", - "value" : "분기 선택" + "value" : "%1$@년 %2$@분기" } } } }, - "profile_status_placeholder" : { + "profile_quarterly_activity" : { "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { "state" : "translated", - "value" : "Set Status" + "value" : "Quarterly Activity" } }, "ko" : { "stringUnit" : { "state" : "translated", - "value" : "상태 설정" + "value" : "분기별 활동" } } } }, - "profile_week_axis" : { + "profile_select_quarter" : { "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { "state" : "translated", - "value" : "Week" + "value" : "Select Quarter" } }, "ko" : { "stringUnit" : { "state" : "translated", - "value" : "주차" + "value" : "분기 선택" + } + } + } + }, + "profile_status_placeholder" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Set Status" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "상태 설정" } } } }, - "profile_week_format" : { + "profile_week_axis" : { "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { "state" : "translated", - "value" : "Week %1$lld" + "value" : "Week" } }, "ko" : { "stringUnit" : { "state" : "translated", - "value" : "%1$lld주" + "value" : "주차" } } } @@ -1154,23 +1098,6 @@ } } }, - "profile_year_option_format" : { - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "%1$lld" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "%1$lld년" - } - } - } - }, "push_clear_all_filters" : { "extractionState" : "manual", "localizations" : { @@ -1217,24 +1144,7 @@ "ko" : { "stringUnit" : { "state" : "translated", - "value" : "받은 알림이 없습니다." - } - } - } - }, - "push_notifications_title" : { - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notifications" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "받은 푸시 알람" + "value" : "받은 알림이 없어요." } } } @@ -1302,24 +1212,7 @@ "ko" : { "stringUnit" : { "state" : "translated", - "value" : "설정에서의 푸시 알람 설정과 별개입니다." - } - } - } - }, - "push_settings_title" : { - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Alerts" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "알람" + "value" : "설정에서의 푸시 알람 설정과는 별개예요." } } } @@ -1511,33 +1404,6 @@ } } }, - "Q%lld" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Q%1$lld" - } - } - } - }, - "rainbow" : { - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Rainbow" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "무지개" - } - } - } - }, "relative_time_days_ago_format" : { "extractionState" : "manual", "localizations" : { @@ -1606,24 +1472,7 @@ } } }, - "relative_time_updated_suffix" : { - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : " updated" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : " 업데이트" - } - } - } - }, - "relative_time_updated_format" : { + "relative_time_updated_format" : { "extractionState" : "manual", "localizations" : { "en" : { @@ -1652,7 +1501,7 @@ "ko" : { "stringUnit" : { "state" : "translated", - "value" : "인터넷 연결을 확인해주세요." + "value" : "네트워크 연결을 확인해주세요." } } } @@ -1703,7 +1552,7 @@ "ko" : { "stringUnit" : { "state" : "translated", - "value" : "검색 결과가 없습니다." + "value" : "검색 결과가 없어요." } } } @@ -1839,7 +1688,7 @@ "ko" : { "stringUnit" : { "state" : "translated", - "value" : "회원 탈퇴가 진행되면 모든 데이터가 지워지고 복구할 수 없습니다." + "value" : "회원 탈퇴가 진행되면 모든 데이터가 지워지고 복구할 수 없어요." } } } @@ -1975,7 +1824,7 @@ "ko" : { "stringUnit" : { "state" : "translated", - "value" : "신규 기능을 빠르게 만나볼 수 있습니다" + "value" : "신규 기능을 빠르게 만나볼 수 있어요" } } } @@ -2048,23 +1897,6 @@ } } }, - "settings_title" : { - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Settings" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "설정" - } - } - } - }, "settings_version" : { "extractionState" : "manual", "localizations" : { @@ -2082,40 +1914,6 @@ } } }, - "sky" : { - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sky" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "하늘" - } - } - } - }, - "sun" : { - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sun" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "태양" - } - } - } - }, "system_theme_automatic" : { "extractionState" : "manual", "localizations" : { @@ -2167,23 +1965,6 @@ } } }, - "theme_title" : { - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Theme" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "테마" - } - } - } - }, "today_complete_action" : { "extractionState" : "manual", "localizations" : { @@ -2298,7 +2079,7 @@ "ko" : { "stringUnit" : { "state" : "translated", - "value" : "완료되지 않은 일이 생기면 이곳에서 우선순위대로 볼 수 있습니다." + "value" : "완료되지 않은 일이 생기면 이곳에서 우선순위대로 볼 수 있어요." } } } @@ -2315,7 +2096,7 @@ "ko" : { "stringUnit" : { "state" : "translated", - "value" : "남아 있는 Todo가 없습니다." + "value" : "남아 있는 Todo가 없어요." } } } @@ -2332,7 +2113,7 @@ "ko" : { "stringUnit" : { "state" : "translated", - "value" : "곧 마감되는 Todo가 생기면 이곳에서 먼저 볼 수 있습니다." + "value" : "곧 마감되는 Todo가 생기면 이곳에서 먼저 볼 수 있어요." } } } @@ -2349,7 +2130,7 @@ "ko" : { "stringUnit" : { "state" : "translated", - "value" : "7일 내 일정이 없습니다." + "value" : "7일 내 일정이 없어요." } } } @@ -2383,7 +2164,7 @@ "ko" : { "stringUnit" : { "state" : "translated", - "value" : "선택한 보기 옵션에 맞는 Todo가 없습니다." + "value" : "선택한 보기 옵션에 맞는 Todo가 없어요." } } } @@ -2400,7 +2181,7 @@ "ko" : { "stringUnit" : { "state" : "translated", - "value" : "중요 표시한 Todo가 생기면 이곳에서 바로 볼 수 있습니다." + "value" : "중요 표시한 Todo가 생기면 이곳에서 바로 볼 수 있어요." } } } @@ -2417,7 +2198,7 @@ "ko" : { "stringUnit" : { "state" : "translated", - "value" : "집중할 일이 없습니다." + "value" : "집중할 일이 없어요." } } } @@ -2434,7 +2215,7 @@ "ko" : { "stringUnit" : { "state" : "translated", - "value" : "지금은 기한이 지난 Todo가 없습니다." + "value" : "지금은 기한이 지난 Todo가 없어요." } } } @@ -2451,7 +2232,7 @@ "ko" : { "stringUnit" : { "state" : "translated", - "value" : "지난 마감 Todo가 없습니다." + "value" : "지난 마감 Todo가 없어요." } } } @@ -2485,7 +2266,7 @@ "ko" : { "stringUnit" : { "state" : "translated", - "value" : "중요 표시한 Todo만 표시됩니다." + "value" : "중요 표시한 Todo만 표시돼요." } } } @@ -2643,40 +2424,6 @@ } } }, - "today_title" : { - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Today" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "오늘" - } - } - } - }, - "web_page_missing_title" : { - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Unable to find this web page" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "웹페이지를 찾을 수 없습니다" - } - } - } - }, "TODO" : { "localizations" : { "en" : { @@ -2687,17 +2434,6 @@ } } }, - "TODO 편집" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Edit TODO" - } - } - } - }, "todo_add" : { "extractionState" : "manual", "localizations" : { @@ -2891,13 +2627,13 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Completed + Incomplete" + "value" : "all" } }, "ko" : { "stringUnit" : { "state" : "translated", - "value" : "완료 + 미완료" + "value" : "전체" } } } @@ -3220,7 +2956,7 @@ "ko" : { "stringUnit" : { "state" : "translated", - "value" : "작성된 내용이 없습니다." + "value" : "작성된 내용이 없어요." } } } @@ -3271,7 +3007,7 @@ "ko" : { "stringUnit" : { "state" : "translated", - "value" : "검색 결과가 없습니다." + "value" : "검색 결과가 없어요." } } } @@ -3480,23 +3216,6 @@ } } }, - "todo_manage_title" : { - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Edit TODO" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "TODO 편집" - } - } - } - }, "todo_no_tags" : { "extractionState" : "manual", "localizations" : { @@ -3694,17 +3413,6 @@ } } }, - "URL" : { - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "URL" - } - } - } - }, "Web Page" : { "localizations" : { "en" : { @@ -3725,877 +3433,19 @@ } } }, - "개인정보 처리방침" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Privacy Policy" - } - } - } - }, - "검색" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Search" - } - } - } - }, - "검색 결과가 없습니다." : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "No results found." - } - } - } - }, - "검색어를 입력해 저장한 앱 컨텐츠를 찾아보세요." : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Enter a search term to find your saved content." - } - } - } - }, - "계정 연동" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Account" - } - } - } - }, - "기간" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Period" - } - } - } - }, - "더보기" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Show More" - } - } - } - }, - "로그아웃" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sign Out" - } - } - } - }, - "로그인하면 사용 약관 및 개인 정보 취급 방침에 동의하게 됩니다." : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "By signing in, you agree to the Terms of Service and Privacy Policy." - } - } - } - }, - "마감일" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Due Date" - } - } - } - }, - "모든 필터 지우기" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Clear All Filters" - } - } - } - }, - "미리보기" : { - "extractionState" : "stale", + "web_page_missing_title" : { + "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { "state" : "translated", - "value" : "Preview" + "value" : "Unable to find this web page" } - } - } - }, - "받은 알림이 없습니다." : { - "extractionState" : "stale", - "localizations" : { - "en" : { + }, + "ko" : { "stringUnit" : { "state" : "translated", - "value" : "No notifications received." - } - } - } - }, - "받은 푸시 알람" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notifications" - } - } - } - }, - "버전 정보" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Version" - } - } - } - }, - "베타 테스트 참여" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Join Beta Testing" - } - } - } - }, - "보기 범위" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Range" - } - } - } - }, - "분기 선택" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Select Quarter" - } - } - } - }, - "분기별 활동" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Quarterly Activity" - } - } - } - }, - "사용자 설정" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "User Settings" - } - } - } - }, - "삭제" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Delete" - } - } - } - }, - "상태 설정" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Set Status" - } - } - } - }, - "생성일" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Created At" - } - } - } - }, - "설정" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Settings" - } - } - } - }, - "설정에서의 푸시 알람 설정과 별개입니다." : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Separate from your Settings app notification preference." - } - } - } - }, - "세부 정보" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Details" - } - } - } - }, - "소셜 계정" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Social Accounts" - } - } - } - }, - "수정" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Edit" - } - } - } - }, - "신규 기능을 빠르게 만나볼 수 있습니다" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Get early access to new features." - } - } - } - }, - "알람" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Alerts" - } - } - } - }, - "알림" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notifications" - } - } - } - }, - "없음" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "None" - } - } - } - }, - "연결" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Connect" - } - } - } - }, - "연결 해제" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Disconnect" - } - } - } - }, - "연도" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Year" - } - } - } - }, - "오늘" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Today" - } - } - } - }, - "옵션" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Options" - } - } - } - }, - "완료" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Done" - } - } - } - }, - "완료 상태" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Completion Status" - } - } - } - }, - "완료일" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Completed At" - } - } - } - }, - "이 분기에는 선택한 활동이 없어요" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "No selected activity this quarter." - } - } - } - }, - "이 카테고리를 삭제하면 해당하던 TODO는 기타 카테고리로 처리됩니다.\n정말 삭제하시겠습니까?" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Deleting this category will move its TODOs to Other.\nAre you sure you want to delete it?" - } - } - } - }, - "읽지 않음" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Unread" - } - } - } - }, - "임시 데이터 삭제" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Clear Temporary Data" - } - } - } - }, - "작성된 내용이 없습니다." : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "No content has been written." - } - } - } - }, - "저장한 Web Page가 표시됩니다." : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Saved web pages appear here." - } - } - } - }, - "전체 삭제" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Clear All" - } - } - } - }, - "정렬 기준" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sort By" - } - } - } - }, - "정렬 순서" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sort Order" - } - } - } - }, - "정렬: %@" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sort: %1$@" - } - } - } - }, - "정렬: %@ / %@" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sort: %1$@ / %2$@" - } - }, - "ko" : { - "stringUnit" : { - "state" : "new", - "value" : "정렬: %1$@ / %2$@" - } - } - } - }, - "제목(필수)" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Title (Required)" - } - } - } - }, - "주간 추세" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Weekly Trend" - } - } - } - }, - "주차" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Week" - } - } - } - }, - "중요 표시" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pinned" - } - } - } - }, - "중요 표시만" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pinned Only" - } - } - } - }, - "중요 표시한 Todo만 표시됩니다." : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Only pinned todos are shown." - } - } - } - }, - "최근 검색" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Recent Searches" - } - } - } - }, - "최근 수정" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Recently Updated" - } - } - } - }, - "최근 수정한 Todo가 없습니다." : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "No recently updated todos." - } - } - } - }, - "추가" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Add" - } - } - } - }, - "카테고리" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Category" - } - } - } - }, - "카테고리 삭제" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Delete Category" - } - } - } - }, - "컨텐츠" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Content" - } - } - } - }, - "탈퇴" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Delete" - } - } - } - }, - "태그" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tags" - } - } - } - }, - "태그 없음" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "No Tags" - } - } - } - }, - "테마" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Theme" - } - } - } - }, - "편집" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Edit" - } - } - } - }, - "편집 탭에서 Markdown으로 작성하면 여기에서 서식이 적용되어 보여요." : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Write in Markdown on the Edit tab to preview formatted text here." - } - } - } - }, - "푸시 알람 활성화" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Enable Push Notifications" - } - } - } - }, - "프로필" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Profile" - } - } - } - }, - "필터 옵션" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Filter Options" - } - } - } - }, - "현재 계정" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Current Account" - } - } - } - }, - "홈" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Home" - } - } - } - }, - "활동" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Activity" - } - } - } - }, - "활동 없음" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "No Activity" - } - } - } - }, - "활동 히트맵" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Activity Heatmap" - } - } - } - }, - "회원 탈퇴" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Delete Account" + "value" : "웹페이지를 찾을 수 없어요" } } } diff --git a/DevLog/UI/Home/HomeView.swift b/DevLog/UI/Home/HomeView.swift index c5da0939..050834e7 100644 --- a/DevLog/UI/Home/HomeView.swift +++ b/DevLog/UI/Home/HomeView.swift @@ -21,7 +21,7 @@ struct HomeView: View { webPageSection } .listStyle(.insetGrouped) - .navigationTitle(String(localized: "home_title")) + .navigationTitle(String(localized: "nav_home")) .navigationDestination(for: Path.self) { path in switch path { case .category(let item): @@ -333,7 +333,7 @@ struct HomeView: View { .foregroundStyle(Color(.label)) } } - .navigationTitle(String(localized: "home_content_title")) + .navigationTitle(String(localized: "nav_home_content")) .navigationBarTitleDisplayMode(.inline) .toolbar { ToolbarItem(placement: .topBarLeading) { diff --git a/DevLog/UI/Home/TodoManageView.swift b/DevLog/UI/Home/TodoManageView.swift index 0005e7a1..8019d9f9 100644 --- a/DevLog/UI/Home/TodoManageView.swift +++ b/DevLog/UI/Home/TodoManageView.swift @@ -50,7 +50,7 @@ struct TodoManageView: View { .listRowInsets(EdgeInsets()) } .environment(\.editMode, .constant(.active)) - .navigationTitle(String(localized: "todo_manage_title")) + .navigationTitle(String(localized: "nav_todo_manage")) .navigationBarTitleDisplayMode(.inline) .navigationBarBackButtonHidden() .sheet(isPresented: Binding( diff --git a/DevLog/UI/Profile/ProfileHeatmapView.swift b/DevLog/UI/Profile/ProfileHeatmapView.swift index 9a264aa7..b6072093 100644 --- a/DevLog/UI/Profile/ProfileHeatmapView.swift +++ b/DevLog/UI/Profile/ProfileHeatmapView.swift @@ -52,32 +52,51 @@ struct ProfileHeatmapView: View { 6: String(localized: "profile_weekday_fri") ] let orderedWeekdays = Array(1...7) + let labelFontSize = smallestWeekdayLabelFontSize( + labels: Array(labels.values), + layout: layout + ) VStack(alignment: .leading, spacing: layout.cellSpacing) { ForEach(orderedWeekdays, id: \.self) { weekday in - Group { - if let label = labels[weekday] { - Text(label) - .font(.caption2) - .foregroundStyle(.secondary) - .frame( - width: layout.cellSize, - height: layout.cellSize, - alignment: .leading - ) - } else { - Color.clear - .frame( - width: layout.cellSize, - height: layout.cellSize - ) - } + if let label = labels[weekday] { + Text(label) + .font(.system(size: labelFontSize)) + .allowsTightening(true) + .foregroundStyle(.secondary) + .frame( + width: layout.cellSize, + height: layout.cellSize, + alignment: .leading + ) + } else { + Color.clear + .frame( + width: layout.cellSize, + height: layout.cellSize + ) } } } .padding(.top, layout.weekdayTopPadding) } + private func smallestWeekdayLabelFontSize(labels: [String], layout: ProfileHeatmapLayout) -> CGFloat { + let captionFont = UIFont.preferredFont(forTextStyle: .caption2) + let availableWidth = max(layout.cellSize, 1) + + let fittedSizes = labels.map { label in + let textWidth = max( + (label as NSString).size(withAttributes: [.font: captionFont]).width, + 1 + ) + let widthRatio = availableWidth / textWidth + return captionFont.pointSize * min(widthRatio, 1) + } + + return max((fittedSizes.min() ?? captionFont.pointSize).rounded(.down), 1) + } + private var availableWidth: CGFloat { // ProfileView의 바깥 가로 패딩(16)과 히트맵 카드 내부 패딩(12)을 합한 값 let horizontalPadding: CGFloat = 16 + 12 diff --git a/DevLog/UI/Profile/ProfileTrendChartView.swift b/DevLog/UI/Profile/ProfileTrendChartView.swift index 5c5a0227..73517c77 100644 --- a/DevLog/UI/Profile/ProfileTrendChartView.swift +++ b/DevLog/UI/Profile/ProfileTrendChartView.swift @@ -52,22 +52,19 @@ struct ProfileTrendChartView: View { ) .chartXAxis { AxisMarks(values: axisWeekIndices) { value in - AxisGridLine(stroke: StrokeStyle(lineWidth: 0.5)) - .foregroundStyle(.quaternary) - AxisTick(stroke: StrokeStyle(lineWidth: 0.5)) - .foregroundStyle(.quaternary) AxisValueLabel { if let weekIndex = value.as(Int.self) { - Text( - String.localizedStringWithFormat( - String(localized: "profile_week_format"), - Int64(weekIndex) - ) - ) + Text("\(weekIndex)") .font(.caption2) .fixedSize() } } + if let weekIndex = value.as(Int.self), weekIndex != xDomain.upperBound { + AxisGridLine(stroke: StrokeStyle(lineWidth: 0.5)) + .foregroundStyle(.quaternary) + AxisTick(stroke: StrokeStyle(lineWidth: 0.5)) + .foregroundStyle(.quaternary) + } } } .chartYAxis { @@ -86,6 +83,10 @@ struct ProfileTrendChartView: View { .clipShape(RoundedRectangle(cornerRadius: 10)) } .frame(height: chartHeight) + + Text(String(localized: "profile_week_axis")) + .font(.caption2) + .foregroundStyle(.secondary) } else { VStack(spacing: 6) { Image(systemName: "chart.line.uptrend.xyaxis") diff --git a/DevLog/UI/Profile/ProfileView.swift b/DevLog/UI/Profile/ProfileView.swift index 6bca1d9b..c8e1c519 100644 --- a/DevLog/UI/Profile/ProfileView.swift +++ b/DevLog/UI/Profile/ProfileView.swift @@ -260,13 +260,8 @@ struct ProfileView: View { set: { viewModel.send(.setQuarterPickerYear($0)) } )) { ForEach(viewModel.availableQuarterYears, id: \.self) { year in - Text( - String.localizedStringWithFormat( - String(localized: "profile_year_option_format"), - Int64(year) - ) - ) - .tag(year) + Text(verbatim: String(year)) + .tag(year) } } .pickerStyle(.menu) @@ -304,7 +299,12 @@ struct ProfileView: View { guard let quarterStart else { return } viewModel.send(.selectQuarter(quarterStart)) } label: { - Text("Q\(quarter)") + Text( + String.localizedStringWithFormat( + String(localized: "profile_quarter_format"), + Int64(quarter) + ) + ) .font(.subheadline.weight(.semibold)) .frame(maxWidth: .infinity) .padding(.vertical, 12) diff --git a/DevLog/UI/PushNotification/PushNotificationListView.swift b/DevLog/UI/PushNotification/PushNotificationListView.swift index b2d89d72..b75bf445 100644 --- a/DevLog/UI/PushNotification/PushNotificationListView.swift +++ b/DevLog/UI/PushNotification/PushNotificationListView.swift @@ -36,7 +36,7 @@ struct PushNotificationListView: View { } } .refreshable { viewModel.send(.fetchNotifications) } - .navigationTitle(String(localized: "push_notifications_title")) + .navigationTitle(String(localized: "nav_push_notifications")) .alert( "", isPresented: Binding( diff --git a/DevLog/UI/Setting/AccountView.swift b/DevLog/UI/Setting/AccountView.swift index 92e9dedc..2dbcbd57 100644 --- a/DevLog/UI/Setting/AccountView.swift +++ b/DevLog/UI/Setting/AccountView.swift @@ -51,7 +51,7 @@ struct AccountView: View { } .scrollDisabled(true) .listStyle(.insetGrouped) - .navigationTitle(String(localized: "account_title")) + .navigationTitle(String(localized: "nav_account")) .onAppear { viewModel.send(.onAppear) } diff --git a/DevLog/UI/Setting/PushNotificationSettingsView.swift b/DevLog/UI/Setting/PushNotificationSettingsView.swift index de33514d..37f48119 100644 --- a/DevLog/UI/Setting/PushNotificationSettingsView.swift +++ b/DevLog/UI/Setting/PushNotificationSettingsView.swift @@ -61,7 +61,7 @@ struct PushNotificationSettingsView: View { .opacity(viewModel.state.pushNotificationEnable ? 1.0 : 0.2) } .listStyle(.insetGrouped) - .navigationTitle(String(localized: "push_settings_title")) + .navigationTitle(String(localized: "nav_push_settings")) .overlay { if viewModel.state.isLoading { LoadingView() diff --git a/DevLog/UI/Setting/SettingView.swift b/DevLog/UI/Setting/SettingView.swift index 9ad4cf9d..e0e1d542 100644 --- a/DevLog/UI/Setting/SettingView.swift +++ b/DevLog/UI/Setting/SettingView.swift @@ -108,7 +108,7 @@ struct SettingView: View { Spacer() } } - .navigationTitle(String(localized: "settings_title")) + .navigationTitle(String(localized: "nav_settings")) .navigationBarTitleDisplayMode(.inline) .navigationDestination(for: Path.self) { path in switch path { diff --git a/DevLog/UI/Setting/ThemeView.swift b/DevLog/UI/Setting/ThemeView.swift index b7ac0e19..3dee9ba5 100644 --- a/DevLog/UI/Setting/ThemeView.swift +++ b/DevLog/UI/Setting/ThemeView.swift @@ -52,7 +52,7 @@ struct ThemeView: View { .listStyle(.insetGrouped) .toolbar { ToolbarItem(placement: .principal) { - Text(String(localized: "theme_title")) + Text(String(localized: "nav_theme")) .bold() } } diff --git a/DevLog/UI/Today/TodayView.swift b/DevLog/UI/Today/TodayView.swift index f434f10d..2370b434 100644 --- a/DevLog/UI/Today/TodayView.swift +++ b/DevLog/UI/Today/TodayView.swift @@ -25,7 +25,7 @@ struct TodayView: View { } } .listStyle(.insetGrouped) - .navigationTitle(String(localized: "today_title")) + .navigationTitle(String(localized: "nav_today")) .toolbar { toolbarContent } .navigationDestination(for: Path.self) { path in switch path { diff --git a/docs/AppStore_Hitmap.png b/docs/AppStore_Hitmap.png new file mode 100644 index 00000000..85f49845 Binary files /dev/null and b/docs/AppStore_Hitmap.png differ diff --git a/docs/AppStore_Home.png b/docs/AppStore_Home.png new file mode 100644 index 00000000..8df7db4b Binary files /dev/null and b/docs/AppStore_Home.png differ diff --git a/docs/AppStore_Markdown.png b/docs/AppStore_Markdown.png new file mode 100644 index 00000000..08f85416 Binary files /dev/null and b/docs/AppStore_Markdown.png differ diff --git a/docs/AppStore_Notifications.png b/docs/AppStore_Notifications.png new file mode 100644 index 00000000..84dd6baa Binary files /dev/null and b/docs/AppStore_Notifications.png differ diff --git a/docs/AppStore_Today.png b/docs/AppStore_Today.png new file mode 100644 index 00000000..c0a98b1b Binary files /dev/null and b/docs/AppStore_Today.png differ diff --git a/docs/hitmap.png b/docs/hitmap.png index 26e406b1..da650ba7 100644 Binary files a/docs/hitmap.png and b/docs/hitmap.png differ diff --git a/docs/home.png b/docs/home.png index 2512cb04..2a56022d 100644 Binary files a/docs/home.png and b/docs/home.png differ diff --git a/docs/markdown.png b/docs/markdown.png index 234424b3..726e347f 100644 Binary files a/docs/markdown.png and b/docs/markdown.png differ diff --git a/docs/notification.png b/docs/notification.png index 55543cd0..fdb4ce95 100644 Binary files a/docs/notification.png and b/docs/notification.png differ diff --git a/docs/today.png b/docs/today.png index ae163832..3c008d71 100644 Binary files a/docs/today.png and b/docs/today.png differ