Compare commits

..

12 Commits

Author SHA1 Message Date
Imran Remtulla
bfa661c8e0 Enabled italian translations, increment version 2022-12-15 12:15:35 -05:00
Imran Remtulla
e5825fe1d3 Merge pull request #153 from atilluF/Italian-TL
Italian translation
2022-12-15 12:12:00 -05:00
Imran Remtulla
9e09aba444 Merge pull request #152 from atilluF/README
Added SourceForge to README.md
2022-12-15 12:11:55 -05:00
atilluF
8f5e07a5ca Added Italian translation 2022-12-15 18:01:58 +01:00
atilluF
e7f3cdafe5 Added SourceForge to README.md 2022-12-15 17:55:02 +01:00
Imran Remtulla
14ae43de92 Internationalized more strings
Added ZH to supported language codes
Increment version
2022-12-15 11:09:03 -05:00
Imran Remtulla
a8f0d784a2 Merge pull request #151 from RanTranslations/main
assets: Add Simplified Chinese translations
2022-12-15 10:32:29 -05:00
JohnsonRan
b1fb06e90b assets: Add Simplified Chinese translations 2022-12-15 18:53:33 +08:00
Imran Remtulla
481204665c Workaround for version detection error in BG 2022-12-14 19:10:05 -05:00
Imran Remtulla
317b5ac83a Added a log for prev. commit 2022-12-12 20:56:14 -05:00
Imran Remtulla
f3b1ca4541 Attempt to disable ver. det. in bg if needed 2022-12-12 20:53:42 -05:00
Imran Remtulla
a00cfa2ba6 Fixed some strings 2022-12-11 11:46:00 -05:00
9 changed files with 524 additions and 28 deletions

View File

@@ -13,6 +13,7 @@ Currently supported App sources:
- [IzzyOnDroid](https://android.izzysoft.de/)
- [Mullvad](https://mullvad.net/en/)
- [Signal](https://signal.org/)
- [SourceForge](https://sourceforge.net/)
- [APKMirror](https://apkmirror.com/) (Track-Only)
## Limitations

View File

@@ -170,6 +170,16 @@
"pleaseAllowInstallPerm": "Please allow Obtainium to install Apps",
"trackOnly": "Track-Only",
"errorWithHttpStatusCode": "Error {}",
"versionCorrectionDisabled": "Version correction disabled (plugin doesn't seem to work)",
"unknown": "Unknown",
"none": "None",
"never": "Never",
"latestVersionX": "Latest Version: {}",
"installedVersionX": "Installed Version: {}",
"lastUpdateCheckX": "Last Update Check: {}",
"remove": "Remove",
"removeAppQuestion": "Remove App?",
"yesMarkUpdated": "'Yes, Mark as Updated",
"tooManyRequestsTryAgainInMinutes": {
"one": "Too many requests (rate limited) - try again in {} minute",
"other": "Too many requests (rate limited) - try again in {} minutes"

227
assets/translations/it.json Normal file
View File

@@ -0,0 +1,227 @@
{
"invalidURLForSource": "URL dell'App da {} non valido",
"noReleaseFound": "Impossibile trovare una release adatta",
"noVersionFound": "Impossibile determinare la versione della release",
"urlMatchesNoSource": "L'URL non corrisponde ad alcuna fonte conosciuta",
"cantInstallOlderVersion": "Impossibile installare una versione precedente di un'App",
"appIdMismatch": "L'ID del pacchetto scaricato non corrisponde all'ID dell'App esistente",
"functionNotImplemented": "Questa classe non ha implementato questa funzione",
"placeholder": "Segnaposto",
"someErrors": "Si sono verificati degli errori",
"unexpectedError": "Errore imprevisto",
"ok": "Va bene",
"and": "e",
"startedBgUpdateTask": "Avviata l'attività di controllo degli aggiornamenti in background",
"bgUpdateIgnoreAfterIs": "Bg update ignoreAfter is {}",
"startedActualBGUpdateCheck": "Avviato il controllo effettivo degli aggiornamenti in background",
"bgUpdateTaskFinished": "Terminata l'attività di controllo degli aggiornamenti in background",
"firstRun": "Questo è il primo avvio di sempre di Obtainium",
"settingUpdateCheckIntervalTo": "Imposta l'intervallo di aggiornamento a {}",
"githubPATLabel": "GitHub Personal Access Token (aumenta il limite di traffico)",
"githubPATHint": "PAT deve seguire questo formato: username:token",
"githubPATFormat": "username:token",
"githubPATLinkText": "Informazioni su GitHub PAT",
"includePrereleases": "Includi prerelease",
"fallbackToOlderReleases": "Ripiega su release datate",
"filterReleaseTitlesByRegEx": "Filtra le release con le espressioni regolari",
"invalidRegEx": "Espressione regolare invalida",
"noDescription": "Descrizione assente",
"cancel": "Annulla",
"continue": "Continua",
"requiredInBrackets": "(Richiesto)",
"dropdownNoOptsError": "ERRORE: LA TENDINA DEVE AVERE ALMENO UN'OPZIONE",
"colour": "Colore",
"githubStarredRepos": "i repository stellati da GitHub",
"uname": "Username",
"wrongArgNum": "Numero di argomenti forniti errato",
"xIsTrackOnly": "{} è Solo-Monitoraggio",
"source": "Fonte",
"app": "App",
"appsFromSourceAreTrackOnly": "Le App da questa fonte sono in modalità 'Solo-Monitoraggio'.",
"youPickedTrackOnly": "Hai selezionato l'opzione 'Solo-Monitoraggio'.",
"trackOnlyAppDescription": "L'App sarà monitorata per gli aggiornamenti, ma Obtainium non sarà in grado di scaricarli o di installarli.",
"cancelled": "Annullato",
"appAlreadyAdded": "App già aggiunta",
"alreadyUpToDateQuestion": "App già aggiornata?",
"addApp": "Aggiungi App",
"appSourceURL": "URL della fonte dell'App",
"error": "Errore",
"add": "Aggiungi",
"searchSomeSourcesLabel": "Cerca (disponibile solo per alcune fonti)",
"search": "Cerca",
"additionalOptsFor": "Opzioni aggiuntive per {}",
"supportedSourcesBelow": "Fonti supportate:",
"trackOnlyInBrackets": "(Solo-Monitoraggio)",
"searchableInBrackets": "(Ricercabile)",
"appsString": "App",
"noApps": "Nessuna App",
"noAppsForFilter": "Nessuna App per i filtri selezionati",
"byX": "Da {}",
"percentProgress": "Progresso: {}%",
"pleaseWait": "Attendere prego",
"updateAvailable": "Aggiornamento disponibile",
"estimateInBracketsShort": "(Prev.)",
"notInstalled": "Non installato",
"estimateInBrackets": "(Previsto)",
"selectAll": "Seleziona tutto",
"deselectN": "Deseleziona {}",
"xWillBeRemovedButRemainInstalled": "{} sarà rimosso da Obtainium ma resterà installato sul dispositivo.",
"removeSelectedAppsQuestion": "Rimuovere le App selezionate?",
"removeSelectedApps": "Rimuovi le App selezionate",
"updateX": "Aggiorna {}",
"installX": "Installa {}",
"markXTrackOnlyAsUpdated": "Contrassegna {}\n(Solo-Monitoraggio)\ncome aggiornato",
"changeX": "modifica {}",
"installUpdateApps": "Installa/Aggiorna le App",
"installUpdateSelectedApps": "Installa/Aggiornale le App selezionate",
"onlyWorksWithNonEVDApps": "Funziona solo per le App il cui stato d'installazione non può essere rilevato automaticamente (inconsueto).",
"markXSelectedAppsAsUpdated": "Contrassegnare le {} App selezionate come aggiornate?",
"no": "No",
"yes": "Sì",
"markSelectedAppsUpdated": "Contrassegna le App selezionate come aggiornate",
"pinToTop": "Fissa in alto",
"unpinFromTop": "Rimuovi dall'alto",
"resetInstallStatusForSelectedAppsQuestion": "Ripristinare lo stato d'installazione delle App selezionate?",
"installStatusOfXWillBeResetExplanation": "Lo stato d'installazione di ogni App selezionata sarà ripristinato.\n\nCiò può essere d'aiuto nel caso in cui la versione mostrata dell'App in Obtainium non è corretta a causa di un aggiornamento fallito o di altri problemi.",
"shareSelectedAppURLs": "Condividi gli URL delle App selezionate",
"resetInstallStatus": "Ripristina lo stato d'installazione",
"more": "Di più",
"removeOutdatedFilter": "Rimuovi il filtro per le App datate",
"showOutdatedOnly": "Mostra solo le App datate",
"filter": "Filtri",
"filterActive": "Filtri *",
"filterApps": "Filtra App",
"appName": "Nome dell'App",
"author": "Autore",
"upToDateApps": "App aggiornate",
"nonInstalledApps": "App non installate",
"importExport": "Importa/Esporta",
"settings": "Impostazioni",
"exportedTo": "Esportato in {}",
"obtainiumExport": "Esporta da Obtainium",
"invalidInput": "Inserimento non valido",
"importedX": "Importato {}",
"obtainiumImport": "Importa in Obtainium",
"importFromURLList": "Importa da lista di URL",
"searchQuery": "Stringa di ricerca",
"appURLList": "Lista di URL delle App",
"line": "Linea",
"searchX": "Cerca {}",
"noResults": "Nessun risultato trovato",
"importX": "Importa {}",
"importedAppsIdDisclaimer": "Le App importate potrebbero essere visualizzate erroneamente come \"Non installate\".\nPer risolvere il problema, reinstallale con Obtainium.\nQuesto non dovrebbe influire sui dati delle App.\n\nRiguarda solo l'URL e i metodi di importazione di terze parti.",
"importErrors": "Errori dell'importazione",
"importedXOfYApps": "{} App di {} importate.",
"followingURLsHadErrors": "I seguenti URL contengono errori:",
"okay": "Va bene",
"selectURL": "Seleziona l'URL",
"selectURLs": "Seleziona gli URL",
"pick": "Seleziona",
"theme": "Tema",
"dark": "Scuro",
"light": "Chiaro",
"followSystem": "Segui il sistema",
"obtainium": "Obtainium",
"materialYou": "Material You",
"appSortBy": "App ordinate per",
"authorName": "Autore/Nome",
"nameAuthor": "Nome/Autore",
"asAdded": "Data di aggiunta",
"appSortOrder": "Ordinamento",
"ascending": "Ascendente",
"descending": "Discendente",
"bgUpdateCheckInterval": "Intervallo di controllo degli aggiornamenti in background",
"neverManualOnly": "Mai - Solo manuale",
"appearance": "Aspetto",
"showWebInAppView": "Mostra la pagina web dell'App se selezionata",
"pinUpdates": "Fissa in alto gli aggiornamenti disponibili nella pagina delle App",
"updates": "Aggiornato",
"sourceSpecific": "Specifico per la fonte",
"appSource": "Sorgente dell'App",
"noLogs": "Nessun log",
"appLogs": "Log dell'App",
"close": "Chiudi",
"share": "Condividi",
"appNotFound": "App non trovata",
"obtainiumExportHyphenatedLowercase": "esportazione-obtainium",
"pickAnAPK": "Seleziona un APK",
"appHasMoreThanOnePackage": "{} offre più di un pacchetto:",
"deviceSupportsXArch": "Il tuo dispositivo supporta l'architettura {} della CPU.",
"deviceSupportsFollowingArchs": "Il tuo dispositivo supporta le seguenti architetture della CPU:",
"warning": "Attenzione",
"sourceIsXButPackageFromYPrompt": "L'origine dell'App è '{}' ma il pacchetto della release proviene da '{}'. Continuare?",
"updatesAvailable": "Aggiornamenti disponibili",
"updatesAvailableNotifDescription": "Avvisa l'utente che sono disponibili gli aggiornamenti di una o più App monitorate da Obtainium",
"noNewUpdates": "Nessun nuovo aggiornamento.",
"xHasAnUpdate": "{} è stato aggiornato.",
"appsUpdated": "App aggiornate",
"appsUpdatedNotifDescription": "Avvisa l'utente che una o più App sono state aggiornate in background",
"xWasUpdatedToY": "{} è stato aggiornato a {}.",
"errorCheckingUpdates": "Controllo degli errori per gli aggiornamenti",
"errorCheckingUpdatesNotifDescription": "Una notifica che mostra quando il controllo degli aggiornamenti in background fallisce",
"appsRemoved": "App rimosse",
"appsRemovedNotifDescription": "Avvisa l'utente che una o più App sono state rimosse a causa di errori durante il caricamento",
"xWasRemovedDueToErrorY": "{} è stata rimosso a causa di questo errore: {}",
"completeAppInstallation": "Completa l'installazione dell'App",
"obtainiumMustBeOpenToInstallApps": "Obtainium deve essere aperto per poter installare le App",
"completeAppInstallationNotifDescription": "Chiede all'utente di riaprire Obtainium per terminare l'installazione di un App",
"checkingForUpdates": "Controllo degli aggiornamenti in corso",
"checkingForUpdatesNotifDescription": "Notifica transitoria che appare durante la verifica degli aggiornamenti",
"pleaseAllowInstallPerm": "Per favore permetti a Obtainium di installare le App",
"trackOnly": "Solo-Monitoraggio",
"errorWithHttpStatusCode": "Errore {}",
"versionCorrectionDisabled": "Correzione della versione disabilitata (il plugin non pare funzionare)",
"unknown": "Sconosciuto",
"none": "Nessuno",
"never": "Mai",
"latestVersionX": "Ultima versione: {}",
"installedVersionX": "Versione installata: {}",
"lastUpdateCheckX": "Ultimo controllo degli aggiornamenti: {}",
"remove": "Rimuovi",
"removeAppQuestion": "Rimuovere App?",
"yesMarkUpdated": "'Sì, contrassegna come aggiornato",
"tooManyRequestsTryAgainInMinutes": {
"one": "Troppe richieste (traffico limitato) - riprova tra {} minuto",
"other": "Troppe richieste (traffico limitato) - riprova tra {} minuti"
},
"bgUpdateGotErrorRetryInMinutes": {
"one": "Il controllo degli aggiornamenti in background ha incontrato un {}, ricontrollo tra {} minuto",
"other": "Il controllo degli aggiornamenti in background ha incontrato un {}, ricontrollo tra {} minuti"
},
"bgCheckFoundUpdatesWillNotifyIfNeeded": {
"one": "Il controllo degli aggiornamenti in background ha trovato {} aggiornamento - avviserà l'utento se necessario",
"other": "Il controllo degli aggiornamenti in background ha trovato {} aggiornamenti - avviserà l'utento se necessario"
},
"apps": {
"one": "{} App",
"other": "{} App"
},
"url": {
"one": "{} URL",
"other": "{} URL"
},
"minute": {
"one": "{} minuto",
"other": "{} minuti"
},
"hour": {
"one": "{} ora",
"other": "{} ore"
},
"day": {
"one": "{} giorno",
"other": "{} giorni"
},
"clearedNLogsBeforeXAfterY": {
"one": "Pulito {n} log (prima = {before}, dopo = {after})",
"other": "Puliti {n} log (prima = {before}, dopo = {after})"
},
"xAndNMoreUpdatesAvailable": {
"one": "{} e un'altra App hanno aggiornamenti disponibili.",
"other": "{} e altre {} App hanno aggiornamenti disponibili."
},
"xAndNMoreUpdatesInstalled": {
"one": "{} e un'altra App sono state aggiornate.",
"other": "{} e altre {} App sono state aggiornate."
}
}

227
assets/translations/zh.json Normal file
View File

@@ -0,0 +1,227 @@
{
"invalidURLForSource": "不是一个有效的 {} URL",
"noReleaseFound": "找不到合适的更新",
"noVersionFound": "无法确定更新版本",
"urlMatchesNoSource": "URL 与已知来源不符",
"cantInstallOlderVersion": "无法安装旧版应用程序",
"appIdMismatch": "下载的软件包名与现有的应用程序包名不一致",
"functionNotImplemented": "该类没有实现此功能",
"placeholder": "占位符",
"someErrors": "出现了一些错误",
"unexpectedError": "意外错误",
"ok": "好的",
"and": "和",
"startedBgUpdateTask": "开始后台检查更新任务",
"bgUpdateIgnoreAfterIs": "Bg update ignoreAfter is {}",
"startedActualBGUpdateCheck": "后台检查更新已开始",
"bgUpdateTaskFinished": "后台检查更新已完成",
"firstRun": "这是你第一次运行 Obtainium",
"settingUpdateCheckIntervalTo": "设置检查更新间隔为 {}",
"githubPATLabel": "GitHub 个人访问令牌 (提高 API 限制)",
"githubPATHint": "个人访问令牌必须为: username:token 形式",
"githubPATFormat": "username:token",
"githubPATLinkText": "'关于 GitHub 个人访问令牌",
"includePrereleases": "包含预发布版",
"fallbackToOlderReleases": "回落到旧版",
"filterReleaseTitlesByRegEx": "通过正则表达式过滤发布标题",
"invalidRegEx": "无效的正则表达式",
"noDescription": "无描述",
"cancel": "取消",
"continue": "继续",
"requiredInBrackets": "(必须)",
"dropdownNoOptsError": "错误:下拉菜单必须至少有一个选项",
"colour": "颜色",
"githubStarredRepos": "GitHub 已星标仓库",
"uname": "用户名",
"wrongArgNum": "提供了错误的参数数量",
"xIsTrackOnly": "{} 仅追踪",
"source": "源码",
"app": "应用程序",
"appsFromSourceAreTrackOnly": "来自此来源的应用为仅追踪",
"youPickedTrackOnly": "你已选择仅追踪选项",
"trackOnlyAppDescription": "The App will be tracked for updates, but Obtainium will not be able to download or install it.",
"cancelled": "已取消",
"appAlreadyAdded": "此应用程序已被添加",
"alreadyUpToDateQuestion": "App Already up to Date?",
"addApp": "添加应用",
"appSourceURL": "应用来源 URL",
"error": "错误",
"add": "添加",
"searchSomeSourcesLabel": "搜索 (仅部分来源)",
"search": "搜索",
"additionalOptsFor": "{} 的更多选项",
"supportedSourcesBelow": "受支持的来源:",
"trackOnlyInBrackets": "(仅追踪)",
"searchableInBrackets": "(可被搜索)",
"appsString": "应用程序",
"noApps": "无应用程序",
"noAppsForFilter": "没有应用可被过滤",
"byX": "来自 {}",
"percentProgress": "进度: {}%",
"pleaseWait": "请等待...",
"updateAvailable": "更新可用",
"estimateInBracketsShort": "(预计.)",
"notInstalled": "未安装",
"estimateInBrackets": "(预计)",
"selectAll": "全选",
"deselectN": "取消选择 {}",
"xWillBeRemovedButRemainInstalled": "{} 将被从 Obtainium 中删除,但仍安装在设备上。",
"removeSelectedAppsQuestion": "删除已选择的应用程序吗?",
"removeSelectedApps": "删除已选择的应用程序",
"updateX": "更新 {}",
"installX": "安装 {}",
"markXTrackOnlyAsUpdated": "将仅追踪编辑为已更新",
"changeX": "更改 {}",
"installUpdateApps": "安装/更新应用程序",
"installUpdateSelectedApps": "安装/更新已选择的应用程序",
"onlyAppliesToInstalledAndOutdatedApps": "'只适用于已安装但已过时的应用程序",
"markXSelectedAppsAsUpdated": "将已选择的 {} 个应用程序标记为已更新?",
"no": "不要",
"yes": "好的",
"markSelectedAppsUpdated": "标记已选择的应用程序为已更新",
"pinToTop": "置顶",
"unpinFromTop": "取消置顶",
"resetInstallStatusForSelectedAppsQuestion": "为已选择的应用程序重置安装状态吗?",
"installStatusOfXWillBeResetExplanation": "当 Obtainium 中显示的应用程序版本由于更新失败或其他问题而不正确时,这将有助于重置任何选定应用程序的安装状态。",
"shareSelectedAppURLs": "分享已选择的应用程序 URL",
"resetInstallStatus": "重置安装状态",
"more": "更多",
"removeOutdatedFilter": "删除过时的应用程序过滤器",
"showOutdatedOnly": "只显示过时的应用程序",
"filter": "过滤器",
"filterActive": "过滤器 *",
"filterApps": "过滤应用",
"appName": "应用名称",
"author": "作者",
"upToDateApps": "已更新的应用程序",
"nonInstalledApps": "未安装的应用程序",
"importExport": "导入/导出",
"settings": "设置",
"exportedTo": "导出到 {}",
"obtainiumExport": "Obtainium 导出",
"invalidInput": "无效输入",
"importedX": "已导出到 {}",
"obtainiumImport": "Obtainium 导入",
"importFromURLList": "从 URL 列表导入",
"searchQuery": "搜索查询",
"appURLList": "应用 URL 列表",
"line": "行",
"searchX": "搜索 {}",
"noResults": "无结果",
"importX": "导入 {}",
"importedAppsIdDisclaimer": "导入的应用程序可能不正确地显示为未安装。要解决这个问题,请通过 Obtainium 重新安装它们。",
"importErrors": "导入错误",
"importedXOfYApps": "{} 中的 {} 个应用已导入",
"followingURLsHadErrors": "以下 URL 有错误:",
"okay": "好的",
"selectURL": "已选择的 URL",
"selectURLs": "已选择的 URL",
"pick": "选择",
"theme": "主题",
"dark": "深色",
"light": "浅色",
"followSystem": "跟随系统",
"obtainium": "Obtainium",
"materialYou": "Material You",
"appSortBy": "应用排列方式",
"authorName": "作者/名字",
"nameAuthor": "名字/作者",
"asAdded": "以添加顺序",
"appSortOrder": "以排列顺序",
"ascending": "升序",
"descending": "降序",
"bgUpdateCheckInterval": "后台更新检查间隔",
"neverManualOnly": "从不 - 仅手动",
"appearance": "外观",
"showWebInAppView": "在应用来源页显示网页",
"pinUpdates": "将需要更新的应用固定到顶部",
"updates": "已更新",
"sourceSpecific": "指定源",
"appSource": "应用源",
"noLogs": "无日志",
"appLogs": "应用日志",
"close": "关闭",
"share": "分享",
"appNotFound": "未找到应用",
"obtainiumExportHyphenatedLowercase": "obtainium-导出",
"pickAnAPK": "选择一个安装包",
"appHasMoreThanOnePackage": "{} 有多于一个安装包:",
"deviceSupportsXArch": "你的设备支持 {} CPU 架构",
"deviceSupportsFollowingArchs": "你的设备支持以下 CPU 架构:",
"warning": "警告",
"sourceIsXButPackageFromYPrompt": "此应用来源是 '{}' 但更新包来自 '{}'。 继续吗?",
"updatesAvailable": "更新可用",
"updatesAvailableNotifDescription": "通知 Obtainium 所跟踪应用程序的更新",
"noNewUpdates": "你的应用已是最新。",
"xHasAnUpdate": "{} 有更新啦",
"appsUpdated": "应用已更新",
"appsUpdatedNotifDescription": "通知在后台安装应用程序的更新",
"xWasUpdatedToY": "{} 已更新到 {}.",
"errorCheckingUpdates": "检查更新出错",
"errorCheckingUpdatesNotifDescription": "当后台更新检查失败时显示的通知",
"appsRemoved": "应用已删除",
"appsRemovedNotifDescription": "通知由于加载应用程序时出错而被删除",
"xWasRemovedDueToErrorY": "{} 已因以下错误被删除: {}",
"completeAppInstallation": "完成应用安装",
"obtainiumMustBeOpenToInstallApps": "Obtainium 需要被启动以安装更新",
"completeAppInstallationNotifDescription": "需要返回 Obtainium以完成应用程序的安装。",
"checkingForUpdates": "检查更新中",
"checkingForUpdatesNotifDescription": "检查更新时出现的瞬时通知",
"pleaseAllowInstallPerm": "请允许 Obtainium 安装应用程序",
"trackOnly": "仅追踪",
"errorWithHttpStatusCode": "错误 {}",
"versionCorrectionDisabled": "Version correction disabled (plugin doesn't seem to work)",
"unknown": "Unknown",
"none": "None",
"never": "Never",
"latestVersionX": "Latest Version: {}",
"installedVersionX": "Installed Version: {}",
"lastUpdateCheckX": "Last Update Check: {}",
"remove": "Remove",
"removeAppQuestion": "Remove App?",
"yesMarkUpdated": "'Yes, Mark as Updated",
"tooManyRequestsTryAgainInMinutes": {
"one": "请求过多 (API 限制) - 在 {} 分钟后重试",
"other": "请求过多 (API 限制) - 在 {} 分钟后重试"
},
"bgUpdateGotErrorRetryInMinutes": {
"one": "后台更新检查遇到了 {} 问题, 将在 {} 分钟后重试",
"other": "后台更新检查遇到了 {} 问题, 将在 {} 分钟后重试"
},
"bgCheckFoundUpdatesWillNotifyIfNeeded": {
"one": "后台更新检查找到了 {} 个更新 - 将通知用户",
"other": "后台更新检查找到了 {} 个更新 - 将通知用户"
},
"apps": {
"one": "{} 个应用",
"other": "{} 个应用"
},
"url": {
"one": "{} 个 URL",
"other": "{} 个 URL"
},
"minute": {
"one": "{} 分钟",
"other": "{} 分钟"
},
"hour": {
"one": "{} 小时",
"other": "{} 小时"
},
"day": {
"one": "{} 天",
"other": "{} 天"
},
"clearedNLogsBeforeXAfterY": {
"one": "清除了 {n} 个日志 (清除前 = {before}, 清除后 = {after})",
"other": "清除了 {n} 个日志 (清除前 = {before}, 清除后 = {after})"
},
"xAndNMoreUpdatesAvailable": {
"one": "{} 和 {} 更多应用已被更新",
"other": "{} 和 {} 更多应用已被更新"
},
"xAndNMoreUpdatesInstalled": {
"one": "{} 和 {} 更多应用已被安装",
"other": "{} 和 {} 更多应用已被安装"
}
}

View File

@@ -21,13 +21,13 @@ import 'package:easy_localization/src/easy_localization_controller.dart';
// ignore: implementation_imports
import 'package:easy_localization/src/localization.dart';
const String currentVersion = '0.8.8';
const String currentVersion = '0.8.12';
const String currentReleaseTag =
'v$currentVersion-beta'; // KEEP THIS IN SYNC WITH GITHUB RELEASES
const int bgUpdateCheckAlarmId = 666;
const supportedLocales = [Locale('en')];
const supportedLocales = [Locale('en'), Locale('zh'), Locale('it')];
const fallbackLocale = Locale('en');
const localeDir = 'assets/translations';
@@ -85,7 +85,7 @@ Future<void> bgUpdateCheck(int taskId, Map<String, dynamic>? params) async {
if (e is RateLimitError || e is SocketException) {
var remainingMinutes = e is RateLimitError ? e.remainingMinutes : 15;
logs.add(plural('bgUpdateGotErrorRetryInMinutes', remainingMinutes,
args: [e.runtimeType.toString()]));
args: [e.runtimeType.toString(), remainingMinutes.toString()]));
AndroidAlarmManager.oneShot(Duration(minutes: remainingMinutes),
Random().nextInt(pow(2, 31) as int), bgUpdateCheck, params: {
'ignoreAfterMicroseconds': nextIgnoreAfter.microsecondsSinceEpoch

View File

@@ -76,7 +76,7 @@ class _AppPageState extends State<AppPage> {
style: Theme.of(context).textTheme.displayLarge,
),
Text(
'By ${app?.app.author ?? 'Unknown'}',
tr('byX', args: [app?.app.author ?? tr('unknown')]),
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.headlineMedium,
),
@@ -102,12 +102,17 @@ class _AppPageState extends State<AppPage> {
height: 32,
),
Text(
'Latest Version: ${app?.app.latestVersion ?? 'Unknown'}',
tr('latestVersionX',
args: [app?.app.latestVersion ?? tr('unknown')]),
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.bodyLarge,
),
Text(
'Installed Version: ${app?.app.installedVersion ?? 'None'}${app?.app.trackOnly == true ? ' (Estimate)\n\nApp is Track-Only' : ''}',
'${tr('installedVersionX', args: [
app?.app.installedVersion ?? tr('none')
])}${app?.app.trackOnly == true ? ' ${tr('estimateInBrackets')}\n\n${tr('xIsTrackOnly', args: [
tr('app')
])}' : ''}',
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.bodyLarge,
),
@@ -115,7 +120,11 @@ class _AppPageState extends State<AppPage> {
height: 32,
),
Text(
'Last Update Check: ${app?.app.lastUpdateCheck == null ? 'Never' : '\n${app?.app.lastUpdateCheck?.toLocal()}'}',
tr('lastUpdateCheckX', args: [
app?.app.lastUpdateCheck == null
? tr('never')
: '\n${app?.app.lastUpdateCheck?.toLocal()}'
]),
textAlign: TextAlign.center,
style: const TextStyle(
fontStyle: FontStyle.italic, fontSize: 12),
@@ -166,7 +175,7 @@ class _AppPageState extends State<AppPage> {
Navigator.of(context)
.pop();
},
child: const Text('No')),
child: Text(tr('no'))),
TextButton(
onPressed: () {
HapticFeedback
@@ -183,8 +192,8 @@ class _AppPageState extends State<AppPage> {
Navigator.of(context)
.pop();
},
child: const Text(
'Yes, Mark as Updated'))
child: Text(
tr('yesMarkUpdated')))
],
);
});
@@ -267,9 +276,14 @@ class _AppPageState extends State<AppPage> {
context: context,
builder: (BuildContext ctx) {
return AlertDialog(
title: const Text('Remove App?'),
content: Text(
'This will remove \'${app?.installedInfo?.name ?? app?.app.name}\' from Obtainium.${app?.app.installedVersion != null ? '\n\nNote that while Obtainium will no longer track its updates, the App will remain installed.' : ''}'),
title: Text(tr('removeAppQuestion')),
content: Text(tr(
'xWillBeRemovedButRemainInstalled',
args: [
app?.installedInfo?.name ??
app?.app.name ??
tr('app')
])),
actions: [
TextButton(
onPressed: () {
@@ -283,12 +297,12 @@ class _AppPageState extends State<AppPage> {
count++ >= 2);
});
},
child: const Text('Remove')),
child: Text(tr('remove'))),
TextButton(
onPressed: () {
Navigator.of(context).pop();
},
child: const Text('Cancel'))
child: Text(tr('cancel')))
],
);
});
@@ -298,7 +312,7 @@ class _AppPageState extends State<AppPage> {
Theme.of(context).colorScheme.error,
surfaceTintColor:
Theme.of(context).colorScheme.error),
child: const Text('Remove'),
child: Text(tr('remove')),
),
])),
if (app?.downloadProgress != null)

View File

@@ -427,6 +427,19 @@ class AppsProvider with ChangeNotifier {
return null;
}
Future<bool> doesInstalledAppsPluginWork() async {
bool res = false;
try {
res = (await InstalledApps.getAppInfo(obtainiumId)).versionName != null;
} catch (e) {
//
}
if (!res) {
logs.add(tr('versionCorrectionDisabled'));
}
return res;
}
// If the App says it is installed but installedInfo is null, set it to not installed
// If there is any other mismatch between installedInfo and installedVersion, try reconciling them intelligently
// If that fails, just set it to the actual version string (all we can do at that point)
@@ -550,21 +563,25 @@ class AppsProvider with ChangeNotifier {
}
loadingApps = false;
notifyListeners();
List<App> modifiedApps = [];
for (var app in apps.values) {
var moddedApp =
getCorrectedInstallStatusAppIfPossible(app.app, app.installedInfo);
if (moddedApp != null) {
modifiedApps.add(moddedApp);
if (await doesInstalledAppsPluginWork()) {
List<App> modifiedApps = [];
for (var app in apps.values) {
var moddedApp =
getCorrectedInstallStatusAppIfPossible(app.app, app.installedInfo);
if (moddedApp != null) {
modifiedApps.add(moddedApp);
}
}
if (modifiedApps.isNotEmpty) {
await saveApps(modifiedApps, attemptToCorrectInstallStatus: false);
}
}
if (modifiedApps.isNotEmpty) {
await saveApps(modifiedApps, attemptToCorrectInstallStatus: false);
}
}
Future<void> saveApps(List<App> apps,
{bool attemptToCorrectInstallStatus = true}) async {
attemptToCorrectInstallStatus =
attemptToCorrectInstallStatus && (await doesInstalledAppsPluginWork());
for (var app in apps) {
AppInfo? info = await getInstalledInfo(app.id);
app.name = info?.name ?? app.name;

View File

@@ -36,7 +36,7 @@ class UpdateNotification extends ObtainiumNotification {
: updates.length == 1
? tr('xHasAnUpdate', args: [updates[0].name])
: plural('xAndNMoreUpdatesAvailable', updates.length - 1,
args: [updates[0].name]);
args: [updates[0].name, (updates.length - 1).toString()]);
}
}
@@ -48,7 +48,7 @@ class SilentUpdateNotification extends ObtainiumNotification {
? tr('xWasUpdatedToY',
args: [updates[0].name, updates[0].latestVersion])
: plural('xAndNMoreUpdatesInstalled', updates.length - 1,
args: [updates[0].name]);
args: [updates[0].name, (updates.length - 1).toString()]);
}
}

View File

@@ -17,7 +17,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
# In Windows, build-name is used as the major, minor, and patch parts
# of the product and file versions while build-number is used as the build suffix.
version: 0.8.8+71 # When changing this, update the tag in main() accordingly
version: 0.8.12+76 # When changing this, update the tag in main() accordingly
environment:
sdk: '>=2.18.2 <3.0.0'