mirror of
https://github.com/kodjodevf/mangayomi.git
synced 2026-04-20 23:22:07 +00:00
Merge pull request #512 from NBA2K1/Fix-manga-delete
Fix delete "Downloaded episodes/chapters"
This commit is contained in:
commit
b14e198c54
29 changed files with 726 additions and 107 deletions
|
|
@ -17,6 +17,17 @@
|
|||
"alphabetically": "أبجدياً",
|
||||
"last_read": "آخر قراءة",
|
||||
"last_update_check": "آخر فحص للتحديثات",
|
||||
"last_entry_delete_warning": "{count, plural, =1{أنت بتحذف الـ{entryType} الوحيد من هذا الـ{mediaType} من المكتبة.} other{أنت بتحذف كل الـ{count} {entryTypePlural} من هذا الـ{mediaType} من المكتبة.}}\nهذا كمان هيشيل الـ{mediaType} بالكامل من مكتبتك.\n\nملاحظة: الملفات نفسها مش هتتحذف.",
|
||||
"@last_entry_delete_warning": {
|
||||
"placeholders": {
|
||||
"count": {},
|
||||
"entryType": {},
|
||||
"entryTypePlural": {},
|
||||
"mediaType": {}
|
||||
}
|
||||
},
|
||||
"chapter": "فصل",
|
||||
"episode": "حلقة",
|
||||
"unread_count": "عدد غير المقروء",
|
||||
"latest_chapter": "أحدث فصل",
|
||||
"date_added": "تاريخ الإضافة",
|
||||
|
|
|
|||
|
|
@ -19,6 +19,17 @@
|
|||
"last_read": "Zuletzt gelesen",
|
||||
"last_watched": "Zuletzt angeschaut",
|
||||
"last_update_check": "Letzte Aktualisierungsprüfung",
|
||||
"last_entry_delete_warning": "{count, plural, =1{Du löschst das einzige {entryType} dieses {mediaType}s aus deiner Bibliothek.} other{Du löschst alle {count} {entryTypePlural} dieses {mediaType}s aus deiner Bibliothek.}}\nDadurch wird auch der ganze {mediaType} aus deiner Bibliothek entfernt.\n\nHinweis: Die Dateien selbst werden nicht gelöscht.",
|
||||
"@last_entry_delete_warning": {
|
||||
"placeholders": {
|
||||
"count": {},
|
||||
"entryType": {},
|
||||
"entryTypePlural": {},
|
||||
"mediaType": {}
|
||||
}
|
||||
},
|
||||
"chapter": "Kapitel",
|
||||
"episode": "Episode",
|
||||
"unread_count": "Ungelesene Anzahl",
|
||||
"unwatched_count": "Ungesehene Anzahl",
|
||||
"latest_chapter": "Letztes Kapitel",
|
||||
|
|
|
|||
|
|
@ -19,6 +19,18 @@
|
|||
"last_read": "Last read",
|
||||
"last_watched": "Last watched",
|
||||
"last_update_check": "Last update check",
|
||||
"last_entry_delete_warning": "{count, plural, =1{You are deleting the only {entryType} of this {mediaType} from the library.} other{You are deleting all {count} {entryTypePlural} of this {mediaType} from the library.}}\nThis will also remove the whole {mediaType} from your library.\n\nNote: The files themselves will not be deleted.",
|
||||
"@last_entry_delete_warning": {
|
||||
"description": "Warning when deleting all entries (chapters/episodes) of a manga/anime.",
|
||||
"placeholders": {
|
||||
"count": {},
|
||||
"entryType": {},
|
||||
"entryTypePlural": {},
|
||||
"mediaType": {}
|
||||
}
|
||||
},
|
||||
"chapter": "chapter",
|
||||
"episode": "episode",
|
||||
"unread_count": "Unread count",
|
||||
"unwatched_count": "Unwatched count",
|
||||
"latest_chapter": "Latest chapter",
|
||||
|
|
|
|||
|
|
@ -17,6 +17,17 @@
|
|||
"alphabetically": "Alfabéticamente",
|
||||
"last_read": "Última lectura",
|
||||
"last_update_check": "Última verificación de actualización",
|
||||
"last_entry_delete_warning": "{count, plural, =1{Estás borrando el único {entryType} de este {mediaType} de tu biblioteca.} other{Estás borrando los {count} {entryTypePlural} de este {mediaType} de tu biblioteca.}}\nEsto también quitará todo el {mediaType} de tu biblioteca.\n\nNota: Los archivos en sí no se borrarán.",
|
||||
"@last_entry_delete_warning": {
|
||||
"placeholders": {
|
||||
"count": {},
|
||||
"entryType": {},
|
||||
"entryTypePlural": {},
|
||||
"mediaType": {}
|
||||
}
|
||||
},
|
||||
"chapter": "capítulo",
|
||||
"episode": "episodio",
|
||||
"unread_count": "Cuenta de no leídos",
|
||||
"latest_chapter": "Último capítulo",
|
||||
"date_added": "Fecha añadida",
|
||||
|
|
|
|||
|
|
@ -17,6 +17,17 @@
|
|||
"alphabetically": "Alfabéticamente",
|
||||
"last_read": "Última lectura",
|
||||
"last_update_check": "Última verificación de actualización",
|
||||
"last_entry_delete_warning": "{count, plural, =1{Estás borrando el único {entryType} de este {mediaType} de tu biblioteca.} other{Estás borrando los {count} {entryTypePlural} de este {mediaType} de tu biblioteca.}}\nEsto también quitará todo el {mediaType} de tu biblioteca.\n\nNota: Los archivos en sí no se borrarán.",
|
||||
"@last_entry_delete_warning": {
|
||||
"placeholders": {
|
||||
"count": {},
|
||||
"entryType": {},
|
||||
"entryTypePlural": {},
|
||||
"mediaType": {}
|
||||
}
|
||||
},
|
||||
"chapter": "capítulo",
|
||||
"episode": "episodio",
|
||||
"unread_count": "Cuenta de no leídos",
|
||||
"latest_chapter": "Último capítulo",
|
||||
"date_added": "Fecha añadida",
|
||||
|
|
|
|||
|
|
@ -17,6 +17,17 @@
|
|||
"alphabetically": "Alphabétiquement",
|
||||
"last_read": "Dernier lu",
|
||||
"last_update_check": "Dernière mise à jour",
|
||||
"last_entry_delete_warning": "{count, plural, =1{Tu es en train de supprimer le seul {entryType} de ce {mediaType} de ta bibliothèque.} other{Tu es en train de supprimer les {count} {entryTypePlural} de ce {mediaType} de ta bibliothèque.}}\nÇa va aussi supprimer tout le {mediaType} de ta bibliothèque.\n\nNote : Les fichiers ne seront pas supprimés.",
|
||||
"@last_entry_delete_warning": {
|
||||
"placeholders": {
|
||||
"count": {},
|
||||
"entryType": {},
|
||||
"entryTypePlural": {},
|
||||
"mediaType": {}
|
||||
}
|
||||
},
|
||||
"chapter": "chapitre",
|
||||
"episode": "épisode",
|
||||
"unread_count": "Nombre de non-lus",
|
||||
"latest_chapter": "Dernier chapitre",
|
||||
"date_added": "Date ajoutée",
|
||||
|
|
|
|||
|
|
@ -17,6 +17,17 @@
|
|||
"alphabetically": "Secara Abjad",
|
||||
"last_read": "Bacaan Terakhir",
|
||||
"last_update_check": "Pemeriksaan Pembaruan Terakhir",
|
||||
"last_entry_delete_warning": "{count, plural, =1{Kamu sedang menghapus satu-satunya {entryType} dari {mediaType} ini di perpustakaan kamu.} other{Kamu sedang menghapus semua {count} {entryTypePlural} dari {mediaType} ini di perpustakaan kamu.}}\nIni juga akan menghapus seluruh {mediaType} dari perpustakaanmu.\n\nCatatan: File-nya sendiri tidak akan dihapus.",
|
||||
"@last_entry_delete_warning": {
|
||||
"placeholders": {
|
||||
"count": {},
|
||||
"entryType": {},
|
||||
"entryTypePlural": {},
|
||||
"mediaType": {}
|
||||
}
|
||||
},
|
||||
"chapter": "bab",
|
||||
"episode": "episode",
|
||||
"unread_count": "Jumlah Belum Dibaca",
|
||||
"latest_chapter": "Bab Terbaru",
|
||||
"date_added": "Tanggal Ditambahkan",
|
||||
|
|
|
|||
|
|
@ -17,6 +17,17 @@
|
|||
"alphabetically": "Alfabeticamente",
|
||||
"last_read": "Ultima lettura",
|
||||
"last_update_check": "Ultimo controllo aggiornamenti",
|
||||
"last_entry_delete_warning": "{count, plural, =1{Stai eliminando l’unico {entryType} di questo {mediaType} dalla tua libreria.} other{Stai eliminando tutti e {count} {entryTypePlural} di questo {mediaType} dalla tua libreria.}}\nQuesto rimuoverà anche tutto il {mediaType} dalla tua libreria.\n\nNota: I file non saranno eliminati.",
|
||||
"@last_entry_delete_warning": {
|
||||
"placeholders": {
|
||||
"count": {},
|
||||
"entryType": {},
|
||||
"entryTypePlural": {},
|
||||
"mediaType": {}
|
||||
}
|
||||
},
|
||||
"chapter": "capitolo",
|
||||
"episode": "episodio",
|
||||
"unread_count": "Conteggio non letti",
|
||||
"latest_chapter": "Ultimo capitolo",
|
||||
"date_added": "Data aggiunta",
|
||||
|
|
|
|||
|
|
@ -17,6 +17,17 @@
|
|||
"alphabetically": "Alfabeticamente",
|
||||
"last_read": "Última leitura",
|
||||
"last_update_check": "Última verificação de atualização",
|
||||
"last_entry_delete_warning": "{count, plural, =1{Estás a eliminar o único {entryType} deste {mediaType} da tua biblioteca.} other{Estás a eliminar todos os {count} {entryTypePlural} deste {mediaType} da tua biblioteca.}}\nIsto vai também remover todo o {mediaType} da tua biblioteca.\n\nNota: Os ficheiros em si não vão ser eliminados.",
|
||||
"@last_entry_delete_warning": {
|
||||
"placeholders": {
|
||||
"count": {},
|
||||
"entryType": {},
|
||||
"entryTypePlural": {},
|
||||
"mediaType": {}
|
||||
}
|
||||
},
|
||||
"chapter": "capítulo",
|
||||
"episode": "episódio",
|
||||
"unread_count": "Contagem de não lidos",
|
||||
"latest_chapter": "Último capítulo",
|
||||
"date_added": "Data de adição",
|
||||
|
|
|
|||
|
|
@ -17,6 +17,17 @@
|
|||
"alphabetically": "Alfabeticamente",
|
||||
"last_read": "Última leitura",
|
||||
"last_update_check": "Última verificação de atualização",
|
||||
"last_entry_delete_warning": "{count, plural, =1{Você está deletando o único {entryType} deste {mediaType} da sua biblioteca.} other{Você está deletando todos os {count} {entryTypePlural} deste {mediaType} da sua biblioteca.}}\nIsso também vai remover todo o {mediaType} da sua biblioteca.\n\nObs: Os arquivos em si não serão deletados.",
|
||||
"@last_entry_delete_warning": {
|
||||
"placeholders": {
|
||||
"count": {},
|
||||
"entryType": {},
|
||||
"entryTypePlural": {},
|
||||
"mediaType": {}
|
||||
}
|
||||
},
|
||||
"chapter": "capítulo",
|
||||
"episode": "episódio",
|
||||
"unread_count": "Contagem de não lidos",
|
||||
"latest_chapter": "Último capítulo",
|
||||
"date_added": "Data adicionada",
|
||||
|
|
|
|||
|
|
@ -17,6 +17,17 @@
|
|||
"alphabetically": "По алфавиту",
|
||||
"last_read": "Последнее чтение",
|
||||
"last_update_check": "Последняя проверка обновлений",
|
||||
"last_entry_delete_warning": "{count, plural, =1{Ты удаляешь единственный {entryType} этого {mediaType} из библиотеки.} other{Ты удаляешь все {count} {entryTypePlural} этого {mediaType} из библиотеки.}}\nЭто также удалит весь {mediaType} из твоей библиотеки.\n\nПримечание: Сами файлы удалены не будут.",
|
||||
"@last_entry_delete_warning": {
|
||||
"placeholders": {
|
||||
"count": {},
|
||||
"entryType": {},
|
||||
"entryTypePlural": {},
|
||||
"mediaType": {}
|
||||
}
|
||||
},
|
||||
"chapter": "глава",
|
||||
"episode": "эпизод",
|
||||
"unread_count": "Количество непрочитанных",
|
||||
"latest_chapter": "Последняя глава",
|
||||
"date_added": "Дата добавления",
|
||||
|
|
|
|||
|
|
@ -20,6 +20,17 @@
|
|||
"alphabetically": "ตามตัวอักษร",
|
||||
"last_read": "อ่านล่าสุด",
|
||||
"last_update_check": "ตรวจการอัพเดท",
|
||||
"last_entry_delete_warning": "{count, plural, =1{คุณกำลังลบ{entryType}เดียวของ{mediaType}นี้ออกจากคลังของคุณ} other{คุณกำลังลบทั้งหมด {count} {entryTypePlural}ของ{mediaType}นี้ออกจากคลังของคุณ}}\nสิ่งนี้จะลบ{mediaType}ทั้งหมดออกจากคลังของคุณด้วย\n\nหมายเหตุ: ไฟล์จะไม่ถูกลบ",
|
||||
"@last_entry_delete_warning": {
|
||||
"placeholders": {
|
||||
"count": {},
|
||||
"entryType": {},
|
||||
"entryTypePlural": {},
|
||||
"mediaType": {}
|
||||
}
|
||||
},
|
||||
"chapter": "บท",
|
||||
"episode": "ตอน",
|
||||
"unread_count": "ที่ยังไม่อ่าน",
|
||||
"latest_chapter": "ตอนล่าสุด",
|
||||
"date_added": "วันที่เพิ่ม",
|
||||
|
|
|
|||
|
|
@ -17,6 +17,17 @@
|
|||
"alphabetically": "Alfabetik Olarak",
|
||||
"last_read": "Son Okunan",
|
||||
"last_update_check": "Son Güncelleme Kontrolü",
|
||||
"last_entry_delete_warning": "{count, plural, =1{Kitaplığından bu {mediaType}’nin tek {entryType}’ünü siliyorsun.} other{Kitaplığından bu {mediaType}’nin tüm {count} {entryTypePlural}’ini siliyorsun.}}\nBu işlem {mediaType}’nin tamamını da kütüphanenden kaldıracak.\n\nNot: Dosyalar silinmeyecek.",
|
||||
"@last_entry_delete_warning": {
|
||||
"placeholders": {
|
||||
"count": {},
|
||||
"entryType": {},
|
||||
"entryTypePlural": {},
|
||||
"mediaType": {}
|
||||
}
|
||||
},
|
||||
"chapter": "bölüm",
|
||||
"episode": "bölüm",
|
||||
"unread_count": "Okunmamış Sayısı",
|
||||
"latest_chapter": "Son Bölüm",
|
||||
"date_added": "Eklenme Tarihi",
|
||||
|
|
|
|||
|
|
@ -20,6 +20,17 @@
|
|||
"alphabetically": "按字母顺序",
|
||||
"last_read": "最后阅读",
|
||||
"last_update_check": "最后更新检查",
|
||||
"last_entry_delete_warning": "{count, plural, =1{你正在从你的库中删除此{mediaType}的唯一{entryType}。} other{你正在从你的库中删除此{mediaType}的全部{count}{entryTypePlural}。}}\n这也会将整个{mediaType}从你的库中移除。\n\n注意:文件本身不会被删除。",
|
||||
"@last_entry_delete_warning": {
|
||||
"placeholders": {
|
||||
"count": {},
|
||||
"entryType": {},
|
||||
"entryTypePlural": {},
|
||||
"mediaType": {}
|
||||
}
|
||||
},
|
||||
"chapter": "章节",
|
||||
"episode": "剧集",
|
||||
"unread_count": "未读计数",
|
||||
"latest_chapter": "最新章节",
|
||||
"date_added": "添加日期",
|
||||
|
|
|
|||
|
|
@ -234,6 +234,29 @@ abstract class AppLocalizations {
|
|||
/// **'Last update check'**
|
||||
String get last_update_check;
|
||||
|
||||
/// Warning when deleting all entries (chapters/episodes) of a manga/anime.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'{count, plural, =1{You are deleting the only {entryType} of this {mediaType} from the library.} other{You are deleting all {count} {entryTypePlural} of this {mediaType} from the library.}}\nThis will also remove the whole {mediaType} from your library.\n\nNote: The files themselves will not be deleted.'**
|
||||
String last_entry_delete_warning(
|
||||
num count,
|
||||
Object entryType,
|
||||
Object entryTypePlural,
|
||||
Object mediaType,
|
||||
);
|
||||
|
||||
/// No description provided for @chapter.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'chapter'**
|
||||
String get chapter;
|
||||
|
||||
/// No description provided for @episode.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'episode'**
|
||||
String get episode;
|
||||
|
||||
/// No description provided for @unread_count.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
|
|
|
|||
|
|
@ -65,6 +65,29 @@ class AppLocalizationsAr extends AppLocalizations {
|
|||
@override
|
||||
String get last_update_check => 'آخر فحص للتحديثات';
|
||||
|
||||
@override
|
||||
String last_entry_delete_warning(
|
||||
num count,
|
||||
Object entryType,
|
||||
Object entryTypePlural,
|
||||
Object mediaType,
|
||||
) {
|
||||
String _temp0 = intl.Intl.pluralLogic(
|
||||
count,
|
||||
locale: localeName,
|
||||
other:
|
||||
'أنت بتحذف كل الـ$count $entryTypePlural من هذا الـ$mediaType من المكتبة.',
|
||||
one: 'أنت بتحذف الـ$entryType الوحيد من هذا الـ$mediaType من المكتبة.',
|
||||
);
|
||||
return '$_temp0\nهذا كمان هيشيل الـ$mediaType بالكامل من مكتبتك.\n\nملاحظة: الملفات نفسها مش هتتحذف.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get chapter => 'فصل';
|
||||
|
||||
@override
|
||||
String get episode => 'حلقة';
|
||||
|
||||
@override
|
||||
String get unread_count => 'عدد غير المقروء';
|
||||
|
||||
|
|
|
|||
|
|
@ -65,6 +65,30 @@ class AppLocalizationsDe extends AppLocalizations {
|
|||
@override
|
||||
String get last_update_check => 'Letzte Aktualisierungsprüfung';
|
||||
|
||||
@override
|
||||
String last_entry_delete_warning(
|
||||
num count,
|
||||
Object entryType,
|
||||
Object entryTypePlural,
|
||||
Object mediaType,
|
||||
) {
|
||||
String _temp0 = intl.Intl.pluralLogic(
|
||||
count,
|
||||
locale: localeName,
|
||||
other:
|
||||
'Du löschst alle $count $entryTypePlural dieses ${mediaType}s aus deiner Bibliothek.',
|
||||
one:
|
||||
'Du löschst das einzige $entryType dieses ${mediaType}s aus deiner Bibliothek.',
|
||||
);
|
||||
return '$_temp0\nDadurch wird auch der ganze $mediaType aus deiner Bibliothek entfernt.\n\nHinweis: Die Dateien selbst werden nicht gelöscht.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get chapter => 'Kapitel';
|
||||
|
||||
@override
|
||||
String get episode => 'Episode';
|
||||
|
||||
@override
|
||||
String get unread_count => 'Ungelesene Anzahl';
|
||||
|
||||
|
|
|
|||
|
|
@ -65,6 +65,30 @@ class AppLocalizationsEn extends AppLocalizations {
|
|||
@override
|
||||
String get last_update_check => 'Last update check';
|
||||
|
||||
@override
|
||||
String last_entry_delete_warning(
|
||||
num count,
|
||||
Object entryType,
|
||||
Object entryTypePlural,
|
||||
Object mediaType,
|
||||
) {
|
||||
String _temp0 = intl.Intl.pluralLogic(
|
||||
count,
|
||||
locale: localeName,
|
||||
other:
|
||||
'You are deleting all $count $entryTypePlural of this $mediaType from the library.',
|
||||
one:
|
||||
'You are deleting the only $entryType of this $mediaType from the library.',
|
||||
);
|
||||
return '$_temp0\nThis will also remove the whole $mediaType from your library.\n\nNote: The files themselves will not be deleted.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get chapter => 'chapter';
|
||||
|
||||
@override
|
||||
String get episode => 'episode';
|
||||
|
||||
@override
|
||||
String get unread_count => 'Unread count';
|
||||
|
||||
|
|
|
|||
|
|
@ -65,6 +65,30 @@ class AppLocalizationsEs extends AppLocalizations {
|
|||
@override
|
||||
String get last_update_check => 'Última verificación de actualización';
|
||||
|
||||
@override
|
||||
String last_entry_delete_warning(
|
||||
num count,
|
||||
Object entryType,
|
||||
Object entryTypePlural,
|
||||
Object mediaType,
|
||||
) {
|
||||
String _temp0 = intl.Intl.pluralLogic(
|
||||
count,
|
||||
locale: localeName,
|
||||
other:
|
||||
'Estás borrando los $count $entryTypePlural de este $mediaType de tu biblioteca.',
|
||||
one:
|
||||
'Estás borrando el único $entryType de este $mediaType de tu biblioteca.',
|
||||
);
|
||||
return '$_temp0\nEsto también quitará todo el $mediaType de tu biblioteca.\n\nNota: Los archivos en sí no se borrarán.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get chapter => 'capítulo';
|
||||
|
||||
@override
|
||||
String get episode => 'episodio';
|
||||
|
||||
@override
|
||||
String get unread_count => 'Cuenta de no leídos';
|
||||
|
||||
|
|
@ -1525,6 +1549,30 @@ class AppLocalizationsEs419 extends AppLocalizationsEs {
|
|||
@override
|
||||
String get last_update_check => 'Última verificación de actualización';
|
||||
|
||||
@override
|
||||
String last_entry_delete_warning(
|
||||
num count,
|
||||
Object entryType,
|
||||
Object entryTypePlural,
|
||||
Object mediaType,
|
||||
) {
|
||||
String _temp0 = intl.Intl.pluralLogic(
|
||||
count,
|
||||
locale: localeName,
|
||||
other:
|
||||
'Estás borrando los $count $entryTypePlural de este $mediaType de tu biblioteca.',
|
||||
one:
|
||||
'Estás borrando el único $entryType de este $mediaType de tu biblioteca.',
|
||||
);
|
||||
return '$_temp0\nEsto también quitará todo el $mediaType de tu biblioteca.\n\nNota: Los archivos en sí no se borrarán.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get chapter => 'capítulo';
|
||||
|
||||
@override
|
||||
String get episode => 'episodio';
|
||||
|
||||
@override
|
||||
String get unread_count => 'Cuenta de no leídos';
|
||||
|
||||
|
|
|
|||
|
|
@ -65,6 +65,30 @@ class AppLocalizationsFr extends AppLocalizations {
|
|||
@override
|
||||
String get last_update_check => 'Dernière mise à jour';
|
||||
|
||||
@override
|
||||
String last_entry_delete_warning(
|
||||
num count,
|
||||
Object entryType,
|
||||
Object entryTypePlural,
|
||||
Object mediaType,
|
||||
) {
|
||||
String _temp0 = intl.Intl.pluralLogic(
|
||||
count,
|
||||
locale: localeName,
|
||||
other:
|
||||
'Tu es en train de supprimer les $count $entryTypePlural de ce $mediaType de ta bibliothèque.',
|
||||
one:
|
||||
'Tu es en train de supprimer le seul $entryType de ce $mediaType de ta bibliothèque.',
|
||||
);
|
||||
return '$_temp0\nÇa va aussi supprimer tout le $mediaType de ta bibliothèque.\n\nNote : Les fichiers ne seront pas supprimés.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get chapter => 'chapitre';
|
||||
|
||||
@override
|
||||
String get episode => 'épisode';
|
||||
|
||||
@override
|
||||
String get unread_count => 'Nombre de non-lus';
|
||||
|
||||
|
|
|
|||
|
|
@ -65,6 +65,30 @@ class AppLocalizationsId extends AppLocalizations {
|
|||
@override
|
||||
String get last_update_check => 'Pemeriksaan Pembaruan Terakhir';
|
||||
|
||||
@override
|
||||
String last_entry_delete_warning(
|
||||
num count,
|
||||
Object entryType,
|
||||
Object entryTypePlural,
|
||||
Object mediaType,
|
||||
) {
|
||||
String _temp0 = intl.Intl.pluralLogic(
|
||||
count,
|
||||
locale: localeName,
|
||||
other:
|
||||
'Kamu sedang menghapus semua $count $entryTypePlural dari $mediaType ini di perpustakaan kamu.',
|
||||
one:
|
||||
'Kamu sedang menghapus satu-satunya $entryType dari $mediaType ini di perpustakaan kamu.',
|
||||
);
|
||||
return '$_temp0\nIni juga akan menghapus seluruh $mediaType dari perpustakaanmu.\n\nCatatan: File-nya sendiri tidak akan dihapus.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get chapter => 'bab';
|
||||
|
||||
@override
|
||||
String get episode => 'episode';
|
||||
|
||||
@override
|
||||
String get unread_count => 'Jumlah Belum Dibaca';
|
||||
|
||||
|
|
|
|||
|
|
@ -65,6 +65,30 @@ class AppLocalizationsIt extends AppLocalizations {
|
|||
@override
|
||||
String get last_update_check => 'Ultimo controllo aggiornamenti';
|
||||
|
||||
@override
|
||||
String last_entry_delete_warning(
|
||||
num count,
|
||||
Object entryType,
|
||||
Object entryTypePlural,
|
||||
Object mediaType,
|
||||
) {
|
||||
String _temp0 = intl.Intl.pluralLogic(
|
||||
count,
|
||||
locale: localeName,
|
||||
other:
|
||||
'Stai eliminando tutti e $count $entryTypePlural di questo $mediaType dalla tua libreria.',
|
||||
one:
|
||||
'Stai eliminando l’unico $entryType di questo $mediaType dalla tua libreria.',
|
||||
);
|
||||
return '$_temp0\nQuesto rimuoverà anche tutto il $mediaType dalla tua libreria.\n\nNota: I file non saranno eliminati.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get chapter => 'capitolo';
|
||||
|
||||
@override
|
||||
String get episode => 'episodio';
|
||||
|
||||
@override
|
||||
String get unread_count => 'Conteggio non letti';
|
||||
|
||||
|
|
|
|||
|
|
@ -65,6 +65,30 @@ class AppLocalizationsPt extends AppLocalizations {
|
|||
@override
|
||||
String get last_update_check => 'Última verificação de atualização';
|
||||
|
||||
@override
|
||||
String last_entry_delete_warning(
|
||||
num count,
|
||||
Object entryType,
|
||||
Object entryTypePlural,
|
||||
Object mediaType,
|
||||
) {
|
||||
String _temp0 = intl.Intl.pluralLogic(
|
||||
count,
|
||||
locale: localeName,
|
||||
other:
|
||||
'Estás a eliminar todos os $count $entryTypePlural deste $mediaType da tua biblioteca.',
|
||||
one:
|
||||
'Estás a eliminar o único $entryType deste $mediaType da tua biblioteca.',
|
||||
);
|
||||
return '$_temp0\nIsto vai também remover todo o $mediaType da tua biblioteca.\n\nNota: Os ficheiros em si não vão ser eliminados.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get chapter => 'capítulo';
|
||||
|
||||
@override
|
||||
String get episode => 'episódio';
|
||||
|
||||
@override
|
||||
String get unread_count => 'Contagem de não lidos';
|
||||
|
||||
|
|
@ -1522,6 +1546,30 @@ class AppLocalizationsPtBr extends AppLocalizationsPt {
|
|||
@override
|
||||
String get last_update_check => 'Última verificação de atualização';
|
||||
|
||||
@override
|
||||
String last_entry_delete_warning(
|
||||
num count,
|
||||
Object entryType,
|
||||
Object entryTypePlural,
|
||||
Object mediaType,
|
||||
) {
|
||||
String _temp0 = intl.Intl.pluralLogic(
|
||||
count,
|
||||
locale: localeName,
|
||||
other:
|
||||
'Você está deletando todos os $count $entryTypePlural deste $mediaType da sua biblioteca.',
|
||||
one:
|
||||
'Você está deletando o único $entryType deste $mediaType da sua biblioteca.',
|
||||
);
|
||||
return '$_temp0\nIsso também vai remover todo o $mediaType da sua biblioteca.\n\nObs: Os arquivos em si não serão deletados.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get chapter => 'capítulo';
|
||||
|
||||
@override
|
||||
String get episode => 'episódio';
|
||||
|
||||
@override
|
||||
String get unread_count => 'Contagem de não lidos';
|
||||
|
||||
|
|
|
|||
|
|
@ -65,6 +65,30 @@ class AppLocalizationsRu extends AppLocalizations {
|
|||
@override
|
||||
String get last_update_check => 'Последняя проверка обновлений';
|
||||
|
||||
@override
|
||||
String last_entry_delete_warning(
|
||||
num count,
|
||||
Object entryType,
|
||||
Object entryTypePlural,
|
||||
Object mediaType,
|
||||
) {
|
||||
String _temp0 = intl.Intl.pluralLogic(
|
||||
count,
|
||||
locale: localeName,
|
||||
other:
|
||||
'Ты удаляешь все $count $entryTypePlural этого $mediaType из библиотеки.',
|
||||
one:
|
||||
'Ты удаляешь единственный $entryType этого $mediaType из библиотеки.',
|
||||
);
|
||||
return '$_temp0\nЭто также удалит весь $mediaType из твоей библиотеки.\n\nПримечание: Сами файлы удалены не будут.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get chapter => 'глава';
|
||||
|
||||
@override
|
||||
String get episode => 'эпизод';
|
||||
|
||||
@override
|
||||
String get unread_count => 'Количество непрочитанных';
|
||||
|
||||
|
|
|
|||
|
|
@ -65,6 +65,29 @@ class AppLocalizationsTh extends AppLocalizations {
|
|||
@override
|
||||
String get last_update_check => 'ตรวจการอัพเดท';
|
||||
|
||||
@override
|
||||
String last_entry_delete_warning(
|
||||
num count,
|
||||
Object entryType,
|
||||
Object entryTypePlural,
|
||||
Object mediaType,
|
||||
) {
|
||||
String _temp0 = intl.Intl.pluralLogic(
|
||||
count,
|
||||
locale: localeName,
|
||||
other:
|
||||
'คุณกำลังลบทั้งหมด $count $entryTypePluralของ$mediaTypeนี้ออกจากคลังของคุณ',
|
||||
one: 'คุณกำลังลบ$entryTypeเดียวของ$mediaTypeนี้ออกจากคลังของคุณ',
|
||||
);
|
||||
return '$_temp0\nสิ่งนี้จะลบ$mediaTypeทั้งหมดออกจากคลังของคุณด้วย\n\nหมายเหตุ: ไฟล์จะไม่ถูกลบ';
|
||||
}
|
||||
|
||||
@override
|
||||
String get chapter => 'บท';
|
||||
|
||||
@override
|
||||
String get episode => 'ตอน';
|
||||
|
||||
@override
|
||||
String get unread_count => 'ที่ยังไม่อ่าน';
|
||||
|
||||
|
|
|
|||
|
|
@ -65,6 +65,29 @@ class AppLocalizationsTr extends AppLocalizations {
|
|||
@override
|
||||
String get last_update_check => 'Son Güncelleme Kontrolü';
|
||||
|
||||
@override
|
||||
String last_entry_delete_warning(
|
||||
num count,
|
||||
Object entryType,
|
||||
Object entryTypePlural,
|
||||
Object mediaType,
|
||||
) {
|
||||
String _temp0 = intl.Intl.pluralLogic(
|
||||
count,
|
||||
locale: localeName,
|
||||
other:
|
||||
'Kitaplığından bu $mediaType’nin tüm $count $entryTypePlural’ini siliyorsun.',
|
||||
one: 'Kitaplığından bu $mediaType’nin tek $entryType’ünü siliyorsun.',
|
||||
);
|
||||
return '$_temp0\nBu işlem $mediaType’nin tamamını da kütüphanenden kaldıracak.\n\nNot: Dosyalar silinmeyecek.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get chapter => 'bölüm';
|
||||
|
||||
@override
|
||||
String get episode => 'bölüm';
|
||||
|
||||
@override
|
||||
String get unread_count => 'Okunmamış Sayısı';
|
||||
|
||||
|
|
|
|||
|
|
@ -65,6 +65,28 @@ class AppLocalizationsZh extends AppLocalizations {
|
|||
@override
|
||||
String get last_update_check => '最后更新检查';
|
||||
|
||||
@override
|
||||
String last_entry_delete_warning(
|
||||
num count,
|
||||
Object entryType,
|
||||
Object entryTypePlural,
|
||||
Object mediaType,
|
||||
) {
|
||||
String _temp0 = intl.Intl.pluralLogic(
|
||||
count,
|
||||
locale: localeName,
|
||||
other: '你正在从你的库中删除此$mediaType的全部$count$entryTypePlural。',
|
||||
one: '你正在从你的库中删除此$mediaType的唯一$entryType。',
|
||||
);
|
||||
return '$_temp0\n这也会将整个$mediaType从你的库中移除。\n\n注意:文件本身不会被删除。';
|
||||
}
|
||||
|
||||
@override
|
||||
String get chapter => '章节';
|
||||
|
||||
@override
|
||||
String get episode => '剧集';
|
||||
|
||||
@override
|
||||
String get unread_count => '未读计数';
|
||||
|
||||
|
|
|
|||
|
|
@ -37,7 +37,9 @@ import 'package:mangayomi/modules/manga/detail/widgets/chapter_filter_list_tile_
|
|||
import 'package:mangayomi/modules/manga/detail/widgets/chapter_sort_list_tile_widget.dart';
|
||||
import 'package:mangayomi/modules/widgets/error_text.dart';
|
||||
import 'package:mangayomi/modules/widgets/progress_center.dart';
|
||||
import 'package:mangayomi/utils/extensions/string_extensions.dart';
|
||||
import 'package:mangayomi/utils/global_style.dart';
|
||||
import 'package:path/path.dart' as p;
|
||||
|
||||
class LibraryScreen extends ConsumerStatefulWidget {
|
||||
final ItemType itemType;
|
||||
|
|
@ -1148,57 +1150,12 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
|
|||
const SizedBox(width: 15),
|
||||
TextButton(
|
||||
onPressed: () async {
|
||||
// From Library
|
||||
if (fromLibList.isNotEmpty) {
|
||||
isar.writeTxnSync(() {
|
||||
for (var manga in mangasList) {
|
||||
if (manga.isLocalArchive ?? false) {
|
||||
final provider = ref.read(
|
||||
synchingProvider(syncId: 1).notifier,
|
||||
);
|
||||
final histories = isar.historys
|
||||
.filter()
|
||||
.mangaIdEqualTo(manga.id)
|
||||
.findAllSync();
|
||||
for (var history in histories) {
|
||||
isar.historys.deleteSync(history.id!);
|
||||
provider.addChangedPart(
|
||||
ActionType.removeHistory,
|
||||
history.id,
|
||||
"{}",
|
||||
false,
|
||||
);
|
||||
}
|
||||
|
||||
for (var chapter in manga.chapters) {
|
||||
final updates = isar.updates
|
||||
.filter()
|
||||
.mangaIdEqualTo(chapter.mangaId)
|
||||
.chapterNameEqualTo(chapter.name)
|
||||
.findAllSync();
|
||||
for (var update in updates) {
|
||||
isar.updates.deleteSync(update.id!);
|
||||
provider.addChangedPart(
|
||||
ActionType.removeUpdate,
|
||||
update.id,
|
||||
"{}",
|
||||
false,
|
||||
);
|
||||
}
|
||||
isar.chapters.deleteSync(chapter.id!);
|
||||
provider.addChangedPart(
|
||||
ActionType.removeChapter,
|
||||
chapter.id,
|
||||
"{}",
|
||||
false,
|
||||
);
|
||||
}
|
||||
isar.mangas.deleteSync(manga.id!);
|
||||
provider.addChangedPart(
|
||||
ActionType.removeItem,
|
||||
manga.id,
|
||||
"{}",
|
||||
false,
|
||||
);
|
||||
_removeImport(ref, manga);
|
||||
} else {
|
||||
manga.favorite = false;
|
||||
manga.updatedAt =
|
||||
|
|
@ -1208,59 +1165,34 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
|
|||
}
|
||||
});
|
||||
}
|
||||
// Downloaded Chapters
|
||||
if (downloadedChapsList.isNotEmpty) {
|
||||
isar.writeTxnSync(() async {
|
||||
for (var manga in mangasList) {
|
||||
if (manga.isLocalArchive ?? false) {
|
||||
for (var chapter in manga.chapters) {
|
||||
try {
|
||||
final storageProvider =
|
||||
StorageProvider();
|
||||
final mangaDir = await storageProvider
|
||||
.getMangaMainDirectory(chapter);
|
||||
final path = await storageProvider
|
||||
.getMangaChapterDirectory(
|
||||
chapter,
|
||||
mangaMainDirectory: mangaDir,
|
||||
);
|
||||
|
||||
try {
|
||||
try {
|
||||
if (File(
|
||||
"${mangaDir!.path}${chapter.name}.cbz",
|
||||
).existsSync()) {
|
||||
File(
|
||||
"${mangaDir.path}${chapter.name}.cbz",
|
||||
).deleteSync();
|
||||
}
|
||||
} catch (_) {}
|
||||
try {
|
||||
if (File(
|
||||
"${mangaDir!.path}${chapter.name}.mp4",
|
||||
).existsSync()) {
|
||||
File(
|
||||
"${mangaDir.path}${chapter.name}.mp4",
|
||||
).deleteSync();
|
||||
}
|
||||
} catch (_) {}
|
||||
path!.deleteSync(recursive: true);
|
||||
} catch (_) {}
|
||||
isar.writeTxnSync(() {
|
||||
final download = isar.downloads
|
||||
.filter()
|
||||
.idEqualTo(chapter.id!)
|
||||
.findAllSync();
|
||||
if (download.isNotEmpty) {
|
||||
isar.downloads.deleteSync(
|
||||
download.first.id!,
|
||||
);
|
||||
}
|
||||
});
|
||||
} catch (_) {}
|
||||
}
|
||||
for (var manga in mangasList) {
|
||||
String mangaDirectory = "";
|
||||
if (manga.isLocalArchive ?? false) {
|
||||
mangaDirectory = _deleteImport(
|
||||
manga,
|
||||
mangaDirectory,
|
||||
);
|
||||
// Also remove item from library
|
||||
// else it has 0 chapters/episodes
|
||||
// and when opened, shows exception
|
||||
// "Null check operator"
|
||||
_removeImport(ref, manga);
|
||||
} else {
|
||||
mangaDirectory = await _deleteDownload(
|
||||
manga,
|
||||
mangaDirectory,
|
||||
);
|
||||
}
|
||||
if (mangaDirectory.isNotEmpty) {
|
||||
final path = Directory(mangaDirectory);
|
||||
if (path.existsSync() &&
|
||||
path.listSync().isEmpty) {
|
||||
path.deleteSync(recursive: true);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
ref.read(mangasListStateProvider.notifier).clear();
|
||||
|
|
@ -1285,6 +1217,122 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
|
|||
);
|
||||
}
|
||||
|
||||
/// helper method to remove the library entry of an imported item
|
||||
/// does not remove from the device itself.
|
||||
void _removeImport(WidgetRef ref, Manga manga) {
|
||||
final provider = ref.read(synchingProvider(syncId: 1).notifier);
|
||||
final histories = isar.historys
|
||||
.filter()
|
||||
.mangaIdEqualTo(manga.id)
|
||||
.findAllSync();
|
||||
for (var history in histories) {
|
||||
isar.historys.deleteSync(history.id!);
|
||||
provider.addChangedPart(
|
||||
ActionType.removeHistory,
|
||||
history.id,
|
||||
"{}",
|
||||
false,
|
||||
);
|
||||
}
|
||||
|
||||
for (var chapter in manga.chapters) {
|
||||
final updates = isar.updates
|
||||
.filter()
|
||||
.mangaIdEqualTo(chapter.mangaId)
|
||||
.chapterNameEqualTo(chapter.name)
|
||||
.findAllSync();
|
||||
for (var update in updates) {
|
||||
isar.updates.deleteSync(update.id!);
|
||||
provider.addChangedPart(
|
||||
ActionType.removeUpdate,
|
||||
update.id,
|
||||
"{}",
|
||||
false,
|
||||
);
|
||||
}
|
||||
isar.chapters.deleteSync(chapter.id!);
|
||||
provider.addChangedPart(
|
||||
ActionType.removeChapter,
|
||||
chapter.id,
|
||||
"{}",
|
||||
false,
|
||||
);
|
||||
}
|
||||
isar.mangas.deleteSync(manga.id!);
|
||||
provider.addChangedPart(ActionType.removeItem, manga.id, "{}", false);
|
||||
}
|
||||
|
||||
/// helper method to delete imported mangas/animes
|
||||
String _deleteImport(Manga manga, String mangaDirectory) {
|
||||
for (var chapter in manga.chapters) {
|
||||
final path = chapter.archivePath;
|
||||
if (path == null) continue;
|
||||
final chapterFile = File(path);
|
||||
if (mangaDirectory.isEmpty) {
|
||||
mangaDirectory = p.dirname(path);
|
||||
}
|
||||
|
||||
try {
|
||||
if (chapterFile.existsSync()) {
|
||||
chapterFile.deleteSync();
|
||||
}
|
||||
} catch (_) {}
|
||||
}
|
||||
return mangaDirectory;
|
||||
}
|
||||
|
||||
/// helper method to delete downloaded mangas/animes
|
||||
Future<String> _deleteDownload(Manga manga, String mangaDirectory) async {
|
||||
final storageProvider = StorageProvider();
|
||||
Directory? mangaDir;
|
||||
final idsToDelete = <int>{};
|
||||
final downloadedIds = (await isar.downloads.where().idProperty().findAll())
|
||||
.toSet();
|
||||
|
||||
if (downloadedIds.isEmpty) return mangaDirectory;
|
||||
|
||||
for (var chapter in manga.chapters) {
|
||||
if (chapter.id == null || !downloadedIds.contains(chapter.id)) continue;
|
||||
|
||||
mangaDir ??= await storageProvider.getMangaMainDirectory(chapter);
|
||||
final chapterDir = await storageProvider.getMangaChapterDirectory(
|
||||
chapter,
|
||||
mangaMainDirectory: mangaDir,
|
||||
);
|
||||
File? file;
|
||||
|
||||
if (mangaDirectory.isEmpty) mangaDirectory = mangaDir!.path;
|
||||
if (manga.itemType == ItemType.manga) {
|
||||
// ref: download_page_widget.dart
|
||||
file = File(p.join(mangaDir!.path, "${chapter.name}.cbz"));
|
||||
} else if (manga.itemType == ItemType.anime) {
|
||||
// ref: download_page_widget.dart
|
||||
file = File(
|
||||
p.join(
|
||||
mangaDir!.path,
|
||||
"${chapter.name!.replaceForbiddenCharacters(' ')}.mp4",
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
try {
|
||||
if (file != null && file.existsSync()) {
|
||||
file.deleteSync();
|
||||
}
|
||||
if (chapterDir!.existsSync()) {
|
||||
chapterDir.deleteSync(recursive: true);
|
||||
}
|
||||
} catch (_) {}
|
||||
idsToDelete.add(chapter.id!);
|
||||
}
|
||||
if (idsToDelete.isNotEmpty) {
|
||||
isar.writeTxnSync(() {
|
||||
isar.downloads.deleteAllSync(idsToDelete.toList());
|
||||
});
|
||||
}
|
||||
return mangaDirectory;
|
||||
}
|
||||
|
||||
void _showDraggableMenu(Settings settings) {
|
||||
final l10n = l10nLocalizations(context)!;
|
||||
customDraggableTabBar(
|
||||
|
|
|
|||
|
|
@ -1045,11 +1045,56 @@ class _MangaDetailViewState extends ConsumerState<MangaDetailView>
|
|||
shadowColor: Colors.transparent,
|
||||
),
|
||||
onPressed: () {
|
||||
final selectedChapters = ref.watch(
|
||||
chaptersListStateProvider,
|
||||
);
|
||||
final totalChapters =
|
||||
widget.manga!.chapters.length;
|
||||
final isLastChapters =
|
||||
selectedChapters.length == totalChapters;
|
||||
final isAnime = widget.itemType == ItemType.anime;
|
||||
final entryType = isAnime
|
||||
? l10n.episode
|
||||
: l10n.chapter;
|
||||
final pluralEntryType = isAnime
|
||||
? l10n.episodes
|
||||
: l10n.chapters;
|
||||
final mediaType = isAnime
|
||||
? l10n.anime
|
||||
: l10n.manga;
|
||||
final warningMessage = l10n
|
||||
.last_entry_delete_warning(
|
||||
totalChapters,
|
||||
entryType,
|
||||
pluralEntryType,
|
||||
mediaType,
|
||||
);
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (context) {
|
||||
return AlertDialog(
|
||||
title: Text(l10n.delete_chapters),
|
||||
content: isLastChapters
|
||||
? Row(
|
||||
crossAxisAlignment:
|
||||
CrossAxisAlignment.start,
|
||||
children: [
|
||||
const Icon(
|
||||
Icons.warning_amber_rounded,
|
||||
color: Colors.orange,
|
||||
),
|
||||
const SizedBox(width: 12),
|
||||
Expanded(
|
||||
child: Text(
|
||||
warningMessage,
|
||||
style: TextStyle(
|
||||
color: Colors.red,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
)
|
||||
: null,
|
||||
actions: [
|
||||
Row(
|
||||
mainAxisAlignment:
|
||||
|
|
@ -1064,15 +1109,19 @@ class _MangaDetailViewState extends ConsumerState<MangaDetailView>
|
|||
const SizedBox(width: 15),
|
||||
TextButton(
|
||||
onPressed: () async {
|
||||
isar.writeTxnSync(() {
|
||||
for (var chapter in ref.watch(
|
||||
chaptersListStateProvider,
|
||||
)) {
|
||||
isar.chapters.deleteSync(
|
||||
chapter.id!,
|
||||
);
|
||||
}
|
||||
final navigator = Navigator.of(
|
||||
context,
|
||||
);
|
||||
await isar.writeTxn(() async {
|
||||
final idsToDelete =
|
||||
selectedChapters
|
||||
.map((c) => c.id!)
|
||||
.toList();
|
||||
await isar.chapters.deleteAll(
|
||||
idsToDelete,
|
||||
);
|
||||
});
|
||||
if (!mounted) return;
|
||||
ref
|
||||
.read(
|
||||
isLongPressedStateProvider
|
||||
|
|
@ -1085,8 +1134,21 @@ class _MangaDetailViewState extends ConsumerState<MangaDetailView>
|
|||
.notifier,
|
||||
)
|
||||
.clear();
|
||||
if (mounted) {
|
||||
Navigator.pop(context);
|
||||
navigator.pop();
|
||||
if (isLastChapters) {
|
||||
navigator.pop();
|
||||
Future.delayed(
|
||||
const Duration(
|
||||
milliseconds: 350,
|
||||
),
|
||||
() {
|
||||
isar.writeTxn(
|
||||
() => isar.mangas.delete(
|
||||
widget.manga!.id!,
|
||||
),
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
},
|
||||
child: Text(l10n.delete),
|
||||
|
|
|
|||
Loading…
Reference in a new issue