add localizable to edit privacy

This commit is contained in:
cheykrym 2025-10-08 03:48:24 +03:00
parent 60e689cca0
commit 62ee0e894a
4 changed files with 291 additions and 64 deletions

View File

@ -82,12 +82,6 @@ final class ProfileService {
completion(.failure(ProfileServiceError.encoding(message))) completion(.failure(ProfileServiceError.encoding(message)))
return return
} }
if let jsonString = String(data: body, encoding: .utf8) {
print("📤 Request Body JSON:\n\(jsonString)")
} else {
print("⚠️ Не удалось преобразовать тело запроса в строку")
}
client.request( client.request(
path: "/v1/profile/edit", path: "/v1/profile/edit",

View File

@ -14,6 +14,16 @@
} }
} }
}, },
"%@: %@" : {
"localizations" : {
"ru" : {
"stringUnit" : {
"state" : "new",
"value" : "%1$@: %2$@"
}
}
}
},
"%lld" : { "%lld" : {
}, },
@ -148,7 +158,14 @@
} }
}, },
"Автоудаление аккаунта" : { "Автоудаление аккаунта" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Account Auto-Deletion"
}
}
}
}, },
"Активные сессии" : { "Активные сессии" : {
"localizations" : { "localizations" : {
@ -170,13 +187,34 @@
}, },
"Видимость и контент" : { "Видимость и контент" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Visibility & Content"
}
}
}
}, },
"Видимость статуса 'был в сети'" : { "Видимость статуса 'был в сети'" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "'Last Seen' Status Visibility"
}
}
}
}, },
"Включить автоудаление аккаунта" : { "Включить автоудаление аккаунта" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Enable Account Auto-Deletion"
}
}
}
}, },
"Вложение" : { "Вложение" : {
@ -191,6 +229,16 @@
} }
} }
}, },
"Все" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Everyone"
}
}
}
},
"Вы" : { "Вы" : {
"localizations" : { "localizations" : {
"en" : { "en" : {
@ -221,7 +269,15 @@
"comment" : "Global search section" "comment" : "Global search section"
}, },
"Готово" : { "Готово" : {
"comment" : "Profile update success title" "comment" : "Profile update success title",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Done"
}
}
}
}, },
"Данные" : { "Данные" : {
@ -420,6 +476,16 @@
"Кликер в разработке" : { "Кликер в разработке" : {
"comment" : "Concept tab placeholder title" "comment" : "Concept tab placeholder title"
}, },
"Контакты" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Contacts"
}
}
}
},
"Конфиденциальность" : { "Конфиденциальность" : {
"localizations" : { "localizations" : {
"en" : { "en" : {
@ -456,13 +522,34 @@
} }
}, },
"Кто может звонить" : { "Кто может звонить" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Who Can Call"
}
}
}
}, },
"Кто может приглашать в беседы" : { "Кто может приглашать в беседы" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Who Can Invite to Group Chats"
}
}
}
}, },
"Кто может приглашать в паблики" : { "Кто может приглашать в паблики" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Who Can Invite to Public Groups"
}
}
}
}, },
"Лента" : { "Лента" : {
"localizations" : { "localizations" : {
@ -519,8 +606,15 @@
"Локальные чаты" : { "Локальные чаты" : {
"comment" : "Local search section" "comment" : "Local search section"
}, },
"Максимальное время автоудаления: %@" : { "Максимальное время автоудаления" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maximum Auto-Delete Time"
}
}
}
}, },
"Мини-приложения" : { "Мини-приложения" : {
"comment" : "Applets", "comment" : "Applets",
@ -576,10 +670,25 @@
} }
}, },
"Настройки приватности" : { "Настройки приватности" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Privacy Settings"
}
}
}
}, },
"Настройки приватности обновлены." : { "Настройки приватности обновлены." : {
"comment" : "Profile update success fallback" "comment" : "Profile update success fallback",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Privacy Settings Updated."
}
}
}
}, },
"Не удалось выполнить поиск." : { "Не удалось выполнить поиск." : {
"comment" : "Search error fallback\nSearch service decoding error" "comment" : "Search error fallback\nSearch service decoding error"
@ -793,6 +902,16 @@
} }
} }
}, },
"Никто" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nobody"
}
}
}
},
"Ничего не найдено" : { "Ничего не найдено" : {
"comment" : "Global search empty state" "comment" : "Global search empty state"
}, },
@ -831,7 +950,14 @@
}, },
"Ограничить таймер автоудаления (максимум)" : { "Ограничить таймер автоудаления (максимум)" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Limit Auto-Delete Timer (Maximum)"
}
}
}
}, },
"Описание" : { "Описание" : {
@ -1044,13 +1170,34 @@
} }
}, },
"Показывать био не-контактам" : { "Показывать био не-контактам" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Show Bio to Non-Contacts"
}
}
}
}, },
"Показывать сторисы не-контактам" : { "Показывать сторисы не-контактам" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Show Stories to Non-Contacts"
}
}
}
}, },
"Показывать фото не-контактам" : { "Показывать фото не-контактам" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Show Profile Photo to Non-Contacts"
}
}
}
}, },
"Пользователь Системы 1" : { "Пользователь Системы 1" : {
"comment" : "Тестовая подмена офф аккаунта", "comment" : "Тестовая подмена офф аккаунта",
@ -1079,7 +1226,14 @@
}, },
"Приватные чаты" : { "Приватные чаты" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Private Chats"
}
}
}
}, },
"Приглашение достигло лимита использования." : { "Приглашение достигло лимита использования." : {
"localizations" : { "localizations" : {
@ -1112,7 +1266,14 @@
} }
}, },
"Приглашения и звонки" : { "Приглашения и звонки" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Invitations & Calls"
}
}
}
}, },
"Приложение" : { "Приложение" : {
@ -1128,10 +1289,24 @@
} }
}, },
"Принимать сообщения от незнакомцев" : { "Принимать сообщения от незнакомцев" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Allow Messages from Non-Contacts"
}
}
}
}, },
"Принудительное включение автоудаления сообщений" : { "Принудительное включение автоудаления сообщений" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Force Auto-Delete in Private Chats"
}
}
}
}, },
"Проверьте данные и повторите попытку." : { "Проверьте данные и повторите попытку." : {
"localizations" : { "localizations" : {
@ -1170,19 +1345,47 @@
"comment" : "Search placeholder title" "comment" : "Search placeholder title"
}, },
"Профиль и поиск" : { "Профиль и поиск" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Profile & Search"
}
}
}
}, },
"Публичная информация" : { "Публичная информация" : {
}, },
"Разрешить пересылку сообщений" : { "Разрешить пересылку сообщений" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Allow Message Forwarding"
}
}
}
}, },
"Разрешить поиск профиля" : { "Разрешить поиск профиля" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Allow Profile Search"
}
}
}
}, },
"Разрешить хранить чаты на сервере" : { "Разрешить хранить чаты на сервере" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Allow Storing Chats on Server"
}
}
}
}, },
"Регистрация" : { "Регистрация" : {
"comment" : "Регистрация", "comment" : "Регистрация",
@ -1246,7 +1449,14 @@
} }
}, },
"Сбросить по умолчанию" : { "Сбросить по умолчанию" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Reset to Default"
}
}
}
}, },
"Светлая" : { "Светлая" : {
"localizations" : { "localizations" : {
@ -1352,7 +1562,14 @@
}, },
"Сохранить изменения" : { "Сохранить изменения" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Save Changes"
}
}
}
}, },
"Спасибо!" : { "Спасибо!" : {
@ -1439,9 +1656,17 @@
} }
}, },
"Удалять аккаунт через %lld дн." : { "Удалять аккаунт через %lld дн." : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Delete Account After %lld days."
}
}
}
}, },
"Ура!" : { "Ура!" : {
"extractionState" : "stale",
"localizations" : { "localizations" : {
"en" : { "en" : {
"stringUnit" : { "stringUnit" : {
@ -1494,7 +1719,14 @@
} }
}, },
"Чаты и хранение" : { "Чаты и хранение" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Chats & Storage"
}
}
}
}, },
"Черновики" : { "Черновики" : {
"comment" : "Drafts", "comment" : "Drafts",

View File

@ -176,7 +176,7 @@ struct ChangePasswordView: View {
.alert(item: $alertData) { data in .alert(item: $alertData) { data in
Alert( Alert(
title: Text(data.kind == .success title: Text(data.kind == .success
? NSLocalizedString("Ура!", comment: "") ? NSLocalizedString("Готово", comment: "")
: NSLocalizedString("Ошибка", comment: "")), : NSLocalizedString("Ошибка", comment: "")),
message: Text(data.message), message: Text(data.message),
dismissButton: .default(Text(NSLocalizedString("OK", comment: ""))) { dismissButton: .default(Text(NSLocalizedString("OK", comment: ""))) {

View File

@ -59,18 +59,18 @@ struct EditPrivacyView: View {
} }
if !isLoading && loadError == nil { if !isLoading && loadError == nil {
Section(header: Text("Профиль и поиск")) { Section(header: Text(NSLocalizedString("Профиль и поиск", comment: ""))) {
Toggle("Разрешить поиск профиля", isOn: $profilePermissions.isSearchable) Toggle(NSLocalizedString("Разрешить поиск профиля", comment: ""), isOn: $profilePermissions.isSearchable)
Toggle("Разрешить пересылку сообщений", isOn: $profilePermissions.allowMessageForwarding) Toggle(NSLocalizedString("Разрешить пересылку сообщений", comment: ""), isOn: $profilePermissions.allowMessageForwarding)
Toggle("Принимать сообщения от незнакомцев", isOn: $profilePermissions.allowMessagesFromNonContacts) Toggle(NSLocalizedString("Принимать сообщения от незнакомцев", comment: ""), isOn: $profilePermissions.allowMessagesFromNonContacts)
} }
Section(header: Text("Видимость и контент")) { Section(header: Text(NSLocalizedString("Видимость и контент", comment: ""))) {
Toggle("Показывать фото не-контактам", isOn: $profilePermissions.showProfilePhotoToNonContacts) Toggle(NSLocalizedString("Показывать фото не-контактам", comment: ""), isOn: $profilePermissions.showProfilePhotoToNonContacts)
Toggle("Показывать био не-контактам", isOn: $profilePermissions.showBioToNonContacts) Toggle(NSLocalizedString("Показывать био не-контактам", comment: ""), isOn: $profilePermissions.showBioToNonContacts)
Toggle("Показывать сторисы не-контактам", isOn: $profilePermissions.showStoriesToNonContacts) Toggle(NSLocalizedString("Показывать сторисы не-контактам", comment: ""), isOn: $profilePermissions.showStoriesToNonContacts)
Picker("Видимость статуса 'был в сети'", selection: $profilePermissions.lastSeenVisibility) { Picker(NSLocalizedString("Видимость статуса 'был в сети'", comment: ""), selection: $profilePermissions.lastSeenVisibility) {
ForEach(privacyScopeOptions) { scope in ForEach(privacyScopeOptions) { scope in
Text(scope.title).tag(scope.rawValue) Text(scope.title).tag(scope.rawValue)
} }
@ -78,22 +78,22 @@ struct EditPrivacyView: View {
.pickerStyle(.segmented) .pickerStyle(.segmented)
} }
Section(header: Text("Приглашения и звонки")) { Section(header: Text(NSLocalizedString("Приглашения и звонки", comment: ""))) {
Picker("Кто может приглашать в паблики", selection: $profilePermissions.publicInvitePermission) { Picker(NSLocalizedString("Кто может приглашать в паблики", comment: ""), selection: $profilePermissions.publicInvitePermission) {
ForEach(privacyScopeOptions) { scope in ForEach(privacyScopeOptions) { scope in
Text(scope.title).tag(scope.rawValue) Text(scope.title).tag(scope.rawValue)
} }
} }
.pickerStyle(.segmented) .pickerStyle(.segmented)
Picker("Кто может приглашать в беседы", selection: $profilePermissions.groupInvitePermission) { Picker(NSLocalizedString("Кто может приглашать в беседы", comment: ""), selection: $profilePermissions.groupInvitePermission) {
ForEach(privacyScopeOptions) { scope in ForEach(privacyScopeOptions) { scope in
Text(scope.title).tag(scope.rawValue) Text(scope.title).tag(scope.rawValue)
} }
} }
.pickerStyle(.segmented) .pickerStyle(.segmented)
Picker("Кто может звонить", selection: $profilePermissions.callPermission) { Picker(NSLocalizedString("Кто может звонить", comment: ""), selection: $profilePermissions.callPermission) {
ForEach(privacyScopeOptions) { scope in ForEach(privacyScopeOptions) { scope in
Text(scope.title).tag(scope.rawValue) Text(scope.title).tag(scope.rawValue)
} }
@ -101,27 +101,28 @@ struct EditPrivacyView: View {
.pickerStyle(.segmented) .pickerStyle(.segmented)
} }
Section(header: Text("Чаты и хранение")) { Section(header: Text(NSLocalizedString("Чаты и хранение", comment: ""))) {
Toggle("Разрешить хранить чаты на сервере", isOn: $profilePermissions.allowServerChats) Toggle(NSLocalizedString("Разрешить хранить чаты на сервере", comment: ""), isOn: $profilePermissions.allowServerChats)
} }
Section(header: Text("Приватные чаты")) { Section(header: Text(NSLocalizedString("Приватные чаты", comment: ""))) {
Toggle("Принудительное включение автоудаления сообщений", isOn: $profilePermissions.forceAutoDeleteMessagesInPrivate) Toggle(NSLocalizedString("Принудительное включение автоудаления сообщений", comment: ""), isOn: $profilePermissions.forceAutoDeleteMessagesInPrivate)
Toggle("Ограничить таймер автоудаления (максимум)", isOn: autoDeleteTimerEnabled) Toggle(NSLocalizedString("Ограничить таймер автоудаления (максимум)", comment: ""), isOn: autoDeleteTimerEnabled)
if autoDeleteTimerEnabled.wrappedValue { if autoDeleteTimerEnabled.wrappedValue {
Stepper(value: autoDeleteTimerBinding, in: 5...86400, step: 5) { Stepper(value: autoDeleteTimerBinding, in: 5...86400, step: 5) {
Text("Максимальное время автоудаления: \(formattedAutoDeleteSeconds(autoDeleteTimerBinding.wrappedValue))") Text("\(NSLocalizedString("Максимальное время автоудаления", comment: "")): \(formattedAutoDeleteSeconds(autoDeleteTimerBinding.wrappedValue))")
} }
} }
} }
Section(header: Text("Автоудаление аккаунта")) { Section(header: Text(NSLocalizedString("Автоудаление аккаунта", comment: ""))) {
Toggle("Включить автоудаление аккаунта", isOn: autoDeleteAccountEnabled) Toggle(NSLocalizedString("Включить автоудаление аккаунта", comment: ""), isOn: autoDeleteAccountEnabled)
if autoDeleteAccountEnabled.wrappedValue { if autoDeleteAccountEnabled.wrappedValue {
Stepper(value: autoDeleteAccountBinding, in: 1...365) { Stepper(value: autoDeleteAccountBinding, in: 1...365) {
Text("Удалять аккаунт через \(autoDeleteAccountBinding.wrappedValue) дн.") Text(String(format: NSLocalizedString("Удалять аккаунт через %lld дн.", comment: ""), autoDeleteAccountBinding.wrappedValue))
} }
} }
} }
@ -136,7 +137,7 @@ struct EditPrivacyView: View {
ProgressView() ProgressView()
.frame(maxWidth: .infinity, alignment: .center) .frame(maxWidth: .infinity, alignment: .center)
} else { } else {
Text("Сохранить изменения") Text(NSLocalizedString("Сохранить изменения", comment: ""))
.frame(maxWidth: .infinity, alignment: .center) .frame(maxWidth: .infinity, alignment: .center)
} }
} }
@ -146,9 +147,9 @@ struct EditPrivacyView: View {
Section { Section {
Button(role: .destructive) { Button(role: .destructive) {
profilePermissions = ProfilePermissionsState() profilePermissions = ProfilePermissionsState()
print("Настройки приватности сброшены к значениям по умолчанию") if AppConfig.DEBUG {print("Настройки приватности сброшены к значениям по умолчанию")}
} label: { } label: {
Text("Сбросить по умолчанию") Text(NSLocalizedString("Сбросить по умолчанию", comment: ""))
.frame(maxWidth: .infinity, alignment: .center) .frame(maxWidth: .infinity, alignment: .center)
} }
} }
@ -165,7 +166,7 @@ struct EditPrivacyView: View {
} }
) )
} }
.navigationTitle("Настройки приватности") .navigationTitle(NSLocalizedString("Настройки приватности", comment: ""))
.task { .task {
await loadProfile() await loadProfile()
} }
@ -203,11 +204,11 @@ private enum PrivacyScope: Int, CaseIterable, Identifiable {
var title: String { var title: String {
switch self { switch self {
case .everyone: case .everyone:
return "Все" return NSLocalizedString("Все", comment: "")
case .contacts: case .contacts:
return "Контакты" return NSLocalizedString("Контакты", comment: "")
case .nobody: case .nobody:
return "Никто" return NSLocalizedString("Никто", comment: "")
} }
} }
} }