From 9e0c3e7b685c94496aa5fe9a940b926e16e1ebac Mon Sep 17 00:00:00 2001 From: edde746 <86283021+edde746@users.noreply.github.com> Date: Fri, 27 Feb 2026 14:49:47 +0100 Subject: [PATCH] fix: improve delete-from-server button safety Rename "Delete" to "Delete from server" with distinct icon and always-red styling to prevent accidental server deletions. Closes #568 --- lib/i18n/de.i18n.json | 5 +++-- lib/i18n/en.i18n.json | 5 +++-- lib/i18n/es.i18n.json | 5 +++-- lib/i18n/fr.i18n.json | 5 +++-- lib/i18n/it.i18n.json | 5 +++-- lib/i18n/ko.i18n.json | 5 +++-- lib/i18n/nl.i18n.json | 5 +++-- lib/i18n/strings_de.g.dart | 10 ++++++---- lib/i18n/strings_en.g.dart | 16 ++++++++++------ lib/i18n/strings_es.g.dart | 10 ++++++---- lib/i18n/strings_fr.g.dart | 10 ++++++---- lib/i18n/strings_it.g.dart | 10 ++++++---- lib/i18n/strings_ko.g.dart | 10 ++++++---- lib/i18n/strings_nl.g.dart | 10 ++++++---- lib/i18n/strings_sv.g.dart | 10 ++++++---- lib/i18n/strings_zh.g.dart | 10 ++++++---- lib/i18n/sv.i18n.json | 5 +++-- lib/i18n/zh.i18n.json | 5 +++-- lib/utils/dialogs.dart | 4 ++-- lib/widgets/focusable_list_tile.dart | 10 ++++++++++ lib/widgets/media_context_menu.dart | 17 ++++++++++++----- 21 files changed, 109 insertions(+), 63 deletions(-) diff --git a/lib/i18n/de.i18n.json b/lib/i18n/de.i18n.json index fdfbba20..310e3143 100644 --- a/lib/i18n/de.i18n.json +++ b/lib/i18n/de.i18n.json @@ -273,8 +273,9 @@ "goToSeason": "Zur Staffel", "shufflePlay": "Zufallswiedergabe", "fileInfo": "Dateiinfo", - "confirmDelete": "Sind Sie sicher, dass Sie dieses Element aus Ihrem Dateisystem löschen möchten?", - "deleteMultipleWarning": "Mehrere Elemente können gelöscht werden.", + "deleteFromServer": "Vom Server löschen", + "confirmDelete": "Dieses Medium und seine Dateien werden dauerhaft von Ihrem Server gelöscht. Dies kann nicht rückgängig gemacht werden.", + "deleteMultipleWarning": "Dies umfasst alle Episoden und deren Dateien.", "mediaDeletedSuccessfully": "Medienelement erfolgreich gelöscht", "mediaFailedToDelete": "Löschen des Medienelements fehlgeschlagen", "rate": "Bewerten" diff --git a/lib/i18n/en.i18n.json b/lib/i18n/en.i18n.json index cbc18e9e..eb938889 100644 --- a/lib/i18n/en.i18n.json +++ b/lib/i18n/en.i18n.json @@ -273,8 +273,9 @@ "goToSeason": "Go to season", "shufflePlay": "Shuffle Play", "fileInfo": "File Info", - "confirmDelete": "Are you sure you want to delete this item from your filesystem?", - "deleteMultipleWarning": "Multiple items may be deleted.", + "deleteFromServer": "Delete from server", + "confirmDelete": "This will permanently delete this media and its files from your server. This cannot be undone.", + "deleteMultipleWarning": "This includes all episodes and their files.", "mediaDeletedSuccessfully": "Media item deleted successfully", "mediaFailedToDelete": "Failed to delete media item", "rate": "Rate" diff --git a/lib/i18n/es.i18n.json b/lib/i18n/es.i18n.json index 7e80021f..bfe8e54c 100644 --- a/lib/i18n/es.i18n.json +++ b/lib/i18n/es.i18n.json @@ -273,8 +273,9 @@ "goToSeason": "Ir a la temporada", "shufflePlay": "Reproducción Aleatoria", "fileInfo": "Información del Archivo", - "confirmDelete": "¿Estás seguro de que quieres eliminar este elemento de tu sistema de archivos?", - "deleteMultipleWarning": "Es posible que se eliminen varios elementos.", + "deleteFromServer": "Eliminar del servidor", + "confirmDelete": "Esto eliminará permanentemente este contenido y sus archivos de tu servidor. Esta acción no se puede deshacer.", + "deleteMultipleWarning": "Esto incluye todos los episodios y sus archivos.", "mediaDeletedSuccessfully": "Elemento multimedia eliminado con éxito", "mediaFailedToDelete": "Error al eliminar el elemento multimedia", "rate": "Calificar" diff --git a/lib/i18n/fr.i18n.json b/lib/i18n/fr.i18n.json index 9a0f1315..b81f1c23 100644 --- a/lib/i18n/fr.i18n.json +++ b/lib/i18n/fr.i18n.json @@ -273,8 +273,9 @@ "goToSeason": "Aller à la saison", "shufflePlay": "Lecture aléatoire", "fileInfo": "Informations sur le fichier", - "confirmDelete": "Êtes-vous sûr de vouloir supprimer cet élément de votre système de fichiers?", - "deleteMultipleWarning": "Plusieurs éléments peuvent être supprimés.", + "deleteFromServer": "Supprimer du serveur", + "confirmDelete": "Cela supprimera définitivement ce média et ses fichiers de votre serveur. Cette action est irréversible.", + "deleteMultipleWarning": "Cela inclut tous les épisodes et leurs fichiers.", "mediaDeletedSuccessfully": "Élément média supprimé avec succès", "mediaFailedToDelete": "Échec de la suppression de l'élément média", "rate": "Noter" diff --git a/lib/i18n/it.i18n.json b/lib/i18n/it.i18n.json index b1da2926..8e9f5558 100644 --- a/lib/i18n/it.i18n.json +++ b/lib/i18n/it.i18n.json @@ -273,8 +273,9 @@ "goToSeason": "Vai alla stagione", "shufflePlay": "Riproduzione casuale", "fileInfo": "Info sul file", - "confirmDelete": "Sei sicuro di voler eliminare questo elemento dal tuo filesystem?", - "deleteMultipleWarning": "Potrebbero essere eliminati più elementi.", + "deleteFromServer": "Elimina dal server", + "confirmDelete": "Questo eliminerà permanentemente questo contenuto e i suoi file dal tuo server. Questa azione non può essere annullata.", + "deleteMultipleWarning": "Questo include tutti gli episodi e i loro file.", "mediaDeletedSuccessfully": "Elemento multimediale eliminato con successo", "mediaFailedToDelete": "Impossibile eliminare l'elemento multimediale", "rate": "Valuta" diff --git a/lib/i18n/ko.i18n.json b/lib/i18n/ko.i18n.json index 1fcca5ef..0450b81b 100644 --- a/lib/i18n/ko.i18n.json +++ b/lib/i18n/ko.i18n.json @@ -273,8 +273,9 @@ "goToSeason": "시즌으로 이동", "shufflePlay": "무작위 재생", "fileInfo": "파일 정보", - "confirmDelete": "파일 시스템에서 이 항목을 삭제하시겠습니까?", - "deleteMultipleWarning": "여러 항목이 삭제될 수 있습니다.", + "deleteFromServer": "서버에서 삭제", + "confirmDelete": "이 미디어와 파일이 서버에서 영구적으로 삭제됩니다. 이 작업은 취소할 수 없습니다.", + "deleteMultipleWarning": "모든 에피소드와 파일이 포함됩니다.", "mediaDeletedSuccessfully": "미디어 항목이 성공적으로 삭제되었습니다", "mediaFailedToDelete": "미디어 항목 삭제 실패", "rate": "평가" diff --git a/lib/i18n/nl.i18n.json b/lib/i18n/nl.i18n.json index e08757ae..3ff7e563 100644 --- a/lib/i18n/nl.i18n.json +++ b/lib/i18n/nl.i18n.json @@ -273,8 +273,9 @@ "goToSeason": "Ga naar seizoen", "shufflePlay": "Willekeurig afspelen", "fileInfo": "Bestand info", - "confirmDelete": "Weet je zeker dat je dit item van je bestandssysteem wilt verwijderen?", - "deleteMultipleWarning": "Meerdere items kunnen worden verwijderd.", + "deleteFromServer": "Verwijderen van server", + "confirmDelete": "Dit zal deze media en de bijbehorende bestanden permanent van je server verwijderen. Dit kan niet ongedaan worden gemaakt.", + "deleteMultipleWarning": "Dit omvat alle afleveringen en hun bestanden.", "mediaDeletedSuccessfully": "Media-item succesvol verwijderd", "mediaFailedToDelete": "Verwijderen van media-item mislukt", "rate": "Beoordelen" diff --git a/lib/i18n/strings_de.g.dart b/lib/i18n/strings_de.g.dart index e89a84e9..55049c72 100644 --- a/lib/i18n/strings_de.g.dart +++ b/lib/i18n/strings_de.g.dart @@ -407,8 +407,9 @@ class _TranslationsMediaMenuDe implements TranslationsMediaMenuEn { @override String get goToSeason => 'Zur Staffel'; @override String get shufflePlay => 'Zufallswiedergabe'; @override String get fileInfo => 'Dateiinfo'; - @override String get confirmDelete => 'Sind Sie sicher, dass Sie dieses Element aus Ihrem Dateisystem löschen möchten?'; - @override String get deleteMultipleWarning => 'Mehrere Elemente können gelöscht werden.'; + @override String get deleteFromServer => 'Vom Server löschen'; + @override String get confirmDelete => 'Dieses Medium und seine Dateien werden dauerhaft von Ihrem Server gelöscht. Dies kann nicht rückgängig gemacht werden.'; + @override String get deleteMultipleWarning => 'Dies umfasst alle Episoden und deren Dateien.'; @override String get mediaDeletedSuccessfully => 'Medienelement erfolgreich gelöscht'; @override String get mediaFailedToDelete => 'Löschen des Medienelements fehlgeschlagen'; @override String get rate => 'Bewerten'; @@ -1545,8 +1546,9 @@ extension on TranslationsDe { 'mediaMenu.goToSeason' => 'Zur Staffel', 'mediaMenu.shufflePlay' => 'Zufallswiedergabe', 'mediaMenu.fileInfo' => 'Dateiinfo', - 'mediaMenu.confirmDelete' => 'Sind Sie sicher, dass Sie dieses Element aus Ihrem Dateisystem löschen möchten?', - 'mediaMenu.deleteMultipleWarning' => 'Mehrere Elemente können gelöscht werden.', + 'mediaMenu.deleteFromServer' => 'Vom Server löschen', + 'mediaMenu.confirmDelete' => 'Dieses Medium und seine Dateien werden dauerhaft von Ihrem Server gelöscht. Dies kann nicht rückgängig gemacht werden.', + 'mediaMenu.deleteMultipleWarning' => 'Dies umfasst alle Episoden und deren Dateien.', 'mediaMenu.mediaDeletedSuccessfully' => 'Medienelement erfolgreich gelöscht', 'mediaMenu.mediaFailedToDelete' => 'Löschen des Medienelements fehlgeschlagen', 'mediaMenu.rate' => 'Bewerten', diff --git a/lib/i18n/strings_en.g.dart b/lib/i18n/strings_en.g.dart index 285c991e..09a1d73d 100644 --- a/lib/i18n/strings_en.g.dart +++ b/lib/i18n/strings_en.g.dart @@ -876,11 +876,14 @@ class TranslationsMediaMenuEn { /// en: 'File Info' String get fileInfo => 'File Info'; - /// en: 'Are you sure you want to delete this item from your filesystem?' - String get confirmDelete => 'Are you sure you want to delete this item from your filesystem?'; + /// en: 'Delete from server' + String get deleteFromServer => 'Delete from server'; - /// en: 'Multiple items may be deleted.' - String get deleteMultipleWarning => 'Multiple items may be deleted.'; + /// en: 'This will permanently delete this media and its files from your server. This cannot be undone.' + String get confirmDelete => 'This will permanently delete this media and its files from your server. This cannot be undone.'; + + /// en: 'This includes all episodes and their files.' + String get deleteMultipleWarning => 'This includes all episodes and their files.'; /// en: 'Media item deleted successfully' String get mediaDeletedSuccessfully => 'Media item deleted successfully'; @@ -3147,8 +3150,9 @@ extension on Translations { 'mediaMenu.goToSeason' => 'Go to season', 'mediaMenu.shufflePlay' => 'Shuffle Play', 'mediaMenu.fileInfo' => 'File Info', - 'mediaMenu.confirmDelete' => 'Are you sure you want to delete this item from your filesystem?', - 'mediaMenu.deleteMultipleWarning' => 'Multiple items may be deleted.', + 'mediaMenu.deleteFromServer' => 'Delete from server', + 'mediaMenu.confirmDelete' => 'This will permanently delete this media and its files from your server. This cannot be undone.', + 'mediaMenu.deleteMultipleWarning' => 'This includes all episodes and their files.', 'mediaMenu.mediaDeletedSuccessfully' => 'Media item deleted successfully', 'mediaMenu.mediaFailedToDelete' => 'Failed to delete media item', 'mediaMenu.rate' => 'Rate', diff --git a/lib/i18n/strings_es.g.dart b/lib/i18n/strings_es.g.dart index 2b36a0dd..4824a5ea 100644 --- a/lib/i18n/strings_es.g.dart +++ b/lib/i18n/strings_es.g.dart @@ -407,8 +407,9 @@ class _TranslationsMediaMenuEs implements TranslationsMediaMenuEn { @override String get goToSeason => 'Ir a la temporada'; @override String get shufflePlay => 'Reproducción Aleatoria'; @override String get fileInfo => 'Información del Archivo'; - @override String get confirmDelete => '¿Estás seguro de que quieres eliminar este elemento de tu sistema de archivos?'; - @override String get deleteMultipleWarning => 'Es posible que se eliminen varios elementos.'; + @override String get deleteFromServer => 'Eliminar del servidor'; + @override String get confirmDelete => 'Esto eliminará permanentemente este contenido y sus archivos de tu servidor. Esta acción no se puede deshacer.'; + @override String get deleteMultipleWarning => 'Esto incluye todos los episodios y sus archivos.'; @override String get mediaDeletedSuccessfully => 'Elemento multimedia eliminado con éxito'; @override String get mediaFailedToDelete => 'Error al eliminar el elemento multimedia'; @override String get rate => 'Calificar'; @@ -1545,8 +1546,9 @@ extension on TranslationsEs { 'mediaMenu.goToSeason' => 'Ir a la temporada', 'mediaMenu.shufflePlay' => 'Reproducción Aleatoria', 'mediaMenu.fileInfo' => 'Información del Archivo', - 'mediaMenu.confirmDelete' => '¿Estás seguro de que quieres eliminar este elemento de tu sistema de archivos?', - 'mediaMenu.deleteMultipleWarning' => 'Es posible que se eliminen varios elementos.', + 'mediaMenu.deleteFromServer' => 'Eliminar del servidor', + 'mediaMenu.confirmDelete' => 'Esto eliminará permanentemente este contenido y sus archivos de tu servidor. Esta acción no se puede deshacer.', + 'mediaMenu.deleteMultipleWarning' => 'Esto incluye todos los episodios y sus archivos.', 'mediaMenu.mediaDeletedSuccessfully' => 'Elemento multimedia eliminado con éxito', 'mediaMenu.mediaFailedToDelete' => 'Error al eliminar el elemento multimedia', 'mediaMenu.rate' => 'Calificar', diff --git a/lib/i18n/strings_fr.g.dart b/lib/i18n/strings_fr.g.dart index 79dac6a8..45e2a918 100644 --- a/lib/i18n/strings_fr.g.dart +++ b/lib/i18n/strings_fr.g.dart @@ -407,8 +407,9 @@ class _TranslationsMediaMenuFr implements TranslationsMediaMenuEn { @override String get goToSeason => 'Aller à la saison'; @override String get shufflePlay => 'Lecture aléatoire'; @override String get fileInfo => 'Informations sur le fichier'; - @override String get confirmDelete => 'Êtes-vous sûr de vouloir supprimer cet élément de votre système de fichiers?'; - @override String get deleteMultipleWarning => 'Plusieurs éléments peuvent être supprimés.'; + @override String get deleteFromServer => 'Supprimer du serveur'; + @override String get confirmDelete => 'Cela supprimera définitivement ce média et ses fichiers de votre serveur. Cette action est irréversible.'; + @override String get deleteMultipleWarning => 'Cela inclut tous les épisodes et leurs fichiers.'; @override String get mediaDeletedSuccessfully => 'Élément média supprimé avec succès'; @override String get mediaFailedToDelete => 'Échec de la suppression de l\'élément média'; @override String get rate => 'Noter'; @@ -1545,8 +1546,9 @@ extension on TranslationsFr { 'mediaMenu.goToSeason' => 'Aller à la saison', 'mediaMenu.shufflePlay' => 'Lecture aléatoire', 'mediaMenu.fileInfo' => 'Informations sur le fichier', - 'mediaMenu.confirmDelete' => 'Êtes-vous sûr de vouloir supprimer cet élément de votre système de fichiers?', - 'mediaMenu.deleteMultipleWarning' => 'Plusieurs éléments peuvent être supprimés.', + 'mediaMenu.deleteFromServer' => 'Supprimer du serveur', + 'mediaMenu.confirmDelete' => 'Cela supprimera définitivement ce média et ses fichiers de votre serveur. Cette action est irréversible.', + 'mediaMenu.deleteMultipleWarning' => 'Cela inclut tous les épisodes et leurs fichiers.', 'mediaMenu.mediaDeletedSuccessfully' => 'Élément média supprimé avec succès', 'mediaMenu.mediaFailedToDelete' => 'Échec de la suppression de l\'élément média', 'mediaMenu.rate' => 'Noter', diff --git a/lib/i18n/strings_it.g.dart b/lib/i18n/strings_it.g.dart index 96039f0c..d49f792c 100644 --- a/lib/i18n/strings_it.g.dart +++ b/lib/i18n/strings_it.g.dart @@ -407,8 +407,9 @@ class _TranslationsMediaMenuIt implements TranslationsMediaMenuEn { @override String get goToSeason => 'Vai alla stagione'; @override String get shufflePlay => 'Riproduzione casuale'; @override String get fileInfo => 'Info sul file'; - @override String get confirmDelete => 'Sei sicuro di voler eliminare questo elemento dal tuo filesystem?'; - @override String get deleteMultipleWarning => 'Potrebbero essere eliminati più elementi.'; + @override String get deleteFromServer => 'Elimina dal server'; + @override String get confirmDelete => 'Questo eliminerà permanentemente questo contenuto e i suoi file dal tuo server. Questa azione non può essere annullata.'; + @override String get deleteMultipleWarning => 'Questo include tutti gli episodi e i loro file.'; @override String get mediaDeletedSuccessfully => 'Elemento multimediale eliminato con successo'; @override String get mediaFailedToDelete => 'Impossibile eliminare l\'elemento multimediale'; @override String get rate => 'Valuta'; @@ -1545,8 +1546,9 @@ extension on TranslationsIt { 'mediaMenu.goToSeason' => 'Vai alla stagione', 'mediaMenu.shufflePlay' => 'Riproduzione casuale', 'mediaMenu.fileInfo' => 'Info sul file', - 'mediaMenu.confirmDelete' => 'Sei sicuro di voler eliminare questo elemento dal tuo filesystem?', - 'mediaMenu.deleteMultipleWarning' => 'Potrebbero essere eliminati più elementi.', + 'mediaMenu.deleteFromServer' => 'Elimina dal server', + 'mediaMenu.confirmDelete' => 'Questo eliminerà permanentemente questo contenuto e i suoi file dal tuo server. Questa azione non può essere annullata.', + 'mediaMenu.deleteMultipleWarning' => 'Questo include tutti gli episodi e i loro file.', 'mediaMenu.mediaDeletedSuccessfully' => 'Elemento multimediale eliminato con successo', 'mediaMenu.mediaFailedToDelete' => 'Impossibile eliminare l\'elemento multimediale', 'mediaMenu.rate' => 'Valuta', diff --git a/lib/i18n/strings_ko.g.dart b/lib/i18n/strings_ko.g.dart index 891b5017..24936b1e 100644 --- a/lib/i18n/strings_ko.g.dart +++ b/lib/i18n/strings_ko.g.dart @@ -407,8 +407,9 @@ class _TranslationsMediaMenuKo implements TranslationsMediaMenuEn { @override String get goToSeason => '시즌으로 이동'; @override String get shufflePlay => '무작위 재생'; @override String get fileInfo => '파일 정보'; - @override String get confirmDelete => '파일 시스템에서 이 항목을 삭제하시겠습니까?'; - @override String get deleteMultipleWarning => '여러 항목이 삭제될 수 있습니다.'; + @override String get deleteFromServer => '서버에서 삭제'; + @override String get confirmDelete => '이 미디어와 파일이 서버에서 영구적으로 삭제됩니다. 이 작업은 취소할 수 없습니다.'; + @override String get deleteMultipleWarning => '모든 에피소드와 파일이 포함됩니다.'; @override String get mediaDeletedSuccessfully => '미디어 항목이 성공적으로 삭제되었습니다'; @override String get mediaFailedToDelete => '미디어 항목 삭제 실패'; @override String get rate => '평가'; @@ -1545,8 +1546,9 @@ extension on TranslationsKo { 'mediaMenu.goToSeason' => '시즌으로 이동', 'mediaMenu.shufflePlay' => '무작위 재생', 'mediaMenu.fileInfo' => '파일 정보', - 'mediaMenu.confirmDelete' => '파일 시스템에서 이 항목을 삭제하시겠습니까?', - 'mediaMenu.deleteMultipleWarning' => '여러 항목이 삭제될 수 있습니다.', + 'mediaMenu.deleteFromServer' => '서버에서 삭제', + 'mediaMenu.confirmDelete' => '이 미디어와 파일이 서버에서 영구적으로 삭제됩니다. 이 작업은 취소할 수 없습니다.', + 'mediaMenu.deleteMultipleWarning' => '모든 에피소드와 파일이 포함됩니다.', 'mediaMenu.mediaDeletedSuccessfully' => '미디어 항목이 성공적으로 삭제되었습니다', 'mediaMenu.mediaFailedToDelete' => '미디어 항목 삭제 실패', 'mediaMenu.rate' => '평가', diff --git a/lib/i18n/strings_nl.g.dart b/lib/i18n/strings_nl.g.dart index fc2ca405..d56dd4b5 100644 --- a/lib/i18n/strings_nl.g.dart +++ b/lib/i18n/strings_nl.g.dart @@ -407,8 +407,9 @@ class _TranslationsMediaMenuNl implements TranslationsMediaMenuEn { @override String get goToSeason => 'Ga naar seizoen'; @override String get shufflePlay => 'Willekeurig afspelen'; @override String get fileInfo => 'Bestand info'; - @override String get confirmDelete => 'Weet je zeker dat je dit item van je bestandssysteem wilt verwijderen?'; - @override String get deleteMultipleWarning => 'Meerdere items kunnen worden verwijderd.'; + @override String get deleteFromServer => 'Verwijderen van server'; + @override String get confirmDelete => 'Dit zal deze media en de bijbehorende bestanden permanent van je server verwijderen. Dit kan niet ongedaan worden gemaakt.'; + @override String get deleteMultipleWarning => 'Dit omvat alle afleveringen en hun bestanden.'; @override String get mediaDeletedSuccessfully => 'Media-item succesvol verwijderd'; @override String get mediaFailedToDelete => 'Verwijderen van media-item mislukt'; @override String get rate => 'Beoordelen'; @@ -1545,8 +1546,9 @@ extension on TranslationsNl { 'mediaMenu.goToSeason' => 'Ga naar seizoen', 'mediaMenu.shufflePlay' => 'Willekeurig afspelen', 'mediaMenu.fileInfo' => 'Bestand info', - 'mediaMenu.confirmDelete' => 'Weet je zeker dat je dit item van je bestandssysteem wilt verwijderen?', - 'mediaMenu.deleteMultipleWarning' => 'Meerdere items kunnen worden verwijderd.', + 'mediaMenu.deleteFromServer' => 'Verwijderen van server', + 'mediaMenu.confirmDelete' => 'Dit zal deze media en de bijbehorende bestanden permanent van je server verwijderen. Dit kan niet ongedaan worden gemaakt.', + 'mediaMenu.deleteMultipleWarning' => 'Dit omvat alle afleveringen en hun bestanden.', 'mediaMenu.mediaDeletedSuccessfully' => 'Media-item succesvol verwijderd', 'mediaMenu.mediaFailedToDelete' => 'Verwijderen van media-item mislukt', 'mediaMenu.rate' => 'Beoordelen', diff --git a/lib/i18n/strings_sv.g.dart b/lib/i18n/strings_sv.g.dart index 735b8ab4..8c1d34c5 100644 --- a/lib/i18n/strings_sv.g.dart +++ b/lib/i18n/strings_sv.g.dart @@ -407,8 +407,9 @@ class _TranslationsMediaMenuSv implements TranslationsMediaMenuEn { @override String get goToSeason => 'Gå till säsong'; @override String get shufflePlay => 'Blanda uppspelning'; @override String get fileInfo => 'Filinformation'; - @override String get confirmDelete => 'Är du säker på att du vill ta bort detta objekt från ditt filsystem?'; - @override String get deleteMultipleWarning => 'Flera objekt kan komma att tas bort.'; + @override String get deleteFromServer => 'Ta bort från servern'; + @override String get confirmDelete => 'Detta kommer permanent ta bort detta media och dess filer från din server. Detta kan inte ångras.'; + @override String get deleteMultipleWarning => 'Detta inkluderar alla avsnitt och deras filer.'; @override String get mediaDeletedSuccessfully => 'Mediaobjekt borttaget'; @override String get mediaFailedToDelete => 'Kunde inte ta bort mediaobjekt'; @override String get rate => 'Betygsätt'; @@ -1545,8 +1546,9 @@ extension on TranslationsSv { 'mediaMenu.goToSeason' => 'Gå till säsong', 'mediaMenu.shufflePlay' => 'Blanda uppspelning', 'mediaMenu.fileInfo' => 'Filinformation', - 'mediaMenu.confirmDelete' => 'Är du säker på att du vill ta bort detta objekt från ditt filsystem?', - 'mediaMenu.deleteMultipleWarning' => 'Flera objekt kan komma att tas bort.', + 'mediaMenu.deleteFromServer' => 'Ta bort från servern', + 'mediaMenu.confirmDelete' => 'Detta kommer permanent ta bort detta media och dess filer från din server. Detta kan inte ångras.', + 'mediaMenu.deleteMultipleWarning' => 'Detta inkluderar alla avsnitt och deras filer.', 'mediaMenu.mediaDeletedSuccessfully' => 'Mediaobjekt borttaget', 'mediaMenu.mediaFailedToDelete' => 'Kunde inte ta bort mediaobjekt', 'mediaMenu.rate' => 'Betygsätt', diff --git a/lib/i18n/strings_zh.g.dart b/lib/i18n/strings_zh.g.dart index 013cfa06..a877e844 100644 --- a/lib/i18n/strings_zh.g.dart +++ b/lib/i18n/strings_zh.g.dart @@ -407,8 +407,9 @@ class _TranslationsMediaMenuZh implements TranslationsMediaMenuEn { @override String get goToSeason => '转到季'; @override String get shufflePlay => '随机播放'; @override String get fileInfo => '文件信息'; - @override String get confirmDelete => '确定要从文件系统中删除此项吗?'; - @override String get deleteMultipleWarning => '可能会删除多个项目。'; + @override String get deleteFromServer => '从服务器删除'; + @override String get confirmDelete => '这将永久删除此媒体及其文件。此操作无法撤销。'; + @override String get deleteMultipleWarning => '这包括所有剧集及其文件。'; @override String get mediaDeletedSuccessfully => '媒体项已成功删除'; @override String get mediaFailedToDelete => '删除媒体项失败'; @override String get rate => '评分'; @@ -1545,8 +1546,9 @@ extension on TranslationsZh { 'mediaMenu.goToSeason' => '转到季', 'mediaMenu.shufflePlay' => '随机播放', 'mediaMenu.fileInfo' => '文件信息', - 'mediaMenu.confirmDelete' => '确定要从文件系统中删除此项吗?', - 'mediaMenu.deleteMultipleWarning' => '可能会删除多个项目。', + 'mediaMenu.deleteFromServer' => '从服务器删除', + 'mediaMenu.confirmDelete' => '这将永久删除此媒体及其文件。此操作无法撤销。', + 'mediaMenu.deleteMultipleWarning' => '这包括所有剧集及其文件。', 'mediaMenu.mediaDeletedSuccessfully' => '媒体项已成功删除', 'mediaMenu.mediaFailedToDelete' => '删除媒体项失败', 'mediaMenu.rate' => '评分', diff --git a/lib/i18n/sv.i18n.json b/lib/i18n/sv.i18n.json index 9a0761e9..c66ac4d8 100644 --- a/lib/i18n/sv.i18n.json +++ b/lib/i18n/sv.i18n.json @@ -273,8 +273,9 @@ "goToSeason": "Gå till säsong", "shufflePlay": "Blanda uppspelning", "fileInfo": "Filinformation", - "confirmDelete": "Är du säker på att du vill ta bort detta objekt från ditt filsystem?", - "deleteMultipleWarning": "Flera objekt kan komma att tas bort.", + "deleteFromServer": "Ta bort från servern", + "confirmDelete": "Detta kommer permanent ta bort detta media och dess filer från din server. Detta kan inte ångras.", + "deleteMultipleWarning": "Detta inkluderar alla avsnitt och deras filer.", "mediaDeletedSuccessfully": "Mediaobjekt borttaget", "mediaFailedToDelete": "Kunde inte ta bort mediaobjekt", "rate": "Betygsätt" diff --git a/lib/i18n/zh.i18n.json b/lib/i18n/zh.i18n.json index 5b08f62c..3349eb43 100644 --- a/lib/i18n/zh.i18n.json +++ b/lib/i18n/zh.i18n.json @@ -273,8 +273,9 @@ "goToSeason": "转到季", "shufflePlay": "随机播放", "fileInfo": "文件信息", - "confirmDelete": "确定要从文件系统中删除此项吗?", - "deleteMultipleWarning": "可能会删除多个项目。", + "deleteFromServer": "从服务器删除", + "confirmDelete": "这将永久删除此媒体及其文件。此操作无法撤销。", + "deleteMultipleWarning": "这包括所有剧集及其文件。", "mediaDeletedSuccessfully": "媒体项已成功删除", "mediaFailedToDelete": "删除媒体项失败", "rate": "评分" diff --git a/lib/utils/dialogs.dart b/lib/utils/dialogs.dart index 02bb4efc..fc6a6205 100644 --- a/lib/utils/dialogs.dart +++ b/lib/utils/dialogs.dart @@ -115,8 +115,8 @@ Future<({bool confirmed, bool checked})> showConfirmDialogWithCheckbox( /// Shows a delete confirmation dialog. /// Convenience wrapper around [showConfirmDialog] with destructive styling. -Future showDeleteConfirmation(BuildContext context, {required String title, required String message}) { - return showConfirmDialog(context, title: title, message: message, confirmText: t.common.delete, isDestructive: true); +Future showDeleteConfirmation(BuildContext context, {required String title, required String message, String? confirmText}) { + return showConfirmDialog(context, title: title, message: message, confirmText: confirmText ?? t.common.delete, isDestructive: true); } /// Shows a text input dialog for creating/naming items diff --git a/lib/widgets/focusable_list_tile.dart b/lib/widgets/focusable_list_tile.dart index d0228570..985b675a 100644 --- a/lib/widgets/focusable_list_tile.dart +++ b/lib/widgets/focusable_list_tile.dart @@ -48,6 +48,12 @@ class FocusableListTile extends StatefulWidget { /// An optional color to display behind the menu item when being hovered. final Color? hoverColor; + /// An optional color for the text of the list tile. + final Color? textColor; + + /// An optional color for the icon of the list tile. + final Color? iconColor; + const FocusableListTile({ super.key, this.title, @@ -64,6 +70,8 @@ class FocusableListTile extends StatefulWidget { this.contentPadding, this.suppressInitialSelect = false, this.hoverColor, + this.textColor, + this.iconColor, }); @override @@ -89,6 +97,8 @@ class _FocusableListTileState extends State { focusNode: widget.suppressInitialSelect ? null : widget.focusNode, autofocus: widget.suppressInitialSelect ? false : widget.autofocus, hoverColor: widget.hoverColor, + textColor: widget.textColor, + iconColor: widget.iconColor, ); if (!widget.suppressInitialSelect) { diff --git a/lib/widgets/media_context_menu.dart b/lib/widgets/media_context_menu.dart index be75d9e2..3077bc43 100644 --- a/lib/widgets/media_context_menu.dart +++ b/lib/widgets/media_context_menu.dart @@ -37,8 +37,9 @@ class _MenuAction { final IconData icon; final String label; final Color? hoverColor; + final Color? foregroundColor; - _MenuAction({required this.value, required this.icon, required this.label, this.hoverColor}); + _MenuAction({required this.value, required this.icon, required this.label, this.hoverColor, this.foregroundColor}); } /// A reusable wrapper widget that adds a context menu (long press / right click) @@ -284,9 +285,10 @@ class MediaContextMenuState extends State { menuActions.add( _MenuAction( value: 'delete_media', - icon: Symbols.delete_rounded, - label: t.common.delete, + icon: Symbols.delete_forever_rounded, + label: t.mediaMenu.deleteFromServer, hoverColor: Theme.of(context).colorScheme.error, + foregroundColor: Theme.of(context).colorScheme.error, ), ); } @@ -1137,8 +1139,9 @@ class MediaContextMenuState extends State { // Show confirmation dialog final confirmed = await showDeleteConfirmation( context, - title: t.common.delete, - message: "${t.mediaMenu.confirmDelete}${isMultipleMediaItems ? "\n${t.mediaMenu.deleteMultipleWarning}" : ""}", + title: t.mediaMenu.deleteFromServer, + message: "${t.mediaMenu.confirmDelete}${isMultipleMediaItems ? "\n\n${t.mediaMenu.deleteMultipleWarning}" : ""}", + confirmText: t.mediaMenu.deleteFromServer, ); if (!confirmed || !context.mounted) return; @@ -1330,6 +1333,8 @@ class _FocusableContextMenuSheetState extends State<_FocusableContextMenuSheet> title: Text(action.label), onTap: () => OverlaySheetController.closeAdaptive(context, action.value), hoverColor: action.hoverColor, + textColor: action.foregroundColor, + iconColor: action.foregroundColor, ); }), ], @@ -1435,6 +1440,8 @@ class _FocusablePopupMenuState extends State<_FocusablePopupMenu> { title: Text(action.label), onTap: () => Navigator.pop(context, action.value), hoverColor: action.hoverColor, + textColor: action.foregroundColor, + iconColor: action.foregroundColor, ); }).toList(), ),