Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
3b81ab5
Voice search that explains failures, follows the app language, and an…
professorDeveloper Nov 7, 2026
38adc47
Mangayomi: per-source install, remove, update and enable
professorDeveloper Nov 7, 2026
deeea5f
Show Auto Resolve progress with stop and a cap
professorDeveloper Nov 7, 2026
d833df2
Translate manga pages inside the reader
professorDeveloper Nov 7, 2026
2634256
Check profile PINs offline, add biometric unlock and a skip-picker se…
professorDeveloper Nov 7, 2026
b670d96
Add external Zangetsu repos, run on the device
professorDeveloper Nov 7, 2026
40df888
Add a live Contributors section to About and a GitHub star prompt
professorDeveloper Nov 7, 2026
0d69c7e
Drop a const around a theme colour in the contributors skeleton
professorDeveloper Nov 7, 2026
5c6d179
Hide intl's TextDirection in the overlay; drop a redundant null check
professorDeveloper Nov 7, 2026
e3c6560
Add episode comments, spoiler hiding and timed reactions
professorDeveloper Nov 7, 2026
4654213
Add XP, levels and profile cosmetics
professorDeveloper Nov 7, 2026
4e27dfc
Watch party: host controls, friend invites, chat history, better sync
professorDeveloper Nov 7, 2026
3cdb1f1
Match the episode repository with a pattern
professorDeveloper Nov 7, 2026
8832adc
Play through the window in the scheduler test
professorDeveloper Nov 7, 2026
70049aa
Merge commit 'refs/prsim/59' into check/next-3.3.0-all
professorDeveloper Nov 7, 2026
3663de3
Merge commit 'refs/prsim/58' into check/next-3.3.0-all
professorDeveloper Nov 7, 2026
c466264
Merge commit 'refs/prsim/62' into check/next-3.3.0-all
professorDeveloper Nov 7, 2026
3c1f5b1
Merge commit 'refs/prsim/64' into check/next-3.3.0-all
professorDeveloper Nov 7, 2026
a49371b
Merge commit 'refs/prsim/61' into check/next-3.3.0-all
professorDeveloper Nov 7, 2026
50bec2d
Merge commit 'refs/prsim/60' into check/next-3.3.0-all
professorDeveloper Nov 7, 2026
00f3f8b
Merge commit 'refs/prsim/65' into check/next-3.3.0-all
professorDeveloper Nov 7, 2026
d389d19
Merge commit 'refs/prsim/66' into check/next-3.3.0-all
professorDeveloper Nov 7, 2026
e81dcb7
Merge commit 'refs/prsim/67' into check/next-3.3.0-all
professorDeveloper Nov 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions android/app/src/main/kotlin/com/soplay/sozo/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,7 @@ class MainActivity : FlutterFragmentActivity() {
)
)
"openNotificationSettings" -> result.success(openNotificationSettings())
"openAppSettings" -> result.success(openAppSettings())
"apkPackageName" -> {
val path = call.argument<String>("path").orEmpty()
val name = try {
Expand Down Expand Up @@ -1172,6 +1173,20 @@ class MainActivity : FlutterFragmentActivity() {
}
}

private fun openAppSettings(): Boolean {
return try {
startActivity(
Intent(
Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
Uri.parse("package:$packageName")
).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
)
true
} catch (_: Exception) {
false
}
}

private fun openDefaultLinksSettings(): Boolean {
val pkgUri = Uri.parse("package:$packageName")
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
Expand Down
216 changes: 208 additions & 8 deletions assets/translations/ar.json

Large diffs are not rendered by default.

216 changes: 208 additions & 8 deletions assets/translations/ckb.json

Large diffs are not rendered by default.

216 changes: 208 additions & 8 deletions assets/translations/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -533,6 +533,18 @@
"alt_auto_hint": "Spielt von der ersten Quelle ab, die es hat",
"alt_auto_trying": "{} wird versucht…",
"alt_auto_missed": "Keine passende Quelle konnte es abspielen. Wähle unten eine oder durchsuche eine Quelle.",
"alt_auto_checking": "Prüfe {} · {} von {}",
"alt_auto_waiting": "Warte auf weitere Quellen…",
"alt_auto_stop": "Stopp",
"alt_auto_stopped": "Gestoppt.",
"alt_auto_capped": "{} Quellen geprüft, keine konnte das abspielen. Wähle unten eine aus oder versuche es erneut.",
"alt_auto_tried": "Geprüft",
"alt_skip_no_match": "keine genaue Übereinstimmung",
"alt_skip_no_episode": "Folge nicht gefunden",
"alt_skip_error": "konnte nicht geladen werden",
"auto_switch_attempt": "Versuch {} von {}",
"auto_switch_stop": "Stopp",
"auto_switch_stopped": "Serverwechsel gestoppt. Versuche es erneut oder wähle einen anderen Server oder eine andere Quelle.",
"alt_wrong_title": "Falscher Titel?",
"alt_wrong_title_hint": "Suche selbst in {} und wähle den richtigen Titel",
"alt_corrected": "Verwendet jetzt „{}“",
Expand Down Expand Up @@ -565,7 +577,15 @@
"reconnecting": "Verbindung verloren — neu verbinden…",
"all_servers_failed": "Keiner der Server dieses Titels konnte ihn abspielen. Versuch es später oder wähl eine andere Quelle.",
"shortcut_pip": "Mini-Player (Umschalt: über anderen Apps)",
"mini_popout_hint": "Mini-Player · lange drücken, um über anderen Apps zu schweben"
"mini_popout_hint": "Mini-Player · lange drücken, um über anderen Apps zu schweben",
"react": "Reagieren",
"comments": "Kommentare",
"episode_comments": "Kommentare zu Folge {}",
"reaction_text": "Reaktion schreiben",
"reaction_text_hint": "Kurz etwas sagen…",
"reaction_wait": "Warte ein paar Sekunden, bevor du erneut reagierst",
"reaction_limit": "Du hast das Reaktionslimit für diese Folge erreicht",
"reaction_failed": "Reaktion konnte nicht gesendet werden"
},
"profile": {
"title": "Profil",
Expand Down Expand Up @@ -751,7 +771,15 @@
"library_update": "Nach neuen Folgen suchen",
"library_update_desc": "Prüft deine gefolgten Titel und meldet neue Folgen",
"library_update_every": "Alle {} Stunden",
"library_update_daily": "Einmal täglich"
"library_update_daily": "Einmal täglich",
"contributors": "Mitwirkende",
"contributors_error": "Mitwirkende konnten nicht geladen werden",
"become_contributor": "Mitwirken",
"become_contributor_body": "Sozo ist Open Source. Code, Übersetzungen und Fehlerberichte helfen gleichermaßen.",
"reactions_overlay": "Zuschauerreaktionen",
"reactions_overlay_desc": "Reaktionen anderer Zuschauer im Moment ihres Sendens zeigen, und wo sie sich auf der Zeitleiste häufen",
"hide_spoilers": "Spoiler zu Folgen ausblenden, die ich nicht gesehen habe",
"hide_spoilers_desc": "Kommentare zu einer Folge, die du nicht zu Ende gesehen hast, bleiben verschwommen, bis du sie antippst"
},
"appearance": {
"title": "Darstellung",
Expand Down Expand Up @@ -874,8 +902,20 @@
"all_sources_failed_one": "Die durchsuchte Quelle hat nicht geantwortet. Das ist kein leeres Ergebnis — versuche es noch einmal.",
"voice": "Per Sprache suchen",
"voice_listening": "Ich höre zu …",
"voice_done": "Zuhören beendet",
"voice_hint": "Sag den Namen eines Films oder einer Serie",
"voice_starting": "Mikrofon wird vorbereitet…",
"voice_no_speech": "Das habe ich nicht verstanden",
"voice_no_speech_hint": "Sprich etwas lauter und näher am Mikrofon und versuch es noch einmal.",
"voice_permission": "Mikrofonzugriff ist aus",
"voice_permission_hint": "Erlaube Sozo in den Systemeinstellungen den Zugriff aufs Mikrofon, um per Sprache zu suchen.",
"voice_unavailable": "Spracherkennung ist auf diesem Gerät nicht verfügbar",
"voice_unavailable_hint": "Auf diesem Gerät gibt es keinen Spracherkennungsdienst. Installiere oder aktiviere einen in den Systemeinstellungen, etwa den von Google.",
"voice_network": "Sprachdienst nicht erreichbar",
"voice_network_hint": "Prüf deine Internetverbindung und versuch es noch einmal.",
"voice_error": "Beim Zuhören ist etwas schiefgelaufen",
"voice_error_hint": "Vielleicht nutzt eine andere App das Mikrofon. Versuch es gleich noch einmal.",
"voice_try_again": "Noch einmal versuchen",
"voice_open_settings": "Einstellungen öffnen",
"try_torrents": "Torrents durchsuchen",
"capped_note": "Die {} verlässlichsten von {} Quellen wurden durchsucht — grenze die Auswahl ein, um eine bestimmte zu erreichen.",
"rail_popular_on": "Beliebt auf {source}",
Expand Down Expand Up @@ -1172,7 +1212,31 @@
"reconnecting": "Verbindung wird wiederhergestellt …",
"connecting": "Verbindung wird aufgebaut …",
"connect_failed_title": "Verbindung fehlgeschlagen",
"connect_failed_msg": "Prüfe deine Internetverbindung und versuche es erneut."
"connect_failed_msg": "Prüfe deine Internetverbindung und versuche es erneut.",
"settings_title": "Raumeinstellungen",
"room_size": "Raumgröße",
"only_host_setting": "Nur der Host steuert die Wiedergabe",
"lock_room": "Raum sperren",
"lock_room_hint": "Niemand Neues kann beitreten",
"wait_for_all": "Auf alle warten",
"wait_for_all_hint": "Kurz pausieren, wenn jemand puffert",
"invite_friends": "Freunde einladen",
"invite_sent": "Einladung gesendet",
"invite_failed": "Einladung konnte nicht gesendet werden",
"invite_again_in": "Wieder in {}",
"invite_no_friends": "Füge Freunde hinzu, um sie hierher einzuladen",
"make_host": "Zum Host machen",
"remove_member": "Aus der Party entfernen",
"remove_confirm": "{} aus dieser Party entfernen? Ein erneuter Beitritt ist dann nicht möglich.",
"buffering": "Puffert…",
"sys_joined": "{} ist beigetreten",
"sys_left": "{} hat die Party verlassen",
"sys_host": "{} ist jetzt Host",
"sys_removed": "{} wurde entfernt",
"error_banned": "Du wurdest aus dieser Party entfernt",
"error_locked": "Diese Party ist gesperrt",
"room_closed_kicked": "Der Host hat dich aus dieser Party entfernt",
"waiting_for_others": "Warte, bis alle aufgeholt haben…"
},
"notifications": {
"title": "Benachrichtigungen",
Expand Down Expand Up @@ -1293,7 +1357,19 @@
"highlights": "Markierungen",
"remove_highlight": "Markierung entfernen",
"highlight_note": "Notiz hinzufügen (optional)",
"no_highlights": "Noch keine Markierungen. Text auswählen und „Markieren“ wählen."
"no_highlights": "Noch keine Markierungen. Text auswählen und „Markieren“ wählen.",
"translate_page": "Seite übersetzen",
"translate_preview": "Übersetzte Seite",
"translate_apply": "Übernehmen",
"translate_show_original": "Original anzeigen",
"translate_no_text": "Auf dieser Seite wurde kein Text gefunden.",
"translate_daily_limit": "Du hast die Übersetzungen für heute aufgebraucht. Versuch es morgen wieder.",
"translate_offline": "Du bist offline. Verbinde dich mit dem Internet, um diese Seite zu übersetzen.",
"translate_sign_in": "Melde dich an, um Seiten zu übersetzen.",
"translate_failed": "Diese Seite konnte nicht übersetzt werden. Versuch es noch einmal.",
"translate_language": "Seiten übersetzen in",
"translate_auto": "Jede Seite beim Lesen übersetzen",
"translate_auto_desc": "Jede neue Seite verbraucht eine der heutigen Übersetzungen."
},
"cloudflare": {
"title": "Bestätige, dass du ein Mensch bist",
Expand Down Expand Up @@ -1525,7 +1601,10 @@
"show_more": "Mehr anzeigen",
"delete_confirm_title": "Diesen Kommentar löschen?",
"delete_confirm_body": "Das lässt sich nicht rückgängig machen.",
"sign_in_prompt": "Melde dich an, um zu kommentieren"
"sign_in_prompt": "Melde dich an, um zu kommentieren",
"spoiler": "Spoiler",
"spoiler_hidden": "Spoiler · zum Anzeigen tippen",
"unwatched_hidden": "Noch nicht gesehen · zum Anzeigen tippen"
},
"downloads": {
"view_titles": "Titel",
Expand Down Expand Up @@ -2249,7 +2328,25 @@
"settings_title": "Einstellungen: {}",
"settings_reset": "Zurücksetzen",
"settings_failed": "Die Einstellungen dieser Quelle konnten nicht gelesen werden.",
"settings_none": "Diese Quelle hat keine Einstellungen."
"settings_none": "Diese Quelle hat keine Einstellungen.",
"loading_repo": "Repository wird geladen…",
"add_sources": "Quellen hinzufügen",
"choose_sources": "Quellen auswählen",
"select_all": "Alle auswählen",
"select_none": "Keine auswählen",
"install_selected": "Installieren ({})",
"already_installed": "Installiert",
"remove": "Entfernen",
"remove_source": "Quelle entfernen",
"remove_source_confirm": "{} entfernen? Einstellungen und zwischengespeicherter Code werden gelöscht. Du kannst die Quelle über ihr Repository erneut hinzufügen.",
"remove_repo_confirm": "Dieses Repository und alle seine Quellen entfernen?",
"enable_source": "Aktivieren",
"disable_source": "Deaktivieren",
"source_disabled": "Deaktiviert",
"update": "Aktualisieren",
"update_all": "Alle aktualisieren",
"updates_available": "{} Update(s) verfügbar",
"repo_check_failed": "{} konnte nicht geprüft werden: {}"
},
"ux": {
"quick_search": "Schnellsuche ({})",
Expand Down Expand Up @@ -2549,7 +2646,18 @@
"card_single": "Füge Profile für die Personen hinzu, mit denen du dieses Konto teilst",
"load_failed": "Profile konnten nicht geladen werden",
"offline": "Prüfe deine Verbindung und versuch es erneut.",
"error_generic": "Etwas ist schiefgelaufen. Bitte versuch es erneut."
"error_generic": "Etwas ist schiefgelaufen. Bitte versuch es erneut.",
"on_this_device": "Auf diesem Gerät",
"ask_on_launch": "Beim Start fragen, wer zuschaut",
"ask_on_launch_desc": "Wenn aus, öffnet Sozo das zuletzt genutzte Profil. Profile mit PIN fragen trotzdem.",
"pin_locked_until": "Zu viele Versuche. Versuche es nach {} erneut.",
"pin_not_on_device": "Du bist offline, und die PIN dieses Profils wurde auf diesem Gerät noch nie eingegeben. Verbinde dich einmal mit dem Internet, um es zu entsperren.",
"biometric_reason": "{} entsperren",
"biometric_offer_title": "Fingerabdruck / Face ID verwenden?",
"biometric_offer_body": "Fingerabdruck / Face ID für {} auf diesem Gerät verwenden. Die PIN funktioniert weiterhin.",
"biometric_offer_yes": "Verwenden",
"biometric_offer_no": "Nicht jetzt",
"biometric_toggle": "Fingerabdruck / Face ID für {}"
},
"jellyfin": {
"connect_server": "Medienserver verbinden (Jellyfin)",
Expand Down Expand Up @@ -3027,5 +3135,97 @@
"error_attachment_size": "Jedes Bild darf höchstens 5 MB groß sein.",
"error_attachment_count": "Höchstens 5 Screenshots pro Nachricht.",
"suggest": "Passiert das öfter? Schreib dem Support"
},
"zangetsu": {
"title": "Zangetsu-Quellen",
"row_subtitle": "JavaScript-Quellen aus externen Repos, laufen auf deinem Gerät",
"desc": "Füge ein Zangetsu-Repo hinzu, um zusätzliche Anime- und Filmquellen zu installieren. Sie laufen auf deinem Gerät. Quellen, die Sozo bereits mitbringt, sind als „Integriert“ markiert und nutzen weiter Sozos eigene Version.",
"loading_repo": "Repo wird geladen…",
"repo_added": "Repo hinzugefügt · {} Quellen.",
"checking": "Repos werden auf Updates geprüft…",
"updates_available": "{} Update(s) verfügbar.",
"installed_one": "{} installiert.",
"removed_one": "{} entfernt.",
"updated": "{} Quelle(n) aktualisiert.",
"update_all": "Alle aktualisieren ({})",
"update_to": "Auf v{} aktualisieren",
"built_in": "Integriert",
"search": "Quellen durchsuchen…",
"all_types": "Alle",
"type_movies": "Filme",
"all_languages": "Alle Sprachen",
"error_invalid_url": "Nur https-Links auf raw.githubusercontent.com oder gist.githubusercontent.com können hinzugefügt werden.",
"error_unreachable": "Dieses Repo ist nicht erreichbar. Prüfe den Link und deine Verbindung.",
"error_invalid_index": "Dieser Link verweist nicht auf eine gültige Zangetsu-index.json."
},
"star": {
"title": "Möchtest du Sozo beim Wachsen helfen?",
"body": "Gib uns einen Stern auf GitHub ⭐",
"action": "Stern auf GitHub vergeben",
"later": "Später",
"never": "Nicht mehr fragen",
"update_button": "Sozo auf GitHub einen Stern geben"
},
"progress": {
"title": "Level & XP",
"level": "Level",
"level_short": "Lv. {}",
"level_up": "Level-Aufstieg",
"level_reached": "Du hast Level {} erreicht",
"unlocked_new": "Neu in deinem Spind",
"open_locker": "Spind öffnen",
"unavailable": "Level sind noch nicht verfügbar. Schau bald wieder vorbei.",
"xp_total": "{} XP",
"xp_gain": "+{} XP",
"to_next": "{} XP bis Level {}",
"to_next_short": "{} XP bis zum nächsten Level",
"watch_today": "Heute geschaut: {} von {} XP",
"how_to_earn": "So bekommst du XP",
"rule_watch": "Schauen: 1 XP pro Minute, bis zu 300 am Tag",
"rule_comment": "Ein Kommentar: 5 XP, bis zu 10 Kommentare am Tag",
"rule_like": "Ein Like auf deinen Kommentar: 1 XP, bis zu 50 am Tag",
"rule_streak": "Ein Streak-Tag: 10 XP, mehr an Meilenstein-Tagen",
"rule_achievement": "Ein Erfolg: 50 bis 400 XP je nach Stufe",
"recent": "Letzte XP",
"reason_watch": "Schauen",
"reason_comment": "Kommentare",
"reason_like": "Erhaltene Likes",
"reason_streak": "Streak-Tag",
"reason_achievement": "Erfolg",
"reason_other": "XP",
"locker": "Spind",
"slot_frame": "Avatar-Rahmen",
"slot_title": "Titel",
"slot_color": "Namensfarben",
"equip": "Zum Ausrüsten tippen",
"equipped": "Ausgerüstet",
"unlock_level": "Level {}",
"unlock_badge": "Abzeichen: {}",
"frame_bronze": "Bronze",
"frame_silver": "Silber",
"frame_gold": "Gold",
"frame_neon": "Neon",
"frame_sakura": "Sakura",
"frame_ember": "Glut",
"frame_flame": "Flamme",
"frame_moon": "Mond",
"title_newcomer": "Neuling",
"title_regular": "Stammgast",
"title_veteran": "Veteran",
"title_legend": "Legende",
"title_binger": "Binge-Watcher",
"title_cinephile": "Cineast",
"title_otaku": "Otaku",
"title_bookworm": "Bücherwurm",
"title_night_owl": "Nachteule",
"title_host": "Party-Gastgeber",
"color_sky": "Himmel",
"color_mint": "Minze",
"color_gold": "Gold",
"color_rose": "Rose",
"color_violet": "Violett",
"color_crimson": "Karmesin",
"color_aurora": "Polarlicht",
"color_ember": "Glut"
}
}
Loading
Loading