Skip to content
Open
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
4 changes: 4 additions & 0 deletions ScreenTextGrab/AutomationSupport.swift
Original file line number Diff line number Diff line change
Expand Up @@ -515,6 +515,8 @@ private extension OCRLanguagePreference {
return .italian
case "pt", "pt-br", "portuguese", "portugues":
return .portuguese
case "zh", "zh-hans", "zh-cn", "chinese", "简体中文":
return .chinese
default:
return nil
}
Expand All @@ -536,6 +538,8 @@ private extension OCRLanguagePreference {
return "it"
case .portuguese:
return "pt"
case .chinese:
return "zh"
}
}
}
96 changes: 53 additions & 43 deletions ScreenTextGrab/Localization.swift
Original file line number Diff line number Diff line change
Expand Up @@ -34,53 +34,63 @@ enum L10n {
languageIdentifier.hasPrefix("en")
}

static var usesChinese: Bool {
languageIdentifier.hasPrefix("zh")
}

static func pair(_ tr: String, _ en: String) -> String {
usesEnglish ? en : tr
if usesChinese { return en }
return usesEnglish ? en : tr
}

static func triple(_ tr: String, _ en: String, _ zh: String) -> String {
if usesChinese { return zh }
return usesEnglish ? en : tr
}

static func format(_ tr: String, _ en: String, _ arguments: CVarArg...) -> String {
let format = pair(tr, en)
return String(format: format, locale: Locale.current, arguments: arguments)
}

static var controlsTitle: String { pair("Kontroller", "Controls") }
static var settingsTitle: String { pair("ScreenTextGrab Ayarları", "ScreenTextGrab Settings") }
static var settingsSubtitle: String { pair("Kısayol, izinler, OCR dili ve geçmiş yönetimini buradan düzenle.", "Manage shortcuts, permissions, OCR language, and history here.") }
static var controlsTitle: String { triple("Kontroller", "Controls", "控制") }
static var settingsTitle: String { triple("ScreenTextGrab Ayarları", "ScreenTextGrab Settings", "ScreenTextGrab 设置") }
static var settingsSubtitle: String { triple("Kısayol, izinler, OCR dili ve geçmiş yönetimini buradan düzenle.", "Manage shortcuts, permissions, OCR language, and history here.", "在此管理快捷键、权限、OCR 语言和历史记录。") }

static var settingsTabGeneral: String { pair("Genel", "General") }
static var settingsTabGeneral: String { triple("Genel", "General", "通用") }
static var settingsTabOCR: String { "OCR" }
static var settingsTabDiagnostics: String { pair("Tanı", "Diagnostics") }
static var settingsTabHistory: String { pair("Geçmiş", "History") }
static var settingsTabDiagnostics: String { triple("Tanı", "Diagnostics", "诊断") }
static var settingsTabHistory: String { triple("Geçmiş", "History", "历史记录") }

static var actionSettings: String { pair("Ayarlar", "Settings") }
static var actionRefresh: String { pair("Yenile", "Refresh") }
static var actionClipboardImage: String { pair("Panodaki Görseli Oku", "Read Clipboard Image") }
static var actionImageFile: String { pair("Görsel Dosyası Oku", "Read Image File") }
static var actionPDFFile: String { pair("PDF Oku", "Read PDF") }
static var actionSettings: String { triple("Ayarlar", "Settings", "设置") }
static var actionRefresh: String { triple("Yenile", "Refresh", "刷新") }
static var actionClipboardImage: String { triple("Panodaki Görseli Oku", "Read Clipboard Image", "读取剪贴板图片") }
static var actionImageFile: String { triple("Görsel Dosyası Oku", "Read Image File", "读取图片文件") }
static var actionPDFFile: String { triple("PDF Oku", "Read PDF", "读取 PDF") }
static var actionSearchablePDF: String { "Searchable PDF" }
static var actionCheckForUpdates: String { pair("Güncellemeleri Kontrol Et", "Check for Updates") }
static var actionCheckingForUpdates: String { pair("Kontrol Ediliyor...", "Checking...") }
static var actionDownloadingUpdate: String { pair("İndiriliyor...", "Downloading...") }
static var actionRestartToUpdate: String { pair("Yeniden Başlat ve Güncelle", "Restart & Update") }
static var actionRetryUpdate: String { pair("Tekrar Dene", "Try Again") }
static var actionUpToDate: String { pair("Güncel", "Up to Date") }
static var actionAllow: String { pair("İzin Ver", "Allow Access") }
static var actionSystemSettings: String { pair("Sistem Ayarları", "System Settings") }
static var actionRequestPermission: String { pair("İzin İste", "Request Access") }
static var actionDiagnostics: String { pair("Tanı", "Diagnostics") }
static var actionCopy: String { pair("Kopyala", "Copy") }
static var actionDelete: String { pair("Sil", "Delete") }
static var actionExport: String { pair("Dışa Aktar", "Export") }
static var actionClear: String { pair("Temizle", "Clear") }
static var actionSupportBundle: String { pair("Support Paketi", "Support Bundle") }
static var actionCopyDiagnostics: String { pair("Tanıyı Kopyala", "Copy Diagnostics") }
static var actionLoginItems: String { pair("Giriş Öğeleri", "Login Items") }
static var actionDefault: String { pair("Varsayılan", "Default") }
static var actionChange: String { pair("Değiştir", "Change") }
static var actionCancel: String { pair("İptal", "Cancel") }
static var actionOpenApplicationsFolder: String { pair("Applications Klasörünü Aç", "Open Applications Folder") }
static var actionContinue: String { pair("Devam Et", "Continue") }
static var ocrAutomaticLanguage: String { pair("Dili otomatik algıla", "Automatically detect language") }
static var actionCheckForUpdates: String { triple("Güncellemeleri Kontrol Et", "Check for Updates", "检查更新") }
static var actionCheckingForUpdates: String { triple("Kontrol Ediliyor...", "Checking...", "检查中...") }
static var actionDownloadingUpdate: String { triple("İndiriliyor...", "Downloading...", "下载中...") }
static var actionRestartToUpdate: String { triple("Yeniden Başlat ve Güncelle", "Restart & Update", "重启并更新") }
static var actionRetryUpdate: String { triple("Tekrar Dene", "Try Again", "重试") }
static var actionUpToDate: String { triple("Güncel", "Up to Date", "已是最新") }
static var actionAllow: String { triple("İzin Ver", "Allow Access", "允许访问") }
static var actionSystemSettings: String { triple("Sistem Ayarları", "System Settings", "系统设置") }
static var actionRequestPermission: String { triple("İzin İste", "Request Access", "请求权限") }
static var actionDiagnostics: String { triple("Tanı", "Diagnostics", "诊断") }
static var actionCopy: String { triple("Kopyala", "Copy", "复制") }
static var actionDelete: String { triple("Sil", "Delete", "删除") }
static var actionExport: String { triple("Dışa Aktar", "Export", "导出") }
static var actionClear: String { triple("Temizle", "Clear", "清除") }
static var actionSupportBundle: String { triple("Support Paketi", "Support Bundle", "支持包") }
static var actionCopyDiagnostics: String { triple("Tanıyı Kopyala", "Copy Diagnostics", "复制诊断信息") }
static var actionLoginItems: String { triple("Giriş Öğeleri", "Login Items", "登录项") }
static var actionDefault: String { triple("Varsayılan", "Default", "默认") }
static var actionChange: String { triple("Değiştir", "Change", "更改") }
static var actionCancel: String { triple("İptal", "Cancel", "取消") }
static var actionOpenApplicationsFolder: String { triple("Applications Klasörünü Aç", "Open Applications Folder", "打开应用程序文件夹") }
static var actionContinue: String { triple("Devam Et", "Continue", "继续") }
static var ocrAutomaticLanguage: String { triple("Dili otomatik algıla", "Automatically detect language", "自动检测语言") }

static var installRootUnavailable: String { pair("Applications klasöründe yazılabilir bir hedef bulunamadı.", "No writable install destination was found in Applications.") }
static var installCopyFailedPrefix: String { pair("Uygulama Applications klasörüne taşınamadı:", "The app could not be moved to Applications:") }
Expand All @@ -90,12 +100,12 @@ enum L10n {
static var installAlertTitle: String { pair("Uygulamayı Applications klasöründen aç", "Open the app from Applications") }
static var installAlertBody: String { pair("ScreenTextGrab izinleri ve Spotlight kaydını stabil tutmak için Applications klasöründen çalışmalıdır.", "ScreenTextGrab should run from Applications so permissions and Spotlight registration stay stable.") }

static var accessibilityQuitApp: String { pair("Uygulamadan çık", "Quit app") }
static var accessibilityCheckForUpdates: String { pair("Güncellemeleri kontrol et", "Check for updates") }
static var accessibilityResetHotkey: String { pair("Kısayolu varsayılana döndür", "Reset shortcut to default") }
static var accessibilityLaunchAtLoginToggle: String { pair("Açılışta başlat", "Launch at login") }
static var accessibilityCaptureMode: String { pair("Yakalama modu", "Capture mode") }
static var accessibilityOCRLanguage: String { pair("OCR dili", "OCR language") }
static var accessibilityAutomaticLanguage: String { pair("Dili otomatik algıla", "Automatically detect language") }
static var accessibilityInterfaceLanguage: String { pair("Arayüz dili", "Interface language") }
static var accessibilityQuitApp: String { triple("Uygulamadan çık", "Quit app", "退出应用") }
static var accessibilityCheckForUpdates: String { triple("Güncellemeleri kontrol et", "Check for updates", "检查更新") }
static var accessibilityResetHotkey: String { triple("Kısayolu varsayılana döndür", "Reset shortcut to default", "重置快捷键为默认") }
static var accessibilityLaunchAtLoginToggle: String { triple("Açılışta başlat", "Launch at login", "开机启动") }
static var accessibilityCaptureMode: String { triple("Yakalama modu", "Capture mode", "捕获模式") }
static var accessibilityOCRLanguage: String { triple("OCR dili", "OCR language", "OCR 语言") }
static var accessibilityAutomaticLanguage: String { triple("Dili otomatik algıla", "Automatically detect language", "自动检测语言") }
static var accessibilityInterfaceLanguage: String { triple("Arayüz dili", "Interface language", "界面语言") }
}
35 changes: 20 additions & 15 deletions ScreenTextGrab/Models/AppModels.swift
Original file line number Diff line number Diff line change
Expand Up @@ -112,26 +112,26 @@ enum CaptureMode: String, CaseIterable, Codable, Equatable, Sendable, Identifiab
var title: String {
switch self {
case .standard:
return L10n.pair("Standart", "Standard")
return L10n.triple("Standart", "Standard", "标准")
case .subtitle:
return L10n.pair("Altyazı", "Subtitle")
return L10n.triple("Altyazı", "Subtitle", "字幕")
case .code:
return L10n.pair("Kod", "Code")
return L10n.triple("Kod", "Code", "代码")
case .table:
return L10n.pair("Tablo", "Table")
return L10n.triple("Tablo", "Table", "表格")
}
}

var shortTitle: String {
switch self {
case .standard:
return L10n.pair("Standart", "Standard")
return L10n.triple("Standart", "Standard", "标准")
case .subtitle:
return L10n.pair("Altyazı", "Subtitle")
return L10n.triple("Altyazı", "Subtitle", "字幕")
case .code:
return L10n.pair("Kod", "Code")
return L10n.triple("Kod", "Code", "代码")
case .table:
return L10n.pair("Tablo", "Table")
return L10n.triple("Tablo", "Table", "表格")
}
}

Expand Down Expand Up @@ -239,11 +239,11 @@ enum CaptureOutputPreset: String, CaseIterable, Codable, Equatable, Sendable, Id
var title: String {
switch self {
case .smart:
return L10n.pair("Akıllı", "Smart")
return L10n.triple("Akıllı", "Smart", "智能")
case .plainText:
return L10n.pair("Düz Metin", "Plain Text")
return L10n.triple("Düz Metin", "Plain Text", "纯文本")
case .cleaned:
return L10n.pair("Temizlenmiş", "Cleaned")
return L10n.triple("Temizlenmiş", "Cleaned", "已清理")
case .office:
return "Office"
case .markdown:
Expand All @@ -256,7 +256,7 @@ enum CaptureOutputPreset: String, CaseIterable, Codable, Equatable, Sendable, Id
var shortTitle: String {
switch self {
case .smart:
return L10n.pair("Akıllı", "Smart")
return L10n.triple("Akıllı", "Smart", "智能")
case .plainText:
return L10n.pair("Düz", "Plain")
case .cleaned:
Expand All @@ -273,11 +273,11 @@ enum CaptureOutputPreset: String, CaseIterable, Codable, Equatable, Sendable, Id
var summary: String {
switch self {
case .smart:
return L10n.pair("Moda göre en uygun sonuç", "Best result for the current mode")
return L10n.triple("Moda göre en uygun sonuç", "Best result for the current mode", "当前模式的最佳结果")
case .plainText:
return L10n.pair("Yalın ve doğrudan metin", "Simple, direct text")
return L10n.triple("Yalın ve doğrudan metin", "Simple, direct text", "简洁直接的文本")
case .cleaned:
return L10n.pair("OCR gürültüsünü azaltır", "Reduces OCR noise")
return L10n.triple("OCR gürültüsünü azaltır", "Reduces OCR noise", "减少 OCR 噪声")
case .office:
return L10n.pair("Office ve tablo uygulamalarıyla uyumlu", "Works well with spreadsheet and word processor apps")
case .markdown:
Expand Down Expand Up @@ -481,6 +481,7 @@ enum OCRLanguagePreference: String, CaseIterable, Codable, Equatable, Sendable,
case spanish = "es-ES"
case italian = "it-IT"
case portuguese = "pt-BR"
case chinese = "zh-Hans"

var id: String { rawValue }

Expand All @@ -500,6 +501,8 @@ enum OCRLanguagePreference: String, CaseIterable, Codable, Equatable, Sendable,
return L10n.pair("Italiano", "Italian")
case .portuguese:
return L10n.pair("Português", "Portuguese")
case .chinese:
return L10n.triple("Çince", "Chinese", "简体中文")
}
}

Expand All @@ -519,6 +522,8 @@ enum OCRLanguagePreference: String, CaseIterable, Codable, Equatable, Sendable,
return "IT"
case .portuguese:
return "PT"
case .chinese:
return "ZH"
}
}
}
Expand Down
7 changes: 7 additions & 0 deletions ScreenTextGrab/Models/CapturePreferences.swift
Original file line number Diff line number Diff line change
Expand Up @@ -280,6 +280,7 @@ enum InterfaceLanguage: String, CaseIterable, Codable, Equatable, Sendable, Iden
case system
case turkish
case english
case chinese

var id: String { rawValue }

Expand All @@ -291,6 +292,8 @@ enum InterfaceLanguage: String, CaseIterable, Codable, Equatable, Sendable, Iden
return "Türkçe"
case .english:
return "English"
case .chinese:
return "简体中文"
}
}

Expand All @@ -302,6 +305,8 @@ enum InterfaceLanguage: String, CaseIterable, Codable, Equatable, Sendable, Iden
return L10n.pair("Arayüz her zaman Türkçe görünür.", "The interface always appears in Turkish.")
case .english:
return L10n.pair("Arayüz her zaman English görünür.", "The interface always appears in English.")
case .chinese:
return L10n.triple("Arayüz her zaman Çince görünür.", "The interface always appears in Chinese.", "界面始终显示为简体中文。")
}
}

Expand All @@ -313,6 +318,8 @@ enum InterfaceLanguage: String, CaseIterable, Codable, Equatable, Sendable, Iden
return "tr"
case .english:
return "en"
case .chinese:
return "zh"
}
}
}
Expand Down
Loading