translate to english
This commit is contained in:
parent
a588a33338
commit
19251ed52f
@ -151,7 +151,7 @@ final class AuthService {
|
||||
return
|
||||
}
|
||||
|
||||
completion(true, apiResponse.data.message)
|
||||
completion(true, NSLocalizedString(apiResponse.data.message, comment: ""))
|
||||
} catch {
|
||||
completion(false, NSLocalizedString("Не удалось обработать ответ сервера.", comment: ""))
|
||||
}
|
||||
@ -280,20 +280,28 @@ final class AuthService {
|
||||
case .network(let err):
|
||||
return String(format: NSLocalizedString("Ошибка сети: %@", comment: ""), err.localizedDescription)
|
||||
case .server(let statusCode, let data):
|
||||
if let message = extractMessage(from: data) {
|
||||
return message
|
||||
}
|
||||
let message = extractMessage(from: data)
|
||||
|
||||
switch statusCode {
|
||||
case 401:
|
||||
return NSLocalizedString("Необходимо авторизоваться заново.", comment: "")
|
||||
case 403:
|
||||
if let message,
|
||||
Self.changePasswordForbiddenMessages.contains(message) {
|
||||
return NSLocalizedString(message, comment: "")
|
||||
}
|
||||
return NSLocalizedString("Старый пароль указан неверно или совпадает с новым.", comment: "")
|
||||
case 422:
|
||||
if let message {
|
||||
return message
|
||||
}
|
||||
return NSLocalizedString("Проверьте данные и повторите попытку.", comment: "")
|
||||
case 429:
|
||||
return NSLocalizedString("Слишком много попыток. Попробуйте позже.", comment: "")
|
||||
default:
|
||||
if let message {
|
||||
return message
|
||||
}
|
||||
return String(format: NSLocalizedString("Ошибка сервера: %@", comment: ""), "\(statusCode)")
|
||||
}
|
||||
case .unauthorized:
|
||||
@ -305,7 +313,8 @@ final class AuthService {
|
||||
|
||||
private func extractMessage(from data: Data?) -> String? {
|
||||
guard let data else { return nil }
|
||||
if let response = try? JSONDecoder().decode(ErrorResponse.self, from: data) {
|
||||
let decoder = JSONDecoder()
|
||||
if let response = try? decoder.decode(ErrorResponse.self, from: data) {
|
||||
if let message = response.data?.message, !message.isEmpty {
|
||||
return message
|
||||
}
|
||||
@ -313,10 +322,61 @@ final class AuthService {
|
||||
return detail
|
||||
}
|
||||
}
|
||||
|
||||
if let jsonObject = try? JSONSerialization.jsonObject(with: data) {
|
||||
if let dictionary = jsonObject as? [String: Any] {
|
||||
if let detail = Self.normalizedMessage(dictionary["detail"] as? String) {
|
||||
return detail
|
||||
}
|
||||
if let dataDict = dictionary["data"] as? [String: Any],
|
||||
let message = Self.normalizedMessage(dataDict["message"] as? String) {
|
||||
return message
|
||||
}
|
||||
if let errors = dictionary["errors"] as? [[String: Any]],
|
||||
let firstMessage = errors.compactMap({ Self.normalizedMessage($0["message"] as? String) }).first {
|
||||
return firstMessage
|
||||
}
|
||||
} else if let array = jsonObject as? [[String: Any]] {
|
||||
if let firstMessage = array.compactMap({ item -> String? in
|
||||
if let detail = Self.normalizedMessage(item["detail"] as? String) {
|
||||
return detail
|
||||
}
|
||||
if let message = Self.normalizedMessage(item["message"] as? String) {
|
||||
return message
|
||||
}
|
||||
if let msg = Self.normalizedMessage(item["msg"] as? String) {
|
||||
return msg
|
||||
}
|
||||
return nil
|
||||
}).first {
|
||||
return firstMessage
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if let string = Self.normalizedMessage(String(data: data, encoding: .utf8)) {
|
||||
return string
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
private extension AuthService {
|
||||
static let changePasswordForbiddenMessages: Set<String> = [
|
||||
"Неверный текущий пароль",
|
||||
"Пароль должен отличаться от старого",
|
||||
"Пароль не удовлетворяет требованиям"
|
||||
]
|
||||
|
||||
static func normalizedMessage(_ raw: String?) -> String? {
|
||||
guard let raw = raw?.trimmingCharacters(in: .whitespacesAndNewlines), !raw.isEmpty else {
|
||||
return nil
|
||||
}
|
||||
return raw
|
||||
}
|
||||
}
|
||||
|
||||
private struct LoginRequest: Encodable {
|
||||
let login: String
|
||||
let password: String
|
||||
|
||||
@ -80,6 +80,24 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"Password updated" : {
|
||||
"comment" : "ответ сервера (change password)",
|
||||
"extractionState" : "manual",
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Password updated"
|
||||
}
|
||||
},
|
||||
"ru" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Пароль обновлен"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"profile_down_text_1" : {
|
||||
|
||||
},
|
||||
@ -90,7 +108,14 @@
|
||||
|
||||
},
|
||||
"Push-уведомления" : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Push-notifications"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Yobble" : {
|
||||
"localizations" : {
|
||||
@ -99,11 +124,24 @@
|
||||
"state" : "translated",
|
||||
"value" : "Yobble"
|
||||
}
|
||||
},
|
||||
"ru" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Йоббле"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Активные сессии" : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Active sessions"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Без звука (скоро)" : {
|
||||
|
||||
@ -128,13 +166,27 @@
|
||||
}
|
||||
},
|
||||
"Вы" : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "You"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Вы предложили: %@" : {
|
||||
|
||||
},
|
||||
"Выйти из аккаунта" : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Log out of your account"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Где найти сохранённые черновики?" : {
|
||||
"comment" : "FAQ question: drafts"
|
||||
@ -143,7 +195,14 @@
|
||||
|
||||
},
|
||||
"Двухфакторная аутентификация" : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Two-factor authentication"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Добавить друзей" : {
|
||||
"comment" : "Add friends",
|
||||
@ -157,7 +216,14 @@
|
||||
}
|
||||
},
|
||||
"Другое" : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Other"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Заглушка: Push-уведомления" : {
|
||||
|
||||
@ -178,7 +244,14 @@
|
||||
|
||||
},
|
||||
"Загружаем чаты…" : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Loading chats…"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Загрузка..." : {
|
||||
"localizations" : {
|
||||
@ -227,16 +300,37 @@
|
||||
}
|
||||
},
|
||||
"Здесь не будут чаты" : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "There will be no chats here."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Идеи" : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Ideas"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Избранные сообщения" : {
|
||||
|
||||
},
|
||||
"Изменение пароля" : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Change password"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Инвайт-код (необязательно)" : {
|
||||
"comment" : "Инвайт-код",
|
||||
@ -320,7 +414,14 @@
|
||||
}
|
||||
},
|
||||
"Логин уже занят." : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "The login is already taken."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Мини-приложения" : {
|
||||
"comment" : "Applets",
|
||||
@ -376,46 +477,157 @@
|
||||
}
|
||||
},
|
||||
"Не удалось загрузить список чатов." : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Failed to load chat list."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Не удалось загрузить чаты." : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Failed to load chats."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Не удалось обновить пароль." : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Failed to update password."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Не удалось обработать данные чатов." : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Failed to process chat data."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Не удалось обработать ответ сервера." : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Failed to process server response."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Не удалось сериализовать данные запроса." : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Failed to serialize request data."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Неверный запрос (400)." : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Invalid request (400)."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Неверный код приглашения." : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Invalid invitation code."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Неверный логин" : {
|
||||
"comment" : "Неверный логин"
|
||||
"comment" : "Неверный логин",
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Invalid login"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Неверный логин или пароль." : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Incorrect login or password."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Неверный пароль" : {
|
||||
"comment" : "Неверный пароль"
|
||||
"comment" : "Неверный пароль",
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Incorrect password"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Неверный текущий пароль" : {
|
||||
"extractionState" : "manual",
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "The current password is incorrect"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Неизвестная ошибка" : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Unknown error"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Неизвестная ошибка." : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Unknown error."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Неизвестная ошибка. Попробуйте позже." : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Unknown error. Please try again later."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Неизвестный" : {
|
||||
|
||||
@ -430,19 +642,56 @@
|
||||
|
||||
},
|
||||
"Нет аккаунта? Регистрация" : {
|
||||
"comment" : "Регистрация"
|
||||
"comment" : "Регистрация",
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Don't have an account? Register"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Нет сообщений" : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "No messages"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Новый пароль" : {
|
||||
"comment" : "Новый пароль"
|
||||
"comment" : "Новый пароль",
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "New Password"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"О приложении" : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "About the app"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Обновить" : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Refresh"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Обратная связь" : {
|
||||
|
||||
@ -457,61 +706,197 @@
|
||||
|
||||
},
|
||||
"Ошибка" : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Error"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Ошибка авторизации" : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Authorization error"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Ошибка при деавторизации." : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Error while deauthorizing."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Ошибка регистрация" : {
|
||||
"comment" : "Ошибка"
|
||||
"comment" : "Ошибка",
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Registration error"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Ошибка сервера (%@)." : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Server error (%@)."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Ошибка сервера: %@" : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Server error: %@"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Ошибка сети: %@" : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Network error: %@"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Ошибка соединения с сервером." : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Server connection error."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Пароли не совпадают" : {
|
||||
"comment" : "Пароли не совпадают"
|
||||
"comment" : "Пароли не совпадают",
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "The passwords do not match"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Пароли не совпадают." : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "The passwords do not match."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Пароль" : {
|
||||
"comment" : "Пароль"
|
||||
"comment" : "Пароль",
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Password"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Пароль должен быть от 8 до 128 символов" : {
|
||||
"comment" : "Пароль должен быть от 6 до 32 символов"
|
||||
"comment" : "Пароль должен быть от 6 до 32 символов",
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "The password must be between 8 and 128 characters"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Пароль обновлен" : {
|
||||
|
||||
"Пароль должен отличаться от старого" : {
|
||||
"extractionState" : "manual",
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "The password must be different from the old one"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Пароль не удовлетворяет требованиям" : {
|
||||
"extractionState" : "manual",
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "The password does not meet the requirements"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Пароль успешно обновлен." : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Password updated successfully."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Перейдите в раздел \"Настройки > Сменить пароль\" и следуйте инструкциям." : {
|
||||
"comment" : "FAQ answer: reset password"
|
||||
},
|
||||
"Повторить" : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Repeat"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Поддержка" : {
|
||||
|
||||
},
|
||||
"Подтверждение пароля" : {
|
||||
"comment" : "Подтверждение пароля"
|
||||
"comment" : "Подтверждение пароля",
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Confirm password"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Пока что у вас нет чатов" : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "You don't have any chats yet."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Помощь" : {
|
||||
"comment" : "Help Center",
|
||||
@ -525,52 +910,151 @@
|
||||
}
|
||||
},
|
||||
"Приглашение достигло лимита использования." : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "The invitation has reached its usage limit."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Приглашение истекло." : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "The invitation has expired."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Приглашение не активно." : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "The invitation is not active."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Приложение" : {
|
||||
|
||||
},
|
||||
"Применить" : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Apply"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Проверьте данные и повторите попытку." : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Please check your data and try again."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Произошла ошибка." : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "An error occurred."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Публичная информация" : {
|
||||
|
||||
},
|
||||
"Регистрация" : {
|
||||
"comment" : "Регистрация"
|
||||
"comment" : "Регистрация",
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Registration"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Регистрация временно недоступна." : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Registration is temporarily unavailable."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Регистрация выполнена, но вход не удался." : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Registration completed, but login failed."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Регистрация запрещена." : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Registration is prohibited."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Регистрация и вход выполнены успешно." : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Registration and login completed successfully."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Редактировать профиль" : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Edit profile"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Сервер не отвечает. Попробуйте позже." : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "The server is not responding. Try again later."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Сессия истекла. Войдите снова." : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Session expired. Please log in again."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Скан" : {
|
||||
"comment" : "Scan",
|
||||
@ -584,13 +1068,40 @@
|
||||
}
|
||||
},
|
||||
"Слишком много запросов." : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Too many requests."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Слишком много попыток. Попробуйте позже." : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "needs_review",
|
||||
"value" : "You want too much. Take a rest."
|
||||
}
|
||||
},
|
||||
"ru" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Слишком много хочешь. Отдохни."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Сменить пароль" : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Change password"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Сообщение" : {
|
||||
|
||||
@ -599,22 +1110,75 @@
|
||||
|
||||
},
|
||||
"Старый пароль" : {
|
||||
"comment" : "Старый пароль"
|
||||
"comment" : "Старый пароль",
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Old Password"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Старый пароль указан неверно или совпадает с новым." : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "The old password is incorrect or the same as the new one."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Темы" : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Themes"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Ты шо ебанутый? А ниче тот факт что новый пароль должен отличаться от старого." : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Are you fucking nuts? It's okay that the new password has to be different from the old one."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Уведомления" : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Notifications"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Удалить чат (скоро)" : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Delete chat (cuming soon)"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Ура!" : {
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Fine!"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Центр авторов" : {
|
||||
"comment" : "Creator Center",
|
||||
@ -628,13 +1192,35 @@
|
||||
}
|
||||
},
|
||||
"Частые вопросы" : {
|
||||
"comment" : "FAQ navigation title"
|
||||
"comment" : "FAQ navigation title",
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "FAQ"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Чат" : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Chat"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Чаты" : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Chats"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Черновики" : {
|
||||
"comment" : "Drafts",
|
||||
@ -654,7 +1240,14 @@
|
||||
|
||||
},
|
||||
"Язык" : {
|
||||
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Language"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"version" : "1.0"
|
||||
|
||||
@ -176,7 +176,7 @@ struct ChangePasswordView: View {
|
||||
.alert(item: $alertData) { data in
|
||||
Alert(
|
||||
title: Text(data.kind == .success
|
||||
? NSLocalizedString("Пароль обновлен", comment: "")
|
||||
? NSLocalizedString("Ура!", comment: "")
|
||||
: NSLocalizedString("Ошибка", comment: "")),
|
||||
message: Text(data.message),
|
||||
dismissButton: .default(Text(NSLocalizedString("OK", comment: ""))) {
|
||||
|
||||
@ -21,9 +21,9 @@ struct SettingsView: View {
|
||||
// }
|
||||
|
||||
// MARK: - Безопасность
|
||||
Section(header: Text("Безопасность")) {
|
||||
Section(header: Text(NSLocalizedString("Безопасность", comment: ""))) {
|
||||
NavigationLink(destination: ChangePasswordView()) {
|
||||
Label("Сменить пароль", systemImage: "key")
|
||||
Label(NSLocalizedString("Сменить пароль", comment: ""), systemImage: "key")
|
||||
}
|
||||
NavigationLink(destination: Text("Заглушка: Двухфакторная аутентификация")) {
|
||||
Label("Двухфакторная аутентификация", systemImage: "lock.shield")
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user