From 75eeb4ad4dea68b4fefa6310ef9cffac8477a3d7 Mon Sep 17 00:00:00 2001 From: YESEONG LEE Date: Tue, 18 Aug 2026 11:59:38 +0900 Subject: [PATCH] =?UTF-8?q?[#87]=20feat:=20=EC=95=B1=20=EC=A0=84=EC=B2=B4?= =?UTF-8?q?=20=ED=95=9C=EA=B5=AD=EC=96=B4/=EC=98=81=EC=96=B4=20=EB=A1=9C?= =?UTF-8?q?=EC=BB=AC=EB=9D=BC=EC=9D=B4=EC=A0=9C=EC=9D=B4=EC=85=98=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - String Catalog에 ko/en 언어 등록, 로고 조각·브랜드명 등 번역 제외 처리 - 소스 언어(en)와 어긋나던 한국어 하드코딩 alert 문구를 영어 키 + 번역으로 전환 - SecretList/CreateProject/Lock 화면의 남은 하드코딩 문자열을 .module 패턴으로 마이그레이션 - 알림 본문 문장의 영어/한국어 온점 표기를 통일 --- .../Resources/Localizable.xcstrings | 5803 ++++++++++++++--- .../CreateProject/CreateProjectFeature.swift | 12 +- .../CreateProject/CreateProjectView.swift | 12 +- .../CreateSecret/CreateSecretFeature.swift | 2 +- .../Model/CreateSecretError.swift | 2 +- .../CreateSecret/Model/ProjectLoadError.swift | 4 +- .../Sources/Features/Lock/LockView.swift | 2 +- .../Features/Onboarding/OnboardingView.swift | 6 +- .../DetailSSLRequiredFieldView.swift | 2 +- .../Model/SecretDetailError.swift | 14 +- .../SecretDetail/SecretDetailFeature.swift | 2 +- .../SecretDetail/SecretDetailView.swift | 2 +- .../SecretList/SecretListFeature.swift | 6 +- .../Features/SecretList/SecretListView.swift | 29 +- .../Settings/About/AboutSettingsView.swift | 4 +- .../Components/SettingsValueRow.swift | 2 +- .../Settings/Data/DataSettingsFeature.swift | 2 +- .../Settings/ICloud/ICloudSettingsView.swift | 8 +- .../NotificationSettingsFeature.swift | 2 +- .../Features/Sidebar/SidebarFeature.swift | 42 +- .../Features/Sidebar/SidebarView.swift | 2 +- .../SecurityNotification+Module.swift | 8 +- .../Sources/Support/ICloudSyncAlert.swift | 2 +- .../CreateProjectFeatureTests.swift | 12 +- .../CreateSecretFeatureTests.swift | 16 +- .../Onboarding/OnboardingFeatureTests.swift | 4 +- .../SecretDetailFeatureTests.swift | 2 +- .../SecretList/SecretListFeatureTests.swift | 6 +- .../Data/DataSettingsFeatureTests.swift | 2 +- .../NotificationSettingsFeatureTests.swift | 2 +- .../Tests/Sidebar/SidebarFeatureTests.swift | 30 +- 31 files changed, 4895 insertions(+), 1149 deletions(-) diff --git a/Projects/DVPresentation/Resources/Localizable.xcstrings b/Projects/DVPresentation/Resources/Localizable.xcstrings index 7bd0e88f..663c167a 100644 --- a/Projects/DVPresentation/Resources/Localizable.xcstrings +++ b/Projects/DVPresentation/Resources/Localizable.xcstrings @@ -1,1031 +1,4776 @@ { - "sourceLanguage" : "en", - "strings" : { - "" : { - - }, - "'%@' 프로젝트를 삭제할까요?" : { - - }, - "%lld min" : { - "comment" : "A user-visible string that describes a duration in minutes. The argument is the number of minutes.", - "isCommentAutoGenerated" : true - }, - "%lld sec" : { - "comment" : "A label for an option in the \"Auto-clear clipboard\" dropdown. The argument is the number of seconds selected.", - "isCommentAutoGenerated" : true - }, - "1 min" : { - "comment" : "A selectable option in the settings picker row.", - "isCommentAutoGenerated" : true - }, - "3 days before expiration" : { - "comment" : "Label for an expiry alert day option that corresponds to 3 days before expiration.", - "isCommentAutoGenerated" : true - }, - "5 min" : { - "comment" : "A selectable option in the settings picker row.", - "isCommentAutoGenerated" : true - }, - "7 days before expiration" : { - - }, - "15 min" : { - "comment" : "A tag for a 15-minute selection in the settings picker row.", - "isCommentAutoGenerated" : true - }, - "30 days before expiration" : { - - }, - "A database error occurred while loading projects. The project list may be incomplete." : { - - }, - "A database error occurred while saving the secret. Please try again." : { - "comment" : "Text displayed in an alert when saving a secret fails due to a database error.", - "isCommentAutoGenerated" : true - }, - "A saved secret expires today." : { - "comment" : "Body of a notification shown on the day a saved secret expires.", - "isCommentAutoGenerated" : true - }, - "A saved secret will expire in %lld days." : { - "comment" : "The number of days before the secret expires is dynamically inserted here.", - "isCommentAutoGenerated" : true - }, - "A secret expires today" : { - "comment" : "Title of a notification shown on the day a saved secret expires.", - "isCommentAutoGenerated" : true - }, - "A secret is expiring soon" : { - "comment" : "Title of a notification when a saved secret is expiring soon.", - "isCommentAutoGenerated" : true - }, - "A value was copied %lld times in a short period" : { - "comment" : "A description of an abnormal access notification. The argument is the number of times a value was copied.", - "isCommentAutoGenerated" : true - }, - "Abnormal access detected" : { - "comment" : "Title of the notification when an abnormal access is detected.", - "isCommentAutoGenerated" : true - }, - "About" : { - "comment" : "Title of the \"About\" settings category.", - "isCommentAutoGenerated" : true - }, - "Access Token" : { - - }, - "Access your secrets on all your\nApple devices, securely encrypted." : { - - }, - "Add new project" : { - "comment" : "Label for the \"Add new project\" button in the \"Project\" field of the CreateSecret form.", - "isCommentAutoGenerated" : true - }, - "Add Project" : { - - }, - "Add Secret" : { - "comment" : "Text for the button that allows the user to add a new secret.", - "isCommentAutoGenerated" : true - }, - "Add to favorites" : { - "comment" : "Accessibility label for the \"Add to favorites\" button in the secret detail header.", - "isCommentAutoGenerated" : true - }, - "Alert on repeated authentication failures" : { - "comment" : "Text displayed in a settings row that allows the user to enable or disable alerts when repeated authentication failures occur.", - "isCommentAutoGenerated" : true - }, - "Alert on repeated clipboard copies" : { - "comment" : "Description of a setting that alerts the user when they copy from the clipboard more than once.", - "isCommentAutoGenerated" : true - }, - "Alert timing" : { - "comment" : "Label for the timing of the expiration alert.", - "isCommentAutoGenerated" : true - }, - "All" : { - - }, - "Allow DeVault in System Settings to launch it automatically when you log in." : { - - }, - "An unexpected error occurred. Please try again." : { - - }, - "An unexpected error occurred. Your changes were not saved and are still here." : { - "comment" : "Text displayed in a notification when an unexpected error occurred while saving changes.", - "isCommentAutoGenerated" : true - }, - "API Key" : { - "comment" : "Label for the \"API Key\" option in the \"Create Secret\" screen.", - "isCommentAutoGenerated" : true - }, - "API Keys/Token" : { - "comment" : "Title of the \"Create Secret\" screen's top label.", - "isCommentAutoGenerated" : true - }, - "API Webhook Secret" : { - "comment" : "Label for the \"API Webhook Secret\" option in the \"Create Secret\" screen.", - "isCommentAutoGenerated" : true - }, - "App Shortcuts" : { - "comment" : "Title of the settings section related to app shortcuts.", - "isCommentAutoGenerated" : true - }, - "Approval required" : { - - }, - "Ascending" : { - "comment" : "A label for the ascending sort direction.", - "isCommentAutoGenerated" : true - }, - "Authentication" : { - "comment" : "Section title in the settings view for authentication-related settings.", - "isCommentAutoGenerated" : true - }, - "Authentication failed" : { - "comment" : "Title of an alert displayed when touch ID authentication fails.", - "isCommentAutoGenerated" : true - }, - "Authentication failed %lld times in a short period" : { - "comment" : "A description of an abnormal access notification. The argument is the number of times authentication failed in a short period.", - "isCommentAutoGenerated" : true - }, - "Authentication required" : { - - }, - "Authority / Scope" : { - "comment" : "Label for the \"Authority / Scope\" field in the API Key Token form section.", - "isCommentAutoGenerated" : true - }, - "Auto-clear clipboard" : { - "comment" : "Title for the setting that enables or disables automatic clearing of the clipboard after a certain period.", - "isCommentAutoGenerated" : true - }, - "Auto-detected: %@" : { - "comment" : "A hint indicating that a field value was automatically detected. The text inside the parentheses will be replaced with the actual detected value.", - "isCommentAutoGenerated" : true - }, - "Auto-lock" : { - "comment" : "Title of the toggle that enables or disables automatic locking after inactivity.", - "isCommentAutoGenerated" : true - }, - "Auto-Lock" : { - "comment" : "Section title in the Security Settings view for the Auto-Lock settings.", - "isCommentAutoGenerated" : true - }, - "Automatically applied when creating a new secret." : { - "comment" : "Description of the default environment setting in the General Settings view.", - "isCommentAutoGenerated" : true - }, - "Automatically starts DeVault when you log in to your Mac." : { - "comment" : "Description of a setting that allows a user to enable or disable automatic startup of DeVault when logging in to their Mac.", - "isCommentAutoGenerated" : true - }, - "Back to App" : { - "comment" : "Label for a button that takes the user back to the main app.", - "isCommentAutoGenerated" : true - }, - "Cancel" : { - "comment" : "The label of a button that cancels an action.", - "isCommentAutoGenerated" : true - }, - "Certificate" : { - "comment" : "Label for the certificate field in the SSL/TLS certificate form section.", - "isCommentAutoGenerated" : true - }, - "Certificate Chain" : { - - }, - "Certification JSON" : { - "comment" : "Label for the text field that allows the user to input the JSON string for the service account credential.", - "isCommentAutoGenerated" : true - }, - "Check that a login password is set in System Settings." : { - "comment" : "Message in an alert that instructs the user to check their System Settings for a login password.", - "isCommentAutoGenerated" : true - }, - "Check your device's iCloud usage restrictions." : { - - }, - "Check your network connection and try again." : { - "comment" : "Text displayed in an alert when the user's network connection is unavailable.", - "isCommentAutoGenerated" : true - }, - "Checking Status…" : { - - }, - "Clear after" : { - "comment" : "Label for the \"Clear after\" option in the \"Clipboard\" section of the security settings view.", - "isCommentAutoGenerated" : true - }, - "Client ID" : { - "comment" : "Label for the \"Client ID\" field in the \"OAuth Client\" form section.", - "isCommentAutoGenerated" : true - }, - "Client Secret" : { - - }, - "Clipboard" : { - "comment" : "Section title in the settings view for clipboard settings.", - "isCommentAutoGenerated" : true - }, - "Clipboard cleared" : { - "comment" : "Text displayed in a notification when the user clears the clipboard.", - "isCommentAutoGenerated" : true - }, - "Collapse Projects" : { - "comment" : "Accessibility label for a button that collapses the section displaying the user's projects.", - "isCommentAutoGenerated" : true - }, - "Connected" : { - "comment" : "Label for the status of the iCloud sync when it is enabled.", - "isCommentAutoGenerated" : true - }, - "Continue Without iCloud" : { - "comment" : "Text for a button that allows the user to continue using the app without syncing with iCloud.", - "isCommentAutoGenerated" : true - }, - "Couldn't delete data" : { - "comment" : "Text displayed in a notification when there is an error deleting all data.", - "isCommentAutoGenerated" : true - }, - "Couldn't determine iCloud status. Please try again in a moment." : { - "comment" : "An alert message that appears when the app cannot determine the iCloud account status.", - "isCommentAutoGenerated" : true - }, - "Couldn't update expiration alerts" : { - - }, - "Create" : { - - }, - "Create Project" : { - - }, - "Custom" : { - - }, - "Data" : { - "comment" : "Title of the settings category related to data management.", - "isCommentAutoGenerated" : true - }, - "Data on this Mac and in iCloud won't be deleted. Future changes on this Mac won't sync until iCloud Sync is turned on again." : { - - }, - "Database" : { - - }, - "De" : { - - }, - "Default environment" : { - "comment" : "Title of a section in the General Settings view that describes the default environment setting.", - "isCommentAutoGenerated" : true - }, - "Defaults" : { - "comment" : "Section title in the General Settings view that refers to the default settings.", - "isCommentAutoGenerated" : true - }, - "Delete" : { - - }, - "Delete All Data" : { - "comment" : "Title of an action that deletes all data.", - "isCommentAutoGenerated" : true - }, - "Delete Forever" : { - "comment" : "The text of a button to permanently delete an item.", - "isCommentAutoGenerated" : true - }, - "Delete Forever?" : { - - }, - "Delete Project" : { - - }, - "Deleted" : { - - }, - "Descending" : { - "comment" : "A label for the descending sort direction.", - "isCommentAutoGenerated" : true - }, - "Devault" : { - "comment" : "Name of the company behind the app.", - "isCommentAutoGenerated" : true - }, - "Devault Team" : { - "comment" : "Name of the Devault team.", - "isCommentAutoGenerated" : true - }, - "Developer" : { - "comment" : "Title of a section in the \"About\" settings view that lists the name of the Devault team.", - "isCommentAutoGenerated" : true - }, - "Development" : { - - }, - "Direction" : { - "comment" : "A label for the direction of sorting.", - "isCommentAutoGenerated" : true - }, - "Discard" : { - - }, - "Discard changes?" : { - - }, - "e.g -----BEGIN CERTIFICATE-----" : { - - }, - "e.g -----BEGIN OPENSSH PRIVATE KEY-----" : { - - }, - "e.g -----BEGIN PRIVATE KEY-----" : { - "comment" : "Placeholder text for the private key field in the SSL/TLS certificate form section.", - "isCommentAutoGenerated" : true - }, - "e.g {\"type\": \"service_account\", ...}" : { - - }, - "e.g abc123secret" : { - "comment" : "Placeholder text for the \"Client Secret\" text field in the \"OAuth Client\" form section.", - "isCommentAutoGenerated" : true - }, - "e.g certbot renew" : { - - }, - "e.g custom-secret-value" : { - "comment" : "Placeholder text for the value field in the custom secret form.", - "isCommentAutoGenerated" : true - }, - "e.g deploy.example.com" : { - "comment" : "Placeholder text for a label.", - "isCommentAutoGenerated" : true - }, - "e.g DeVault" : { - "comment" : "Placeholder text for the Name field in the CreateSecret form.", - "isCommentAutoGenerated" : true - }, - "e.g example.com" : { - - }, - "e.g FOO=bar" : { - "comment" : "Placeholder text for the \"envSet List\" text field in the form.", - "isCommentAutoGenerated" : true - }, - "e.g ghp_1234567890" : { - - }, - "e.g https://app.example/oauth/callback" : { - - }, - "e.g https://example.com" : { - - }, - "e.g my-app-client" : { - - }, - "e.g ORD-2026-0001" : { - - }, - "e.g organization-admin" : { - "comment" : "Placeholder text for the \"Authority / Scope\" text field in the `ServiceAccountSectionView`.", - "isCommentAutoGenerated" : true - }, - "e.g postgres://user:pass@host:5432/db" : { - "comment" : "Placeholder text for the \"Link String\" field in the \"Database\" form section.", - "isCommentAutoGenerated" : true - }, - "e.g read:user, write:issue" : { - - }, - "e.g repo:read, user:email" : { - - }, - "e.g root" : { - - }, - "e.g ssh-rsa AAAA..." : { - - }, - "e.g support@example.com" : { - "comment" : "Placeholder text for the \"Support Email\" field in the \"License Key\" form section.", - "isCommentAutoGenerated" : true - }, - "e.g XXXXX-XXXXX-XXXXX-XXXXX" : { - "comment" : "Placeholder text for a license key field.", - "isCommentAutoGenerated" : true - }, - "e.g. github.com" : { - "comment" : "Label text for the Services field in the CreateSecret form.", - "isCommentAutoGenerated" : true - }, - "Edit" : { - "comment" : "Accessibility label for the \"Edit\" button in the secret detail header.", - "isCommentAutoGenerated" : true - }, - "Editing is unavailable until the linked projects load. Other details are unaffected." : { - - }, - "Enable expiration alerts" : { - "comment" : "Title of a toggle row that allows the user to enable or disable expiration alerts.", - "isCommentAutoGenerated" : true - }, - "Enable Sync" : { - - }, - "Enable Touch ID" : { - - }, - "Encryption unavailable" : { - - }, - "Enterprise" : { - "comment" : "Description of a license tier when the user is an enterprise user.", - "isCommentAutoGenerated" : true - }, - "Environment" : { - - }, - "Environment Variable Set" : { - - }, - "envSet List" : { - "comment" : "Label for the \"envSet List\" field in the form.", - "isCommentAutoGenerated" : true - }, - "Etc" : { - - }, - "Excludes the DeVault window from screenshots, screen recordings, and screen sharing." : { - - }, - "Expand Projects" : { - "comment" : "Accessibility label for the button that expands the list of projects.", - "isCommentAutoGenerated" : true - }, - "Expiration Alerts" : { - "comment" : "Title of the section that controls expiration alerts.", - "isCommentAutoGenerated" : true - }, - "Expire Date" : { - "comment" : "Label for the \"Expire Date\" field in the \"Create Secret\" form.", - "isCommentAutoGenerated" : true - }, - "Expired" : { - "comment" : "Title of the sidebar filter option for expired items.", - "isCommentAutoGenerated" : true - }, - "Expires within %lld days" : { - "comment" : "A tooltip text for the `SecretExpiryStatus.critical` case.", - "isCommentAutoGenerated" : true - }, - "Expiry" : { - "comment" : "A label displayed in the context menu.", - "isCommentAutoGenerated" : true - }, - "Failed to copy" : { - "comment" : "Text displayed in a notification when a value could not be copied to the clipboard.", - "isCommentAutoGenerated" : true - }, - "Failed to delete secret" : { - "comment" : "Text displayed in an alert when a secret deletion fails.", - "isCommentAutoGenerated" : true - }, - "Failed to load" : { - "comment" : "Text displayed in the sidebar when loading the list of projects fails.", - "isCommentAutoGenerated" : true - }, - "Failed to load linked projects" : { - - }, - "Failed to load projects" : { - - }, - "Failed to load the list" : { - "comment" : "A title for an alert that indicates that the list of secrets failed to load.", - "isCommentAutoGenerated" : true - }, - "Failed to reveal secret" : { - - }, - "Failed to save changes" : { - "comment" : "Text displayed in a confirmation alert when an update operation fails.", - "isCommentAutoGenerated" : true - }, - "Failed to update favorite" : { - "comment" : "Text displayed in an alert when updating a favorite status of a secret fails.", - "isCommentAutoGenerated" : true - }, - "General" : { - "comment" : "Title of the \"General\" settings category.", - "isCommentAutoGenerated" : true - }, - "Host" : { - - }, - "iCloud" : { - "comment" : "Title of the \"iCloud\" settings category.", - "isCommentAutoGenerated" : true - }, - "iCloud Restricted" : { - - }, - "iCloud Sync" : { - "comment" : "Title of the section in the iCloud Settings view related to iCloud Sync.", - "isCommentAutoGenerated" : true - }, - "iCloud Sync Enabled!" : { - - }, - "iCloud sync isn't available" : { - "comment" : "Title of an alert when iCloud sync is unavailable.", - "isCommentAutoGenerated" : true - }, - "iCloud sync isn't available right now. Please try again later." : { - "comment" : "Text displayed in an alert when the iCloud sync status cannot be determined.", - "isCommentAutoGenerated" : true - }, - "iCloud Temporarily Unavailable" : { - - }, - "If Touch ID is unavailable,\nsystem password will be used" : { - "comment" : "Additional text below the button to inform the user that if Touch ID is unavailable, the system password will be used.", - "isCommentAutoGenerated" : true - }, - "In progress" : { - "comment" : "Accessibility label for the full-window overlay shown while a save or decryption is running. Tells assistive technology users that the window is temporarily locked." - }, - "Individual" : { - "comment" : "Description of a license tier when the user is an individual.", - "isCommentAutoGenerated" : true - }, - "Keep editing" : { - - }, - "Last update detected" : { - - }, - "Launch DeVault at login" : { - "comment" : "Title of a toggle row that allows the user to enable or disable automatic launch of DeVault at login.", - "isCommentAutoGenerated" : true - }, - "License" : { - "comment" : "Title of a settings section that links to the project license.", - "isCommentAutoGenerated" : true - }, - "License Key" : { - - }, - "Link String" : { - - }, - "Lock after inactivity" : { - "comment" : "Label for the \"Lock after inactivity\" setting in the Security Settings view.", - "isCommentAutoGenerated" : true - }, - "Lock App" : { - "comment" : "Accessibility label for the lock button in the MainView.", - "isCommentAutoGenerated" : true - }, - "Memo" : { - - }, - "MIT License" : { - "comment" : "Text for the MIT license link in the About settings view.", - "isCommentAutoGenerated" : true - }, - "Move to trash?" : { - "comment" : "Alert title when confirming to delete a secret.", - "isCommentAutoGenerated" : true - }, - "Name" : { - - }, - "Network Unavailable" : { - - }, - "New Secret" : { - - }, - "No expiration" : { - - }, - "No iCloud Account" : { - - }, - "No project selected" : { - "comment" : "Text displayed when a project is not selected.", - "isCommentAutoGenerated" : true - }, - "No projects yet" : { - - }, - "No secret selected" : { - - }, - "No secrets" : { - "comment" : "A message displayed when there are no secrets.", - "isCommentAutoGenerated" : true - }, - "Not Connected" : { - - }, - "Not Now" : { - - }, - "Not Required" : { - "comment" : "Text indicating that SSL is not required for this database.", - "isCommentAutoGenerated" : true - }, - "Notice" : { - - }, - "Notifications" : { - "comment" : "Title of the \"Notifications\" settings category.", - "isCommentAutoGenerated" : true - }, - "Notifications are turned off" : { - "comment" : "Text displayed in a notification banner when system notification permission is required for alerts to appear.", - "isCommentAutoGenerated" : true - }, - "OAuth" : { - - }, - "OAuth Client" : { - "comment" : "Title of the \"OAuth Client\" option in the \"Create Secret\" screen.", - "isCommentAutoGenerated" : true - }, - "OK" : { - - }, - "On the day of expiration" : { - "comment" : "Label for an option in the \"Expiration Alerts\" settings section that specifies the user should be notified on the exact day of expiration.", - "isCommentAutoGenerated" : true - }, - "Open Settings" : { - "comment" : "Title of the settings option in the \"App Shortcuts\" section.", - "isCommentAutoGenerated" : true - }, - "Open System Settings" : { - - }, - "optional" : { - - }, - "Order Number" : { - "comment" : "Label for the \"Order Number\" field in the \"License Key\" form section.", - "isCommentAutoGenerated" : true - }, - "PassPhrase" : { - "comment" : "Label for the passphrase field in the SSH key form section.", - "isCommentAutoGenerated" : true - }, - "Please authenticate to save the secret." : { - - }, - "Please authenticate to save your changes. Your changes are still here." : { - - }, - "Please authenticate to view the secret." : { - "comment" : "Alert message when authentication is required to view a secret.", - "isCommentAutoGenerated" : true - }, - "Please try again in a moment." : { - - }, - "Please try again." : { - "comment" : "Text for an alert that appears when the user can try again after a failure.", - "isCommentAutoGenerated" : true - }, - "Private Key" : { - - }, - "Production" : { - - }, - "Project" : { - - }, - "Project information could not be loaded. Other details are unaffected." : { - "comment" : "Alert message when project details cannot be loaded.", - "isCommentAutoGenerated" : true - }, - "Project Name" : { - - }, - "Protect the entire app window" : { - - }, - "Public Key" : { - - }, - "Recover" : { - - }, - "Redirect URL" : { - - }, - "Refresh Status" : { - - }, - "Remove from favorites" : { - "comment" : "Label for a button that removes a secret from the user's favorites.", - "isCommentAutoGenerated" : true - }, - "Rename" : { - - }, - "Renew Command" : { - - }, - "Require authentication on app launch" : { - "comment" : "Title of a toggle row that allows the user to enable or disable requiring authentication on app launch.", - "isCommentAutoGenerated" : true - }, - "Require authentication to copy secret" : { - "comment" : "Title of a toggle row in the \"Security\" settings section that allows the user to toggle whether they need to authenticate to copy a secret.", - "isCommentAutoGenerated" : true - }, - "Required" : { - "comment" : "Validation error message when a required field is empty.", - "isCommentAutoGenerated" : true - }, - "Reset" : { - "comment" : "Title of the settings section that allows the user to reset all data.", - "isCommentAutoGenerated" : true - }, - "Retry" : { - "comment" : "Button title that triggers the retry action for revealing a secret.", - "isCommentAutoGenerated" : true - }, - "Sample" : { - "comment" : "Label for a text field.", - "isCommentAutoGenerated" : true - }, - "Save" : { - "comment" : "The label of a button that saves the current input.", - "isCommentAutoGenerated" : true - }, - "Save failed" : { - - }, - "Scope" : { - - }, - "Screen Protection" : { - "comment" : "Section title in the Security Settings view for screen protection settings.", - "isCommentAutoGenerated" : true - }, - "Security" : { - "comment" : "Title of the \"Security\" settings category.", - "isCommentAutoGenerated" : true - }, - "Security Alerts" : { - "comment" : "Title of a settings section in the \"Notifications\" tab that contains options for enabling or disabling security alerts.", - "isCommentAutoGenerated" : true - }, - "Select Project" : { - - }, - "Service Account" : { - - }, - "Services" : { - "comment" : "Label text for the \"Services\" field in the CreateSecret form.", - "isCommentAutoGenerated" : true - }, - "Settings" : { - - }, - "Share" : { - "comment" : "Label for the \"Share\" action in the secret detail view.", - "isCommentAutoGenerated" : true - }, - "Shortcuts" : { - "comment" : "Title of the settings category related to keyboard shortcuts.", - "isCommentAutoGenerated" : true - }, - "Sign in to iCloud in System Settings, then try again." : { - - }, - "Sort by" : { - "comment" : "A label for a picker that lets the user sort the list of secrets.", - "isCommentAutoGenerated" : true - }, - "SSH & Credentials" : { - - }, - "SSH Key" : { - - }, - "SSL Required" : { - - }, - "SSL/TLS Certificate" : { - - }, - "Staging" : { - - }, - "Star" : { - "comment" : "System symbol name for a starred item in the sidebar.", - "isCommentAutoGenerated" : true - }, - "Start" : { - - }, - "Startup" : { - "comment" : "Section title in the General Settings view related to startup preferences.", - "isCommentAutoGenerated" : true - }, - "Status" : { - "comment" : "Title of the section that displays the status of iCloud Sync.", - "isCommentAutoGenerated" : true - }, - "Status Unavailable" : { - - }, - "Storage Configuration Failed" : { - - }, - "Support Email" : { - - }, - "Sync your secrets with iCloud?" : { - - }, - "System notification permission is required for these alerts to appear." : { - "comment" : "Text displayed below the main text in the permission banner, explaining that system notification permission is required for the alerts to appear.", - "isCommentAutoGenerated" : true - }, - "Team" : { - - }, - "The copied value was cleared after being on the clipboard for over %lld seconds." : { - "comment" : "The body of the notification when a value on the clipboard is cleared after being on the clipboard for more than a few seconds. The argument is the number of seconds.", - "isCommentAutoGenerated" : true - }, - "The project list couldn't be loaded. Please try again later." : { - - }, - "The secret could not be decrypted. Check that your device passcode is enabled." : { - - }, - "The secret could not be saved because encryption is unavailable. Check that your device passcode is enabled." : { - - }, - "The setting was saved, but existing notifications couldn't be updated. Please try again." : { - - }, - "The value could not be copied to the clipboard. Please try again." : { - "comment" : "Alert message when a clipboard copy operation fails.", - "isCommentAutoGenerated" : true - }, - "This action cannot be undone." : { - "comment" : "Warning text displayed above the \"Delete All Data\" button in the Data Settings view.", - "isCommentAutoGenerated" : true - }, - "This will also delete data from iCloud and all synced devices." : { - "comment" : "Warning shown in Data Settings when iCloud Sync is enabled.", - "isCommentAutoGenerated" : true - }, - "This will permanently delete all secrets and projects. This action cannot be undone." : { - "comment" : "Message displayed in an alert when the user confirms deleting all data.", - "isCommentAutoGenerated" : true - }, - "Time" : { - "comment" : "A label for sorting by time.", - "isCommentAutoGenerated" : true - }, - "Try Again" : { - "comment" : "Label for a button that triggers the action of retrying an operation.", - "isCommentAutoGenerated" : true - }, - "Turn Off" : { - - }, - "Turn Off iCloud Sync?" : { - - }, - "Turn on iCloud Sync to sync secrets across devices." : { - "comment" : "Text displayed in the body of the status card when iCloud Sync is disabled.", - "isCommentAutoGenerated" : true - }, - "Type" : { - "comment" : "Label text for the \"Type\" field in the CreateSecret form.", - "isCommentAutoGenerated" : true - }, - "Unlock failed" : { - - }, - "Use iCloud Sync" : { - "comment" : "Title of a toggle row that allows the user to enable or disable iCloud Sync.", - "isCommentAutoGenerated" : true - }, - "Username" : { - - }, - "Value" : { - - }, - "Vault" : { - - }, - "Version" : { - "comment" : "Title of a section in the \"About\" settings view that displays the current version of the app.", - "isCommentAutoGenerated" : true - }, - "View on GitHub" : { - "comment" : "Text for a link that takes the user to the license file on GitHub.", - "isCommentAutoGenerated" : true - }, - "Website" : { - - }, - "When enabled, data on this Mac is merged with iCloud. Turning it off keeps data in both places and stops future sync." : { - - }, - "You can change this anytime in Settings" : { - - }, - "You can restore it later from Trash." : { - "comment" : "Text displayed in an alert when a user confirms deleting a secret and learning more about restoring it later.", - "isCommentAutoGenerated" : true - }, - "Your secrets are protected with Touch ID" : { - - }, - "Your secrets will sync automatically when a connection is available." : { - "comment" : "Text displayed in the \"Sync Enabled\" view, explaining that the user's secrets will sync automatically when a connection is available.", - "isCommentAutoGenerated" : true - }, - "Your unsaved changes will be lost." : { - "comment" : "Message displayed in an alert when the user confirms discarding their unsaved changes in a feature.", - "isCommentAutoGenerated" : true - }, - "다른 이름을 입력해주세요." : { - - }, - "다른 프로젝트 이름을 입력해주세요." : { - - }, - "삭제" : { - - }, - "선택됨: %@" : { - - }, - "아직 선택 안 함" : { - - }, - "이름을 변경하지 못했어요" : { - "comment" : "Text for an alert that appears when a secret is not renamed.", - "isCommentAutoGenerated" : true - }, - "이름을 입력해주세요" : { - "comment" : "Title of an alert that appears when a user tries to rename a project with an empty name.", - "isCommentAutoGenerated" : true - }, - "이미 사용 중인 이름이에요" : { - - }, - "이미 사용 중인 프로젝트 이름이에요" : { - "comment" : "Text in an alert displayed when a user tries to create a project with a name that is already taken.", - "isCommentAutoGenerated" : true - }, - "작업을 완료하지 못했어요" : { - - }, - "잠시 후 다시 시도해주세요." : { - "comment" : "Message shown when linking a secret to a project fails.", - "isCommentAutoGenerated" : true - }, - "취소" : { - - }, - "프로젝트 이름은 비워둘 수 없어요." : { - "comment" : "Message shown in an alert when a user tries to rename a project with an empty name.", - "isCommentAutoGenerated" : true - }, - "프로젝트를 만들지 못했어요" : { - "comment" : "Text in an alert displayed when they try to create a new project but fails.", - "isCommentAutoGenerated" : true - }, - "프로젝트를 삭제하지 못했어요" : { - "comment" : "Alert message when deleting a project fails.", - "isCommentAutoGenerated" : true - }, - "프로젝트에 속한 Secret과의 연결이 해제됩니다. Secret 자체는 삭제되지 않습니다." : { - - }, - "확인" : { - - } + "sourceLanguage": "en", + "strings": { + "": {}, + "%lld min": { + "comment": "A user-visible string that describes a duration in minutes. The argument is the number of minutes.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "%lld min" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "%lld분" + } + } + } + }, + "%lld sec": { + "comment": "A label for an option in the \"Auto-clear clipboard\" dropdown. The argument is the number of seconds selected.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "%lld sec" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "%lld초" + } + } + } + }, + "1 min": { + "comment": "A selectable option in the settings picker row.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "1 min" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "1분" + } + } + } + }, + "15 min": { + "comment": "A tag for a 15-minute selection in the settings picker row.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "15 min" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "15분" + } + } + } + }, + "3 days before expiration": { + "comment": "Label for an expiry alert day option that corresponds to 3 days before expiration.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "3 days before expiration" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "만료 3일 전" + } + } + } + }, + "30 days before expiration": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "30 days before expiration" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "만료 30일 전" + } + } + } + }, + "5 min": { + "comment": "A selectable option in the settings picker row.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "5 min" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "5분" + } + } + } + }, + "7 days before expiration": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "7 days before expiration" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "만료 7일 전" + } + } + } + }, + "A database error occurred while loading projects. The project list may be incomplete.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "A database error occurred while loading projects. The project list may be incomplete." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "프로젝트를 불러오는 중 데이터베이스 오류가 발생했어요. 프로젝트 목록이 일부만 표시될 수 있어요." + } + } + } + }, + "A database error occurred while saving the secret. Please try again.": { + "comment": "Text displayed in an alert when saving a secret fails due to a database error.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "A database error occurred while saving the secret. Please try again." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "Secret을 저장하는 중 데이터베이스 오류가 발생했어요. 다시 시도해 주세요." + } + } + } + }, + "A saved secret expires today.": { + "comment": "Body of a notification shown on the day a saved secret expires.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "A saved secret expires today." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "저장된 Secret이 오늘 만료돼요." + } + } + } + }, + "A saved secret will expire in %lld days.": { + "comment": "The number of days before the secret expires is dynamically inserted here.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "variations": { + "plural": { + "one": { + "stringUnit": { + "state": "translated", + "value": "A saved secret will expire in %lld day." + } + }, + "other": { + "stringUnit": { + "state": "translated", + "value": "A saved secret will expire in %lld days." + } + } + } + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "저장된 Secret이 %lld일 후 만료돼요." + } + } + } + }, + "A secret expires today": { + "comment": "Title of a notification shown on the day a saved secret expires.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "A secret expires today." + } + }, + "ko": { + "stringUnit": { + "state": "needs_review", + "value": "Secret이 오늘 만료돼요." + } + } + } + }, + "A secret is expiring soon": { + "comment": "Title of a notification when a saved secret is expiring soon.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "A secret is expiring soon." + } + }, + "ko": { + "stringUnit": { + "state": "needs_review", + "value": "곧 만료되는 Secret이 있어요." + } + } + } + }, + "A value was copied %lld times in a short period.": { + "comment": "A description of an abnormal access notification. The argument is the number of times a value was copied.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "A value was copied %lld times in a short period." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "짧은 시간 동안 값이 %lld번 복사됐어요." + } + } + } + }, + "API Key": { + "comment": "Label for the \"API Key\" option in the \"Create Secret\" screen.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "API Key" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "API Key" + } + } + } + }, + "API Keys/Token": { + "comment": "Title of the \"Create Secret\" screen's top label.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "API Keys/Token" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "API Keys/Token" + } + } + } + }, + "API Webhook Secret": { + "comment": "Label for the \"API Webhook Secret\" option in the \"Create Secret\" screen.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "API Webhook Secret" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "API Webhook Secret" + } + } + } + }, + "Abnormal access detected.": { + "comment": "Title of the notification when an abnormal access is detected.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Abnormal access detected." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "비정상적인 접근이 감지됐어요." + } + } + } + }, + "About": { + "comment": "Title of the \"About\" settings category.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "About" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "정보" + } + } + } + }, + "Access Token": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Access Token" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "Access Token" + } + } + } + }, + "Access your secrets on all your\nApple devices, securely encrypted.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Access your secrets on all your\nApple devices, securely encrypted." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "모든 Apple 기기에서 안전하게 암호화된 Secret에 접근하세요." + } + } + } + }, + "Add Project": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Add Project" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "프로젝트 추가" + } + } + } + }, + "Add Secret": { + "comment": "Text for the button that allows the user to add a new secret.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Add Secret" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "Secret 추가" + } + } + } + }, + "Add new project": { + "comment": "Label for the \"Add new project\" button in the \"Project\" field of the CreateSecret form.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Add new project" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "새 프로젝트 추가" + } + } + } + }, + "Add to favorites": { + "comment": "Accessibility label for the \"Add to favorites\" button in the secret detail header.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Add to favorites" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "즐겨찾기에 추가" + } + } + } + }, + "Alert on repeated authentication failures": { + "comment": "Text displayed in a settings row that allows the user to enable or disable alerts when repeated authentication failures occur.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Alert on repeated authentication failures" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "인증 반복 실패 시 알림" + } + } + } + }, + "Alert on repeated clipboard copies": { + "comment": "Description of a setting that alerts the user when they copy from the clipboard more than once.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Alert on repeated clipboard copies" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "클립보드 반복 복사 시 알림" + } + } + } + }, + "Alert timing": { + "comment": "Label for the timing of the expiration alert.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Alert timing" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "알림 시점" + } + } + } + }, + "Allow DeVault in System Settings to launch it automatically when you log in.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Allow DeVault in System Settings to launch it automatically when you log in." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "시스템 설정에서 DeVault가 로그인 시 자동으로 실행되도록 허용하세요." + } + } + } + }, + "An unexpected error occurred. Please try again.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "An unexpected error occurred. Please try again." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "알 수 없는 오류가 발생했어요. 다시 시도해 주세요." + } + } + } + }, + "An unexpected error occurred. Your changes were not saved and are still here.": { + "comment": "Text displayed in a notification when an unexpected error occurred while saving changes.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "An unexpected error occurred. Your changes were not saved and are still here." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "알 수 없는 오류가 발생했어요. 변경 사항이 저장되지 않았지만 그대로 남아있어요." + } + } + } + }, + "App Shortcuts": { + "comment": "Title of the settings section related to app shortcuts.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "App Shortcuts" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "앱 단축키" + } + } + } + }, + "Approval required": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Approval required" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "승인 필요" + } + } + } + }, + "Ascending": { + "comment": "A label for the ascending sort direction.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Ascending" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "오름차순" + } + } + } + }, + "Authentication": { + "comment": "Section title in the settings view for authentication-related settings.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Authentication" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "인증" + } + } + } + }, + "Authentication failed": { + "comment": "Title of an alert displayed when touch ID authentication fails.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Authentication failed" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "인증 실패" + } + } + } + }, + "Authentication failed %lld times in a short period.": { + "comment": "A description of an abnormal access notification. The argument is the number of times authentication failed in a short period.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Authentication failed %lld times in a short period." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "짧은 시간 동안 인증이 %lld번 실패했어요." + } + } + } + }, + "Authentication required": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Authentication required" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "인증 필요" + } + } + } + }, + "Authority / Scope": { + "comment": "Label for the \"Authority / Scope\" field in the API Key Token form section.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Authority / Scope" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "Authority / Scope" + } + } + } + }, + "Auto-Lock": { + "comment": "Section title in the Security Settings view for the Auto-Lock settings.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Auto-Lock" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "자동 잠금" + } + } + } + }, + "Auto-clear clipboard": { + "comment": "Title for the setting that enables or disables automatic clearing of the clipboard after a certain period.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Auto-clear clipboard" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "클립보드 자동 지우기" + } + } + } + }, + "Auto-detected: %@": { + "comment": "A hint indicating that a field value was automatically detected. The text inside the parentheses will be replaced with the actual detected value.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Auto-detected: %@" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "자동 감지됨: %@" + } + } + } + }, + "Auto-lock": { + "comment": "Title of the toggle that enables or disables automatic locking after inactivity.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Auto-lock" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "자동 잠금" + } + } + } + }, + "Automatically applied when creating a new secret.": { + "comment": "Description of the default environment setting in the General Settings view.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Automatically applied when creating a new secret." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "새 Secret을 만들 때 자동으로 적용돼요." + } + } + } + }, + "Automatically starts DeVault when you log in to your Mac.": { + "comment": "Description of a setting that allows a user to enable or disable automatic startup of DeVault when logging in to their Mac.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Automatically starts DeVault when you log in to your Mac." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "Mac에 로그인할 때 DeVault를 자동으로 실행해요." + } + } + } + }, + "Back to App": { + "comment": "Label for a button that takes the user back to the main app.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Back to App" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "앱으로 돌아가기" + } + } + } + }, + "Cancel": { + "comment": "The label of a button that cancels an action.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Cancel" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "취소" + } + } + } + }, + "Certificate": { + "comment": "Label for the certificate field in the SSL/TLS certificate form section.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Certificate" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "Certificate" + } + } + } + }, + "Certificate Chain": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Certificate Chain" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "Certificate Chain" + } + } + } + }, + "Certification JSON": { + "comment": "Label for the text field that allows the user to input the JSON string for the service account credential.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Certification JSON" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "Certification JSON" + } + } + } + }, + "Check that a login password is set in System Settings.": { + "comment": "Message in an alert that instructs the user to check their System Settings for a login password.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Check that a login password is set in System Settings." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "시스템 설정에서 로그인 암호가 설정되어 있는지 확인하세요." + } + } + } + }, + "Check your device's iCloud usage restrictions.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Check your device's iCloud usage restrictions." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "기기의 iCloud 사용 제한을 확인하세요." + } + } + } + }, + "Check your network connection and try again.": { + "comment": "Text displayed in an alert when the user's network connection is unavailable.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Check your network connection and try again." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "네트워크 연결을 확인한 뒤 다시 시도해 주세요." + } + } + } + }, + "Checking Status…": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Checking Status…" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "상태 확인 중…" + } + } + } + }, + "Clear after": { + "comment": "Label for the \"Clear after\" option in the \"Clipboard\" section of the security settings view.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Clear after" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "지우기까지" + } + } + } + }, + "Client ID": { + "comment": "Label for the \"Client ID\" field in the \"OAuth Client\" form section.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Client ID" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "Client ID" + } + } + } + }, + "Client Secret": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Client Secret" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "Client Secret" + } + } + } + }, + "Clipboard": { + "comment": "Section title in the settings view for clipboard settings.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Clipboard" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "클립보드" + } + } + } + }, + "Clipboard cleared.": { + "comment": "Text displayed in a notification when the user clears the clipboard.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Clipboard cleared." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "클립보드를 지웠어요." + } + } + } + }, + "Collapse Projects": { + "comment": "Accessibility label for a button that collapses the section displaying the user's projects.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Collapse Projects" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "프로젝트 접기" + } + } + } + }, + "Connected": { + "comment": "Label for the status of the iCloud sync when it is enabled.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Connected" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "연결됨" + } + } + } + }, + "Continue Without iCloud": { + "comment": "Text for a button that allows the user to continue using the app without syncing with iCloud.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Continue Without iCloud" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "iCloud 없이 계속하기" + } + } + } + }, + "Couldn't complete the action.": { + "comment": "Alert title when a secret list mutation (delete/recover) fails.", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Couldn't complete the action." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업을 완료하지 못했어요." + } + } + } + }, + "Couldn't create the project.": { + "comment": "Alert title when creating a project fails.", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Couldn't create the project." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "프로젝트를 만들지 못했어요." + } + } + } + }, + "Couldn't delete data.": { + "comment": "Text displayed in a notification when there is an error deleting all data.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Couldn't delete data." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "데이터를 삭제하지 못했어요." + } + } + } + }, + "Couldn't delete the project.": { + "comment": "Alert title when deleting a project fails.", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Couldn't delete the project." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "프로젝트를 삭제하지 못했어요." + } + } + } + }, + "Couldn't determine iCloud status. Please try again in a moment.": { + "comment": "An alert message that appears when the app cannot determine the iCloud account status.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Couldn't determine iCloud status. Please try again in a moment." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "iCloud 상태를 확인할 수 없어요. 잠시 후 다시 시도해 주세요." + } + } + } + }, + "Couldn't rename the project.": { + "comment": "Alert title when renaming a project fails.", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Couldn't rename the project." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이름을 변경하지 못했어요." + } + } + } + }, + "Couldn't update expiration alerts.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Couldn't update expiration alerts." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "만료 알림을 업데이트하지 못했어요." + } + } + } + }, + "Create": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Create" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "생성" + } + } + } + }, + "Create Project": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Create Project" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "프로젝트 생성" + } + } + } + }, + "Custom": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Custom" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "Custom" + } + } + } + }, + "Data": { + "comment": "Title of the settings category related to data management.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Data" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "데이터" + } + } + } + }, + "Data on this Mac and in iCloud won't be deleted. Future changes on this Mac won't sync until iCloud Sync is turned on again.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Data on this Mac and in iCloud won't be deleted. Future changes on this Mac won't sync until iCloud Sync is turned on again." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이 Mac과 iCloud의 데이터는 삭제되지 않아요. iCloud 동기화를 다시 켜기 전까지 이 Mac에서의 변경 사항은 동기화되지 않아요." + } + } + } + }, + "Database": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Database" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "Database" + } + } + } + }, + "De": { + "shouldTranslate": false + }, + "DeVault": { + "comment": "Name of the company behind the app.", + "isCommentAutoGenerated": true, + "shouldTranslate": false + }, + "DeVault Team": { + "comment": "Name of the DeVault team.", + "isCommentAutoGenerated": true, + "shouldTranslate": false + }, + "Default environment": { + "comment": "Title of a section in the General Settings view that describes the default environment setting.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Default environment" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "기본 환경" + } + } + } + }, + "Defaults": { + "comment": "Section title in the General Settings view that refers to the default settings.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Defaults" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "기본값" + } + } + } + }, + "Delete": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Delete" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "삭제" + } + } + } + }, + "Delete All Data": { + "comment": "Title of an action that deletes all data.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Delete All Data" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "모든 데이터 삭제" + } + } + } + }, + "Delete Forever": { + "comment": "The text of a button to permanently delete an item.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Delete Forever" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "영구 삭제" + } + } + } + }, + "Delete Forever?": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Delete Forever?" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "영구 삭제할까요?" + } + } + } + }, + "Delete Project": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Delete Project" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "프로젝트 삭제" + } + } + } + }, + "Delete project '%@'?": { + "comment": "Alert title asking to confirm deleting a project. The argument is the project name.", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Delete project '%@'?" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "'%@' 프로젝트를 삭제할까요?" + } + } + } + }, + "Deleting this project will unlink its secrets. The secrets themselves won't be deleted.": { + "comment": "Alert message explaining that deleting a project only unlinks its secrets.", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Deleting this project will unlink its secrets. The secrets themselves won't be deleted." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "프로젝트에 속한 Secret과의 연결이 해제됩니다. Secret 자체는 삭제되지 않습니다." + } + } + } + }, + "Descending": { + "comment": "A label for the descending sort direction.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Descending" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "내림차순" + } + } + } + }, + "Developer": { + "comment": "Title of a section in the \"About\" settings view that lists the name of the Devault team.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Developer" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "개발자" + } + } + } + }, + "Development": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Development" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "Development" + } + } + } + }, + "Direction": { + "comment": "A label for the direction of sorting.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Direction" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "방향" + } + } + } + }, + "Discard": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Discard" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "취소" + } + } + } + }, + "Discard changes?": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Discard changes?" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "변경 사항을 취소할까요?" + } + } + } + }, + "Edit": { + "comment": "Accessibility label for the \"Edit\" button in the secret detail header.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Edit" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "편집" + } + } + } + }, + "Editing is unavailable until the linked projects load. Other details are unaffected.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Editing is unavailable until the linked projects load. Other details are unaffected." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "연결된 프로젝트를 불러올 때까지 편집할 수 없어요. 다른 정보에는 영향이 없어요." + } + } + } + }, + "Enable Sync": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Enable Sync" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "동기화 사용" + } + } + } + }, + "Enable Touch ID": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Enable Touch ID" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "Touch ID 사용" + } + } + } + }, + "Enable expiration alerts": { + "comment": "Title of a toggle row that allows the user to enable or disable expiration alerts.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Enable expiration alerts" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "만료 알림 사용" + } + } + } + }, + "Encryption unavailable.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Encryption unavailable." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "암호화를 사용할 수 없어요." + } + } + } + }, + "Enterprise": { + "comment": "Description of a license tier when the user is an enterprise user.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Enterprise" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "기업" + } + } + } + }, + "Environment": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Environment" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "환경" + } + } + } + }, + "Environment Variable Set": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Environment Variable Set" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "Environment Variable Set" + } + } + } + }, + "Etc": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Etc" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "Etc" + } + } + } + }, + "Excludes the DeVault window from screenshots, screen recordings, and screen sharing.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Excludes the DeVault window from screenshots, screen recordings, and screen sharing." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "스크린샷, 화면 녹화, 화면 공유에서 DeVault 창을 제외해요." + } + } + } + }, + "Expand Projects": { + "comment": "Accessibility label for the button that expands the list of projects.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Expand Projects" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "프로젝트 펼치기" + } + } + } + }, + "Expiration Alerts": { + "comment": "Title of the section that controls expiration alerts.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Expiration Alerts" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "만료 알림" + } + } + } + }, + "Expire Date": { + "comment": "Label for the \"Expire Date\" field in the \"Create Secret\" form.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Expire Date" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "만료일" + } + } + } + }, + "Expired": { + "comment": "Tooltip label shown when a secret has already expired.", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Expired" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "만료됨" + } + } + } + }, + "Expires within %lld days": { + "comment": "A tooltip text for the `SecretExpiryStatus.critical` case.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Expires within %lld days" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "%lld일 이내 만료" + } + } + } + }, + "Expiry": { + "comment": "A label displayed in the context menu.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Expiry" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "만료일" + } + } + } + }, + "Failed to copy.": { + "comment": "Text displayed in a notification when a value could not be copied to the clipboard.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to copy." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "복사하지 못했어요." + } + } + } + }, + "Failed to delete secret.": { + "comment": "Text displayed in an alert when a secret deletion fails.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to delete secret." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "Secret을 삭제하지 못했어요." + } + } + } + }, + "Failed to load linked projects": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to load linked projects" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "연결된 프로젝트를 불러오지 못했어요" + } + } + } + }, + "Failed to load projects.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to load projects." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "프로젝트를 불러오지 못했어요." + } + } + } + }, + "Failed to load the list.": { + "comment": "A title for an alert that indicates that the list of secrets failed to load.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to load the list." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "목록을 불러오지 못했어요." + } + } + } + }, + "Failed to load.": { + "comment": "Text displayed in the sidebar when loading the list of projects fails.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to load." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "불러오지 못했어요." + } + } + } + }, + "Failed to reveal secret.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to reveal secret." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "Secret을 확인하지 못했어요." + } + } + } + }, + "Failed to save changes.": { + "comment": "Text displayed in a confirmation alert when an update operation fails.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to save changes." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "변경 사항을 저장하지 못했어요." + } + } + } + }, + "Failed to update favorite.": { + "comment": "Text displayed in an alert when updating a favorite status of a secret fails.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to update favorite." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "즐겨찾기 상태를 업데이트하지 못했어요." + } + } + } + }, + "General": { + "comment": "Title of the \"General\" settings category.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "General" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "일반" + } + } + } + }, + "Host": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Host" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "Host" + } + } + } + }, + "If Touch ID is unavailable,\nsystem password will be used.": { + "comment": "Additional text below the button to inform the user that if Touch ID is unavailable, the system password will be used.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "If Touch ID is unavailable,\nsystem password will be used." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "Touch ID를 사용할 수 없으면\n시스템 암호를 사용해요." + } + } + } + }, + "In progress": { + "comment": "Accessibility label for the full-window overlay shown while a save or decryption is running. Tells assistive technology users that the window is temporarily locked.", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "In progress" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "진행 중" + } + } + } + }, + "Individual": { + "comment": "Description of a license tier when the user is an individual.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Individual" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "개인" + } + } + } + }, + "Keep editing": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Keep editing" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "계속 편집" + } + } + } + }, + "Last update detected": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Last update detected" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "마지막 업데이트 감지됨" + } + } + } + }, + "Launch DeVault at login": { + "comment": "Title of a toggle row that allows the user to enable or disable automatic launch of DeVault at login.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Launch DeVault at login" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "로그인 시 DeVault 실행" + } + } + } + }, + "License": { + "comment": "Title of a settings section that links to the project license.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "License" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "라이선스" + } + } + } + }, + "License Key": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "License Key" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "License Key" + } + } + } + }, + "Link String": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Link String" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "Link String" + } + } + } + }, + "Lock App": { + "comment": "Accessibility label for the lock button in the MainView.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Lock App" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "앱 잠금" + } + } + } + }, + "Lock after inactivity": { + "comment": "Label for the \"Lock after inactivity\" setting in the Security Settings view.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Lock after inactivity" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "비활성 시 잠금" + } + } + } + }, + "MIT License": { + "comment": "Text for the MIT license link in the About settings view.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "MIT License" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "MIT License" + } + } + } + }, + "Memo": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Memo" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "메모" + } + } + } + }, + "Move to trash?": { + "comment": "Alert title when confirming to delete a secret.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Move to trash?" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "휴지통으로 이동할까요?" + } + } + } + }, + "Name": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Name" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이름" + } + } + } + }, + "Network Unavailable.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Network Unavailable." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "네트워크를 사용할 수 없어요." + } + } + } + }, + "New Secret": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "New Secret" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "새 Secret" + } + } + } + }, + "No expiration": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "No expiration" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "만료 없음" + } + } + } + }, + "No iCloud Account": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "No iCloud Account" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "iCloud 계정 없음" + } + } + } + }, + "No project selected": { + "comment": "Text displayed when a project is not selected.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "No project selected" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "선택된 프로젝트 없음" + } + } + } + }, + "No projects yet": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "No projects yet" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "아직 프로젝트가 없어요" + } + } + } + }, + "No secret selected": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "No secret selected" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "선택된 Secret 없음" + } + } + } + }, + "No secrets.": { + "comment": "A message displayed when there are no secrets.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "No secrets." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "Secret이 없어요." + } + } + } + }, + "Not Connected": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Not Connected" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "연결되지 않음" + } + } + } + }, + "Not Now": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Not Now" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "나중에" + } + } + } + }, + "Not Required": { + "comment": "Text indicating that SSL is not required for this database.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Not Required" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "필요 없음" + } + } + } + }, + "Notifications": { + "comment": "Title of the \"Notifications\" settings category.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Notifications" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "알림" + } + } + } + }, + "Notifications are turned off": { + "comment": "Text displayed in a notification banner when system notification permission is required for alerts to appear.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Notifications are turned off" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "알림이 꺼져 있어요" + } + } + } + }, + "OAuth": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "OAuth" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "OAuth" + } + } + } + }, + "OAuth Client": { + "comment": "Title of the \"OAuth Client\" option in the \"Create Secret\" screen.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "OAuth Client" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "OAuth Client" + } + } + } + }, + "OK": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "OK" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "확인" + } + } + } + }, + "On the day of expiration": { + "comment": "Label for an option in the \"Expiration Alerts\" settings section that specifies the user should be notified on the exact day of expiration.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "On the day of expiration" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "만료 당일" + } + } + } + }, + "Open Settings": { + "comment": "Title of the settings option in the \"App Shortcuts\" section.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Open Settings" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "설정 열기" + } + } + } + }, + "Open System Settings": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Open System Settings" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "시스템 설정 열기" + } + } + } + }, + "Order Number": { + "comment": "Label for the \"Order Number\" field in the \"License Key\" form section.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Order Number" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "Order Number" + } + } + } + }, + "PassPhrase": { + "comment": "Label for the passphrase field in the SSH key form section.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "PassPhrase" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "PassPhrase" + } + } + } + }, + "Please authenticate to save the secret.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Please authenticate to save the secret." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "Secret을 저장하려면 인증해 주세요." + } + } + } + }, + "Please authenticate to save your changes. Your changes are still here.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Please authenticate to save your changes. Your changes are still here." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "변경 사항을 저장하려면 인증해 주세요. 변경 사항은 그대로 남아 있어요." + } + } + } + }, + "Please authenticate to view the secret.": { + "comment": "Alert message when authentication is required to view a secret.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Please authenticate to view the secret." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "Secret을 보려면 인증해 주세요." + } + } + } + }, + "Please enter a different name.": { + "comment": "Alert message asking the user to pick a different project name.", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Please enter a different name." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "다른 이름을 입력해 주세요." + } + } + } + }, + "Please enter a different project name.": { + "comment": "Alert message asking the user to pick a different project name.", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Please enter a different project name." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "다른 프로젝트 이름을 입력해 주세요." + } + } + } + }, + "Please enter a name.": { + "comment": "Alert title when a user tries to rename a project with an empty name.", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Please enter a name." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이름을 입력해 주세요." + } + } + } + }, + "Please try again in a moment.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Please try again in a moment." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "잠시 후 다시 시도해 주세요." + } + } + } + }, + "Please try again.": { + "comment": "Text for an alert that appears when the user can try again after a failure.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Please try again." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "다시 시도해 주세요." + } + } + } + }, + "Private Key": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Private Key" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "Private Key" + } + } + } + }, + "Production": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Production" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "Production" + } + } + } + }, + "Project": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Project" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "프로젝트" + } + } + } + }, + "Project Name": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Project Name" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "프로젝트 이름" + } + } + } + }, + "Project information could not be loaded. Other details are unaffected.": { + "comment": "Alert message when project details cannot be loaded.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Project information could not be loaded. Other details are unaffected." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "프로젝트 정보를 불러올 수 없어요. 다른 정보에는 영향이 없어요." + } + } + } + }, + "Project name can't be empty.": { + "comment": "Alert message when a user tries to rename a project with an empty name.", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Project name can't be empty." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "프로젝트 이름은 비워둘 수 없어요." + } + } + } + }, + "Protect the entire app window": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Protect the entire app window" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "앱 창 전체 보호" + } + } + } + }, + "Public Key": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Public Key" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "Public Key" + } + } + } + }, + "Recover": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Recover" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "복구" + } + } + } + }, + "Redirect URL": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Redirect URL" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "Redirect URL" + } + } + } + }, + "Refresh Status": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Refresh Status" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "상태 새로고침" + } + } + } + }, + "Remove from favorites": { + "comment": "Label for a button that removes a secret from the user's favorites.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Remove from favorites" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "즐겨찾기에서 제거" + } + } + } + }, + "Rename": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Rename" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이름 변경" + } + } + } + }, + "Renew Command": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Renew Command" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "Renew Command" + } + } + } + }, + "Require authentication on app launch": { + "comment": "Title of a toggle row that allows the user to enable or disable requiring authentication on app launch.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Require authentication on app launch" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "앱 실행 시 인증 요구" + } + } + } + }, + "Require authentication to copy secret": { + "comment": "Title of a toggle row in the \"Security\" settings section that allows the user to toggle whether they need to authenticate to copy a secret.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Require authentication to copy secret" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "Secret 복사 시 인증 요구" + } + } + } + }, + "Required.": { + "comment": "Validation error message when a required field is empty.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Required." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "필수 항목이에요." + } + } + } + }, + "Reset": { + "comment": "Title of the settings section that allows the user to reset all data.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Reset" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "초기화" + } + } + } + }, + "Retry": { + "comment": "Button title that triggers the retry action for revealing a secret.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Retry" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "다시 시도" + } + } + } + }, + "SSH & Credentials": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "SSH & Credentials" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "SSH & Credentials" + } + } + } + }, + "SSH Key": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "SSH Key" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "SSH Key" + } + } + } + }, + "SSL Required": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "SSL Required" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "SSL 필요" + } + } + } + }, + "SSL/TLS Certificate": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "SSL/TLS Certificate" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "SSL/TLS Certificate" + } + } + } + }, + "Sample": { + "comment": "Label for a text field.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Sample" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "Sample" + } + } + } + }, + "Save": { + "comment": "The label of a button that saves the current input.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Save" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "저장" + } + } + } + }, + "Save failed": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Save failed" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "저장 실패" + } + } + } + }, + "Scope": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Scope" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "Scope" + } + } + } + }, + "Screen Protection": { + "comment": "Section title in the Security Settings view for screen protection settings.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Screen Protection" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "화면 보호" + } + } + } + }, + "Search": { + "comment": "Placeholder text for the secret list search field.", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Search" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "검색" + } + } + } + }, + "Security": { + "comment": "Title of the \"Security\" settings category.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Security" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "보안" + } + } + } + }, + "Security Alerts": { + "comment": "Title of a settings section in the \"Notifications\" tab that contains options for enabling or disabling security alerts.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Security Alerts" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "보안 알림" + } + } + } + }, + "Select Project": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Select Project" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "프로젝트 선택" + } + } + } + }, + "Service Account": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Service Account" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "Service Account" + } + } + } + }, + "Services": { + "comment": "Label text for the \"Services\" field in the CreateSecret form.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Services" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "서비스" + } + } + } + }, + "Settings": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Settings" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "설정" + } + } + } + }, + "Share": { + "comment": "Label for the \"Share\" action in the secret detail view.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Share" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "공유" + } + } + } + }, + "Shortcuts": { + "comment": "Title of the settings category related to keyboard shortcuts.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Shortcuts" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "단축키" + } + } + } + }, + "Sign in to iCloud in System Settings, then try again.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Sign in to iCloud in System Settings, then try again." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "시스템 설정에서 iCloud에 로그인한 뒤 다시 시도해 주세요." + } + } + } + }, + "Sort by": { + "comment": "A label for a picker that lets the user sort the list of secrets.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Sort by" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "정렬 기준" + } + } + } + }, + "Staging": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Staging" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "Staging" + } + } + } + }, + "Start": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Start" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "시작" + } + } + } + }, + "Startup": { + "comment": "Section title in the General Settings view related to startup preferences.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Startup" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "시작 항목" + } + } + } + }, + "Status": { + "comment": "Title of the section that displays the status of iCloud Sync.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Status" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "상태" + } + } + } + }, + "Status Unavailable.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Status Unavailable." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "상태를 확인할 수 없어요." + } + } + } + }, + "Storage Configuration Failed": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Storage Configuration Failed" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "저장소 설정 실패" + } + } + } + }, + "Support Email": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Support Email" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "Support Email" + } + } + } + }, + "Sync your secrets with iCloud?": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Sync your secrets with iCloud?" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "Secret을 iCloud와 동기화할까요?" + } + } + } + }, + "System notification permission is required for these alerts to appear.": { + "comment": "Text displayed below the main text in the permission banner, explaining that system notification permission is required for the alerts to appear.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "System notification permission is required for these alerts to appear." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이 알림이 표시되려면 시스템 알림 권한이 필요해요." + } + } + } + }, + "Team": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Team" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "팀" + } + } + } + }, + "The copied value was cleared after being on the clipboard for over %lld seconds.": { + "comment": "The body of the notification when a value on the clipboard is cleared after being on the clipboard for more than a few seconds. The argument is the number of seconds.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "The copied value was cleared after being on the clipboard for over %lld seconds." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "복사된 값이 클립보드에 %lld초 넘게 남아있어 지워졌어요." + } + } + } + }, + "The project list couldn't be loaded. Please try again later.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "The project list couldn't be loaded. Please try again later." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "프로젝트 목록을 불러오지 못했어요. 나중에 다시 시도해 주세요." + } + } + } + }, + "The secret could not be decrypted. Check that your device passcode is enabled.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "The secret could not be decrypted. Check that your device passcode is enabled." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "Secret을 복호화할 수 없어요. 기기 암호가 설정되어 있는지 확인하세요." + } + } + } + }, + "The secret could not be saved because encryption is unavailable. Check that your device passcode is enabled.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "The secret could not be saved because encryption is unavailable. Check that your device passcode is enabled." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "암호화를 사용할 수 없어 Secret을 저장하지 못했어요. 기기 암호가 설정되어 있는지 확인하세요." + } + } + } + }, + "The setting was saved, but existing notifications couldn't be updated. Please try again.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "The setting was saved, but existing notifications couldn't be updated. Please try again." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "설정은 저장됐지만 기존 알림을 업데이트하지 못했어요. 다시 시도해 주세요." + } + } + } + }, + "The value could not be copied to the clipboard. Please try again.": { + "comment": "Alert message when a clipboard copy operation fails.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "The value could not be copied to the clipboard. Please try again." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "값을 클립보드에 복사하지 못했어요. 다시 시도해 주세요." + } + } + } + }, + "This action cannot be undone.": { + "comment": "Warning text displayed above the \"Delete All Data\" button in the Data Settings view.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "This action cannot be undone." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이 작업은 되돌릴 수 없어요." + } + } + } + }, + "This name is already in use.": { + "comment": "Alert title when a project rename target name is already taken.", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "This name is already in use." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이미 사용 중인 이름이에요." + } + } + } + }, + "This project name is already in use.": { + "comment": "Alert title when a new project's name is already taken.", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "This project name is already in use." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이미 사용 중인 프로젝트 이름이에요." + } + } + } + }, + "This will also delete data from iCloud and all synced devices.": { + "comment": "Warning shown in Data Settings when iCloud Sync is enabled.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "This will also delete data from iCloud and all synced devices." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "iCloud와 동기화된 모든 기기의 데이터도 함께 삭제돼요." + } + } + } + }, + "This will permanently delete all secrets and projects. This action cannot be undone.": { + "comment": "Message displayed in an alert when the user confirms deleting all data.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "This will permanently delete all secrets and projects. This action cannot be undone." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "모든 Secret과 프로젝트가 영구적으로 삭제돼요. 이 작업은 되돌릴 수 없어요." + } + } + } + }, + "Time": { + "comment": "A label for sorting by time.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Time" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "시간" + } + } + } + }, + "Try Again": { + "comment": "Label for a button that triggers the action of retrying an operation.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Try Again" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "다시 시도" + } + } + } + }, + "Turn Off": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Turn Off" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "끄기" + } + } + } + }, + "Turn Off iCloud Sync?": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Turn Off iCloud Sync?" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "iCloud 동기화를 끌까요?" + } + } + } + }, + "Turn on iCloud Sync to sync secrets across devices.": { + "comment": "Text displayed in the body of the status card when iCloud Sync is disabled.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Turn on iCloud Sync to sync secrets across devices." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "iCloud 동기화를 켜면 여러 기기에서 Secret을 동기화할 수 있어요." + } + } + } + }, + "Type": { + "comment": "Label text for the \"Type\" field in the CreateSecret form.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Type" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "유형" + } + } + } + }, + "Unlock failed": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Unlock failed" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "잠금 해제 실패" + } + } + } + }, + "Unlock with Touch ID": { + "comment": "Button title that unlocks the app using Touch ID.", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Unlock with Touch ID" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "Touch ID로 잠금 해제" + } + } + } + }, + "Use iCloud Sync": { + "comment": "Title of a toggle row that allows the user to enable or disable iCloud Sync.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Use iCloud Sync" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "iCloud 동기화 사용" + } + } + } + }, + "Username": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Username" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "Username" + } + } + } + }, + "Value": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Value" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "값" + } + } + } + }, + "Vault": { + "shouldTranslate": false + }, + "Version": { + "comment": "Title of a section in the \"About\" settings view that displays the current version of the app.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Version" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "버전" + } + } + } + }, + "View on GitHub": { + "comment": "Text for a link that takes the user to the license file on GitHub.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "View on GitHub" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "GitHub에서 보기" + } + } + } + }, + "Website": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Website" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "웹사이트" + } + } + } + }, + "When enabled, data on this Mac is merged with iCloud. Turning it off keeps data in both places and stops future sync.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "When enabled, data on this Mac is merged with iCloud. Turning it off keeps data in both places and stops future sync." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "켜면 이 Mac의 데이터가 iCloud와 병합돼요. 끄면 양쪽에 데이터가 유지되고 이후 동기화가 중단돼요." + } + } + } + }, + "You can change this anytime in Settings.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "You can change this anytime in Settings." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "설정에서 언제든지 변경할 수 있어요." + } + } + } + }, + "You can restore it later from Trash.": { + "comment": "Text displayed in an alert when a user confirms deleting a secret and learning more about restoring it later.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "You can restore it later from Trash." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "나중에 휴지통에서 복구할 수 있어요." + } + } + } + }, + "Your secrets are protected with Touch ID.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Your secrets are protected with Touch ID." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "Touch ID로 Secret이 보호되고 있어요." + } + } + } + }, + "Your secrets will sync automatically when a connection is available.": { + "comment": "Text displayed in the \"Sync Enabled\" view, explaining that the user's secrets will sync automatically when a connection is available.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Your secrets will sync automatically when a connection is available." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "연결이 가능해지면 Secret이 자동으로 동기화돼요." + } + } + } + }, + "Your unsaved changes will be lost.": { + "comment": "Message displayed in an alert when the user confirms discarding their unsaved changes in a feature.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Your unsaved changes will be lost." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "저장하지 않은 변경 사항이 사라져요." + } + } + } + }, + "e.g -----BEGIN CERTIFICATE-----": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "e.g -----BEGIN CERTIFICATE-----" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "예: -----BEGIN CERTIFICATE-----" + } + } + } + }, + "e.g -----BEGIN OPENSSH PRIVATE KEY-----": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "e.g -----BEGIN OPENSSH PRIVATE KEY-----" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "예: -----BEGIN OPENSSH PRIVATE KEY-----" + } + } + } + }, + "e.g -----BEGIN PRIVATE KEY-----": { + "comment": "Placeholder text for the private key field in the SSL/TLS certificate form section.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "e.g -----BEGIN PRIVATE KEY-----" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "예: -----BEGIN PRIVATE KEY-----" + } + } + } + }, + "e.g DeVault": { + "comment": "Placeholder text for the Name field in the CreateSecret form.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "e.g DeVault" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "예: DeVault" + } + } + } + }, + "e.g FOO=bar": { + "comment": "Placeholder text for the \"envSet List\" text field in the form.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "e.g FOO=bar" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "예: FOO=bar" + } + } + } + }, + "e.g ORD-2026-0001": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "e.g ORD-2026-0001" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "예: ORD-2026-0001" + } + } + } + }, + "e.g XXXXX-XXXXX-XXXXX-XXXXX": { + "comment": "Placeholder text for a license key field.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "e.g XXXXX-XXXXX-XXXXX-XXXXX" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "예: XXXXX-XXXXX-XXXXX-XXXXX" + } + } + } + }, + "e.g abc123secret": { + "comment": "Placeholder text for the \"Client Secret\" text field in the \"OAuth Client\" form section.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "e.g abc123secret" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "예: abc123secret" + } + } + } + }, + "e.g certbot renew": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "e.g certbot renew" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "예: certbot renew" + } + } + } + }, + "e.g custom-secret-value": { + "comment": "Placeholder text for the value field in the custom secret form.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "e.g custom-secret-value" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "예: custom-secret-value" + } + } + } + }, + "e.g deploy.example.com": { + "comment": "Placeholder text for a label.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "e.g deploy.example.com" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "예: deploy.example.com" + } + } + } + }, + "e.g example.com": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "e.g example.com" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "예: example.com" + } + } + } + }, + "e.g ghp_1234567890": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "e.g ghp_1234567890" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "예: ghp_1234567890" + } + } + } + }, + "e.g https://app.example/oauth/callback": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "e.g https://app.example/oauth/callback" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "예: https://app.example/oauth/callback" + } + } + } + }, + "e.g https://example.com": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "e.g https://example.com" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "예: https://example.com" + } + } + } + }, + "e.g my-app-client": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "e.g my-app-client" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "예: my-app-client" + } + } + } + }, + "e.g organization-admin": { + "comment": "Placeholder text for the \"Authority / Scope\" text field in the `ServiceAccountSectionView`.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "e.g organization-admin" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "예: organization-admin" + } + } + } + }, + "e.g postgres://user:pass@host:5432/db": { + "comment": "Placeholder text for the \"Link String\" field in the \"Database\" form section.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "e.g postgres://user:pass@host:5432/db" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "예: postgres://user:pass@host:5432/db" + } + } + } + }, + "e.g read:user, write:issue": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "e.g read:user, write:issue" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "예: read:user, write:issue" + } + } + } + }, + "e.g repo:read, user:email": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "e.g repo:read, user:email" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "예: repo:read, user:email" + } + } + } + }, + "e.g root": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "e.g root" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "예: root" + } + } + } + }, + "e.g ssh-rsa AAAA...": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "e.g ssh-rsa AAAA..." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "예: ssh-rsa AAAA..." + } + } + } + }, + "e.g support@example.com": { + "comment": "Placeholder text for the \"Support Email\" field in the \"License Key\" form section.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "e.g support@example.com" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "예: support@example.com" + } + } + } + }, + "e.g {\"type\": \"service_account\", ...}": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "e.g {\"type\": \"service_account\", ...}" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "예: {\"type\": \"service_account\", ...}" + } + } + } + }, + "e.g. github.com": { + "comment": "Label text for the Services field in the CreateSecret form.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "e.g. github.com" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "예: github.com" + } + } + } + }, + "envSet List": { + "comment": "Label for the \"envSet List\" field in the form.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "envSet List" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "envSet 목록" + } + } + } + }, + "iCloud": { + "comment": "Title of the \"iCloud\" settings category.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "iCloud" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "iCloud" + } + } + } + }, + "iCloud Restricted": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "iCloud Restricted" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "iCloud 제한됨" + } + } + } + }, + "iCloud Sync": { + "comment": "Title of the section in the iCloud Settings view related to iCloud Sync.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "iCloud Sync" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "iCloud 동기화" + } + } + } + }, + "iCloud Sync Enabled!": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "iCloud Sync Enabled!" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "iCloud 동기화가 켜졌어요!" + } + } + } + }, + "iCloud Temporarily Unavailable.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "iCloud Temporarily Unavailable." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "iCloud를 일시적으로 사용할 수 없어요." + } + } + } + }, + "iCloud sync isn't available right now. Please try again later.": { + "comment": "Text displayed in an alert when the iCloud sync status cannot be determined.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "iCloud sync isn't available right now. Please try again later." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "지금은 iCloud 동기화를 사용할 수 없어요. 나중에 다시 시도해 주세요." + } + } + } + }, + "iCloud sync isn't available.": { + "comment": "Title of an alert when iCloud sync is unavailable.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "iCloud sync isn't available." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "iCloud 동기화를 사용할 수 없어요." + } + } + } + }, + "optional": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "optional" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "선택" + } + } + } + }, + "선택됨: %@": { + "comment": "A label that shows the result of the user's selection.", + "isCommentAutoGenerated": true + }, + "아직 선택 안 함": {} }, - "version" : "1.1" -} \ No newline at end of file + "version": "1.1" +} diff --git a/Projects/DVPresentation/Sources/Features/CreateProject/CreateProjectFeature.swift b/Projects/DVPresentation/Sources/Features/CreateProject/CreateProjectFeature.swift index d973adf0..4efc608a 100644 --- a/Projects/DVPresentation/Sources/Features/CreateProject/CreateProjectFeature.swift +++ b/Projects/DVPresentation/Sources/Features/CreateProject/CreateProjectFeature.swift @@ -121,21 +121,21 @@ private extension CreateProjectFeature { func makeCreateNameTakenAlert() -> AlertState { AlertState { - TextState("이미 사용 중인 프로젝트 이름이에요") + TextState(String.module("This project name is already in use.")) } actions: { - ButtonState(role: .cancel) { TextState("확인") } + ButtonState(role: .cancel) { TextState(String.module("OK")) } } message: { - TextState("다른 이름을 입력해주세요.") + TextState(String.module("Please enter a different name.")) } } func makeCreateFailedAlert() -> AlertState { AlertState { - TextState("프로젝트를 만들지 못했어요") + TextState(String.module("Couldn't create the project.")) } actions: { - ButtonState(role: .cancel) { TextState("확인") } + ButtonState(role: .cancel) { TextState(String.module("OK")) } } message: { - TextState("잠시 후 다시 시도해주세요.") + TextState(String.module("Please try again in a moment.")) } } } diff --git a/Projects/DVPresentation/Sources/Features/CreateProject/CreateProjectView.swift b/Projects/DVPresentation/Sources/Features/CreateProject/CreateProjectView.swift index 6d45dda2..0a057102 100644 --- a/Projects/DVPresentation/Sources/Features/CreateProject/CreateProjectView.swift +++ b/Projects/DVPresentation/Sources/Features/CreateProject/CreateProjectView.swift @@ -27,26 +27,26 @@ extension CreateProjectView { private var content: some View { VStack(alignment: .leading, spacing: 16) { - Text("Create Project") + Text(.module("Create Project")) .dvFont(.bodyLG) .foregroundStyle(Color.dv(.black)) VStack(alignment: .leading, spacing: 8) { - Text("Project Name") + Text(.module("Project Name")) .dvFont(.bodyMD) .foregroundStyle(Color.dv(.gray700)) - DVTextField("e.g DeVault", text: nameBinding, size: .md) + DVTextField(.module("e.g DeVault"), text: nameBinding, size: .md) .onSubmit { store.send(.didTapCreate) } - } + } HStack(spacing: 10) { Spacer() - DVButton(titleText: "Cancel", style: .secondary) { + DVButton(titleText: .module("Cancel"), style: .secondary) { store.send(.didTapCancel) } .keyboardShortcut(.cancelAction) - DVButton(titleText: "Create", style: .secondaryProminent) { + DVButton(titleText: .module("Create"), style: .secondaryProminent) { store.send(.didTapCreate) } .keyboardShortcut(.defaultAction) diff --git a/Projects/DVPresentation/Sources/Features/CreateSecret/CreateSecretFeature.swift b/Projects/DVPresentation/Sources/Features/CreateSecret/CreateSecretFeature.swift index 1c833428..025d8902 100644 --- a/Projects/DVPresentation/Sources/Features/CreateSecret/CreateSecretFeature.swift +++ b/Projects/DVPresentation/Sources/Features/CreateSecret/CreateSecretFeature.swift @@ -287,7 +287,7 @@ public struct CreateSecretFeature { // 이전 시도의 잔존 warning 제거 후 이번 검증 결과만 세팅. state.validationErrors = [:] for fieldID in fieldIDs { - state.validationErrors[fieldID] = .module("Required") + state.validationErrors[fieldID] = .module("Required.") } return .none diff --git a/Projects/DVPresentation/Sources/Features/CreateSecret/Model/CreateSecretError.swift b/Projects/DVPresentation/Sources/Features/CreateSecret/Model/CreateSecretError.swift index cb5fc437..e6d7a9a6 100644 --- a/Projects/DVPresentation/Sources/Features/CreateSecret/Model/CreateSecretError.swift +++ b/Projects/DVPresentation/Sources/Features/CreateSecret/Model/CreateSecretError.swift @@ -41,7 +41,7 @@ extension AlertState where Action == CreateSecretFeature.Action.Alert { switch error { case .cryptoUnavailable: return Self { - TextState("Encryption unavailable", bundle: .module) + TextState("Encryption unavailable.", bundle: .module) } actions: { ButtonState(role: .cancel) { TextState("OK", bundle: .module) } } message: { diff --git a/Projects/DVPresentation/Sources/Features/CreateSecret/Model/ProjectLoadError.swift b/Projects/DVPresentation/Sources/Features/CreateSecret/Model/ProjectLoadError.swift index 0aacbcf7..6d64eeba 100644 --- a/Projects/DVPresentation/Sources/Features/CreateSecret/Model/ProjectLoadError.swift +++ b/Projects/DVPresentation/Sources/Features/CreateSecret/Model/ProjectLoadError.swift @@ -29,7 +29,7 @@ extension AlertState where Action == CreateSecretFeature.Action.Alert { switch error { case .repositoryFailure: return Self { - TextState("Failed to load projects", bundle: .module) + TextState("Failed to load projects.", bundle: .module) } actions: { ButtonState(role: .cancel) { TextState("OK", bundle: .module) } } message: { @@ -41,7 +41,7 @@ extension AlertState where Action == CreateSecretFeature.Action.Alert { case .unexpected: return Self { - TextState("Failed to load projects", bundle: .module) + TextState("Failed to load projects.", bundle: .module) } actions: { ButtonState(role: .cancel) { TextState("OK", bundle: .module) } } message: { diff --git a/Projects/DVPresentation/Sources/Features/Lock/LockView.swift b/Projects/DVPresentation/Sources/Features/Lock/LockView.swift index cd4415b7..d3b7a356 100644 --- a/Projects/DVPresentation/Sources/Features/Lock/LockView.swift +++ b/Projects/DVPresentation/Sources/Features/Lock/LockView.swift @@ -40,7 +40,7 @@ extension LockView { private var unlockView: some View { VStack(spacing: 40) { appIconWithLogoView - DVButton(titleText: "Unlock with Touch ID", style: .primary) { + DVButton(titleText: .module("Unlock with Touch ID"), style: .primary) { store.send(.didTapUnlock) } } diff --git a/Projects/DVPresentation/Sources/Features/Onboarding/OnboardingView.swift b/Projects/DVPresentation/Sources/Features/Onboarding/OnboardingView.swift index fc112aaa..6eba6402 100644 --- a/Projects/DVPresentation/Sources/Features/Onboarding/OnboardingView.swift +++ b/Projects/DVPresentation/Sources/Features/Onboarding/OnboardingView.swift @@ -62,12 +62,12 @@ extension OnboardingView { private var securityView: some View { VStack(spacing: 56) { - appIconWithTextView(String.module("Your secrets are protected with Touch ID")) + appIconWithTextView(String.module("Your secrets are protected with Touch ID.")) VStack(spacing: 12) { DVButton(titleText: String.module("Enable Touch ID"), style: .primary) { store.send(.didTapEnableTouchID) } - Text(.module("If Touch ID is unavailable,\nsystem password will be used")) + Text(.module("If Touch ID is unavailable,\nsystem password will be used.")) .dvFont(.captionMDRegular) .foregroundStyle(Color.dv(.gray900)) .multilineTextAlignment(.center) @@ -95,7 +95,7 @@ extension OnboardingView { } } .disabled(store.isEnablingSync) - Text(.module("You can change this anytime in Settings")) + Text(.module("You can change this anytime in Settings.")) .dvFont(.captionMDRegular) .foregroundStyle(Color.dv(.gray600)) } diff --git a/Projects/DVPresentation/Sources/Features/SecretDetail/Components/DetailSSLRequiredFieldView.swift b/Projects/DVPresentation/Sources/Features/SecretDetail/Components/DetailSSLRequiredFieldView.swift index 3043eb6f..0e7469ec 100644 --- a/Projects/DVPresentation/Sources/Features/SecretDetail/Components/DetailSSLRequiredFieldView.swift +++ b/Projects/DVPresentation/Sources/Features/SecretDetail/Components/DetailSSLRequiredFieldView.swift @@ -25,7 +25,7 @@ struct DetailSSLRequiredFieldView: View { // 정작 필요한 켜짐/꺼짐은 알려주지 않는다. 다른 조회 필드가 라벨 + 값으로 읽히므로 // 이 행만 값이 비면 목록을 훑을 때 한 칸이 빈 것처럼 들린다. .accessibilityElement(children: .combine) - .accessibilityValue(Text(isRequired ? .module("Required") : .module("Not Required"))) + .accessibilityValue(Text(isRequired ? .module("Required.") : .module("Not Required"))) } } diff --git a/Projects/DVPresentation/Sources/Features/SecretDetail/Model/SecretDetailError.swift b/Projects/DVPresentation/Sources/Features/SecretDetail/Model/SecretDetailError.swift index e368ea8e..c21874cd 100644 --- a/Projects/DVPresentation/Sources/Features/SecretDetail/Model/SecretDetailError.swift +++ b/Projects/DVPresentation/Sources/Features/SecretDetail/Model/SecretDetailError.swift @@ -56,7 +56,7 @@ extension AlertState where Action == SecretDetailFeature.Action.Alert { case .decryptionFailed: return Self { - TextState("Failed to reveal secret", bundle: .module) + TextState("Failed to reveal secret.", bundle: .module) } actions: { ButtonState(role: .cancel) { TextState("OK", bundle: .module) } } message: { @@ -68,7 +68,7 @@ extension AlertState where Action == SecretDetailFeature.Action.Alert { case .unexpected: return Self { - TextState("Failed to reveal secret", bundle: .module) + TextState("Failed to reveal secret.", bundle: .module) } actions: { ButtonState(role: .cancel) { TextState("OK", bundle: .module) } } message: { @@ -84,7 +84,7 @@ extension AlertState where Action == SecretDetailFeature.Action.Alert { /// 나머지 필드는 계속 고칠 수 있으므로 편집을 이어가게 둔다. static var projectsLoadFailed: Self { Self { - TextState("Failed to load projects", bundle: .module) + TextState("Failed to load projects.", bundle: .module) } actions: { ButtonState(role: .cancel) { TextState("OK", bundle: .module) } } message: { @@ -131,7 +131,7 @@ extension AlertState where Action == SecretDetailFeature.Action.Alert { /// 클립보드 복사 실패. 자동 정리·반복 감지까지 포함한 경로가 실패한 경우다. static var copyFailed: Self { Self { - TextState("Failed to copy", bundle: .module) + TextState("Failed to copy.", bundle: .module) } actions: { ButtonState(role: .cancel) { TextState("OK", bundle: .module) } } message: { @@ -145,7 +145,7 @@ extension AlertState where Action == SecretDetailFeature.Action.Alert { /// 즐겨찾기 갱신 실패. payload 복호화가 없는 경로이므로 인증 실패는 나오지 않는다. static var likeFailed: Self { Self { - TextState("Failed to update favorite", bundle: .module) + TextState("Failed to update favorite.", bundle: .module) } actions: { ButtonState(role: .cancel) { TextState("OK", bundle: .module) } } message: { @@ -176,7 +176,7 @@ extension AlertState where Action == SecretDetailFeature.Action.Alert { static var deleteFailed: Self { Self { - TextState("Failed to delete secret", bundle: .module) + TextState("Failed to delete secret.", bundle: .module) } actions: { ButtonState(role: .cancel) { TextState("OK", bundle: .module) } } message: { @@ -190,7 +190,7 @@ extension AlertState where Action == SecretDetailFeature.Action.Alert { /// 수정 저장 실패. 편집 모드는 유지되므로 입력한 내용이 남아 있다는 것을 문구로 알린다. static var updateFailed: Self { Self { - TextState("Failed to save changes", bundle: .module) + TextState("Failed to save changes.", bundle: .module) } actions: { ButtonState(role: .cancel) { TextState("OK", bundle: .module) } } message: { diff --git a/Projects/DVPresentation/Sources/Features/SecretDetail/SecretDetailFeature.swift b/Projects/DVPresentation/Sources/Features/SecretDetail/SecretDetailFeature.swift index 08312763..6cda8c19 100644 --- a/Projects/DVPresentation/Sources/Features/SecretDetail/SecretDetailFeature.swift +++ b/Projects/DVPresentation/Sources/Features/SecretDetail/SecretDetailFeature.swift @@ -630,7 +630,7 @@ public struct SecretDetailFeature { // 이전 시도의 잔존 경고를 지우고 이번 결과만 세운다. 생성 화면과 같은 규칙이다. state.validationErrors = [:] for fieldID in fieldIDs { - state.validationErrors[fieldID] = .module("Required") + state.validationErrors[fieldID] = .module("Required.") } return .none diff --git a/Projects/DVPresentation/Sources/Features/SecretDetail/SecretDetailView.swift b/Projects/DVPresentation/Sources/Features/SecretDetail/SecretDetailView.swift index c11deb1a..29d21805 100644 --- a/Projects/DVPresentation/Sources/Features/SecretDetail/SecretDetailView.swift +++ b/Projects/DVPresentation/Sources/Features/SecretDetail/SecretDetailView.swift @@ -328,7 +328,7 @@ private func _editingPreviewState( SecretDetailView( store: Store( initialState: { - var state = _editingPreviewState(validationErrors: [.value: .module("Required")]) + var state = _editingPreviewState(validationErrors: [.value: .module("Required.")]) state.editFields?.content = .apiKeyToken(APIKeyTokenFields(value: "")) return state }() diff --git a/Projects/DVPresentation/Sources/Features/SecretList/SecretListFeature.swift b/Projects/DVPresentation/Sources/Features/SecretList/SecretListFeature.swift index 5ef385ba..0c52120e 100644 --- a/Projects/DVPresentation/Sources/Features/SecretList/SecretListFeature.swift +++ b/Projects/DVPresentation/Sources/Features/SecretList/SecretListFeature.swift @@ -190,11 +190,11 @@ public struct SecretListFeature { case .mutationResponse(.failure): state.alert = AlertState { - TextState("작업을 완료하지 못했어요") + TextState(String.module("Couldn't complete the action.")) } actions: { - ButtonState(role: .cancel) { TextState("확인") } + ButtonState(role: .cancel) { TextState(String.module("OK")) } } message: { - TextState("잠시 후 다시 시도해주세요.") + TextState(String.module("Please try again in a moment.")) } return .none diff --git a/Projects/DVPresentation/Sources/Features/SecretList/SecretListView.swift b/Projects/DVPresentation/Sources/Features/SecretList/SecretListView.swift index 6395b2c8..23684470 100644 --- a/Projects/DVPresentation/Sources/Features/SecretList/SecretListView.swift +++ b/Projects/DVPresentation/Sources/Features/SecretList/SecretListView.swift @@ -62,6 +62,7 @@ extension SecretListView { DVTitleBar( titleText: titleText, searchText: searchTextBinding, + searchPromptText: .module("Search"), isSearchFocused: $isSearchFocused, sortMenuContent: showsSort ? { AnyView(sortMenuContent) } : nil ) @@ -129,15 +130,15 @@ extension SecretListView { private func contextMenuItems(for secret: Secret) -> some View { switch store.collection { case .deleted: - Button("Recover") { + Button(.module("Recover")) { store.send(.didTapRecover(id: secret.id)) } - Button("Delete Forever", role: .destructive) { + Button(.module("Delete Forever"), role: .destructive) { store.send(.didTapDeleteForever(id: secret.id)) } case .all, .liked, .notice, .expired, .project: - Button("Delete", role: .destructive) { + Button(.module("Delete"), role: .destructive) { store.send(.didTapDelete(id: secret.id)) } } @@ -147,18 +148,18 @@ extension SecretListView { /// `Menu`가 바깥 클릭·ESC·포커스 상실 처리를 대신하므로 이 화면은 두 축의 값만 계산하면 된다. @ViewBuilder private var sortMenuContent: some View { - Picker("Sort by", selection: sortKeyBinding) { - Text("Time").tag(SecretQuery.Sort.Key.time) - Text("Expiry").tag(SecretQuery.Sort.Key.expiry) - Text("Name").tag(SecretQuery.Sort.Key.name) + Picker(.module("Sort by"), selection: sortKeyBinding) { + Text(.module("Time")).tag(SecretQuery.Sort.Key.time) + Text(.module("Expiry")).tag(SecretQuery.Sort.Key.expiry) + Text(.module("Name")).tag(SecretQuery.Sort.Key.name) } .pickerStyle(.inline) Divider() - Picker("Direction", selection: sortDirectionBinding) { - Text("Ascending").tag(SecretQuery.Sort.Direction.ascending) - Text("Descending").tag(SecretQuery.Sort.Direction.descending) + Picker(.module("Direction"), selection: sortDirectionBinding) { + Text(.module("Ascending")).tag(SecretQuery.Sort.Direction.ascending) + Text(.module("Descending")).tag(SecretQuery.Sort.Direction.descending) } .pickerStyle(.inline) } @@ -183,10 +184,10 @@ extension SecretListView { Image(systemName: "exclamationmark.triangle") .dvFont(.bodyLG) .foregroundStyle(Color.dv(.gray400)) - Text("Failed to load the list") + Text(.module("Failed to load the list.")) .dvFont(.bodyMD) .foregroundStyle(Color.dv(.gray500)) - DVButton(titleText: "Retry", style: .secondary) { + DVButton(titleText: .module("Retry"), style: .secondary) { store.send(.didTapRetry) } Spacer() @@ -195,7 +196,7 @@ extension SecretListView { } private var emptyView: some View { - Text(.module("No secrets")) + Text(.module("No secrets.")) .dvFont(.captionLG) .foregroundStyle(Color.dv(.gray700)) .frame(maxWidth: .infinity, maxHeight: .infinity) @@ -215,7 +216,7 @@ extension SecretListView { case .notice: return "Notice" case .expired: return "Expired" case .deleted: return "Deleted" - case .project: return store.projectName ?? "Project" + case .project: return store.projectName ?? .module("Project") } } diff --git a/Projects/DVPresentation/Sources/Features/Settings/About/AboutSettingsView.swift b/Projects/DVPresentation/Sources/Features/Settings/About/AboutSettingsView.swift index 042edd65..286baab7 100644 --- a/Projects/DVPresentation/Sources/Features/Settings/About/AboutSettingsView.swift +++ b/Projects/DVPresentation/Sources/Features/Settings/About/AboutSettingsView.swift @@ -27,13 +27,13 @@ extension AboutSettingsView { SettingsDetailContainer(title: String.module("About")) { SettingsSection(title: String.module("Version")) { SettingsValueRow( - title: String.module("Devault"), + title: String.module("DeVault"), value: store.version ) } SettingsSection(title: String.module("Developer")) { - SettingsValueRow(title: String.module("Devault Team")) + SettingsValueRow(title: String.module("DeVault Team")) } SettingsSection(title: String.module("License")) { diff --git a/Projects/DVPresentation/Sources/Features/Settings/Components/SettingsValueRow.swift b/Projects/DVPresentation/Sources/Features/Settings/Components/SettingsValueRow.swift index 371aab93..4830a2cb 100644 --- a/Projects/DVPresentation/Sources/Features/Settings/Components/SettingsValueRow.swift +++ b/Projects/DVPresentation/Sources/Features/Settings/Components/SettingsValueRow.swift @@ -79,7 +79,7 @@ struct SettingsValueRow: View { #Preview("Settings Value Row") { Form { Section { - SettingsValueRow(title: "Devault", value: "1.0.0 (1)") + SettingsValueRow(title: "DeVault", value: "1.0.0 (1)") SettingsValueRow(title: "Open Settings", value: "⌘,", valueStyle: .emphasized) } } diff --git a/Projects/DVPresentation/Sources/Features/Settings/Data/DataSettingsFeature.swift b/Projects/DVPresentation/Sources/Features/Settings/Data/DataSettingsFeature.swift index d61b4cf5..1a2868f6 100644 --- a/Projects/DVPresentation/Sources/Features/Settings/Data/DataSettingsFeature.swift +++ b/Projects/DVPresentation/Sources/Features/Settings/Data/DataSettingsFeature.swift @@ -118,7 +118,7 @@ extension DataSettingsFeature { private var deleteFailureAlert: AlertState { AlertState { - TextState(String.module("Couldn't delete data")) + TextState(String.module("Couldn't delete data.")) } actions: { ButtonState(role: .cancel) { TextState(String.module("OK")) diff --git a/Projects/DVPresentation/Sources/Features/Settings/ICloud/ICloudSettingsView.swift b/Projects/DVPresentation/Sources/Features/Settings/ICloud/ICloudSettingsView.swift index db379d5a..a0bf9b91 100644 --- a/Projects/DVPresentation/Sources/Features/Settings/ICloud/ICloudSettingsView.swift +++ b/Projects/DVPresentation/Sources/Features/Settings/ICloud/ICloudSettingsView.swift @@ -81,19 +81,19 @@ extension ICloudSettingsView { case .none where store.isRefreshingStatus: String.module("Checking Status…") case .none: - String.module("Status Unavailable") + String.module("Status Unavailable.") case .some(.noAccount): String.module("No iCloud Account") case .some(.restricted): String.module("iCloud Restricted") case .some(.temporarilyUnavailable): - String.module("iCloud Temporarily Unavailable") + String.module("iCloud Temporarily Unavailable.") case .some(.networkUnavailable): - String.module("Network Unavailable") + String.module("Network Unavailable.") case .some(.configurationUnavailable): String.module("Storage Configuration Failed") case .some(.couldNotDetermine): - String.module("Status Unavailable") + String.module("Status Unavailable.") } } diff --git a/Projects/DVPresentation/Sources/Features/Settings/Notifications/NotificationSettingsFeature.swift b/Projects/DVPresentation/Sources/Features/Settings/Notifications/NotificationSettingsFeature.swift index a8689643..cf226c87 100644 --- a/Projects/DVPresentation/Sources/Features/Settings/Notifications/NotificationSettingsFeature.swift +++ b/Projects/DVPresentation/Sources/Features/Settings/Notifications/NotificationSettingsFeature.swift @@ -92,7 +92,7 @@ public struct NotificationSettingsFeature { case .expiryNotificationsUpdateFailed: state.alert = AlertState { - TextState(String.module("Couldn't update expiration alerts")) + TextState(String.module("Couldn't update expiration alerts.")) } actions: { ButtonState(role: .cancel) { TextState(String.module("OK")) } } message: { diff --git a/Projects/DVPresentation/Sources/Features/Sidebar/SidebarFeature.swift b/Projects/DVPresentation/Sources/Features/Sidebar/SidebarFeature.swift index cfc2e030..6e1ef57d 100644 --- a/Projects/DVPresentation/Sources/Features/Sidebar/SidebarFeature.swift +++ b/Projects/DVPresentation/Sources/Features/Sidebar/SidebarFeature.swift @@ -15,11 +15,11 @@ public enum SidebarFilter: Equatable, CaseIterable, Hashable, Sendable { var title: String { switch self { - case .all: .module("All") - case .starred: .module("Star") - case .notice: .module("Notice") - case .expired: .module("Expired") - case .deleted: .module("Deleted") + case .all: "All" + case .starred: "Star" + case .notice: "Notice" + case .expired: "Expired" + case .deleted: "Deleted" } } @@ -408,56 +408,56 @@ private extension SidebarFeature { func makeDeleteAlert(for project: ProjectItem) -> AlertState { AlertState { - TextState("'\(project.name)' 프로젝트를 삭제할까요?") + TextState(String.module("Delete project '\(project.name)'?")) } actions: { ButtonState(role: .destructive, action: .confirmDelete) { - TextState("삭제") + TextState(String.module("Delete")) } ButtonState(role: .cancel) { - TextState("취소") + TextState(String.module("Cancel")) } } message: { - TextState("프로젝트에 속한 Secret과의 연결이 해제됩니다. Secret 자체는 삭제되지 않습니다.") + TextState(String.module("Deleting this project will unlink its secrets. The secrets themselves won't be deleted.")) } } func makeRenameNameTakenAlert() -> AlertState { AlertState { - TextState("이미 사용 중인 이름이에요") + TextState(String.module("This name is already in use.")) } actions: { - ButtonState(role: .cancel) { TextState("확인") } + ButtonState(role: .cancel) { TextState(String.module("OK")) } } message: { - TextState("다른 프로젝트 이름을 입력해주세요.") + TextState(String.module("Please enter a different project name.")) } } func makeRenameEmptyNameAlert() -> AlertState { AlertState { - TextState("이름을 입력해주세요") + TextState(String.module("Please enter a name.")) } actions: { - ButtonState(role: .cancel) { TextState("확인") } + ButtonState(role: .cancel) { TextState(String.module("OK")) } } message: { - TextState("프로젝트 이름은 비워둘 수 없어요.") + TextState(String.module("Project name can't be empty.")) } } func makeRenameFailedAlert() -> AlertState { AlertState { - TextState("이름을 변경하지 못했어요") + TextState(String.module("Couldn't rename the project.")) } actions: { - ButtonState(role: .cancel) { TextState("확인") } + ButtonState(role: .cancel) { TextState(String.module("OK")) } } message: { - TextState("잠시 후 다시 시도해주세요.") + TextState(String.module("Please try again in a moment.")) } } func makeDeleteFailedAlert() -> AlertState { AlertState { - TextState("프로젝트를 삭제하지 못했어요") + TextState(String.module("Couldn't delete the project.")) } actions: { - ButtonState(role: .cancel) { TextState("확인") } + ButtonState(role: .cancel) { TextState(String.module("OK")) } } message: { - TextState("잠시 후 다시 시도해주세요.") + TextState(String.module("Please try again in a moment.")) } } } diff --git a/Projects/DVPresentation/Sources/Features/Sidebar/SidebarView.swift b/Projects/DVPresentation/Sources/Features/Sidebar/SidebarView.swift index 60858af6..73662cc5 100644 --- a/Projects/DVPresentation/Sources/Features/Sidebar/SidebarView.swift +++ b/Projects/DVPresentation/Sources/Features/Sidebar/SidebarView.swift @@ -133,7 +133,7 @@ extension SidebarView { @ViewBuilder private var projectSectionBody: some View { if case .failed = store.projectsState { - Text(.module("Failed to load")) + Text(.module("Failed to load.")) .dvFont(.bodyMD) .foregroundStyle(Color.dv(.danger)) .frame(maxWidth: .infinity) diff --git a/Projects/DVPresentation/Sources/Localization/SecurityNotification+Module.swift b/Projects/DVPresentation/Sources/Localization/SecurityNotification+Module.swift index 993af16f..70c67979 100644 --- a/Projects/DVPresentation/Sources/Localization/SecurityNotification+Module.swift +++ b/Projects/DVPresentation/Sources/Localization/SecurityNotification+Module.swift @@ -11,15 +11,15 @@ extension SecurityNotification { let body: String switch kind { case .authenticationFailure: - body = String.module("Authentication failed \(threshold) times in a short period") + body = String.module("Authentication failed \(threshold) times in a short period.") case .repeatedCopy: - body = String.module("A value was copied \(threshold) times in a short period") + body = String.module("A value was copied \(threshold) times in a short period.") } - return (String.module("Abnormal access detected"), body) + return (String.module("Abnormal access detected."), body) case .clipboardExceeded(let seconds): return ( - String.module("Clipboard cleared"), + String.module("Clipboard cleared."), String.module("The copied value was cleared after being on the clipboard for over \(seconds) seconds.") ) diff --git a/Projects/DVPresentation/Sources/Support/ICloudSyncAlert.swift b/Projects/DVPresentation/Sources/Support/ICloudSyncAlert.swift index 279e438d..3b8c31c2 100644 --- a/Projects/DVPresentation/Sources/Support/ICloudSyncAlert.swift +++ b/Projects/DVPresentation/Sources/Support/ICloudSyncAlert.swift @@ -37,7 +37,7 @@ func makeICloudSyncUnavailableAlert( (String.module("Couldn't determine iCloud status. Please try again in a moment."), true, false) } return AlertState { - TextState(String.module("iCloud sync isn't available")) + TextState(String.module("iCloud sync isn't available.")) } actions: { if canRetry { ButtonState(action: retry) { TextState(String.module("Try Again")) } diff --git a/Projects/DVPresentation/Tests/CreateProject/CreateProjectFeatureTests.swift b/Projects/DVPresentation/Tests/CreateProject/CreateProjectFeatureTests.swift index e97c2075..ca529687 100644 --- a/Projects/DVPresentation/Tests/CreateProject/CreateProjectFeatureTests.swift +++ b/Projects/DVPresentation/Tests/CreateProject/CreateProjectFeatureTests.swift @@ -54,11 +54,11 @@ struct CreateProjectFeatureTests { await store.receive(.createResponse(.failure(.nameTaken))) { $0.isCreating = false $0.alert = AlertState { - TextState("이미 사용 중인 프로젝트 이름이에요") + TextState(String.module("This project name is already in use.")) } actions: { - ButtonState(role: .cancel) { TextState("확인") } + ButtonState(role: .cancel) { TextState(String.module("OK")) } } message: { - TextState("다른 이름을 입력해주세요.") + TextState(String.module("Please enter a different name.")) } } } @@ -76,11 +76,11 @@ struct CreateProjectFeatureTests { await store.receive(.createResponse(.failure(.createFailed))) { $0.isCreating = false $0.alert = AlertState { - TextState("프로젝트를 만들지 못했어요") + TextState(String.module("Couldn't create the project.")) } actions: { - ButtonState(role: .cancel) { TextState("확인") } + ButtonState(role: .cancel) { TextState(String.module("OK")) } } message: { - TextState("잠시 후 다시 시도해주세요.") + TextState(String.module("Please try again in a moment.")) } } } diff --git a/Projects/DVPresentation/Tests/Features/CreateSecret/CreateSecretFeatureTests.swift b/Projects/DVPresentation/Tests/Features/CreateSecret/CreateSecretFeatureTests.swift index 6326964c..629d3e7a 100644 --- a/Projects/DVPresentation/Tests/Features/CreateSecret/CreateSecretFeatureTests.swift +++ b/Projects/DVPresentation/Tests/Features/CreateSecret/CreateSecretFeatureTests.swift @@ -157,7 +157,7 @@ struct CreateSecretFeatureTests { @Test("selectedSubType 변경: content 교체 + validationErrors / detection state 초기화") func binding_selectedSubType_swapsContentAndClearsState() async { var initialState = CreateSecretFeature.State(secretType: .oauth) - initialState.validationErrors = [.name: "Required"] + initialState.validationErrors = [.name: "Required."] initialState.serviceCandidates = ["GitHub"] initialState.detectedServices = [.clientSecret: "GitHub"] initialState.meta.content = .oauthClient(OAuthClientFields(clientId: "prev-id")) @@ -315,7 +315,7 @@ struct CreateSecretFeatureTests { } await store.send(.didTapSave) { - $0.validationErrors = [.name: "Required", .value: "Required"] + $0.validationErrors = [.name: "Required.", .value: "Required."] } } @@ -329,14 +329,14 @@ struct CreateSecretFeatureTests { } await store.send(.didTapSave) { - $0.validationErrors = [.value: "Required"] + $0.validationErrors = [.value: "Required."] } } @Test("didTapSave 재시도: 이전 validationErrors가 새 결과로 대체 (해결된 필드 warning 사라짐)") func didTapSave_retryReplacesPriorErrors() async { var initialState = CreateSecretFeature.State(secretType: .apiKeyToken) - initialState.validationErrors = [.name: "Required", .value: "Required"] + initialState.validationErrors = [.name: "Required.", .value: "Required."] initialState.meta.name = "n" let store = TestStore(initialState: initialState) { @@ -344,7 +344,7 @@ struct CreateSecretFeatureTests { } await store.send(.didTapSave) { - $0.validationErrors = [.value: "Required"] + $0.validationErrors = [.value: "Required."] } } @@ -356,9 +356,9 @@ struct CreateSecretFeatureTests { await store.send(.didTapSave) { $0.validationErrors = [ - .name: "Required", - .clientId: "Required", - .clientSecret: "Required", + .name: "Required.", + .clientId: "Required.", + .clientSecret: "Required.", ] } } diff --git a/Projects/DVPresentation/Tests/Onboarding/OnboardingFeatureTests.swift b/Projects/DVPresentation/Tests/Onboarding/OnboardingFeatureTests.swift index 7b1c37b3..bc7c2751 100644 --- a/Projects/DVPresentation/Tests/Onboarding/OnboardingFeatureTests.swift +++ b/Projects/DVPresentation/Tests/Onboarding/OnboardingFeatureTests.swift @@ -82,7 +82,7 @@ struct OnboardingFeatureTests { await store.receive(.iCloudSyncStatusResponse(.noAccount)) { $0.isEnablingSync = false $0.alert = AlertState { - TextState("iCloud sync isn't available") + TextState("iCloud sync isn't available.") } actions: { ButtonState(action: .retry) { TextState("Try Again") } ButtonState(action: .openSystemSettings) { TextState("Open System Settings") } @@ -177,7 +177,7 @@ struct OnboardingFeatureTests { private func makeNoAccountAlert() -> AlertState { AlertState { - TextState("iCloud sync isn't available") + TextState("iCloud sync isn't available.") } actions: { ButtonState(action: .retry) { TextState("Try Again") } ButtonState(action: .openSystemSettings) { TextState("Open System Settings") } diff --git a/Projects/DVPresentation/Tests/SecretDetail/SecretDetailFeatureTests.swift b/Projects/DVPresentation/Tests/SecretDetail/SecretDetailFeatureTests.swift index 900ac94a..ff2282da 100644 --- a/Projects/DVPresentation/Tests/SecretDetail/SecretDetailFeatureTests.swift +++ b/Projects/DVPresentation/Tests/SecretDetail/SecretDetailFeatureTests.swift @@ -1028,7 +1028,7 @@ struct SecretDetailFeatureTests { let store = TestStore(initialState: initial) { SecretDetailFeature() } await store.send(.didTapSave) { - $0.validationErrors = [.value: .module("Required")] + $0.validationErrors = [.value: .module("Required.")] } } diff --git a/Projects/DVPresentation/Tests/SecretList/SecretListFeatureTests.swift b/Projects/DVPresentation/Tests/SecretList/SecretListFeatureTests.swift index ad6220a9..b802b428 100644 --- a/Projects/DVPresentation/Tests/SecretList/SecretListFeatureTests.swift +++ b/Projects/DVPresentation/Tests/SecretList/SecretListFeatureTests.swift @@ -217,11 +217,11 @@ struct SecretListFeatureTests { await store.send(.didTapDelete(id: secretID)) await store.receive(.mutationResponse(.failure(.unexpected))) { $0.alert = AlertState { - TextState("작업을 완료하지 못했어요") + TextState(String.module("Couldn't complete the action.")) } actions: { - ButtonState(role: .cancel) { TextState("확인") } + ButtonState(role: .cancel) { TextState(String.module("OK")) } } message: { - TextState("잠시 후 다시 시도해주세요.") + TextState(String.module("Please try again in a moment.")) } } } diff --git a/Projects/DVPresentation/Tests/Settings/Data/DataSettingsFeatureTests.swift b/Projects/DVPresentation/Tests/Settings/Data/DataSettingsFeatureTests.swift index 236cbad2..b3559aa2 100644 --- a/Projects/DVPresentation/Tests/Settings/Data/DataSettingsFeatureTests.swift +++ b/Projects/DVPresentation/Tests/Settings/Data/DataSettingsFeatureTests.swift @@ -90,7 +90,7 @@ struct DataSettingsFeatureTests { await store.receive(.deleteFailed) { $0.isDeleting = false $0.alert = AlertState { - TextState("Couldn't delete data") + TextState("Couldn't delete data.") } actions: { ButtonState(role: .cancel) { TextState("OK") } } message: { diff --git a/Projects/DVPresentation/Tests/Settings/Notifications/NotificationSettingsFeatureTests.swift b/Projects/DVPresentation/Tests/Settings/Notifications/NotificationSettingsFeatureTests.swift index 32965aca..c89fd061 100644 --- a/Projects/DVPresentation/Tests/Settings/Notifications/NotificationSettingsFeatureTests.swift +++ b/Projects/DVPresentation/Tests/Settings/Notifications/NotificationSettingsFeatureTests.swift @@ -79,7 +79,7 @@ struct NotificationSettingsFeatureTests { } await store.receive(.expiryNotificationsUpdateFailed) { $0.alert = AlertState { - TextState("Couldn't update expiration alerts") + TextState("Couldn't update expiration alerts.") } actions: { ButtonState(role: .cancel) { TextState("OK") } } message: { diff --git a/Projects/DVPresentation/Tests/Sidebar/SidebarFeatureTests.swift b/Projects/DVPresentation/Tests/Sidebar/SidebarFeatureTests.swift index 6e5afc74..e4b9af28 100644 --- a/Projects/DVPresentation/Tests/Sidebar/SidebarFeatureTests.swift +++ b/Projects/DVPresentation/Tests/Sidebar/SidebarFeatureTests.swift @@ -225,12 +225,12 @@ struct SidebarFeatureTests { await store.send(.didTapDelete(id: item.id)) { $0.deletingProjectID = item.id $0.alert = AlertState { - TextState("'\(item.name)' 프로젝트를 삭제할까요?") + TextState(String.module("Delete project '\(item.name)'?")) } actions: { - ButtonState(role: .destructive, action: .confirmDelete) { TextState("삭제") } - ButtonState(role: .cancel) { TextState("취소") } + ButtonState(role: .destructive, action: .confirmDelete) { TextState(String.module("Delete")) } + ButtonState(role: .cancel) { TextState(String.module("Cancel")) } } message: { - TextState("프로젝트에 속한 Secret과의 연결이 해제됩니다. Secret 자체는 삭제되지 않습니다.") + TextState(String.module("Deleting this project will unlink its secrets. The secrets themselves won't be deleted.")) } } await store.send(.alert(.dismiss)) { @@ -340,11 +340,11 @@ struct SidebarFeatureTests { await store.send(.didConfirmRename) await store.receive(.renameResponse(.failure(.nameTaken))) { $0.alert = AlertState { - TextState("이미 사용 중인 이름이에요") + TextState(String.module("This name is already in use.")) } actions: { - ButtonState(role: .cancel) { TextState("확인") } + ButtonState(role: .cancel) { TextState(String.module("OK")) } } message: { - TextState("다른 프로젝트 이름을 입력해주세요.") + TextState(String.module("Please enter a different project name.")) } } } @@ -380,12 +380,12 @@ struct SidebarFeatureTests { await store.send(.didTapDelete(id: item.id)) { $0.deletingProjectID = item.id $0.alert = AlertState { - TextState("'\(item.name)' 프로젝트를 삭제할까요?") + TextState(String.module("Delete project '\(item.name)'?")) } actions: { - ButtonState(role: .destructive, action: .confirmDelete) { TextState("삭제") } - ButtonState(role: .cancel) { TextState("취소") } + ButtonState(role: .destructive, action: .confirmDelete) { TextState(String.module("Delete")) } + ButtonState(role: .cancel) { TextState(String.module("Cancel")) } } message: { - TextState("프로젝트에 속한 Secret과의 연결이 해제됩니다. Secret 자체는 삭제되지 않습니다.") + TextState(String.module("Deleting this project will unlink its secrets. The secrets themselves won't be deleted.")) } } } @@ -399,12 +399,12 @@ struct SidebarFeatureTests { state.selection = .project(id: item.id) state.deletingProjectID = item.id state.alert = AlertState { - TextState("'\(item.name)' 프로젝트를 삭제할까요?") + TextState(String.module("Delete project '\(item.name)'?")) } actions: { - ButtonState(role: .destructive, action: .confirmDelete) { TextState("삭제") } - ButtonState(role: .cancel) { TextState("취소") } + ButtonState(role: .destructive, action: .confirmDelete) { TextState(String.module("Delete")) } + ButtonState(role: .cancel) { TextState(String.module("Cancel")) } } message: { - TextState("프로젝트에 속한 Secret과의 연결이 해제됩니다. Secret 자체는 삭제되지 않습니다.") + TextState(String.module("Deleting this project will unlink its secrets. The secrets themselves won't be deleted.")) } let store = TestStore(initialState: state) {