Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5,803 changes: 4,774 additions & 1,029 deletions Projects/DVPresentation/Resources/Localizable.xcstrings

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -121,21 +121,21 @@ private extension CreateProjectFeature {

func makeCreateNameTakenAlert() -> AlertState<Action.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."))
}
}

func makeCreateFailedAlert() -> AlertState<Action.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."))
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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: {
Expand All @@ -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: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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))
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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")))
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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: {
Expand All @@ -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: {
Expand All @@ -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: {
Expand Down Expand Up @@ -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: {
Expand All @@ -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: {
Expand Down Expand Up @@ -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: {
Expand All @@ -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: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
}()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ extension SecretListView {
DVTitleBar(
titleText: titleText,
searchText: searchTextBinding,
searchPromptText: .module("Search"),
isSearchFocused: $isSearchFocused,
sortMenuContent: showsSort ? { AnyView(sortMenuContent) } : nil
)
Expand Down Expand Up @@ -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))
}
}
Expand All @@ -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)
}
Expand All @@ -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()
Expand All @@ -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)
Expand All @@ -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")
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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")) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ extension DataSettingsFeature {

private var deleteFailureAlert: AlertState<Action.Alert> {
AlertState {
TextState(String.module("Couldn't delete data"))
TextState(String.module("Couldn't delete data."))
} actions: {
ButtonState(role: .cancel) {
TextState(String.module("OK"))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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.")
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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: {
Expand Down
Loading