Add more links to the settings page (#1554)

This commit is contained in:
Imran Remtulla
2024-05-05 22:03:04 -04:00
parent 0838a6d30b
commit 7478a7af22
20 changed files with 237 additions and 129 deletions

View File

@@ -113,6 +113,7 @@
"dark": "Tamna", "dark": "Tamna",
"light": "Svijetla", "light": "Svijetla",
"followSystem": "Pratite sistem", "followSystem": "Pratite sistem",
"followSystemThemeExplanation": "Following system theme is possible only by using third-party applications",
"useBlackTheme": "Koristite čisto crnu tamnu temu", "useBlackTheme": "Koristite čisto crnu tamnu temu",
"appSortBy": "Aplikacije sortirane po", "appSortBy": "Aplikacije sortirane po",
"authorName": "Autor/Ime", "authorName": "Autor/Ime",
@@ -309,6 +310,8 @@
"badDownload": "The APK could not be parsed (incompatible or partial download)", "badDownload": "The APK could not be parsed (incompatible or partial download)",
"beforeNewInstallsShareToAppVerifier": "Share new Apps with AppVerifier (if available)", "beforeNewInstallsShareToAppVerifier": "Share new Apps with AppVerifier (if available)",
"appVerifierInstructionToast": "Share to AppVerifier, then return here when ready.", "appVerifierInstructionToast": "Share to AppVerifier, then return here when ready.",
"wiki": "Help/Wiki",
"crowdsourcedConfigsLabel": "Crowdsourced App Configurations (use at your own risk)",
"removeAppQuestion": { "removeAppQuestion": {
"one": "Želite li ukloniti aplikaciju?", "one": "Želite li ukloniti aplikaciju?",
"other": "Želite li ukloniti aplikacije?" "other": "Želite li ukloniti aplikacije?"

View File

@@ -113,6 +113,7 @@
"dark": "Tmavé", "dark": "Tmavé",
"light": "Světlé", "light": "Světlé",
"followSystem": "Jako systém", "followSystem": "Jako systém",
"followSystemThemeExplanation": "Sledování motivu systému je možné pouze pomocí aplikací třetích stran.",
"useBlackTheme": "Použít čistě černé tmavé téma", "useBlackTheme": "Použít čistě černé tmavé téma",
"appSortBy": "Seřadit podle", "appSortBy": "Seřadit podle",
"authorName": "Autor/Jméno", "authorName": "Autor/Jméno",
@@ -309,6 +310,8 @@
"badDownload": "APK nelze analyzovat (nekompatibilní nebo částečné stažení)", "badDownload": "APK nelze analyzovat (nekompatibilní nebo částečné stažení)",
"beforeNewInstallsShareToAppVerifier": "Sdílení nových aplikací s aplikací AppVerifier (pokud je k dispozici)", "beforeNewInstallsShareToAppVerifier": "Sdílení nových aplikací s aplikací AppVerifier (pokud je k dispozici)",
"appVerifierInstructionToast": "Sdílejte do aplikace AppVerifier a po dokončení se sem vraťte.", "appVerifierInstructionToast": "Sdílejte do aplikace AppVerifier a po dokončení se sem vraťte.",
"wiki": "Nápověda/Wiki",
"crowdsourcedConfigsLabel": "Konfigurace aplikací s využitím crowdsourcingu (použití na vlastní nebezpečí)",
"removeAppQuestion": { "removeAppQuestion": {
"one": "Odstranit Apku?", "one": "Odstranit Apku?",
"other": "Odstranit Apky?" "other": "Odstranit Apky?"

View File

@@ -113,6 +113,7 @@
"dark": "Dunkel", "dark": "Dunkel",
"light": "Hell", "light": "Hell",
"followSystem": "System folgen", "followSystem": "System folgen",
"followSystemThemeExplanation": "Das folgende Systemthema ist nur durch die Verwendung von Drittanbieteranwendungen möglich",
"useBlackTheme": "Verwende Pure Black Dark Theme", "useBlackTheme": "Verwende Pure Black Dark Theme",
"appSortBy": "App sortieren nach", "appSortBy": "App sortieren nach",
"authorName": "Autor/Name", "authorName": "Autor/Name",
@@ -309,6 +310,8 @@
"badDownload": "Die APK konnte nicht geparst werden (inkompatibler oder teilweiser Download)", "badDownload": "Die APK konnte nicht geparst werden (inkompatibler oder teilweiser Download)",
"beforeNewInstallsShareToAppVerifier": "Neue Apps mit AppVerifier teilen (falls verfügbar)", "beforeNewInstallsShareToAppVerifier": "Neue Apps mit AppVerifier teilen (falls verfügbar)",
"appVerifierInstructionToast": "Geben Sie die Daten an AppVerifier weiter und kehren Sie dann hierher zurück, wenn Sie fertig sind.", "appVerifierInstructionToast": "Geben Sie die Daten an AppVerifier weiter und kehren Sie dann hierher zurück, wenn Sie fertig sind.",
"wiki": "Hilfe/Wiki",
"crowdsourcedConfigsLabel": "Crowdsourced App Configurations (Verwendung auf eigene Gefahr)",
"removeAppQuestion": { "removeAppQuestion": {
"one": "App entfernen?", "one": "App entfernen?",
"other": "Apps entfernen?" "other": "Apps entfernen?"

View File

@@ -310,6 +310,8 @@
"badDownload": "The APK could not be parsed (incompatible or partial download)", "badDownload": "The APK could not be parsed (incompatible or partial download)",
"beforeNewInstallsShareToAppVerifier": "Share new Apps with AppVerifier (if available)", "beforeNewInstallsShareToAppVerifier": "Share new Apps with AppVerifier (if available)",
"appVerifierInstructionToast": "Share to AppVerifier, then return here when ready.", "appVerifierInstructionToast": "Share to AppVerifier, then return here when ready.",
"wiki": "Help/Wiki",
"crowdsourcedConfigsLabel": "Crowdsourced App Configurations (use at your own risk)",
"removeAppQuestion": { "removeAppQuestion": {
"one": "Remove App?", "one": "Remove App?",
"other": "Remove Apps?" "other": "Remove Apps?"

View File

@@ -113,6 +113,7 @@
"dark": "Oscuro", "dark": "Oscuro",
"light": "Claro", "light": "Claro",
"followSystem": "Seguir al sistema", "followSystem": "Seguir al sistema",
"followSystemThemeExplanation": "Seguir el tema del sistema sólo es posible utilizando aplicaciones de terceros",
"useBlackTheme": "Negro puro en tema oscuro", "useBlackTheme": "Negro puro en tema oscuro",
"appSortBy": "Ordenar aplicaciones por", "appSortBy": "Ordenar aplicaciones por",
"authorName": "Autor/nombre", "authorName": "Autor/nombre",
@@ -309,6 +310,8 @@
"badDownload": "No se ha podido analizar el APK (incompatible o descarga parcial)", "badDownload": "No se ha podido analizar el APK (incompatible o descarga parcial)",
"beforeNewInstallsShareToAppVerifier": "Compartir nuevas aplicaciones con AppVerifier (si está disponible)", "beforeNewInstallsShareToAppVerifier": "Compartir nuevas aplicaciones con AppVerifier (si está disponible)",
"appVerifierInstructionToast": "Comparta con AppVerifier y vuelva aquí cuando esté listo.", "appVerifierInstructionToast": "Comparta con AppVerifier y vuelva aquí cuando esté listo.",
"wiki": "Ayuda/Wiki",
"crowdsourcedConfigsLabel": "Crowdsourced App Configurations (uso bajo su propia responsabilidad)",
"removeAppQuestion": { "removeAppQuestion": {
"one": "¿Eliminar aplicación?", "one": "¿Eliminar aplicación?",
"other": "¿Eliminar aplicaciones?" "other": "¿Eliminar aplicaciones?"

View File

@@ -113,6 +113,7 @@
"dark": "تاریک", "dark": "تاریک",
"light": "روشن", "light": "روشن",
"followSystem": "هماهنگ با سیستم", "followSystem": "هماهنگ با سیستم",
"followSystemThemeExplanation": "Following system theme is possible only by using third-party applications",
"useBlackTheme": "استفاده از تم تیره سیاه خالص", "useBlackTheme": "استفاده از تم تیره سیاه خالص",
"appSortBy": "مرتب سازی برنامه بر اساس", "appSortBy": "مرتب سازی برنامه بر اساس",
"authorName": "سازنده/اسم", "authorName": "سازنده/اسم",
@@ -309,6 +310,8 @@
"badDownload": "The APK could not be parsed (incompatible or partial download)", "badDownload": "The APK could not be parsed (incompatible or partial download)",
"beforeNewInstallsShareToAppVerifier": "Share new Apps with AppVerifier (if available)", "beforeNewInstallsShareToAppVerifier": "Share new Apps with AppVerifier (if available)",
"appVerifierInstructionToast": "Share to AppVerifier, then return here when ready.", "appVerifierInstructionToast": "Share to AppVerifier, then return here when ready.",
"wiki": "Help/Wiki",
"crowdsourcedConfigsLabel": "Crowdsourced App Configurations (use at your own risk)",
"removeAppQuestion": { "removeAppQuestion": {
"one": "برنامه حذف شود؟", "one": "برنامه حذف شود؟",
"other": "برنامه ها حذف شوند؟" "other": "برنامه ها حذف شوند؟"

View File

@@ -113,6 +113,7 @@
"dark": "Sombre", "dark": "Sombre",
"light": "Clair", "light": "Clair",
"followSystem": "Suivre le système", "followSystem": "Suivre le système",
"followSystemThemeExplanation": "Il n'est possible de suivre le thème du système qu'en utilisant des applications tierces.",
"useBlackTheme": "Utilisez le thème noir pur", "useBlackTheme": "Utilisez le thème noir pur",
"appSortBy": "Applications triées par", "appSortBy": "Applications triées par",
"authorName": "Auteur/Nom", "authorName": "Auteur/Nom",
@@ -309,6 +310,8 @@
"badDownload": "L'APK n'a pas pu être analysé (téléchargement incompatible ou partiel)", "badDownload": "L'APK n'a pas pu être analysé (téléchargement incompatible ou partiel)",
"beforeNewInstallsShareToAppVerifier": "Partager les nouvelles applications avec AppVerifier (si disponible)", "beforeNewInstallsShareToAppVerifier": "Partager les nouvelles applications avec AppVerifier (si disponible)",
"appVerifierInstructionToast": "Partagez avec AppVerifier, puis revenez ici lorsque vous êtes prêt.", "appVerifierInstructionToast": "Partagez avec AppVerifier, puis revenez ici lorsque vous êtes prêt.",
"wiki": "Aide/Wiki",
"crowdsourcedConfigsLabel": "Configurations d'applications par la foule (utilisation à vos risques et périls)",
"removeAppQuestion": { "removeAppQuestion": {
"one": "Supprimer l'application ?", "one": "Supprimer l'application ?",
"other": "Supprimer les applications ?" "other": "Supprimer les applications ?"

View File

@@ -113,6 +113,7 @@
"dark": "Sötét", "dark": "Sötét",
"light": "Világos", "light": "Világos",
"followSystem": "Rendszer szerint", "followSystem": "Rendszer szerint",
"followSystemThemeExplanation": "A következő rendszer téma csak harmadik féltől származó alkalmazások használatával lehetséges",
"useBlackTheme": "Használjon teljesen fekete sötét témát", "useBlackTheme": "Használjon teljesen fekete sötét témát",
"appSortBy": "App rendezés...", "appSortBy": "App rendezés...",
"authorName": "Szerző/Név", "authorName": "Szerző/Név",
@@ -309,6 +310,8 @@
"badDownload": "Az APK-t nem lehetett elemezni (inkompatibilis vagy részleges letöltés)", "badDownload": "Az APK-t nem lehetett elemezni (inkompatibilis vagy részleges letöltés)",
"beforeNewInstallsShareToAppVerifier": "Új alkalmazások megosztása az AppVerifierrel (ha elérhető)", "beforeNewInstallsShareToAppVerifier": "Új alkalmazások megosztása az AppVerifierrel (ha elérhető)",
"appVerifierInstructionToast": "Ossza meg az AppVerifierrel, majd térjen vissza ide, ha kész.", "appVerifierInstructionToast": "Ossza meg az AppVerifierrel, majd térjen vissza ide, ha kész.",
"wiki": "Súgó/Wiki",
"crowdsourcedConfigsLabel": "Crowdsourced App Configurations (használat saját felelősségre)",
"removeAppQuestion": { "removeAppQuestion": {
"one": "Eltávolítja az alkalmazást?", "one": "Eltávolítja az alkalmazást?",
"other": "Eltávolítja az alkalmazásokat?" "other": "Eltávolítja az alkalmazásokat?"

View File

@@ -113,6 +113,7 @@
"dark": "Scuro", "dark": "Scuro",
"light": "Chiaro", "light": "Chiaro",
"followSystem": "Segui il sistema", "followSystem": "Segui il sistema",
"followSystemThemeExplanation": "È possibile seguire il tema di sistema solo utilizzando applicazioni di terze parti.",
"useBlackTheme": "Usa il tema nero puro", "useBlackTheme": "Usa il tema nero puro",
"appSortBy": "App ordinate per", "appSortBy": "App ordinate per",
"authorName": "Autore/Nome", "authorName": "Autore/Nome",
@@ -309,6 +310,8 @@
"badDownload": "Non è stato possibile analizzare l'APK (download incompatibile o parziale).", "badDownload": "Non è stato possibile analizzare l'APK (download incompatibile o parziale).",
"beforeNewInstallsShareToAppVerifier": "Condividere le nuove applicazioni con AppVerifier (se disponibile)", "beforeNewInstallsShareToAppVerifier": "Condividere le nuove applicazioni con AppVerifier (se disponibile)",
"appVerifierInstructionToast": "Condividete con AppVerifier, quindi tornate qui quando siete pronti.", "appVerifierInstructionToast": "Condividete con AppVerifier, quindi tornate qui quando siete pronti.",
"wiki": "Aiuto/Wiki",
"crowdsourcedConfigsLabel": "Configurazioni di app in crowdsourcing (uso a proprio rischio)",
"removeAppQuestion": { "removeAppQuestion": {
"one": "Rimuovere l'app?", "one": "Rimuovere l'app?",
"other": "Rimuovere le app?" "other": "Rimuovere le app?"

View File

@@ -113,6 +113,7 @@
"dark": "ダーク", "dark": "ダーク",
"light": "ライト", "light": "ライト",
"followSystem": "システムに従う", "followSystem": "システムに従う",
"followSystemThemeExplanation": "以下のシステムテーマは、サードパーティのアプリケーションを使用することによってのみ可能です。",
"useBlackTheme": "ピュアブラックダークテーマを使用する", "useBlackTheme": "ピュアブラックダークテーマを使用する",
"appSortBy": "アプリの並び方", "appSortBy": "アプリの並び方",
"authorName": "作者名/アプリ名", "authorName": "作者名/アプリ名",
@@ -309,6 +310,8 @@
"badDownload": "APK を解析できませんでした(互換性がないか、部分的にダウンロードされています)。", "badDownload": "APK を解析できませんでした(互換性がないか、部分的にダウンロードされています)。",
"beforeNewInstallsShareToAppVerifier": "AppVerifierで新しいアプリを共有する利用可能な場合", "beforeNewInstallsShareToAppVerifier": "AppVerifierで新しいアプリを共有する利用可能な場合",
"appVerifierInstructionToast": "AppVerifierに共有し、準備ができたらここに戻ってください。", "appVerifierInstructionToast": "AppVerifierに共有し、準備ができたらここに戻ってください。",
"wiki": "ヘルプ/ウィキ",
"crowdsourcedConfigsLabel": "クラウドソーシングによるアプリの設定(利用は自己責任で)",
"removeAppQuestion": { "removeAppQuestion": {
"one": "アプリを削除しますか?", "one": "アプリを削除しますか?",
"other": "アプリを削除しますか?" "other": "アプリを削除しますか?"

View File

@@ -113,6 +113,7 @@
"dark": "Donker", "dark": "Donker",
"light": "Licht", "light": "Licht",
"followSystem": "Volg systeem", "followSystem": "Volg systeem",
"followSystemThemeExplanation": "Het volgende systeemthema is alleen mogelijk met toepassingen van derden",
"useBlackTheme": "Gebruik zwart thema", "useBlackTheme": "Gebruik zwart thema",
"appSortBy": "App sorteren op", "appSortBy": "App sorteren op",
"authorName": "Auteur/Naam", "authorName": "Auteur/Naam",
@@ -309,6 +310,8 @@
"badDownload": "De APK kon niet worden verwerkt (incompatibele of gedeeltelijke download)", "badDownload": "De APK kon niet worden verwerkt (incompatibele of gedeeltelijke download)",
"beforeNewInstallsShareToAppVerifier": "Nieuwe Apps delen met AppVerifier (indien beschikbaar)", "beforeNewInstallsShareToAppVerifier": "Nieuwe Apps delen met AppVerifier (indien beschikbaar)",
"appVerifierInstructionToast": "Deel naar AppVerifier en keer hier terug als je klaar bent.", "appVerifierInstructionToast": "Deel naar AppVerifier en keer hier terug als je klaar bent.",
"wiki": "Help/Wiki",
"crowdsourcedConfigsLabel": "Crowdsourced App-configuraties (gebruik op eigen risico)",
"removeAppQuestion": { "removeAppQuestion": {
"one": "App verwijderen?", "one": "App verwijderen?",
"other": "Apps verwijderen?" "other": "Apps verwijderen?"

View File

@@ -113,6 +113,7 @@
"dark": "Ciemny", "dark": "Ciemny",
"light": "Jasny", "light": "Jasny",
"followSystem": "Zgodny z systemem", "followSystem": "Zgodny z systemem",
"followSystemThemeExplanation": "Podążanie za motywem systemowym jest możliwe tylko przy użyciu aplikacji firm trzecich",
"useBlackTheme": "Użyj czarnego motywu", "useBlackTheme": "Użyj czarnego motywu",
"appSortBy": "Sortuj aplikacje według", "appSortBy": "Sortuj aplikacje według",
"authorName": "Autor/Nazwa", "authorName": "Autor/Nazwa",
@@ -309,6 +310,8 @@
"badDownload": "Nie można przeanalizować pliku APK (niekompatybilny lub częściowo pobrany).", "badDownload": "Nie można przeanalizować pliku APK (niekompatybilny lub częściowo pobrany).",
"beforeNewInstallsShareToAppVerifier": "Udostępnianie nowych aplikacji za pomocą AppVerifier (jeśli dostępne)", "beforeNewInstallsShareToAppVerifier": "Udostępnianie nowych aplikacji za pomocą AppVerifier (jeśli dostępne)",
"appVerifierInstructionToast": "Udostępnij w AppVerifier, a następnie wróć tutaj, gdy będziesz gotowy.", "appVerifierInstructionToast": "Udostępnij w AppVerifier, a następnie wróć tutaj, gdy będziesz gotowy.",
"wiki": "Pomoc/Wiki",
"crowdsourcedConfigsLabel": "Konfiguracje aplikacji pochodzące z crowdsourcingu (korzystanie na własne ryzyko)",
"removeAppQuestion": { "removeAppQuestion": {
"one": "Usunąć aplikację?", "one": "Usunąć aplikację?",
"few": "Usunąć aplikacje?", "few": "Usunąć aplikacje?",

View File

@@ -113,6 +113,7 @@
"dark": "Escuro", "dark": "Escuro",
"light": "Claro", "light": "Claro",
"followSystem": "Padrão do sistema", "followSystem": "Padrão do sistema",
"followSystemThemeExplanation": "O tema do sistema seguinte só é possível através da utilização de aplicações de terceiros",
"useBlackTheme": "Usar tema preto AMOLED", "useBlackTheme": "Usar tema preto AMOLED",
"appSortBy": "Classificar aplicativo por", "appSortBy": "Classificar aplicativo por",
"authorName": "Autor/Nome", "authorName": "Autor/Nome",
@@ -309,6 +310,8 @@
"badDownload": "Não foi possível analisar o APK (transferência incompatível ou parcial)", "badDownload": "Não foi possível analisar o APK (transferência incompatível ou parcial)",
"beforeNewInstallsShareToAppVerifier": "Partilhar novas aplicações com o AppVerifier (se disponível)", "beforeNewInstallsShareToAppVerifier": "Partilhar novas aplicações com o AppVerifier (se disponível)",
"appVerifierInstructionToast": "Partilhe com o AppVerifier e, em seguida, regresse aqui quando estiver pronto.", "appVerifierInstructionToast": "Partilhe com o AppVerifier e, em seguida, regresse aqui quando estiver pronto.",
"wiki": "Ajuda/Wiki",
"crowdsourcedConfigsLabel": "Configurações de aplicações de crowdsourcing (utilização por sua conta e risco)",
"removeAppQuestion": { "removeAppQuestion": {
"one": "Remover aplicativo?", "one": "Remover aplicativo?",
"other": "Remover aplicativos?" "other": "Remover aplicativos?"

View File

@@ -310,6 +310,8 @@
"badDownload": "APK не удалось разобрать (несовместимая или неполная загрузка)", "badDownload": "APK не удалось разобрать (несовместимая или неполная загрузка)",
"beforeNewInstallsShareToAppVerifier": "Поделитесь новыми приложениями с AppVerifier (если доступно)", "beforeNewInstallsShareToAppVerifier": "Поделитесь новыми приложениями с AppVerifier (если доступно)",
"appVerifierInstructionToast": "Поделитесь с AppVerifier, а затем вернитесь сюда, когда будете готовы.", "appVerifierInstructionToast": "Поделитесь с AppVerifier, а затем вернитесь сюда, когда будете готовы.",
"wiki": "Помощь/Вики",
"crowdsourcedConfigsLabel": "Конфигурации приложений на основе краудсорсинга (используйте на свой страх и риск)",
"removeAppQuestion": { "removeAppQuestion": {
"one": "Удалить приложение?", "one": "Удалить приложение?",
"other": "Удалить приложения?" "other": "Удалить приложения?"

View File

@@ -113,6 +113,7 @@
"dark": "Mörkt", "dark": "Mörkt",
"light": "Ljust", "light": "Ljust",
"followSystem": "Följ System", "followSystem": "Följ System",
"followSystemThemeExplanation": "Följande systemtema är endast möjligt med hjälp av tredjepartsapplikationer",
"useBlackTheme": "Använd svart tema", "useBlackTheme": "Använd svart tema",
"appSortBy": "Sortera Appar via", "appSortBy": "Sortera Appar via",
"authorName": "Utvecklare/Namn", "authorName": "Utvecklare/Namn",
@@ -309,6 +310,8 @@
"badDownload": "APK kunde inte analyseras (inkompatibel eller partiell nedladdning)", "badDownload": "APK kunde inte analyseras (inkompatibel eller partiell nedladdning)",
"beforeNewInstallsShareToAppVerifier": "Dela nya appar med AppVerifier (om tillgängligt)", "beforeNewInstallsShareToAppVerifier": "Dela nya appar med AppVerifier (om tillgängligt)",
"appVerifierInstructionToast": "Dela till AppVerifier och återvänd sedan hit när du är klar.", "appVerifierInstructionToast": "Dela till AppVerifier och återvänd sedan hit när du är klar.",
"wiki": "Hjälp/Wiki",
"crowdsourcedConfigsLabel": "Crowdsourcade appkonfigurationer (använd på egen risk)",
"removeAppQuestion": { "removeAppQuestion": {
"one": "Ta Bort App?", "one": "Ta Bort App?",
"other": "Ta Bort Appar?" "other": "Ta Bort Appar?"

View File

@@ -113,6 +113,7 @@
"dark": "Koyu", "dark": "Koyu",
"light": "Aydınlık", "light": "Aydınlık",
"followSystem": "Sistemi Takip Et", "followSystem": "Sistemi Takip Et",
"followSystemThemeExplanation": "Sistem temasını takip etmek yalnızca üçüncü taraf uygulamaları kullanarak mümkündür",
"useBlackTheme": "Saf siyah koyu temasını kullan", "useBlackTheme": "Saf siyah koyu temasını kullan",
"appSortBy": "Uygulama Sıralama Ölçütü", "appSortBy": "Uygulama Sıralama Ölçütü",
"authorName": "Yazar/Ad", "authorName": "Yazar/Ad",
@@ -309,6 +310,8 @@
"badDownload": "APK ayrıştırılamadı (uyumsuz veya kısmi indirme)", "badDownload": "APK ayrıştırılamadı (uyumsuz veya kısmi indirme)",
"beforeNewInstallsShareToAppVerifier": "Yeni Uygulamaları AppVerifier ile paylaşın (varsa)", "beforeNewInstallsShareToAppVerifier": "Yeni Uygulamaları AppVerifier ile paylaşın (varsa)",
"appVerifierInstructionToast": "AppVerifier ile paylaşın, hazır olduğunuzda buraya dönün.", "appVerifierInstructionToast": "AppVerifier ile paylaşın, hazır olduğunuzda buraya dönün.",
"wiki": "Yardım/Wiki",
"crowdsourcedConfigsLabel": "Kitle Kaynaklı Uygulama Yapılandırmaları (riski size ait olmak üzere kullanın)",
"removeAppQuestion": { "removeAppQuestion": {
"one": "Uygulamayı Kaldır?", "one": "Uygulamayı Kaldır?",
"other": "Uygulamaları Kaldır?" "other": "Uygulamaları Kaldır?"

View File

@@ -113,6 +113,7 @@
"dark": "Темна", "dark": "Темна",
"light": "Світла", "light": "Світла",
"followSystem": "Дотримуватися системи", "followSystem": "Дотримуватися системи",
"followSystemThemeExplanation": "Зміна теми системи можлива лише за допомогою сторонніх додатків",
"useBlackTheme": "Використовувати чорну тему (Amoled)", "useBlackTheme": "Використовувати чорну тему (Amoled)",
"appSortBy": "Сортувати застосунки за", "appSortBy": "Сортувати застосунки за",
"authorName": "Автор/Назва", "authorName": "Автор/Назва",
@@ -309,6 +310,8 @@
"badDownload": "APK не вдалося розпарсити (несумісний або часткове завантаження)", "badDownload": "APK не вдалося розпарсити (несумісний або часткове завантаження)",
"beforeNewInstallsShareToAppVerifier": "Діліться новими додатками з AppVerifier (якщо доступно)", "beforeNewInstallsShareToAppVerifier": "Діліться новими додатками з AppVerifier (якщо доступно)",
"appVerifierInstructionToast": "Надішліть на AppVerifier, а потім поверніться сюди, коли будете готові.", "appVerifierInstructionToast": "Надішліть на AppVerifier, а потім поверніться сюди, коли будете готові.",
"wiki": "Довідка/Вікі",
"crowdsourcedConfigsLabel": "Краудсорсингові конфігурації додатків (використовуйте на свій страх і ризик)",
"removeAppQuestion": { "removeAppQuestion": {
"one": "Видалити застосунок?", "one": "Видалити застосунок?",
"other": "Видалити застосунки?" "other": "Видалити застосунки?"

View File

@@ -113,6 +113,7 @@
"dark": "Tối", "dark": "Tối",
"light": "Sáng", "light": "Sáng",
"followSystem": "Theo hệ thống", "followSystem": "Theo hệ thống",
"followSystemThemeExplanation": "Following system theme is possible only by using third-party applications",
"useBlackTheme": "Nền đen", "useBlackTheme": "Nền đen",
"appSortBy": "Sắp xếp ứng dụng", "appSortBy": "Sắp xếp ứng dụng",
"authorName": "Tác giả", "authorName": "Tác giả",
@@ -309,6 +310,8 @@
"badDownload": "Không thể phân tích cú pháp APK (tải xuống một phần hoặc không tương thích)", "badDownload": "Không thể phân tích cú pháp APK (tải xuống một phần hoặc không tương thích)",
"beforeNewInstallsShareToAppVerifier": "Chia sẻ ứng dụng mới với AppVerifier (nếu có)", "beforeNewInstallsShareToAppVerifier": "Chia sẻ ứng dụng mới với AppVerifier (nếu có)",
"appVerifierInstructionToast": "Chia sẻ lên AppVerifier, sau đó quay lại đây khi sẵn sàng.", "appVerifierInstructionToast": "Chia sẻ lên AppVerifier, sau đó quay lại đây khi sẵn sàng.",
"wiki": "Help/Wiki",
"crowdsourcedConfigsLabel": "Crowdsourced App Configurations (use at your own risk)",
"removeAppQuestion": { "removeAppQuestion": {
"one": "Gỡ ứng dụng?", "one": "Gỡ ứng dụng?",
"other": "Gỡ ứng dụng?" "other": "Gỡ ứng dụng?"

View File

@@ -113,6 +113,7 @@
"dark": "深色", "dark": "深色",
"light": "浅色", "light": "浅色",
"followSystem": "跟随系统", "followSystem": "跟随系统",
"followSystemThemeExplanation": "只有使用第三方应用程序,才有可能跟踪系统主题",
"useBlackTheme": "使用纯黑深色主题", "useBlackTheme": "使用纯黑深色主题",
"appSortBy": "排序依据", "appSortBy": "排序依据",
"authorName": "作者 / 应用名称", "authorName": "作者 / 应用名称",
@@ -309,6 +310,8 @@
"badDownload": "无法解析 APK 文件(不兼容或文件不完整)", "badDownload": "无法解析 APK 文件(不兼容或文件不完整)",
"beforeNewInstallsShareToAppVerifier": "与 AppVerifier 共享新应用程序(如有)", "beforeNewInstallsShareToAppVerifier": "与 AppVerifier 共享新应用程序(如有)",
"appVerifierInstructionToast": "分享到 AppVerifier准备就绪后返回此处。", "appVerifierInstructionToast": "分享到 AppVerifier准备就绪后返回此处。",
"wiki": "帮助/维基",
"crowdsourcedConfigsLabel": "众包应用程序配置(使用风险自负)",
"removeAppQuestion": { "removeAppQuestion": {
"one": "是否删除应用?", "one": "是否删除应用?",
"other": "是否删除应用?" "other": "是否删除应用?"

View File

@@ -26,20 +26,33 @@ class SettingsPage extends StatefulWidget {
class _SettingsPageState extends State<SettingsPage> { class _SettingsPageState extends State<SettingsPage> {
List<int> updateIntervalNodes = [ List<int> updateIntervalNodes = [
15, 30, 60, 120, 180, 360, 720, 1440, 4320, 10080, 20160, 43200]; 15,
30,
60,
120,
180,
360,
720,
1440,
4320,
10080,
20160,
43200
];
int updateInterval = 0; int updateInterval = 0;
late SplineInterpolation updateIntervalInterpolator; // 🤓 late SplineInterpolation updateIntervalInterpolator; // 🤓
String updateIntervalLabel = tr('neverManualOnly'); String updateIntervalLabel = tr('neverManualOnly');
bool showIntervalLabel = true; bool showIntervalLabel = true;
final Map<ColorSwatch<Object>, String> colorsNameMap = final Map<ColorSwatch<Object>, String> colorsNameMap =
<ColorSwatch<Object>, String> { <ColorSwatch<Object>, String>{
ColorTools.createPrimarySwatch(obtainiumThemeColor): 'Obtainium' ColorTools.createPrimarySwatch(obtainiumThemeColor): 'Obtainium'
}; };
void initUpdateIntervalInterpolator() { void initUpdateIntervalInterpolator() {
List<InterpolationNode> nodes = []; List<InterpolationNode> nodes = [];
for (final (index, element) in updateIntervalNodes.indexed) { for (final (index, element) in updateIntervalNodes.indexed) {
nodes.add(InterpolationNode(x: index.toDouble()+1, y: element.toDouble())); nodes.add(
InterpolationNode(x: index.toDouble() + 1, y: element.toDouble()));
} }
updateIntervalInterpolator = SplineInterpolation(nodes: nodes); updateIntervalInterpolator = SplineInterpolation(nodes: nodes);
} }
@@ -69,7 +82,7 @@ class _SettingsPageState extends State<SettingsPage> {
int valRounded = (valInterpolated / 30).floor() * 30; int valRounded = (valInterpolated / 30).floor() * 30;
updateInterval = valRounded; updateInterval = valRounded;
updateIntervalLabel = plural('hour', valRounded / 60); updateIntervalLabel = plural('hour', valRounded / 60);
} else if (valInterpolated < 7 * 24 * 60){ } else if (valInterpolated < 7 * 24 * 60) {
int valRounded = (valInterpolated / (12 * 60)).floor() * 12 * 60; int valRounded = (valInterpolated / (12 * 60)).floor() * 12 * 60;
updateInterval = valRounded; updateInterval = valRounded;
updateIntervalLabel = plural('day', valRounded / (24 * 60)); updateIntervalLabel = plural('day', valRounded / (24 * 60));
@@ -90,21 +103,18 @@ class _SettingsPageState extends State<SettingsPage> {
var followSystemThemeExplanation = FutureBuilder( var followSystemThemeExplanation = FutureBuilder(
builder: (ctx, val) { builder: (ctx, val) {
return ((val.data?.version.sdkInt ?? 30) < 29) ? return ((val.data?.version.sdkInt ?? 30) < 29)
Text(tr('followSystemThemeExplanation'), ? Text(tr('followSystemThemeExplanation'),
style: Theme.of(context).textTheme.labelSmall) style: Theme.of(context).textTheme.labelSmall)
: const SizedBox.shrink(); : const SizedBox.shrink();
}, },
future: DeviceInfoPlugin().androidInfo future: DeviceInfoPlugin().androidInfo);
);
Future<bool> colorPickerDialog() async { Future<bool> colorPickerDialog() async {
return ColorPicker( return ColorPicker(
color: settingsProvider.themeColor, color: settingsProvider.themeColor,
onColorChanged: (Color color) => onColorChanged: (Color color) =>
setState(() => setState(() => settingsProvider.themeColor = color),
settingsProvider.themeColor = color
),
actionButtons: const ColorPickerActionButtons( actionButtons: const ColorPickerActionButtons(
okButton: true, okButton: true,
closeButton: true, closeButton: true,
@@ -137,19 +147,17 @@ class _SettingsPageState extends State<SettingsPage> {
showColorName: true, showColorName: true,
materialNameTextStyle: Theme.of(context).textTheme.bodySmall, materialNameTextStyle: Theme.of(context).textTheme.bodySmall,
colorNameTextStyle: Theme.of(context).textTheme.bodySmall, colorNameTextStyle: Theme.of(context).textTheme.bodySmall,
copyPasteBehavior: const ColorPickerCopyPasteBehavior(longPressMenu: true), copyPasteBehavior:
const ColorPickerCopyPasteBehavior(longPressMenu: true),
).showPickerDialog( ).showPickerDialog(
context, context,
transitionBuilder: (BuildContext context, transitionBuilder: (BuildContext context, Animation<double> a1,
Animation<double> a1, Animation<double> a2, Widget widget) { Animation<double> a2, Widget widget) {
final double curvedValue = Curves.easeInCubic.transform(a1.value); final double curvedValue = Curves.easeInCubic.transform(a1.value);
return Transform( return Transform(
alignment: Alignment.center, alignment: Alignment.center,
transform: Matrix4.diagonal3Values(curvedValue, curvedValue, 1), transform: Matrix4.diagonal3Values(curvedValue, curvedValue, 1),
child: Opacity( child: Opacity(opacity: curvedValue, child: widget),
opacity: curvedValue,
child: widget
),
); );
}, },
transitionDuration: const Duration(milliseconds: 250), transitionDuration: const Duration(milliseconds: 250),
@@ -157,46 +165,44 @@ class _SettingsPageState extends State<SettingsPage> {
} }
var colorPicker = ListTile( var colorPicker = ListTile(
dense: true, dense: true,
contentPadding: EdgeInsets.zero, contentPadding: EdgeInsets.zero,
title: Text(tr('selectX', args: [tr('colour')])), title: Text(tr('selectX', args: [tr('colour')])),
subtitle: Text("${ColorTools.nameThatColor(settingsProvider.themeColor)} " subtitle: Text(
"(${ColorTools.materialNameAndCode(settingsProvider.themeColor, "${ColorTools.nameThatColor(settingsProvider.themeColor)} "
colorSwatchNameMap: colorsNameMap)})"), "(${ColorTools.materialNameAndCode(settingsProvider.themeColor, colorSwatchNameMap: colorsNameMap)})"),
trailing: ColorIndicator( trailing: ColorIndicator(
width: 40, width: 40,
height: 40, height: 40,
borderRadius: 20, borderRadius: 20,
color: settingsProvider.themeColor, color: settingsProvider.themeColor,
onSelectFocus: false, onSelectFocus: false,
onSelect: () async { onSelect: () async {
final Color colorBeforeDialog = settingsProvider.themeColor; final Color colorBeforeDialog = settingsProvider.themeColor;
if (!(await colorPickerDialog())) { if (!(await colorPickerDialog())) {
setState(() { setState(() {
settingsProvider.themeColor = colorBeforeDialog; settingsProvider.themeColor = colorBeforeDialog;
}); });
} }
} }));
)
);
var useMaterialThemeSwitch = FutureBuilder( var useMaterialThemeSwitch = FutureBuilder(
builder: (ctx, val) { builder: (ctx, val) {
return ((val.data?.version.sdkInt ?? 0) >= 31) ? return ((val.data?.version.sdkInt ?? 0) >= 31)
Row( ? Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Flexible(child: Text(tr('useMaterialYou'))), Flexible(child: Text(tr('useMaterialYou'))),
Switch( Switch(
value: settingsProvider.useMaterialYou, value: settingsProvider.useMaterialYou,
onChanged: (value) { onChanged: (value) {
settingsProvider.useMaterialYou = value; settingsProvider.useMaterialYou = value;
}) })
], ],
) : const SizedBox.shrink(); )
: const SizedBox.shrink();
}, },
future: DeviceInfoPlugin().androidInfo future: DeviceInfoPlugin().androidInfo);
);
var sortDropdown = DropdownButtonFormField( var sortDropdown = DropdownButtonFormField(
isExpanded: true, isExpanded: true,
@@ -343,13 +349,20 @@ class _SettingsPageState extends State<SettingsPage> {
), ),
//intervalDropdown, //intervalDropdown,
height16, height16,
if (showIntervalLabel) SizedBox( if (showIntervalLabel)
child: Text("${tr('bgUpdateCheckInterval')}: $updateIntervalLabel") SizedBox(
) else const SizedBox(height: 16), child: Text(
"${tr('bgUpdateCheckInterval')}: $updateIntervalLabel"))
else
const SizedBox(height: 16),
intervalSlider, intervalSlider,
FutureBuilder( FutureBuilder(
builder: (ctx, val) { builder: (ctx, val) {
return (settingsProvider.updateInterval > 0) && (((val.data?.version.sdkInt ?? 0) >= 30) || settingsProvider.useShizuku) return (settingsProvider.updateInterval >
0) &&
(((val.data?.version.sdkInt ?? 0) >=
30) ||
settingsProvider.useShizuku)
? Column( ? Column(
crossAxisAlignment: crossAxisAlignment:
CrossAxisAlignment.start, CrossAxisAlignment.start,
@@ -491,33 +504,33 @@ class _SettingsPageState extends State<SettingsPage> {
children: [ children: [
Flexible( Flexible(
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
Text(tr( Text(tr(
'beforeNewInstallsShareToAppVerifier')), 'beforeNewInstallsShareToAppVerifier')),
GestureDetector( GestureDetector(
onTap: () { onTap: () {
launchUrlString( launchUrlString(
'https://github.com/soupslurpr/AppVerifier', 'https://github.com/soupslurpr/AppVerifier',
mode: LaunchMode mode: LaunchMode
.externalApplication); .externalApplication);
}, },
child: Text( child: Text(
tr('about'), tr('about'),
style: const TextStyle( style: const TextStyle(
decoration: decoration:
TextDecoration.underline, TextDecoration.underline,
fontSize: 12), fontSize: 12),
)), )),
], ],
)), )),
Switch( Switch(
value: settingsProvider value: settingsProvider
.beforeNewInstallsShareToAppVerifier, .beforeNewInstallsShareToAppVerifier,
onChanged: (value) { onChanged: (value) {
settingsProvider settingsProvider
.beforeNewInstallsShareToAppVerifier = .beforeNewInstallsShareToAppVerifier =
value; value;
}) })
], ],
@@ -531,17 +544,31 @@ class _SettingsPageState extends State<SettingsPage> {
value: settingsProvider.useShizuku, value: settingsProvider.useShizuku,
onChanged: (useShizuku) { onChanged: (useShizuku) {
if (useShizuku) { if (useShizuku) {
ShizukuApkInstaller.checkPermission().then((resCode) { ShizukuApkInstaller.checkPermission()
settingsProvider.useShizuku = resCode!.startsWith('granted'); .then((resCode) {
switch(resCode){ settingsProvider.useShizuku =
resCode!.startsWith('granted');
switch (resCode) {
case 'binder_not_found': case 'binder_not_found':
showError(ObtainiumError(tr('shizukuBinderNotFound')), context); showError(
ObtainiumError(tr(
'shizukuBinderNotFound')),
context);
case 'old_shizuku': case 'old_shizuku':
showError(ObtainiumError(tr('shizukuOld')), context); showError(
ObtainiumError(
tr('shizukuOld')),
context);
case 'old_android_with_adb': case 'old_android_with_adb':
showError(ObtainiumError(tr('shizukuOldAndroidWithADB')), context); showError(
ObtainiumError(tr(
'shizukuOldAndroidWithADB')),
context);
case 'denied': case 'denied':
showError(ObtainiumError(tr('cancelled')), context); showError(
ObtainiumError(
tr('cancelled')),
context);
} }
}); });
} else { } else {
@@ -566,7 +593,8 @@ class _SettingsPageState extends State<SettingsPage> {
color: Theme.of(context).colorScheme.primary), color: Theme.of(context).colorScheme.primary),
), ),
DropdownButtonFormField( DropdownButtonFormField(
decoration: InputDecoration(labelText: tr('theme')), decoration:
InputDecoration(labelText: tr('theme')),
value: settingsProvider.theme, value: settingsProvider.theme,
items: [ items: [
DropdownMenuItem( DropdownMenuItem(
@@ -593,17 +621,17 @@ class _SettingsPageState extends State<SettingsPage> {
height16, height16,
if (settingsProvider.theme != ThemeSettings.light) if (settingsProvider.theme != ThemeSettings.light)
Row( Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment:
children: [ MainAxisAlignment.spaceBetween,
Flexible(child: Text(tr('useBlackTheme'))), children: [
Switch( Flexible(child: Text(tr('useBlackTheme'))),
value: settingsProvider.useBlackTheme, Switch(
onChanged: (value) { value: settingsProvider.useBlackTheme,
settingsProvider.useBlackTheme = value; onChanged: (value) {
} settingsProvider.useBlackTheme =
) value;
] })
), ]),
height8, height8,
useMaterialThemeSwitch, useMaterialThemeSwitch,
if (!settingsProvider.useMaterialYou) colorPicker, if (!settingsProvider.useMaterialYou) colorPicker,
@@ -624,28 +652,39 @@ class _SettingsPageState extends State<SettingsPage> {
builder: (ctx, val) { builder: (ctx, val) {
return (val.data?.version.sdkInt ?? 0) >= 34 return (val.data?.version.sdkInt ?? 0) >= 34
? Column( ? Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment:
children: [ CrossAxisAlignment.start,
height16, children: [
Row( height16,
mainAxisAlignment: MainAxisAlignment.spaceBetween, Row(
children: [ mainAxisAlignment:
Flexible(child: Text(tr('useSystemFont'))), MainAxisAlignment
Switch( .spaceBetween,
value: settingsProvider.useSystemFont, children: [
onChanged: (useSystemFont) { Flexible(
if (useSystemFont) { child: Text(tr(
NativeFeatures.loadSystemFont().then((val) { 'useSystemFont'))),
settingsProvider.useSystemFont = true; Switch(
}); value: settingsProvider
} else { .useSystemFont,
settingsProvider.useSystemFont = false; onChanged:
} (useSystemFont) {
}) if (useSystemFont) {
] NativeFeatures
) .loadSystemFont()
] .then((val) {
) settingsProvider
.useSystemFont =
true;
});
} else {
settingsProvider
.useSystemFont =
false;
}
})
])
])
: const SizedBox.shrink(); : const SizedBox.shrink();
}, },
future: DeviceInfoPlugin().androidInfo), future: DeviceInfoPlugin().androidInfo),
@@ -801,17 +840,31 @@ class _SettingsPageState extends State<SettingsPage> {
Row( Row(
mainAxisAlignment: MainAxisAlignment.spaceAround, mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [ children: [
TextButton.icon( IconButton(
onPressed: () { onPressed: () {
launchUrlString(settingsProvider.sourceUrl, launchUrlString(settingsProvider.sourceUrl,
mode: LaunchMode.externalApplication); mode: LaunchMode.externalApplication);
}, },
icon: const Icon(Icons.code), icon: const Icon(Icons.code),
label: Text( tooltip: tr('appSource'),
tr('appSource'),
),
), ),
TextButton.icon( IconButton(
onPressed: () {
launchUrlString('${settingsProvider.sourceUrl}/wiki',
mode: LaunchMode.externalApplication);
},
icon: const Icon(Icons.help_outline_rounded),
tooltip: tr('wiki'),
),
IconButton(
onPressed: () {
launchUrlString('https://apps.obtainium.imranr.dev/',
mode: LaunchMode.externalApplication);
},
icon: const Icon(Icons.apps_rounded),
tooltip: tr('crowdsourcedConfigsLabel'),
),
IconButton(
onPressed: () { onPressed: () {
context.read<LogsProvider>().get().then((logs) { context.read<LogsProvider>().get().then((logs) {
if (logs.isEmpty) { if (logs.isEmpty) {
@@ -827,7 +880,7 @@ class _SettingsPageState extends State<SettingsPage> {
}); });
}, },
icon: const Icon(Icons.bug_report_outlined), icon: const Icon(Icons.bug_report_outlined),
label: Text(tr('appLogs'))), tooltip: tr('appLogs'))
], ],
), ),
const SizedBox( const SizedBox(