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
This commit is contained in:
edde746
2026-02-27 14:49:47 +01:00
parent b549432250
commit 9e0c3e7b68
21 changed files with 109 additions and 63 deletions
+3 -2
View File
@@ -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"
+3 -2
View File
@@ -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"
+3 -2
View File
@@ -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"
+3 -2
View File
@@ -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"
+3 -2
View File
@@ -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"
+3 -2
View File
@@ -273,8 +273,9 @@
"goToSeason": "시즌으로 이동",
"shufflePlay": "무작위 재생",
"fileInfo": "파일 정보",
"confirmDelete": "파일 시스템에서 이 항목을 삭제하시겠습니까?",
"deleteMultipleWarning": "여러 항목이 삭제될습니다.",
"deleteFromServer": "서버에서 삭제",
"confirmDelete": "이 미디어와 파일이 서버에서 영구적으로 삭제됩니다. 이 작업은 취소할습니다.",
"deleteMultipleWarning": "모든 에피소드와 파일이 포함됩니다.",
"mediaDeletedSuccessfully": "미디어 항목이 성공적으로 삭제되었습니다",
"mediaFailedToDelete": "미디어 항목 삭제 실패",
"rate": "평가"
+3 -2
View File
@@ -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"
+6 -4
View File
@@ -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',
+10 -6
View File
@@ -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',
+6 -4
View File
@@ -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',
+6 -4
View File
@@ -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',
+6 -4
View File
@@ -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',
+6 -4
View File
@@ -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' => '평가',
+6 -4
View File
@@ -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',
+6 -4
View File
@@ -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',
+6 -4
View File
@@ -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' => '评分',
+3 -2
View File
@@ -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"
+3 -2
View File
@@ -273,8 +273,9 @@
"goToSeason": "转到季",
"shufflePlay": "随机播放",
"fileInfo": "文件信息",
"confirmDelete": "确定要从文件系统中删除此项吗?",
"deleteMultipleWarning": "可能会删除多个项目。",
"deleteFromServer": "从服务器删除",
"confirmDelete": "这将永久删除此媒体及其文件。此操作无法撤销。",
"deleteMultipleWarning": "这包括所有剧集及其文件。",
"mediaDeletedSuccessfully": "媒体项已成功删除",
"mediaFailedToDelete": "删除媒体项失败",
"rate": "评分"
+2 -2
View File
@@ -115,8 +115,8 @@ Future<({bool confirmed, bool checked})> showConfirmDialogWithCheckbox(
/// Shows a delete confirmation dialog.
/// Convenience wrapper around [showConfirmDialog] with destructive styling.
Future<bool> showDeleteConfirmation(BuildContext context, {required String title, required String message}) {
return showConfirmDialog(context, title: title, message: message, confirmText: t.common.delete, isDestructive: true);
Future<bool> 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
+10
View File
@@ -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<FocusableListTile> {
focusNode: widget.suppressInitialSelect ? null : widget.focusNode,
autofocus: widget.suppressInitialSelect ? false : widget.autofocus,
hoverColor: widget.hoverColor,
textColor: widget.textColor,
iconColor: widget.iconColor,
);
if (!widget.suppressInitialSelect) {
+12 -5
View File
@@ -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<MediaContextMenu> {
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<MediaContextMenu> {
// 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(),
),