Russian UI: settings, notch views, agent steps, errors; visible success after installing hooks
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -150,8 +150,8 @@ final class AppState: ObservableObject {
|
||||
let normalised = LocalChat.normaliseURL(baseURL)
|
||||
guard !normalised.isEmpty else {
|
||||
providerModelFetchError[provider] = provider == .ollama
|
||||
? "Connect Ollama in Settings → Chat first."
|
||||
: "Connect LM Studio in Settings → Chat first."
|
||||
? "Сначала подключите Ollama в Настройки → Чат."
|
||||
: "Сначала подключите LM Studio в Настройки → Чат."
|
||||
return
|
||||
}
|
||||
loadingProviderModels.insert(provider)
|
||||
@@ -162,8 +162,8 @@ final class AppState: ObservableObject {
|
||||
switch result {
|
||||
case .success(let models) where models.isEmpty:
|
||||
providerModelFetchError[provider] = provider == .ollama
|
||||
? "No models yet. Download one in Ollama first."
|
||||
: "No models yet. Download one in LM Studio first."
|
||||
? "Моделей пока нет. Скачайте модель в Ollama."
|
||||
: "Моделей пока нет. Скачайте модель в LM Studio."
|
||||
case .success(let models):
|
||||
fetchedProviderModels[provider] = models
|
||||
let current = provider == .ollama ? ollamaChatModel : lmstudioChatModel
|
||||
@@ -173,14 +173,14 @@ final class AppState: ObservableObject {
|
||||
else { lmstudioChatModel = first }
|
||||
}
|
||||
case .failure:
|
||||
providerModelFetchError[provider] = "Cannot reach \(normalised). Is the server running?"
|
||||
providerModelFetchError[provider] = "Нет связи с \(normalised). Сервер запущен?"
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
// Remote providers: require API key
|
||||
guard let apiKey = KeychainStore.shared.get(provider.keychainKey), !apiKey.isEmpty else {
|
||||
providerModelFetchError[provider] = "No API key — add it in Settings."
|
||||
providerModelFetchError[provider] = "Нет API-ключа — добавьте его в Настройки → Чат."
|
||||
return
|
||||
}
|
||||
loadingProviderModels.insert(provider)
|
||||
@@ -196,7 +196,7 @@ final class AppState: ObservableObject {
|
||||
}
|
||||
loadingProviderModels.remove(provider)
|
||||
if models.isEmpty {
|
||||
providerModelFetchError[provider] = "Failed to load models. Check your API key."
|
||||
providerModelFetchError[provider] = "Не удалось загрузить модели. Проверьте API-ключ."
|
||||
} else {
|
||||
fetchedProviderModels[provider] = models
|
||||
switch provider {
|
||||
@@ -680,13 +680,13 @@ struct VercelDeployment: Identifiable {
|
||||
let branch: String?
|
||||
|
||||
var isSuccess: Bool { state == "READY" }
|
||||
var statusLabel: String { isSuccess ? "Ready" : (state == "CANCELED" ? "Canceled" : "Error") }
|
||||
var statusLabel: String { isSuccess ? "Готово" : (state == "CANCELED" ? "Отменено" : "Ошибка") }
|
||||
var timeAgo: String {
|
||||
let diff = Date().timeIntervalSince(createdAt)
|
||||
if diff < 60 { return "just now" }
|
||||
if diff < 3600 { return "\(Int(diff/60))m" }
|
||||
if diff < 86400 { return "\(Int(diff/3600))h" }
|
||||
return "\(Int(diff/86400))d"
|
||||
if diff < 60 { return "только что" }
|
||||
if diff < 3600 { return "\(Int(diff/60)) мин" }
|
||||
if diff < 86400 { return "\(Int(diff/3600)) ч" }
|
||||
return "\(Int(diff/86400)) д"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -705,10 +705,10 @@ struct ResendEmail: Identifiable {
|
||||
}
|
||||
var timeAgo: String {
|
||||
let diff = Date().timeIntervalSince(createdAt)
|
||||
if diff < 60 { return "just now" }
|
||||
if diff < 3600 { return "\(Int(diff/60))m" }
|
||||
if diff < 86400 { return "\(Int(diff/3600))h" }
|
||||
return "\(Int(diff/86400))d"
|
||||
if diff < 60 { return "только что" }
|
||||
if diff < 3600 { return "\(Int(diff/60)) мин" }
|
||||
if diff < 86400 { return "\(Int(diff/3600)) ч" }
|
||||
return "\(Int(diff/86400)) д"
|
||||
}
|
||||
var isDelivered: Bool { lastEvent == "delivered" }
|
||||
}
|
||||
@@ -734,10 +734,10 @@ struct StripePayment: Identifiable, Equatable {
|
||||
var isSuccess: Bool { status == "succeeded" }
|
||||
var timeAgo: String {
|
||||
let diff = Date().timeIntervalSince(createdAt)
|
||||
if diff < 60 { return "just now" }
|
||||
if diff < 3600 { return "\(Int(diff/60))m" }
|
||||
if diff < 86400 { return "\(Int(diff/3600))h" }
|
||||
return "\(Int(diff/86400))d"
|
||||
if diff < 60 { return "только что" }
|
||||
if diff < 3600 { return "\(Int(diff/60)) мин" }
|
||||
if diff < 86400 { return "\(Int(diff/3600)) ч" }
|
||||
return "\(Int(diff/86400)) д"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -781,10 +781,10 @@ struct NotionPage: Identifiable {
|
||||
|
||||
var timeAgo: String {
|
||||
let diff = Date().timeIntervalSince(lastEditedAt)
|
||||
if diff < 60 { return "now" }
|
||||
if diff < 3600 { return "\(Int(diff/60))m" }
|
||||
if diff < 86400 { return "\(Int(diff/3600))h" }
|
||||
return "\(Int(diff/86400))d"
|
||||
if diff < 60 { return "сейчас" }
|
||||
if diff < 3600 { return "\(Int(diff/60)) мин" }
|
||||
if diff < 86400 { return "\(Int(diff/3600)) ч" }
|
||||
return "\(Int(diff/86400)) д"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user