diff --git a/Sources/MacCleanKit/Constants.swift b/Sources/MacCleanKit/Constants.swift index 2d1e4140..eda52e00 100644 --- a/Sources/MacCleanKit/Constants.swift +++ b/Sources/MacCleanKit/Constants.swift @@ -199,6 +199,7 @@ public enum MCConstants { "de.lproj", "de-DE.lproj", "de_DE.lproj", "de-AT.lproj", "de_AT.lproj", "de-CH.lproj", "de_CH.lproj", "German.lproj", "fr.lproj", "fr-FR.lproj", "fr_FR.lproj", "French.lproj", + "it.lproj", "it-IT.lproj", "it_IT.lproj", "it-CH.lproj", "it_CH.lproj", "Italian.lproj", ] // MARK: - Log File Path @@ -231,5 +232,5 @@ public enum MCConstants { // plugin was tried (commit history) but doesn't work under multi-arch // `swift build --arch arm64 --arch x86_64` because xcbuild doesn't // execute plugins. - public static let appVersion = "1.25.3" + public static let appVersion = "1.25.4" } diff --git a/Sources/MacCleanKit/Localization.swift b/Sources/MacCleanKit/Localization.swift index a3472978..5e374286 100644 --- a/Sources/MacCleanKit/Localization.swift +++ b/Sources/MacCleanKit/Localization.swift @@ -8,6 +8,7 @@ public enum AppLanguage: String, CaseIterable, Identifiable, Sendable { case system = "system" case de = "de" case fr = "fr" + case it = "it" case ru = "ru" case zhHans = "zh-Hans" case zhHant = "zh-Hant" @@ -28,6 +29,8 @@ public enum AppLanguage: String, CaseIterable, Identifiable, Sendable { "de" case .fr: "fr" + case .it: + "it" case .ru: "ru" case .zhHans: @@ -42,7 +45,7 @@ public enum AppLanguage: String, CaseIterable, Identifiable, Sendable { public var resolved: AppLanguage { switch self { case .system: Self.systemPreferred - case .de, .fr, .ru, .zhHans, .zhHant, .en: self + case .de, .fr, .it, .ru, .zhHans, .zhHant, .en: self } } @@ -56,6 +59,7 @@ public enum AppLanguage: String, CaseIterable, Identifiable, Sendable { switch normalized.split(separator: "-", maxSplits: 1).first { case "de": return .de case "fr": return .fr + case "it": return .it case "ru": return .ru case "zh": // Traditional markers: Hant script, or Taiwan/Hong Kong/Macau regions. @@ -76,6 +80,7 @@ public enum AppLanguage: String, CaseIterable, Identifiable, Sendable { case .system: L10n.tr("跟随系统", "System", "Системный") case .de: "Deutsch" case .fr: "Français" + case .it: "Italiano" case .ru: "Русский" case .zhHans: "简体中文" case .zhHant: "繁體中文" @@ -128,6 +133,7 @@ public enum L10n { case .system, .en: english() case .de: germanFallbacks[zhHans] ?? english() case .fr: frenchFallbacks[zhHans] ?? english() + case .it: italianFallbacks[zhHans] ?? english() case .ru: russianFallbacks[zhHans] ?? english() } } @@ -141,6 +147,7 @@ public enum L10n { case .system, .en: english() case .de: germanFallbacks[zhHans] ?? english() case .fr: frenchFallbacks[zhHans] ?? english() + case .it: italianFallbacks[zhHans] ?? english() case .ru: russian() case .zhHans: zhHans case .zhHant: traditionalChineseFallbacks[zhHans] ?? zhHans @@ -155,6 +162,8 @@ public enum L10n { germanFallbacks[zhHans] ?? englishFallbacks[zhHans] ?? zhHans case .fr: frenchFallbacks[zhHans] ?? englishFallbacks[zhHans] ?? zhHans + case .it: + italianFallbacks[zhHans] ?? englishFallbacks[zhHans] ?? zhHans case .ru: russianFallbacks[zhHans] ?? englishFallbacks[zhHans] ?? zhHans case .zhHans: @@ -2013,6 +2022,623 @@ public enum L10n { "逐字节完全相同的副本。每个需要的文件请至少保留一份。": "Byte für Byte identische Kopien. Behalte von jeder benötigten Datei mindestens eine Kopie.", ] + private static let italianFallbacks: [String: String] = [ + "查找并移除系统缓存、日志、\n语言文件和其他垃圾": "Trova e rimuovi cache di sistema, registri,\nfile di localizzazione e altri file non necessari", + "清理会删除悬空的构建缓存。下次构建可能会变慢。": "L'eliminazione rimuove la cache di compilazione orfana. La prossima compilazione potrebbe essere più lenta.", + "代码项目中的依赖和构建文件夹。": "Cartelle di dipendenze e di compilazione nei tuoi progetti di codice.", + "每一项都会放回原位置。原位置已有的文件绝不会被覆盖。": "Ogni elemento tornerà nella sua posizione originale. Un file già presente in quella posizione non verrà mai sovrascritto.", + "Mac Sai 无法确认此扩展的文件夹可以安全移除,因此未删除任何内容。": "Mac Sai non ha potuto verificare se la cartella dell'estensione sia sicura da rimuovere, quindi non è stato eliminato nulla.", + "无法移到废纸篓:": "Impossibile spostare nel Cestino: ", + "恢复这次清理?": "Ripristinare questa pulizia?", + "恢复完成": "Ripristino completato", + "详情": "Dettagli", + "时间": "Periodo", + "无法恢复:%ld": "Impossibile ripristinare: %ld", + "这次清理太大,只能恢复前 %ld 项。其余 %ld 项仍在废纸篓中,可在访达里手动放回。": "Questa pulizia era troppo grande per tracciarla tutta: solo i primi %ld elementi possono essere ripristinati. Gli altri %ld sono ancora nel Cestino e puoi rimetterli a posto dal Finder.", + "如果 {browser} 已关闭,扩展文件夹会移到废纸篓。如果它正在运行,则不会删除任何内容,并会告诉你在哪里移除。如果你开启了 {browser} 同步,它可能会重新安装此扩展。": "Se {browser} è chiuso, la cartella dell'estensione viene spostata nel Cestino. Se è aperto, non viene eliminato nulla e ti verrà mostrato dove rimuoverla. Se usi la sincronizzazione di {browser}, l'estensione potrebbe essere reinstallata.", + "镜像": "Immagini", + "清除": "Cancella", + "部分可恢复": "Parzialmente ripristinabile", + "由策略安装": "Installata da criteri", + "清理所选 Docker 项目…": "Elimina elementi Docker selezionati…", + "清理完成": "Pulizia completata", + "{browser} 正在运行,因此未删除任何内容。请在 {browser} 的地址栏中打开 {url} 来移除此扩展。": "{browser} è aperto, quindi non è stato eliminato nulla. Rimuovi l'estensione in {browser} aprendo {url} nella barra degli indirizzi.", + "在设置中打开": "Apri nelle impostazioni", + "已停止": "Arrestato", + "开发者磁盘占用": "Spazio sviluppatori", + "无法判断哪些应用未被使用。请检查 Spotlight 索引是否已开启。": "Mac Sai non riesce a individuare le app inutilizzate. Verifica che l'indicizzazione di Spotlight sia attiva.", + "未知日期": "Data sconosciuta", + "把最近一次清理整批恢复到原位置。已清空废纸篓或原路径已有文件的项会被跳过。": "Ripristina un'intera pulizia con un clic. Gli elementi già eliminati dal Cestino o con un nuovo file al loro posto originale verranno saltati.", + "旧版运行时": "Runtime precedente", + "12 个月": "12 mesi", + "删除所选模拟器项目…": "Elimina elementi simulatori selezionati…", + "未能完成": "Non riuscito", + "这台 Mac 上没有找到 Docker 或 Xcode 模拟器。": "Nessun simulatore Docker o Xcode trovato su questo Mac.", + "Safari 扩展随 App 一起安装,由 macOS 管理,因此此列表只读。将改为打开“设置”。": "Le estensioni di Safari sono installate con le app e gestite da macOS, quindi questo elenco è di sola lettura. Verranno aperte le Impostazioni.", + "超时,已停止": "Tempo scaduto, arrestato", + "关于此扩展": "Informazioni sull'estensione", + "清理会永久删除所有已停止的容器及其中的数据。正在运行的容器不受影响。": "L'eliminazione rimuove definitivamente tutti i container arrestati e i relativi dati. I container in esecuzione non vengono toccati.", + "Docker 和 Xcode 模拟器占用的空间。只显示在这台 Mac 上找到的工具,且不会自动勾选任何项目。": "Spazio occupato da Docker e dai simulatori di Xcode. Vengono mostrati solo gli strumenti presenti su questo Mac e nulla viene preselezionato.", + "容器": "Container", + "使用渐进式 SHA-256 哈希检测\n查找重复文件": "Trova i file duplicati tramite rilevamento\nprogressivo con hash SHA-256", + "请选择你的项目文件夹,而不是系统文件夹或资源库。": "Seleziona la cartella dei tuoi progetti, non una cartella di sistema o la Libreria.", + "Chrome、Brave、Edge、Arc、Firefox 和 Safari 的扩展。名称与已知广告软件家族相符的会标为可疑。": "Estensioni di Chrome, Brave, Edge, Arc, Firefox e Safari. I nomi corrispondenti a note famiglie di adware sono contrassegnati come Sospetta.", + "项目中已安装的依赖和构建产物。运行项目的安装或构建命令即可找回;之后第一次构建会更慢。": "Dipendenze installate e file di compilazione nei tuoi progetti. Esegui il comando di installazione o build per ricrearli; la prima compilazione successiva richiederà più tempo.", + "无法读取 Safari 扩展列表。请在 Safari 设置 > 扩展中查看。": "Impossibile leggere l'elenco delle estensioni di Safari. Controlla in Impostazioni di Safari > Estensioni.", + "可疑": "Sospetta", + "此操作不可撤销,不会进入废纸篓。": "Questa operazione è definitiva. Nulla finisce nel Cestino.", + "这只会忘掉恢复记录,废纸篓里的文件不会被动。之后就不能一键恢复这些清理了。": "Questo cancella solo la cronologia di ripristino. I file nel Cestino non vengono toccati, ma non potrai più ripristinarli con un clic.", + "不会自动勾选。": "Nessun elemento viene selezionato automaticamente.", + "正在查找未使用的应用…": "Ricerca app inutilizzate in corso…", + "6 个月": "6 mesi", + "Spotlight 没有应用的使用记录": "Spotlight non contiene la cronologia di utilizzo delle app", + "浏览器扩展": "Estensioni del browser", + "支持文件": "File di supporto", + "选择项目文件夹(例如 ~/Code),查找 node_modules、venv、target、build 等可重建目录。": "Scegli una cartella di progetti (es. ~/Code) per trovare directory rigenerabili come node_modules, venv, target e build.", + "恢复": "Ripristina", + "正在查找项目…": "Ricerca progetti in corso…", + "卷": "Volumi", + "3 个月": "3 mesi", + "清理只会删除悬空(无标签)镜像,带标签的镜像会保留。": "L'eliminazione rimuove solo le immagini orfane senza tag. Le immagini provviste di tag vengono mantenute.", + "Firefox 正在运行,因此未删除任何内容。请在 Firefox 中通过“工具 > 附加组件和主题”移除此扩展。": "Firefox è aperto, quindi non è stato eliminato nulla. Rimuovi l'estensione in Firefox da Strumenti > Componenti aggiuntivi e temi.", + "删除运行时会先关闭正在使用它的模拟器,这些模拟器之后将不可用。": "Eliminando un runtime, i simulatori che lo utilizzano verranno arrestati e non saranno più disponibili.", + "在 Chrome、Brave、Edge、Arc、Firefox 或 Safari 中未找到扩展": "Nessuna estensione trovata in Chrome, Brave, Edge, Arc, Firefox o Safari", + "没有符合条件的应用": "Nessuna app inutilizzata in questo intervallo", + "已从废纸篓清空:%ld": "Già eliminati dal Cestino: %ld", + "此扩展由管理策略安装,删除文件夹后 {browser} 会重新安装它。如果你不认识它,请在系统设置中搜索“描述文件”或“设备管理”,并移除你不认识的描述文件。": "Questa estensione è stata installata da criteri di gestione, quindi {browser} la reinstallerebbe. Se non la riconosci, cerca Profili o Gestione dispositivi nelle Impostazioni di Sistema e rimuovi eventuali profili sconosciuti.", + "卸载…": "Disinstalla…", + "已将扩展移到废纸篓。": "Estensione spostata nel Cestino.", + "永久清理所选 Docker 项目?": "Eliminare definitivamente gli elementi Docker selezionati?", + "已恢复:%ld": "Ripristinati: %ld", + "构建缓存": "Cache di compilazione", + "Xcode 模拟器": "Simulatori di Xcode", + "%ld 项": "%ld elementi", + "清除历史": "Cancella cronologia", + "清除清理历史?": "Cancellare la cronologia pulizia?", + "上次打开": "Ultima apertura", + "未找到项目垃圾": "Nessun file non necessario di progetto trovato", + "Chrome 正在运行,因此未删除任何内容。请在 Chrome 中通过“窗口 > 扩展程序”移除此扩展。": "Chrome è aperto, quindi non è stato eliminato nulla. Rimuovi l'estensione in Chrome da Finestra > Estensioni.", + "项目垃圾": "File non necessari di progetto", + "内置": "Integrata", + "重复文件检测会使用 SHA-256 哈希每个候选文件。\n大型个人目录可能需要 5–15 分钟。": "Il rilevamento dei duplicati calcola l'hash SHA-256 di ogni file candidato.\nCon cartelle Inizio molto grandi possono volerci 5–15 minuti.", + "清理历史": "Cronologia pulizia", + "删除完成": "Eliminato", + "正在计算文件夹大小…": "Calcolo dimensioni cartelle in corso…", + "还没有可恢复的清理记录": "Nessuna pulizia da ripristinare al momento", + "已找到 Docker,但它没有响应。请先启动 Docker Desktop,然后点“刷新”。": "Docker è installato ma non risponde. Avvia Docker Desktop e fai clic su Aggiorna.", + "永久删除所选模拟器项目?": "Eliminare definitivamente gli elementi dei simulatori selezionati?", + "移除扩展?": "Rimuovere l'estensione?", + "永久清理": "Elimina definitivamente", + "按上次打开时间列出应用,并按占用空间排序。一键转到卸载器。": "Elenca le app non aperte di recente, ordinate per spazio occupato. Con un clic le invii al Disinstallatore.", + "正在读取扩展…": "Lettura estensioni in corso…", + "原位置已有文件,已跳过:%ld": "Posizione originale occupata, saltati: %ld", + "扫描 Mac 中的垃圾文件、恶意威胁\n和性能问题": "Scansiona il Mac alla ricerca di file non necessari, minacce malware\ne problemi di prestazioni", + "此扩展内置于 {browser},无法移除。": "Questa estensione è integrata in {browser} e non può essere rimossa.", + "未使用的应用": "App inutilizzate", + "名称与已知广告软件家族相符。这只是提示,并非确认。": "Il nome corrisponde a una nota famiglia di adware. Si tratta di un avviso, non di un rilevamento confermato.", + "未找到 Docker": "Docker non trovato", + "卷可能保存着数据库等数据,Mac Sai 不会清理它们。如需删除,请使用 Docker Desktop 或 Docker 命令行。": "I volumi possono contenere database o dati permanenti, quindi Mac Sai non li elimina. Per rimuoverli, usa Docker Desktop o il comando docker.", + "不可用的模拟器": "Simulatore non disponibile", + "后台": "In background", + + "这次清理,你没花一分钱。": "Questa pulizia non ti è costata nulla.", + "没有订阅,没有广告,没有追踪。Mac Sai 是我和几位志愿者在业余时间做的。如果它帮你省下了买清理软件的钱,请我喝杯咖啡,让它对所有人继续免费。": "Nessun abbonamento, nessuna pubblicità, nessun tracciamento. Sviluppo Mac Sai la sera e nei fine settimana con alcuni volontari. Se ti ha evitato di pagare per un software di pulizia, offrimi un caffè per mantenerlo gratuito per tutti.", + "请我喝杯咖啡": "Offrimi un caffè", + "以后再说": "Più tardi", + "不再提示": "Non chiedere più", + "谢谢你。正因为有你,它才能一直免费。": "Grazie. È grazie a persone come te che rimane gratuito.", + "支持 Mac Sai": "Supporta Mac Sai", + "请开发者喝杯咖啡": "Offri un caffè allo sviluppatore", + "1 - 3 个月": "Da 1 a 3 mesi", + "3 - 6 个月": "Da 3 a 6 mesi", + "30 天内不再显示": "Ignora per 30 giorni", + "6 个月 - 1 年": "Da 6 mesi a 1 anno", + "AI 工具缓存": "Cache strumenti IA", + "AI 编码工具的缓存(Claude、Codex);不含历史与会话。": "Cache degli strumenti di codifica IA (Claude, Codex). Cronologia e sessioni escluse.", + "CPU": "CPU", + "GPU 使用率": "Utilizzo GPU", + "GitHub 返回了无法识别的响应。": "Risposta imprevista da GitHub.", + "Homebrew 返回了无法识别的响应。": "Risposta imprevista da Homebrew.", + "IDE 与编辑器缓存": "Cache di IDE ed editor", + "Internet 插件": "Plug-in Internet", + "PDF": "PDF", + "Safari 扩展": "Estensioni di Safari", + "Safari 扩展不能在本应用内开启、关闭或删除,以免破坏宿主应用的签名。请在 Safari 设置中管理它们。": "Le estensioni di Safari non possono essere attivate, disattivate o eliminate qui per non danneggiare la firma dell'app host. Gestiscile nelle impostazioni di Safari.", + "Spotlight 的整个搜索索引会被清除并重建。数小时内 Spotlight 搜索可能返回空结果(主目录越大耗时越久),系统搜索和智能文件夹也会受影响。": "L'intero indice di ricerca di Spotlight verrà cancellato e ricostruito. Per diverse ore la ricerca Spotlight potrebbe non mostrare risultati (più tempo se la cartella Inizio è grande); anche la ricerca di sistema e le cartelle smart saranno interessate.", + "URL Scheme": "Schemi URL", + "Xcode 垃圾": "File non necessari di Xcode", + "iOS 设备备份": "Backup dispositivi iOS", + "iPhone 和 iPad 的本地备份。": "Backup locali di iPhone e iPad.", + "macOS 的“哪类文件由哪个应用打开”数据库会被清除并重建。完成前(通常数小时),双击文件可能失败或打开错误应用,默认应用设置可能重置,Spotlight 启动应用也可能不可用。重启可加快恢复。": "Il database di macOS che associa i tipi di file alle applicazioni verrà cancellato e ricostruito. Fino al termine (spesso diverse ore), fare doppio clic su un file potrebbe fallire o aprire l'app sbagliata, le impostazioni delle app predefinite potrebbero reimpostarsi e l'avvio delle app tramite Spotlight potrebbe non funzionare. Riavviare velocizza il processo.", + "macOS 诊断日志。": "Registri di diagnosi di macOS.", + "npm、Cargo、pip、Homebrew、Gradle 的可重建缓存。": "Cache rigenerabili di npm, Cargo, pip, Homebrew e Gradle.", + "~/Library/Logs/MacClean/operations.log — 30 天后自动清理": "~/Library/Logs/MacClean/operations.log: eliminato automaticamente dopo 30 giorni", + "“邮件”应用的搜索索引会从头重建。重建完成前,邮件搜索和未读数可能不准确(大型邮箱通常需 10–30 分钟)。": "L'indice di ricerca dell'app Mail verrà ricostruito da zero. Fino al termine, la ricerca e il conteggio delle email non lette potrebbero risultare errati (in genere 10–30 minuti per caselle di posta voluminose).", + "一切就绪!": "Tutto pronto!", + "一键清理": "Pulizia in un clic", + "上一级": "Livello superiore", + "下一步": "Avanti", + "下载": "Download", + "不可写": "non scrivibile", + "不能排除整个 /Volumes。": "Non puoi escludere l'intero /Volumes.", + "不能排除整个主目录。": "Non puoi escludere l'intera cartella Inizio.", + "主题": "Tema", + "仅显示错误": "Solo errori", + "仅移除 macOS 已标记可清理的 Time Machine 本地快照;不会删除你主动需要的内容。": "Vengono rimosse solo le istantanee locali di Time Machine che macOS ha già contrassegnato per l'eliminazione; nulla di ciò di cui hai bisogno verrà eliminato.", + "仍要运行": "Esegui comunque", + "从大到小": "Dal più grande al più piccolo", + "从小到大": "Dal più piccolo al più grande", + "代码": "Codice", + "代码编辑器的缓存(Cursor、Antigravity 等)。": "Cache degli editor di codice come Cursor e Antigravity.", + "以开源方式让你的 Mac 保持干净、快速和安全。": "Il modo open source per mantenere il tuo Mac pulito, veloce e sicuro.", + "优化": "Ottimizzazione", + "优化你的 Mac": "Ottimizza il tuo Mac", + "会产生几分钟磁盘活动。该操作为只读,无论结果如何都不会更改磁盘内容。": "Richiede qualche minuto di attività del disco. L'operazione è di sola lettura: il contenuto del disco non viene modificato in nessun caso.", + "会删除本地 Time Machine 快照以释放空间。远程或备份盘上的快照不受影响,你仍可从 Time Machine 备份恢复。": "Le istantanee locali di Time Machine vengono eliminate per liberare spazio. Le istantanee su dischi remoti o di backup restano intatte; potrai comunque effettuare il ripristino dal backup di Time Machine.", + "你的 Mac 很干净!": "Il tuo Mac è pulito!", + "你选择的项目已在废纸篓中——需要时可以恢复。若要彻底删除,请打开“废纸篓”模块并清空。": "Gli elementi selezionati si trovano nel Cestino: puoi recuperarli se necessario. Per eliminarli definitivamente, apri il modulo Cestini e svuotalo.", + "保留": "CONSERVATO", + "修复 Finder 的文件类型与应用打开方式数据库": "Ripara il database delle associazioni tra tipi di file e applicazioni nel Finder", + "偏好设置面板": "Pannelli Preferenze", + "充电中": "In carica", + "全部": "Tutti", + "全部展开": "Espandi tutto", + "全部折叠": "Comprimi tutto", + "关于": "Info", + "关闭": "disattiva", + "其他": "Altro", + "内存": "Memoria", + "内存使用率": "Utilizzo memoria", + "内存压力过高": "Pressione memoria elevata", + "内容已更改": "contenuto modificato", + "出于安全考虑,已拒绝移除此项目。": "Elemento non rimosso per motivi di sicurezza.", + "分区": "Sezione", + "切换后会立即应用到主界面和菜单栏小组件。": "Le modifiche hanno effetto immediato sulla finestra principale e sul widget della barra dei menu.", + "刚刚": "proprio ora", + "删除此关联(自动备份当前版本)": "Rimuovi associazione (backup automatico creato)", + "删除重复项": "Rimuovi duplicati", + "刷新 DNS 缓存": "Svuota cache DNS", + "刷新": "Aggiorna", + "前往“隐私与安全性 → 完全磁盘访问权限”": "Vai in Privacy e sicurezza → Accesso completo al disco", + "加速": "Velocità", + "加速邮件": "Velocizza Mail", + "包管理器缓存": "Cache gestori pacchetti", + "占用空间最多的文件。": "I file che occupano più spazio.", + "占用资源": "Processi pesanti", + "卸载": "Disinstalla", + "卸载器": "Disinstallatore", + "压缩包": "Archivi", + "发现新版本": "Aggiornamento disponibile", + "发现的垃圾": "di file non necessari trovati", + "发生未知错误": "Si è verificato un errore sconosciuto", + "发行说明": "Note di rilascio", + "取消": "Annulla", + "受保护的系统应用——无法移除": "App di sistema protetta: impossibile rimuoverla", + "受保护路径": "percorso protetto", + "受保护,无法退出": "Protetto: impossibile forzare l'uscita", + "受限": "Limitato", + "只能排除主目录或 /Volumes 下的文件夹。": "È possibile escludere solo cartelle nella cartella Inizio o in /Volumes.", + "可回收": "pronti per il recupero", + "可用磁盘空间": "Spazio libero su disco", + "仅显示图标": "Solo icona", + "可能带来持续数小时的影响——将打开确认窗口": "Ha effetti collaterali per diverse ore: richiede conferma", + "可视化磁盘使用情况": "Visualizza l'uso del disco", + "可视化磁盘空间使用情况": "Visualizza l'uso dello spazio su disco", + "合并": "Unisci", + "合并所选副本?": "Unire le copie selezionate?", + "同一文件的相同副本。": "Copie identiche dello stesso file.", + "启动代理": "Launch Agent", + "启动守护进程": "Launch Daemon", + "回收 Docker 空间": "Recupera spazio Docker", + "图片": "Immagini", + "在 Finder 中显示": "Mostra nel Finder", + "在 Finder 中查看配置文件": "Mostra configurazione nel Finder", + "在 GitHub 上浏览代码库": "Sfoglia il codice sorgente su GitHub", + "在屏幕顶部实时显示 CPU、内存、磁盘、电池和网络状态。点击可展开浮窗。": "Stato in tempo reale di CPU, memoria, disco, batteria e rete nella barra dei menu. Fai clic per aprire il riquadro a comparsa.", + "在监控位置检测到新的可执行文件": "Rilevato un nuovo eseguibile in una posizione monitorata", + "在磁盘上发现的已知恶意文件。": "File dannosi noti trovati sul disco.", + "在系统设置中打开": "Apri in Impostazioni di Sistema", + "在系统设置中打开类别": "Apri categoria in Impostazioni di Sistema", + "复制": "Copia", + "复制全部": "Copia tutto", + "复制升级命令": "Copia comando di aggiornamento", + "复制路径": "Copia percorso", + "外观": "Aspetto", + "大型个人目录可能需要几分钟扫描": "La scansione potrebbe richiedere diversi minuti per cartelle Inizio di grandi dimensioni", + "大小": "Dimensioni", + "大文件": "File grandi", + "大文件与旧文件": "File grandi e vecchi", + "失效的登录项": "Elementi di login non validi", + "失败或孤立下载留下的文件。": "Residui di download non riusciti o interrotti.", + "好": "OK", + "存储空间严重不足": "Spazio disco quasi esaurito", + "安全擦除": "Eliminazione sicura", + "安全擦除文件,使其无法恢复": "Elimina i file in modo sicuro rendendoli irrecuperabili", + "安装包": "Programmi di installazione", + "完全磁盘访问权限": "Accesso completo al disco", + "完成": "Fine", + "完整日志:~/Library/Logs/MacClean/operations.log": "Registro completo: ~/Library/Logs/MacClean/operations.log", + "实时系统状态": "Statistiche di sistema in tempo reale", + "将当前内容复制到剪贴板,可粘贴到 GitHub issue 中": "Copia il contenuto negli appunti per incollarlo in una issue su GitHub", + "将文件拖放到此处进行粉碎": "Trascina qui i file per distruggerli", + "将模块渐变背景替换为中性的深色背景,以提升可读性。": "Sostituisce lo sfondo sfumato dei moduli con un colore scuro neutro per una migliore leggibilità.", + "尚未排除任何文件夹。": "Nessuna cartella ancora esclusa.", + "屏幕录制": "Registrazione schermo", + "展开": "Espandi", + "已不存在": "non esiste più", + "已保存的 Wi-Fi": "Reti Wi-Fi salvate", + "已停用": "Disattivato", + "已删除应用留下的支持文件。": "File di supporto residui di applicazioni eliminate.", + "已删除应用的残留文件": "Residui di app eliminate", + "已删除用户数据": "Utenti eliminati", + "已发现文件": "File trovati", + "已取消——未授予管理员权限。": "Annullato: permessi di amministratore non concessi.", + "已启用": "Attivato", + "已复制": "Copiato", + "已是最新": "Aggiornato", + "已清理": "puliti", + "已移到废纸篓": "Spostato nel Cestino", + "已移除用户账户留下的数据。": "Dati residui di account utente rimossi.", + "已连接": "Connesso", + "已选择": "Selezionati", + "已选择待清理": "selezionati per la pulizia", + "已防护": "Protetto", + "干净": "Pulito", + "平衡": "Bilanciata", + "应用": "Applicazioni", + "应用临时文件,下次启动会重新生成。": "File temporanei delle app. Rigenerati al prossimo avvio.", + "应用二进制中未使用的 CPU 架构切片。": "Architetture CPU non utilizzate all'interno dei binari delle app.", + "应用内未使用的本地化语言资源。": "File di localizzazione inutilizzati inclusi nelle app.", + "应用写入的诊断日志。": "Registri diagnostici scritti dalle applicazioni.", + "应用包中未找到通用 Mach-O 二进制文件": "nessun binario Mach-O universale trovato nel bundle", + "应用已打开": "App aperta", + "应用更新": "Aggiornamenti", + "应用权限": "Permessi app", + "应用程序": "Applicazioni", + "废纸篓": "Cestini", + "废纸篓为空": "Il Cestino è vuoto", + "建议": "Consigli", + "开启": "attiva", + "开始使用": "Inizia", + "强制退出": "Uscita forzata", + "强制退出前会要求确认": "Richiede conferma prima dell'uscita forzata", + "当前位于废纸篓中的项目。": "Elementi attualmente presenti nel Cestino.", + "彻底移除应用": "Rimuovi completamente le applicazioni", + "彻底移除应用及其残留文件": "Rimuovi completamente le app e i relativi file residui", + "待清理": "da pulire", + "忘记": "Dimentica", + "忘记所选": "Dimentica selezionate", + "忘记所选网络?": "Dimenticare le reti selezionate?", + "快速": "Rapida", + "性能": "Prestazioni", + "恢复默认": "Ripristina predefiniti", + "恶意软件": "Malware", + "恶意软件扫描": "Scansione malware", + "恶意软件清理": "Rimozione malware", + "所有应用均为最新": "Tutte le app sono aggiornate", + "所选副本会保留在原位并转为克隆,仅释放重复占用的空间,不删除任何文件。": "Le copie selezionate restano al loro posto come cloni. Viene liberato solo lo spazio duplicato, senza eliminare alcun file.", + "所选副本会被移到废纸篓,每组保留一个原件。": "Le copie selezionate verranno spostate nel Cestino, conservando un originale per gruppo.", + "打开 Safari 设置": "Apri impostazioni di Safari", + "打开活动日志,查看每个错误并复制详情用于反馈问题": "Apri il registro attività per visualizzare tutti gli errori e copiare i dettagli per una segnalazione", + "打开系统设置": "Apri Impostazioni di Sistema", + "打开设置": "Apri Impostazioni", + "执行 macOS 内置的每日、每周和每月维护任务": "Esegue le attività di manutenzione giornaliere, settimanali e mensili integrate di macOS", + "扩展": "Estensioni", + "扫描": "Scansiona", + "扫描完成——没有需要清理的内容": "Scansione completata: nulla da pulire", + "扫描病毒、广告软件和其他威胁": "Scansiona alla ricerca di virus, adware e altre minacce", + "折叠": "Comprimi", + "报告问题": "Segnala un problema", + "指向已不存在应用的登录项。": "Elementi di login che puntano ad app non più presenti.", + "按名称": "Nome", + "按应用查看持有哪些隐私权限。这是只读列表——按钮会打开系统设置。本应用无法关闭权限。": "Visualizza quali permessi di privacy possiede ciascuna app. Questo elenco è di sola lettura: i pulsanti aprono le Impostazioni di Sistema. Mac Sai non può revocare i permessi direttamente.", + "损坏或孤立的偏好设置文件。": "File di preferenze danneggiati o orfani.", + "损坏的偏好设置": "Preferenze danneggiate", + "排序": "Ordina", + "排序方式": "Ordina per", + "排除": "Escludi", + "排除文件夹": "Cartelle escluse", + "提交错误报告和功能请求": "Segnalazioni di bug e richieste di funzionalità", + "搜索应用...": "Cerca app...", + "搜索文件类型或应用...": "Cerca tipo di file o app...", + "搜索语言": "Cerca lingue", + "文件": "File", + "文件夹": "Cartelle", + "文件打开方式": "Associazioni file", + "文件粉碎": "Distruggi documenti", + "文档": "Documenti", + "文档版本": "Versioni documento", + "无法写入 plist": "Impossibile scrivere il file plist", + "无法列出哪些应用持有哪些权限。仍可通过下方按钮打开系统设置。": "Impossibile elencare i permessi delle app. Puoi comunque aprire Impostazioni di Sistema con i pulsanti sottostanti.", + "无法更新已保存的 Wi-Fi 网络。": "Impossibile aggiornare le reti Wi-Fi salvate.", + "无法添加该文件夹。": "Impossibile aggiungere questa cartella.", + "无法读取 plist": "Impossibile leggere il file plist", + "无法读取权限数据库": "Impossibile leggere il database dei permessi", + "无法退出受保护的进程。": "Il processo è protetto e non può essere terminato.", + "无线接口名称无效,已中止操作。": "Nome interfaccia Wi-Fi non valido, operazione annullata.", + "日志为空。尚未执行过清理。": "Il registro è vuoto. Nessuna pulizia ancora eseguita.", + "旧文件": "File vecchi", + "旧更新文件": "Aggiornamenti obsoleti", + "旧的自动保存文档版本。": "Vecchie versioni salvate automaticamente dei documenti.", + "显示宿主应用": "Mostra app host", + "智能扫描": "Scansione smart", + "更改权限只能在系统设置中完成。": "I permessi possono essere modificati solo in Impostazioni di Sistema.", + "更新": "Aggiorna", + "更新后遗留的安装包。": "Pacchetti di installazione rimasti dopo un aggiornamento.", + "更新日志和历史版本": "Changelog e versioni precedenti", + "曾经挂载但已不再需要的磁盘映像。": "Immagini disco montate in passato e non più necessarie.", + "曾被换出的应用回到前台时可能需要片刻恢复。": "Le app spostate nella memoria virtuale potrebbero richiedere un attimo per tornare reattive in primo piano.", + "最近 1 个月": "Ultimo mese", + "最近清理": "Pulizia recente", + "最近项目列表和其他隐私痕迹。": "Elenchi di elementi recenti e altre tracce di privacy.", + "未下载完成的文件。": "File scaricati parzialmente.", + "未使用": "Inutilizzati", + "未使用的磁盘映像": "Immagini disco inutilizzate", + "未保存的工作可能会丢失。": "Il lavoro non salvato potrebbe andare perso.", + "未列出任何 Safari 扩展": "Nessuna estensione di Safari trovata", + "未列出任何应用。": "Nessuna app trovata.", + "未发现垃圾": "Nessun file non necessario trovato", + "未发现垃圾、威胁或性能问题": "Nessun file non necessario, minaccia o problema di prestazioni trovato", + "未发现隐私痕迹": "Nessuna traccia di privacy trovata", + "未在应用包中找到辅助组件": "helper non trovato nel bundle dell'app", + "未完成下载": "Download incompleti", + "未找到 Docker 命令行工具。请确认已安装 Docker Desktop。": "Strumento a riga di comando Docker non trovato. Assicurati che Docker Desktop sia installato.", + "未找到 Wi-Fi 硬件。": "Nessun hardware Wi-Fi rilevato.", + "未找到关联文件": "Nessun file associato trovato", + "未找到大文件或旧文件": "Nessun file grande o vecchio trovato", + "未找到第三方扩展、插件或偏好设置面板。": "Nessuna estensione, plug-in o pannello preferenze di terze parti trovato.", + "未找到邮件索引——邮件可能使用了不同的版本目录。": "Indice di Mail non trovato: Mail potrebbe utilizzare una cartella di versione differente.", + "未找到重复文件": "Nessun file duplicato trovato", + "未找到附件": "Nessun allegato trovato", + "未找到项目": "Nessun elemento trovato", + "未检测到威胁": "Nessuna minaccia rilevata", + "未注册": "non registrato", + "未知": "Sconosciuto", + "未知应用": "App sconosciuta", + "未知错误": "Errore sconosciuto", + "未选择任何项目": "Nessun elemento selezionato", + "权限总览": "Panoramica permessi", + "查找大于 50 MB 且最近未访问的文件": "Trova file più grandi di 50 MB non aperti di recente", + "查找来自邮件、Outlook 和 Spark 的缓存邮件附件": "Trova allegati email memorizzati nella cache di Mail, Outlook e Spark", + "查找重复文件": "Trova file duplicati", + "查看占用 CPU 和内存的应用并强制退出": "Visualizza le app che consumano più CPU e memoria e forzane la chiusura", + "查看发布页": "Visualizza release", + "查看日志": "Visualizza registro", + "查看第三方偏好设置面板、Internet 插件和 Safari 扩展。用户安装的面板和插件可移到废纸篓。": "Controlla i pannelli preferenze di terze parti, i plug-in Internet e le estensioni di Safari. Quelli installati dall'utente possono essere spostati nel Cestino.", + "标记为“保留”的行受保护,只会删除勾选的副本。": "Le righe contrassegnate come CONSERVATO sono protette. Verranno eliminate solo le copie spuntate.", + "检查可用的应用更新": "Verifica gli aggiornamenti disponibili per le app", + "检查启动磁盘的文件系统完整性": "Verifica l'integrità del file system sul disco di avvio", + "检查更新": "Controlla aggiornamenti", + "检测并移除威胁": "Rileva e rimuovi minacce", + "模式": "Modalità", + "正在分析应用支持目录...": "Analisi di Application Support in corso...", + "正在分析系统...": "Analisi del sistema in corso...", + "正在分析结果...": "Analisi dei risultati in corso...", + "正在分析附件...": "Analisi degli allegati in corso...", + "正在加载项目...": "Caricamento elementi in corso...", + "正在卸载…": "Disinstallazione in corso…", + "正在发现已安装应用...": "Rilevamento applicazioni installate in corso...", + "正在完成...": "Finalizzazione in corso...", + "正在完成扫描...": "Completamento scansione in corso...", + "正在并行哈希候选文件...": "Calcolo hash parallelo dei file candidati...", + "正在开始清理...": "Avvio pulizia in corso...", + "正在恢复默认…": "Ripristino predefiniti in corso…", + "正在扫描 Apple Mail...": "Scansione di Apple Mail in corso...", + "正在扫描 Chrome 数据...": "Scansione dati di Chrome in corso...", + "正在扫描 Firefox 数据...": "Scansione dati di Firefox in corso...", + "正在扫描 Outlook...": "Scansione di Outlook in corso...", + "正在扫描 Safari 数据...": "Scansione dati di Safari in corso...", + "正在扫描 Spark...": "Scansione di Spark in corso...", + "正在扫描...": "Scansione in corso...", + "正在扫描个人目录...": "Scansione cartella Inizio in corso...", + "正在扫描启动守护进程...": "Scansione Launch Daemon in corso...", + "正在扫描用户废纸篓...": "Scansione Cestino utente in corso...", + "正在扫描用户缓存...": "Scansione cache utente in corso...", + "正在扫描磁盘...": "Scansione del disco in corso...", + "正在扫描系统日志...": "Scansione registri di sistema in corso...", + "正在扫描缓存...": "Scansione cache in corso...", + "正在按大小分组文件...": "Raggruppamento file per dimensione in corso...", + "正在整理结果...": "Organizzazione risultati in corso...", + "正在查找关联文件...": "Ricerca file associati in corso...", + "正在查找扩展…": "Ricerca estensioni in corso…", + "正在检查…": "Controllo in corso…", + "正在检查偏好设置...": "Controllo preferenze in corso...", + "正在检查启动代理...": "Controllo Launch Agent in corso...", + "正在检查外接驱动器...": "Controllo unità esterne in corso...", + "正在检查已知恶意软件特征...": "Controllo firme malware note in corso...", + "正在检查文件大小...": "Controllo dimensioni file in corso...", + "正在检查更新...": "Controllo aggiornamenti in corso...", + "正在检查浏览器扩展...": "Controllo estensioni del browser in corso...", + "正在检查登录项...": "Controllo elementi di login in corso...", + "正在检查系统痕迹...": "Controllo tracce di sistema in corso...", + "正在检查访问日期...": "Controllo date di accesso in corso...", + "正在检查语言文件...": "Controllo file di lingua in corso...", + "正在检测已安装语言…": "Rilevamento lingue installate in corso…", + "正在清理你的 Mac...": "Pulizia del Mac in corso...", + "正在粉碎文件...": "Distruzione file in corso...", + "正在计算大小...": "Calcolo dimensioni in corso...", + "正在读取已保存的网络…": "Lettura reti salvate in corso…", + "正在读取权限…": "Lettura permessi in corso…", + "正在读取进程…": "Lettura processi in corso…", + "残留下载文件": "Download residui", + "每组都会保留一个副本,且永远不会被移除。": "Viene sempre conservata una copia per gruppo che non sarà mai rimossa.", + "永久删除": "Eliminazione definitiva", + "没有可显示的应用": "Nessuna applicazione da mostrare", + "没有可用的备份": "Nessun backup disponibile", + "没有已保存的 Wi-Fi 网络": "Nessuna rete Wi-Fi salvata", + "没有找到匹配的结果": "Nessun risultato corrispondente", + "没有自定义的文件打开方式": "Nessuna associazione file personalizzata", + "没有记录到错误。": "Nessun errore registrato.", + "活动日志": "Registro attività", + "派生数据、归档和模拟器缓存。": "Derived data, archivi e cache dei simulatori.", + "浅色": "Chiaro", + "浏览历史和跟踪数据;Cookie 与会话会保留。": "Cronologia di navigazione e dati di tracciamento; cookie e sessioni vengono mantenuti.", + "浏览器和其他网络应用会在下次请求时重新解析主机名,影响通常只有毫秒级。": "I browser e le altre app risolveranno nuovamente i nomi host alla richiesta successiva, con un impatto di pochi millisecondi.", + "浏览器隐私": "Privacy del browser", + "深度": "Approfondita", + "深色": "Scuro", + "添加文件夹…": "Aggiungi cartella…", + "清理": "Pulizia", + "清理所选项目": "Pulisci selezionati", + "清理未使用的 Docker 镜像、已停止的容器和构建缓存": "Rimuovi immagini Docker inutilizzate, container arrestati e cache di compilazione", + "清理浏览器数据、历史记录、Cookie 和系统痕迹": "Cancella dati del browser, cronologia, cookie e tracce di sistema", + "清理缓存、日志和临时文件": "Elimina cache, registri e file temporanei", + "清理非活动内存,为当前应用释放更多空间": "Libera memoria inattiva per dare più spazio alle app aperte", + "清空废纸篓": "Svuota Cestino", + "清空废纸篓?": "Svuotare il Cestino?", + "清空所有废纸篓位置,包括外接驱动器": "Svuota tutti i cestini, inclusi quelli delle unità esterne", + "清除本地 DNS 缓存并强制重新解析": "Svuota la cache DNS locale e forza nuove richieste di risoluzione", + "清除缓存、偏好设置和保存的状态,保留应用本身。": "Cancella cache, preferenze e stato salvato. L'applicazione rimane installata.", + "源代码": "Codice sorgente", + "点击“扫描”以可视化磁盘使用情况": "Fai clic su Scansiona per visualizzare l'uso del disco", + "点击“智能扫描”即可一键清理 Mac,也可以在侧边栏探索各个模块。": "Fai clic su Scansione smart per pulire il Mac con un clic, oppure esplora i singoli moduli nella barra laterale.", + "点击上方按钮检查更新": "Fai clic sul pulsante sopra per controllare gli aggiornamenti", + "版本历史": "Cronologia versioni", + "用户": "Utente", + "用户日志文件": "File di registro utente", + "用户缓存文件": "File di cache utente", + "由 macOS 管理的缓存,会自动重建。": "Cache gestite da macOS. Ricostruite automaticamente.", + "电池": "Batteria", + "电池循环次数较高": "Numero di cicli batteria elevato", + "电池温度": "Temperatura batteria", + "界面语言": "Lingua interfaccia", + "登录时启动": "Apri al login", + "登录项": "Elementi di login", + "相机": "Fotocamera", + "磁盘": "Disco", + "磁盘映像": "Immagini disco", + "移到废纸篓": "Sposta nel Cestino", + "移到废纸篓?": "Spostare nel Cestino?", + "移除": "Rimuovi", + "移除不再使用的已保存网络,减少被追踪的可能。需要管理员权限。": "Rimuovi le reti salvate non più in uso per ridurre le tracce di localizzazione. Richiede permessi di amministratore.", + "移除背景颜色": "Rimuovi colori di sfondo", + "稍后": "Più tardi", + "空间透视": "Space Lens", + "第三方": "Di terze parti", + "筛选": "Filtra", + "粉碎": "Distruggi", + "精简 Time Machine 快照": "Riduci istantanee di Time Machine", + "精简后应用包无法再通过 codesign --verify": "il bundle dell'app non supera più codesign --verify dopo l'alleggerimento", + "系统垃圾": "File non necessari", + "系统日志文件": "File di registro di sistema", + "系统缓存文件": "File di cache di sistema", + "系统隐私": "Privacy di sistema", + "组件状态:": "Stato widget:", + "继续": "Continua", + "维护": "Manutenzione", + "缩减本地 Time Machine 快照以回收磁盘空间": "Riduci le dimensioni delle istantanee locali di Time Machine per recuperare spazio", + "自动化": "Automazione", + "自动检查更新": "Controlla aggiornamenti automaticamente", + "英文、基础资源、中文、俄文和德文会始终保留。已勾选的语言会保留;未勾选的语言文件可由“系统垃圾”移除。": "Inglese, risorse Base, cinese, russo, tedesco, francese e italiano vengono sempre conservati. Le lingue selezionate vengono mantenute; i file delle lingue deselezionate possono essere rimossi da File non necessari.", + "菜单栏显示": "Indicatore barra dei menu", + "表格": "Fogli di calcolo", + "视频": "Video", + "设置": "Impostazioni", + "设置…": "Impostazioni…", + "该任务没有可执行的系统命令": "L'attività non prevede comandi di sistema eseguibili", + "该路径已被现有排除项覆盖。": "Questo percorso è già coperto da un'esclusione esistente.", + "该进程已不再运行。": "Questo processo non è più in esecuzione.", + "语言": "Lingua", + "语言文件": "File di lingua", + "语言清理": "Pulizia lingue", + "请从侧边栏选择一个模块": "Seleziona un modulo dalla barra laterale", + "请至少勾选一个要清理的项目": "Seleziona almeno un elemento da pulire", + "请选择绝对路径。": "Scegli un percorso assoluto.", + "请重新扫描,勾选要移除的项目,然后点击“清理”。": "Esegui nuovamente la scansione, seleziona gli elementi da rimuovere e fai clic su Pulizia.", + "超过 1 年": "Oltre 1 anno", + "跟随系统": "Sistema", + "跨卷": "volume diverso", + "跳过此版本": "Salta questa versione", + "输入的二进制文件不是通用 Mach-O": "il binario di input non è un Mach-O universale", + "运行 docker system prune,删除未使用的镜像、已停止的容器、未使用的网络和构建缓存。此操作不可撤销(不会进入废纸篓)。正在运行的容器、使用中的镜像和命名卷不受影响,磁盘映像 Docker.raw 也不会被直接删除。": "Esegue docker system prune, rimuovendo le immagini non utilizzate, i container arrestati, le reti non usate e la cache di compilazione. Operazione irreversibile (i file non passano dal Cestino). Container in esecuzione, immagini in uso e volumi con nome restano intatti; l'immagine disco Docker.raw non viene mai eliminata direttamente.", + "运行中": "In esecuzione", + "运行安全任务": "Esegui attività sicure", + "运行时间": "Tempo di attività", + "运行此任务": "Esegui questa attività", + "运行系统维护任务,让 Mac 保持健康": "Esegui attività di manutenzione del sistema per mantenere il tuo Mac efficiente", + "运行维护脚本": "Esegui script di manutenzione", + "返回": "Indietro", + "返回起点": "Torna all'inizio", + "还原": "Ripristina", + "还原版本": "Ripristina versione", + "这台 Mac": "Questo Mac", + "进度": "Avanzamento", + "退出": "Esci", + "退出监视器": "Esci dal monitor", + "选中的项目会移到废纸篓,如有需要仍可恢复。": "Gli elementi selezionati verranno spostati nel Cestino, potrai recuperarli se necessario.", + "选择一个应用以查看相关文件": "Seleziona un'app per vederne i file correlati", + "选择应用图标旁显示的紧凑数值。GPU 或电池温度不可用时显示 --。": "Scegli il valore compatto da mostrare accanto all'icona dell'app. I sensori GPU o batteria non disponibili appaiono come --.", + "选择文件": "Seleziona file", + "选择要从清理中排除的文件夹。": "Scegli una cartella da escludere dalla pulizia.", + "通常没有可见影响——这些脚本与 macOS 夜间自动运行的维护脚本相同。": "Nessun effetto visibile: sono gli stessi script che macOS esegue automaticamente di notte.", + "通用": "Generali", + "通用二进制": "Binari universali", + "通过精简低优先级本地快照回收可清除磁盘空间": "Recupera spazio eliminabile assottigliando le istantanee locali a bassa priorità", + "邮件索引已移除。邮件将在下次启动时重建。": "Indice di Mail rimosso. Mail lo ricostruirà al prossimo avvio.", + "邮件附件": "Allegati di Mail", + "邮件附件的缓存副本。": "Copie memorizzate nella cache degli allegati di Mail.", + "释放内存": "Libera memoria RAM", + "释放可清除空间": "Libera spazio eliminabile", + "释放空间": "Libera spazio", + "重复文件": "Duplicati", + "重建 Spotlight 搜索索引,提高搜索准确性": "Ricostruisci l'indice di ricerca di Spotlight per migliorare la precisione delle ricerche", + "重建 Spotlight 索引": "Ricostruisci indice Spotlight", + "重建“邮件”数据库索引,以修复搜索和性能问题": "Ricostruisci l'indice del database di Mail per correggere problemi di ricerca e prestazioni", + "重建启动服务": "Ricostruisci Launch Services", + "重新扫描": "Scansiona di nuovo", + "重新扫描启动项": "Riscansiona elementi di avvio", + "重新检查": "Ricontrolla", + "重新读取已保存的网络": "Ricarica reti salvate", + "重新读取扩展列表": "Ricarica estensioni", + "重新读取权限列表": "Ricarica permessi", + "重试": "Riprova", + "错误": "Errore", + "长时间未打开的文件。": "File che non apri da molto tempo.", + "防护": "Protezione", + "隐私清理": "Privacy", + "需要在“系统设置 → 登录项”中批准": "richiede approvazione in Impostazioni di Sistema → Elementi login", + "需要在“系统设置 → 通用 → 登录项”中批准": "Richiede approvazione in Impostazioni di Sistema → Generali → Elementi login", + "需要完全磁盘访问权限": "Accesso completo al disco richiesto", + "需要完全磁盘访问权限才能列出应用": "Accesso completo al disco necessario per elencare le app", + "非 APFS 卷": "volume non APFS", + "非普通文件": "file non ordinario", + "音频": "Audio", + "验证启动磁盘": "Verifica disco di avvio", + "高级": "AVANZATE", + "麦克风": "Microfono", + "会自动重建": "Ricreato automaticamente", + "可安全移除": "Sicuro da rimuovere", + "清理前请检查": "Verifica prima di pulire", + "应用临时文件。每个应用下次启动时会自动重新生成。": "File temporanei delle app. Ricreati automaticamente al prossimo avvio di ciascuna app.", + "由 macOS 自行管理的缓存,需要时会自动重建。": "Cache gestite direttamente da macOS. Ricostruite automaticamente al bisogno.", + "下载和构建缓存。npm、Cargo、pip、Homebrew 和 Gradle 会在下次安装或构建时重新下载所需内容。": "Cache di download e compilazione. npm, Cargo, pip, Homebrew e Gradle riscaricheranno quanto necessario alla prossima installazione o compilazione.", + "仅编辑器缓存。Cursor 和 Antigravity 下次启动时会重新生成;你的设置和扩展不受影响。": "Solo cache degli editor. Cursor e Antigravity le ricreeranno al prossimo avvio; impostazioni ed estensioni restano intatte.", + "仅临时和缓存文件夹。Claude 和 Codex 会按需重新生成;绝不包含历史、记忆和会话。": "Solo cartelle temporanee e di cache. Claude e Codex le ricreano al bisogno; cronologia, memoria e sessioni non sono mai incluse.", + "应用为排查问题写下的诊断记录。应用不会回读旧日志,运行时会写新的日志。": "Testo di diagnostica scritto dalle app per la risoluzione dei problemi. Le app non rileggono i vecchi registri e ne avviano di nuovi durante l'esecuzione.", + "macOS 诊断日志。仅在排查过去的问题时有用;macOS 会继续写入新日志。": "Registri diagnostici di macOS. Utili solo per analizzare problemi passati; macOS continuerà a scriverne di nuovi.", + "无法读取的设置文件,或其应用已不再安装。这台 Mac 上没有任何东西在使用它们。": "File di impostazioni illeggibili o la cui app non è più installata. Nulla su questo Mac li utilizza.", + "指向已不存在应用的登录项,因此无法启动任何东西。": "Elementi di login che puntano ad app inesistenti, quindi incapaci di avviare alcunché.", + "失败或被放弃的下载留下的文件。如仍需要,请重新下载。": "File residui di download falliti o abbandonati. Riscarica il file se ne hai ancora bisogno.", + "未完成下载的部分文件和超过一天的临时文件。下载仍在进行时请勿清理。": "File parziali di download incompleti e file temporanei risalenti a oltre un giorno fa. Non pulire se un download è ancora in corso.", + "应用在一周多以前下载的安装包。安装程序运行后就不再需要,需要时可重新下载。": "Pacchetti di installazione scaricati dalle app più di una settimana fa. Non sono più necessari dopo l'esecuzione e possono essere riscaricati.", + "以已不再安装的应用命名的支持文件夹(每行的名称就是该应用的 ID)。以后重新安装该应用会从头开始。": "Cartelle di supporto con il nome di un'app non più installata (il nome su ciascuna riga è l'ID dell'app). Reinstallando l'app in seguito partirà da zero.", + "你不使用的语言翻译。移除会修改应用包;如需恢复请重新安装应用。": "Traduzioni per lingue che non usi. La rimozione modifica il bundle dell'applicazione; reinstalla l'app per ripristinarle.", + "文档的旧自动保存版本。当前版本会保留,但清理后无法再浏览旧版本。": "Versioni precedenti salvate automaticamente dei tuoi documenti. La versione attuale rimane, ma non potrai più consultare le versioni precedenti dopo la pulizia.", + "超过 30 天的 iPhone 和 iPad 本地备份。如果这是设备唯一的备份,请保留或先备份到 iCloud。": "Backup locali di iPhone e iPad risalenti a più di 30 giorni fa. Se è l'unico backup del dispositivo, conservalo o esegui prima un backup su iCloud.", + "从应用中移除这台 Mac 无法运行的 CPU 代码。会直接修改应用;只有重新安装才能撤销。": "Rimuove dalle applicazioni il codice per architetture CPU non eseguibili su questo Mac. Modifica direttamente le app; solo reinstallandole si annulla la modifica.", + "DerivedData 和 Previews 会在下次构建时重建,Device Support 会在连接设备时重新复制。Archives 和模拟器数据无法重新生成;如需旧构建或崩溃符号请保留。": "DerivedData e Previews vengono ricreati alla prossima compilazione, Device Support viene ricopiato al collegamento del dispositivo. Archivi e dati dei simulatori non possono essere rigenerati; conservali se ti servono vecchie build o simboli di crash.", + "已不在这台 Mac 上的账户的整个个人文件夹。请逐个核对名称:暂时离线的网络账户看起来完全一样。": "Intere cartelle Inizio di account non più presenti su questo Mac. Controlla ogni nome: un account di rete temporaneamente non in linea appare identico.", + "下载文件夹中超过一周的磁盘映像,通常是已运行过的安装程序。如需要可重新下载。": "Immagini disco nei Download risalenti a oltre una settimana fa, in genere installer già eseguiti. Puoi riscaricarli se necessario.", + "邮件保存在磁盘上的附件副本。IMAP 和 Exchange 账户可从服务器重新下载,POP 账户不行。": "Copie di allegati salvate sul disco da Mail. Per gli account IMAP ed Exchange Mail può riscaricarli dal server, ma non per gli account POP.", + "已在废纸篓中。清倒是永久性的,无法撤销。": "Già nel Cestino. Lo svuotamento è definitivo e non può essere annullato.", + "匹配已知恶意软件特征。如果它属于你有意安装的软件,请先检查路径。": "Corrisponde a una firma malware nota. Controlla prima il percorso se appartiene a software installato intenzionalmente.", + "你的浏览历史和跟踪数据。清理后无法恢复;Cookie 和登录会话会保留。": "Cronologia di navigazione e dati di tracciamento. Non ripristinabili dopo la pulizia; cookie e sessioni di accesso restano.", + "最近项目列表和类似痕迹。应用的“最近打开”菜单将会清空。": "Elenchi di elementi recenti e tracce simili. Il menu Apri recenti delle app risulterà vuoto.", + "你自己的文件,仅按大小挑选。这里没有任何东西天生就是垃圾;请逐个检查。": "I tuoi file personali, selezionati solo per dimensione. Nulla qui è di per sé non necessario; controlla ogni singolo file.", + "很久没打开过的你自己的文件。旧并不代表不需要;请逐个检查。": "I tuoi file personali che non apri da molto tempo. Vecchio non significa inutile; controlla ogni singolo file.", + "逐字节完全相同的副本。每个需要的文件请至少保留一份。": "Copie identiche byte per byte. Conserva almeno una copia per ciascun file di cui hai bisogno.", + ] + private static let russianFallbacks: [String: String] = [ "智能扫描": "Умное сканирование", "系统垃圾": "Системный мусор", diff --git a/Tests/MacCleanKitTests/LocalizationTests.swift b/Tests/MacCleanKitTests/LocalizationTests.swift index af593158..81181575 100644 --- a/Tests/MacCleanKitTests/LocalizationTests.swift +++ b/Tests/MacCleanKitTests/LocalizationTests.swift @@ -230,7 +230,7 @@ final class LocalizationTests: AppLanguageTestCase { ("清除", "Clear", "Очистить"), ("这只会忘掉恢复记录,废纸篓里的文件不会被动。之后就不能一键恢复这些清理了。", "This only forgets the restore list. Nothing in the Trash is touched, but these cleans can no longer be restored in one click.", "Это"), ] - for language in [AppLanguage.de, .fr] { + for language in [AppLanguage.de, .fr, .it] { AppLanguage.current = language for (zh, en, ru) in strings { let value = L10n.tr(zh, en, ru) @@ -251,10 +251,38 @@ final class LocalizationTests: AppLanguageTestCase { } } + func testItalianLanguageSelectionAndRegionalIdentifiers() { + XCTAssertTrue(AppLanguage.allCases.contains(.it)) + XCTAssertEqual(AppLanguage.it.pickerLabel, "Italiano") + XCTAssertEqual(AppLanguage.it.localeIdentifier, "it") + for identifier in ["it", "it-IT", "it_IT", "it-CH", "IT-sm"] { + XCTAssertEqual(AppLanguage.preferredLanguage(for: identifier), .it) + } + } + + func testItalianUsesEveryTranslationOverload() { + AppLanguage.current = .it + XCTAssertEqual(L10n.tr("设置", "Settings"), "Impostazioni") + XCTAssertEqual(L10n.tr("设置", "Settings", "Настройки"), "Impostazioni") + XCTAssertEqual(L10n.tr("设置"), "Impostazioni") + } + + func testUntranslatedStringFallsBackToEnglishInItalian() { + AppLanguage.current = .it + XCTAssertEqual(L10n.tr("新功能", "New feature"), "New feature") + } + + func testItalianLanguageResourcesCannotBeOfferedForCleanup() { + for folder in ["it.lproj", "it-IT.lproj", "Italian.lproj"] { + XCTAssertTrue(LanguagePreferences.alwaysKept.contains(folder), folder) + } + } + func testSupportCardIsTranslatedInEveryLanguage() { let expected: [AppLanguage: String] = [ .de: "Spendier mir einen Kaffee", .fr: "Offrez-moi un café", + .it: "Offrimi un caffè", .zhHant: "請我喝杯咖啡", .ru: "Угостить кофе", ] @@ -276,7 +304,7 @@ final class LocalizationTests: AppLanguageTestCase { let sameAsSimplified: Set = [ "容器", "卷", "大小", "取消", "永久清理", "清理完成", "未能完成", "已停止", ] - for language in [AppLanguage.de, .fr, .ru] { + for language in [AppLanguage.de, .fr, .it, .ru] { AppLanguage.current = language for (index, value) in DiskHogsText.all.enumerated() where !sameAsEnglish.contains(english[index]) || language == .ru { XCTAssertNotEqual(value, english[index], "\(language) is missing: \(english[index])") @@ -306,7 +334,7 @@ final class LocalizationTests: AppLanguageTestCase { ("正在查找项目…", "Finding projects…", "Поиск проектов…"), ("正在计算文件夹大小…", "Measuring folders…", "Подсчёт размера папок…"), ] - for language in [AppLanguage.de, .fr, .zhHant, .ru] { + for language in [AppLanguage.de, .fr, .it, .zhHant, .ru] { AppLanguage.current = language for s in strings { let text = L10n.tr(s.zh, s.en, s.ru) @@ -350,7 +378,7 @@ final class LocalizationTests: AppLanguageTestCase { let sameInTraditional: Set = ["未知"] for (zh, english) in strings { - for language in [AppLanguage.de, .fr] { + for language in [AppLanguage.de, .fr, .it] { AppLanguage.current = language XCTAssertNotEqual(L10n.tr(zh, english), english, "\(language) is missing \"\(english)\"") } diff --git a/Tests/MacCleanTests/BrowserExtensionsLocalizationTests.swift b/Tests/MacCleanTests/BrowserExtensionsLocalizationTests.swift index cddc3afd..45bfb7ed 100644 --- a/Tests/MacCleanTests/BrowserExtensionsLocalizationTests.swift +++ b/Tests/MacCleanTests/BrowserExtensionsLocalizationTests.swift @@ -56,7 +56,7 @@ final class BrowserExtensionsLocalizationTests: EnglishAppLanguageTestCase { AppLanguage.current = .zhHans let simplified = allStrings() - for language in [AppLanguage.de, .fr, .ru] { + for language in [AppLanguage.de, .fr, .it, .ru] { AppLanguage.current = language for (index, value) in allStrings().enumerated() { XCTAssertNotEqual(value, english[index], "\(language) is untranslated: \(english[index])") @@ -70,7 +70,7 @@ final class BrowserExtensionsLocalizationTests: EnglishAppLanguageTestCase { } func testNoEmDashesOrUnfilledPlaceholders() { - for language in [AppLanguage.en, .de, .fr, .ru, .zhHans, .zhHant] { + for language in [AppLanguage.en, .de, .fr, .it, .ru, .zhHans, .zhHant] { AppLanguage.current = language for value in allStrings() { XCTAssertFalse(value.contains("\u{2014}"), "\(language) has an em dash: \(value)") diff --git a/VERSION b/VERSION index 5bb76b57..26a9e99b 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.25.3 +1.25.4 diff --git a/scripts/build-dmg.sh b/scripts/build-dmg.sh index f1eed1ee..25107739 100755 --- a/scripts/build-dmg.sh +++ b/scripts/build-dmg.sh @@ -87,6 +87,7 @@ cat > "${APP_BUNDLE}/Contents/Info.plist" << PLIST zh-Hans zh-Hant fr + it CFBundleExecutable MacClean @@ -162,6 +163,7 @@ cat > "${MENU_APP}/Contents/Info.plist" << MENU_PLIST zh-Hans zh-Hant fr + it CFBundleExecutable MacCleanMenu