mirror of
https://github.com/kodjodevf/mangayomi.git
synced 2026-04-20 23:22:07 +00:00
reworked sync
This commit is contained in:
parent
bd17e1e9eb
commit
e1cecd8e37
42 changed files with 747 additions and 3178 deletions
|
|
@ -353,25 +353,16 @@
|
|||
"syncing": "مزامنة",
|
||||
"sync_password": "كلمة المرور (على الأقل 8 أحرف)",
|
||||
"sync_logged": "تم تسجيل الدخول بنجاح",
|
||||
"syncing_subtitle": "قم بمزامنة تقدمك عبر أجهزة متعددة باستخدام خادم مستضاف ذاتيًا.\nتأكد من التحميل أولاً إذا كانت هذه هي المرة الأولى التي تقوم فيها بالمزامنة\nأو قم بالتنزيل قبل استخدام المزامنة (التلقائية) على هذا الجهاز!",
|
||||
"last_sync": "آخر مزامنة في: ",
|
||||
"last_upload": "آخر تحميل في: ",
|
||||
"last_download": "آخر تنزيل في: ",
|
||||
"syncing_subtitle": "قم بمزامنة تقدمك عبر أجهزة متعددة عبر خادم مستضاف ذاتيًا. اطّلع على خادم الخلاف الخاص بنا لمزيد من المعلومات!",
|
||||
"last_sync_manga": "آخر مزامنة مانغا في:",
|
||||
"last_sync_history": "آخر مزامنة للتاريخ في:",
|
||||
"last_sync_update": "آخر مزامنة تحديث في:",
|
||||
"sync_server": "عنوان خادم المزامنة",
|
||||
"sync_login_invalid_creds": "بريد إلكتروني أو كلمة مرور غير صحيحة",
|
||||
"sync_checking": "جارٍ التحقق من المزامنة...",
|
||||
"sync_uploading": "بدأ التحميل...",
|
||||
"sync_downloading": "بدأ التنزيل...",
|
||||
"sync_upload_finished": "اكتمل التحميل",
|
||||
"sync_download_finished": "اكتمل التنزيل",
|
||||
"sync_up_to_date": "المزامنة محدثة",
|
||||
"sync_upload_failed": "فشل التحميل",
|
||||
"sync_download_failed": "فشل التنزيل",
|
||||
"sync_starting": "بدء المزامنة...",
|
||||
"sync_finished": "تم الانتهاء من المزامنة",
|
||||
"sync_failed": "فشل المزامنة",
|
||||
"sync_button_sync": "مزامنة التقدم",
|
||||
"sync_button_upload": "تحميل كامل",
|
||||
"sync_button_download": "تنزيل كامل",
|
||||
"sync_confirm_upload": "التحميل الكامل سيستبدل البيانات الحالية على الخادم ببياناتك الحالية!",
|
||||
"sync_confirm_download": "التنزيل الكامل سيستبدل بياناتك الحالية بالبيانات الموجودة على الخادم!",
|
||||
"dialog_confirm": "تأكيد",
|
||||
"full_screen_player": "استخدام الشاشة الكاملة",
|
||||
"full_screen_player_info": "استخدام الشاشة الكاملة تلقائيًا عند تشغيل الفيديو.",
|
||||
|
|
@ -406,25 +397,7 @@
|
|||
"statistics": "الإحصائيات",
|
||||
"default_subtitle_language": "لغة الترجمة الافتراضية",
|
||||
"follow_system_theme": "اتبع سمة النظام",
|
||||
"sync_button_snapshot": "إنشاء لقطة",
|
||||
"sync_confirm_snapshot": "اطلب من الخادم إنشاء نسخة احتياطية عن بُعد!",
|
||||
"sync_on": "تمكين المزامنة",
|
||||
"sync_pending_manga": "تغييرات المانجا معلقة",
|
||||
"sync_pending_category": "تغييرات الفئة معلقة",
|
||||
"sync_pending_chapter": "تغييرات الفصل معلقة",
|
||||
"sync_pending_history": "تغييرات السجل معلقة",
|
||||
"sync_pending_update": "تغييرات التحديث معلقة",
|
||||
"sync_pending_extension": "تغييرات الامتداد معلقة",
|
||||
"sync_pending_track": "تغييرات التتبع معلقة",
|
||||
"sync_snapshot_creating": "جارٍ إنشاء لقطة...",
|
||||
"sync_snapshot_created": "تم إنشاء اللقطة!",
|
||||
"sync_snapshot_deleting": "جارٍ حذف اللقطة...",
|
||||
"sync_snapshot_deleted": "تم حذف اللقطة!",
|
||||
"sync_snapshot_no_data": "لا توجد بيانات لإنشاء لقطة! قم بتحميل كامل أولاً!",
|
||||
"sync_browse_snapshots": "تصفح النسخ الاحتياطية القديمة",
|
||||
"sync_snapshots": "اللقطات",
|
||||
"sync_load_snapshot": "تحميل لقطة",
|
||||
"sync_delete_snapshot": "حذف لقطة",
|
||||
"sync_auto": "المزامنة التلقائية",
|
||||
"sync_auto_warning": "المزامنة التلقائية هي ميزة تجريبية حاليًا!",
|
||||
"sync_auto_off": "إيقاف",
|
||||
|
|
|
|||
|
|
@ -202,44 +202,17 @@
|
|||
"syncing": "Synchronisierung",
|
||||
"sync_password": "Passwort (mind. 8 Zeichen)",
|
||||
"sync_logged": "Login erfolgreich!",
|
||||
"syncing_subtitle": "Synchronisiere deinen Fortschritt über mehrere Geräte mithilfe \neines selbstgehosteten Servers. Beim ersten synchronisieren \nsolltest du zuerst \"Alles hochladen\" oder \"Alles herunterladen\" \nbevor du die (Auto-)Synchronisation auf diesem Gerät aktivierst!",
|
||||
"last_sync": "Zuletzt synchronisiert: ",
|
||||
"last_upload": "Zuletzt hochgeladen: ",
|
||||
"last_download": "Zuletzt heruntergeladen: ",
|
||||
"syncing_subtitle": "Synchronisiere deinen Fortschritt über mehrere Geräte mithilfe \neines selbstgehosteten Servers. Mehr Info gibt es bei unserem Discord Server!",
|
||||
"last_sync_manga": "Manga zuletzt synchronisiert: ",
|
||||
"last_sync_history": "Verlauf zuletzt synchronisiert: ",
|
||||
"last_sync_update": "Update zuletzt synchronisiert: ",
|
||||
"sync_server": "Sync Server IP Adresse / Domain",
|
||||
"sync_login_invalid_creds": "Ungültiger Email oder Passwort",
|
||||
"sync_checking": "Synchronisierung wird vorbereitet...",
|
||||
"sync_uploading": "Hochladen...",
|
||||
"sync_downloading": "Herunterladen...",
|
||||
"sync_upload_finished": "Hochladen erfolgreich",
|
||||
"sync_download_finished": "Herunterladen erfolgreich",
|
||||
"sync_up_to_date": "Synchronisierung ist auf den neuesten Stand",
|
||||
"sync_upload_failed": "Hochladen fehlgeschlagen",
|
||||
"sync_download_failed": "Herunterladen fehlgeschlagen",
|
||||
"sync_starting": "Sync gestartet...",
|
||||
"sync_finished": "Sync erfolgreich abgeschlossen!",
|
||||
"sync_failed": "Sync fehlgeschlagen!",
|
||||
"sync_button_sync": "Jetzt synchronisieren",
|
||||
"sync_button_snapshot": "Snapshot erstellen",
|
||||
"sync_button_upload": "Alles hochladen",
|
||||
"sync_button_download": "Alles herunterladen",
|
||||
"sync_confirm_snapshot": "Erstelle eine Kopie des derzeiten Backups auf den Server!",
|
||||
"sync_confirm_upload": "Deine Daten auf dem Server werden jetzt durch deinen lokalen Daten ersetzt!",
|
||||
"sync_confirm_download": "Deine lokalen Daten werden jetzt durch den Daten vom Server ersetzt!",
|
||||
"sync_on": "Sync aktivieren",
|
||||
"sync_pending_manga": "Ausstehende Änderungen für Manga",
|
||||
"sync_pending_category": "Ausstehende Änderungen für Kategorien",
|
||||
"sync_pending_chapter": "Ausstehende Änderungen für Kapiteln",
|
||||
"sync_pending_history": "Ausstehende Änderungen für Fortschritte",
|
||||
"sync_pending_update": "Ausstehende Änderungen für Updates",
|
||||
"sync_pending_extension": "Ausstehende Änderungen für Erweiterungen",
|
||||
"sync_pending_track": "Ausstehende Änderungen für Trackings",
|
||||
"sync_snapshot_creating": "Erstelle Snapshot...",
|
||||
"sync_snapshot_created": "Snapshot wurde erstellt!",
|
||||
"sync_snapshot_deleting": "Lösche Snapshot...",
|
||||
"sync_snapshot_deleted": "Snapshot wurde gelöscht!",
|
||||
"sync_snapshot_no_data": "Keine Daten zum Sichern! Lade erstmal alles hoch!",
|
||||
"sync_browse_snapshots": "Durchsuche ältere Backups",
|
||||
"sync_snapshots": "Snapshots",
|
||||
"sync_load_snapshot": "Snapshot laden",
|
||||
"sync_delete_snapshot": "Snapshot löschen",
|
||||
"sync_auto": "Auto Sync",
|
||||
"sync_auto_warning": "Auto Sync ist derzeit ein experimentelles Feature!",
|
||||
"sync_auto_off": "Aus",
|
||||
|
|
|
|||
|
|
@ -203,44 +203,17 @@
|
|||
"syncing": "Sync",
|
||||
"sync_password": "Password (at least 8 characters)",
|
||||
"sync_logged": "Login successful",
|
||||
"syncing_subtitle": "Sync your progress across multiple devices via a self-hosted \nserver. Make sure to upload first if this is your first time \nsyncing or download before using (auto) sync on this device!",
|
||||
"last_sync": "Last sync at: ",
|
||||
"last_upload": "Last upload at: ",
|
||||
"last_download": "Last download at: ",
|
||||
"syncing_subtitle": "Sync your progress across multiple devices via a self-hosted \nserver. Check out our discord server for more info!",
|
||||
"last_sync_manga": "Last manga sync at: ",
|
||||
"last_sync_history": "Last history sync at: ",
|
||||
"last_sync_update": "Last update sync at: ",
|
||||
"sync_server": "Sync Server Address",
|
||||
"sync_login_invalid_creds": "Invalid email or password",
|
||||
"sync_checking": "Checking for sync...",
|
||||
"sync_uploading": "Upload started...",
|
||||
"sync_downloading": "Download started...",
|
||||
"sync_upload_finished": "Upload finished",
|
||||
"sync_download_finished": "Download finished",
|
||||
"sync_up_to_date": "Sync up to date",
|
||||
"sync_upload_failed": "Upload failed",
|
||||
"sync_download_failed": "Download failed",
|
||||
"sync_starting": "Starting sync...",
|
||||
"sync_finished": "Sync finished",
|
||||
"sync_failed": "Sync failed",
|
||||
"sync_button_sync": "Sync progress",
|
||||
"sync_button_snapshot": "Create snapshot",
|
||||
"sync_button_upload": "Full upload",
|
||||
"sync_button_download": "Full download",
|
||||
"sync_confirm_snapshot": "Request the server to create a remote copy of the current backup!",
|
||||
"sync_confirm_upload": "A full upload will completely replace the remote data with your current one!",
|
||||
"sync_confirm_download": "A full download will completely replace your current data with the remote one!",
|
||||
"sync_on": "Enable sync",
|
||||
"sync_pending_manga": "Manga changes pending",
|
||||
"sync_pending_category": "Category changes pending",
|
||||
"sync_pending_chapter": "Chapter changes pending",
|
||||
"sync_pending_history": "History changes pending",
|
||||
"sync_pending_update": "Update changes pending",
|
||||
"sync_pending_extension": "Extension changes pending",
|
||||
"sync_pending_track": "Track changes pending",
|
||||
"sync_snapshot_creating": "Creating snapshot...",
|
||||
"sync_snapshot_created": "Snapshot created!",
|
||||
"sync_snapshot_deleting": "Deleting snapshot...",
|
||||
"sync_snapshot_deleted": "Snapshot deleted!",
|
||||
"sync_snapshot_no_data": "No data to create a snapshot! Do a full upload first!",
|
||||
"sync_browse_snapshots": "Browse older backups",
|
||||
"sync_snapshots": "Snapshots",
|
||||
"sync_load_snapshot": "Load snapshot",
|
||||
"sync_delete_snapshot": "Delete snapshot",
|
||||
"sync_auto": "Auto Sync",
|
||||
"sync_auto_warning": "Auto Sync is currently an experimental feature!",
|
||||
"sync_auto_off": "Off",
|
||||
|
|
|
|||
|
|
@ -353,33 +353,22 @@
|
|||
"syncing": "Sincronizar",
|
||||
"sync_password": "Contraseña (al menos 8 caracteres)",
|
||||
"sync_logged": "Inicio de sesión exitoso",
|
||||
"syncing_subtitle": "Sincroniza tu progreso entre varios dispositivos a través de un servidor autogestionado. Asegúrate de cargar primero si es la primera vez que sincronizas o descarga antes de usar la sincronización (automática) en este dispositivo.",
|
||||
"last_sync": "Última sincronización: ",
|
||||
"last_upload": "Última carga: ",
|
||||
"last_download": "Última descarga: ",
|
||||
"syncing_subtitle": "Sincroniza tu progreso en varios dispositivos a través de un servidor propio. Echa un vistazo a nuestro servidor Discord para más información.",
|
||||
"last_sync_manga": "Última sincronización del manga en:",
|
||||
"last_sync_history": "Última sincronización de la historia en:",
|
||||
"last_sync_update": "Última actualización sincronizada en:",
|
||||
"sync_server": "Dirección del servidor de sincronización",
|
||||
"sync_login_invalid_creds": "Correo o contraseña inválidos",
|
||||
"sync_checking": "Comprobando sincronización...",
|
||||
"sync_uploading": "Iniciando carga...",
|
||||
"sync_downloading": "Iniciando descarga...",
|
||||
"sync_upload_finished": "Carga finalizada",
|
||||
"sync_download_finished": "Descarga finalizada",
|
||||
"sync_up_to_date": "Sincronización actualizada",
|
||||
"sync_upload_failed": "Carga fallida",
|
||||
"sync_download_failed": "Descarga fallida",
|
||||
"sync_starting": "Empezando la sincronización...",
|
||||
"sync_finished": "Sincronización finalizada",
|
||||
"sync_failed": "Error de sincronización",
|
||||
"sync_button_sync": "Sincronizar progreso",
|
||||
"sync_button_upload": "Carga completa",
|
||||
"sync_button_download": "Descarga completa",
|
||||
"sync_confirm_upload": "¡Una carga completa reemplazará completamente los datos remotos con los actuales!",
|
||||
"sync_confirm_download": "¡Una descarga completa reemplazará completamente tus datos actuales con los remotos!",
|
||||
"dialog_confirm": "Confirmar",
|
||||
"full_screen_player": "Usar pantalla completa",
|
||||
"full_screen_player_info": "Usar automáticamente la pantalla completa al reproducir un video.",
|
||||
"novel_sources": "Fuentes de novelas",
|
||||
"novel_extensions": "Extensiones de novelas",
|
||||
"novel": "Novela",
|
||||
"sync_after_reading": "Sincronizar después de leer o ver",
|
||||
"sync_on_app_launch": "Sincronizar al abrir la aplicación",
|
||||
"skip_opening": "Omitir apertura",
|
||||
"skip_ending": "Omitir cierre",
|
||||
"n_hour_ago": "hace {hour} hora",
|
||||
|
|
@ -406,25 +395,7 @@
|
|||
"statistics": "Estadísticas",
|
||||
"default_subtitle_language": "Idioma predeterminado de subtítulos",
|
||||
"follow_system_theme": "Seguir el tema del sistema",
|
||||
"sync_button_snapshot": "Crear instantánea",
|
||||
"sync_confirm_snapshot": "¡Solicita al servidor crear una copia de seguridad remota!",
|
||||
"sync_on": "Habilitar sincronización",
|
||||
"sync_pending_manga": "Cambios pendientes en manga",
|
||||
"sync_pending_category": "Cambios pendientes en categorías",
|
||||
"sync_pending_chapter": "Cambios pendientes en capítulos",
|
||||
"sync_pending_history": "Cambios pendientes en historial",
|
||||
"sync_pending_update": "Cambios pendientes en actualizaciones",
|
||||
"sync_pending_extension": "Cambios pendientes en extensiones",
|
||||
"sync_pending_track": "Cambios pendientes en seguimiento",
|
||||
"sync_snapshot_creating": "Creando instantánea...",
|
||||
"sync_snapshot_created": "¡Instantánea creada!",
|
||||
"sync_snapshot_deleting": "Eliminando instantánea...",
|
||||
"sync_snapshot_deleted": "¡Instantánea eliminada!",
|
||||
"sync_snapshot_no_data": "¡No hay datos para crear una instantánea! ¡Haz una carga completa primero!",
|
||||
"sync_browse_snapshots": "Explorar copias de seguridad antiguas",
|
||||
"sync_snapshots": "Instantáneas",
|
||||
"sync_load_snapshot": "Cargar instantánea",
|
||||
"sync_delete_snapshot": "Eliminar instantánea",
|
||||
"sync_auto": "Sincronización automática",
|
||||
"sync_auto_warning": "¡La sincronización automática es una función experimental actualmente!",
|
||||
"sync_auto_off": "Desactivado",
|
||||
|
|
|
|||
|
|
@ -353,25 +353,16 @@
|
|||
"syncing": "Sincronizando",
|
||||
"sync_password": "Contraseña (al menos 8 caracteres)",
|
||||
"sync_logged": "Inicio de sesión exitoso",
|
||||
"syncing_subtitle": "Sincroniza tu progreso en varios dispositivos mediante un servidor \npropio. Asegúrate de cargar primero si es la primera vez que \nsincronizas o de descargar antes de usar la sincronización \n(automática) en este dispositivo.",
|
||||
"last_sync": "Última sincronización: ",
|
||||
"last_upload": "Última carga: ",
|
||||
"last_download": "Última descarga: ",
|
||||
"syncing_subtitle": "Sincroniza tu progreso en varios dispositivos a través de un servidor propio. Echa un vistazo a nuestro servidor Discord para más información.",
|
||||
"last_sync_manga": "Última sincronización del manga en:",
|
||||
"last_sync_history": "Última sincronización de la historia en:",
|
||||
"last_sync_update": "Última actualización sincronizada en:",
|
||||
"sync_server": "Dirección del servidor de sincronización",
|
||||
"sync_login_invalid_creds": "Correo electrónico o contraseña inválidos",
|
||||
"sync_checking": "Comprobando sincronización...",
|
||||
"sync_uploading": "Iniciando carga...",
|
||||
"sync_downloading": "Iniciando descarga...",
|
||||
"sync_upload_finished": "Carga completada",
|
||||
"sync_download_finished": "Descarga completada",
|
||||
"sync_up_to_date": "Sincronización al día",
|
||||
"sync_upload_failed": "Error en la carga",
|
||||
"sync_download_failed": "Error en la descarga",
|
||||
"sync_starting": "Empezando la sincronización...",
|
||||
"sync_finished": "Sincronización finalizada",
|
||||
"sync_failed": "Error de sincronización",
|
||||
"sync_button_sync": "Sincronizar progreso",
|
||||
"sync_button_upload": "Carga completa",
|
||||
"sync_button_download": "Descarga completa",
|
||||
"sync_confirm_upload": "¡Una carga completa reemplazará por completo los datos remotos con los actuales!",
|
||||
"sync_confirm_download": "¡Una descarga completa reemplazará por completo tus datos actuales con los remotos!",
|
||||
"dialog_confirm": "Confirmar",
|
||||
"full_screen_player": "Usar pantalla completa",
|
||||
"full_screen_player_info": "Usar automáticamente la pantalla completa al reproducir un video.",
|
||||
|
|
@ -406,25 +397,7 @@
|
|||
"statistics": "Estadísticas",
|
||||
"default_subtitle_language": "Idioma predeterminado de subtítulos",
|
||||
"follow_system_theme": "Seguir el tema del sistema",
|
||||
"sync_button_snapshot": "Crear instantánea",
|
||||
"sync_confirm_snapshot": "¡Solicita al servidor crear una copia de seguridad remota!",
|
||||
"sync_on": "Habilitar sincronización",
|
||||
"sync_pending_manga": "Cambios pendientes en manga",
|
||||
"sync_pending_category": "Cambios pendientes en categorías",
|
||||
"sync_pending_chapter": "Cambios pendientes en capítulos",
|
||||
"sync_pending_history": "Cambios pendientes en historial",
|
||||
"sync_pending_update": "Cambios pendientes en actualizaciones",
|
||||
"sync_pending_extension": "Cambios pendientes en extensiones",
|
||||
"sync_pending_track": "Cambios pendientes en seguimiento",
|
||||
"sync_snapshot_creating": "Creando instantánea...",
|
||||
"sync_snapshot_created": "¡Instantánea creada!",
|
||||
"sync_snapshot_deleting": "Eliminando instantánea...",
|
||||
"sync_snapshot_deleted": "¡Instantánea eliminada!",
|
||||
"sync_snapshot_no_data": "¡No hay datos para crear una instantánea! ¡Haz una carga completa primero!",
|
||||
"sync_browse_snapshots": "Explorar copias de seguridad antiguas",
|
||||
"sync_snapshots": "Instantáneas",
|
||||
"sync_load_snapshot": "Cargar instantánea",
|
||||
"sync_delete_snapshot": "Eliminar instantánea",
|
||||
"sync_auto": "Sincronización automática",
|
||||
"sync_auto_warning": "¡La sincronización automática es una función experimental actualmente!",
|
||||
"sync_auto_off": "Desactivado",
|
||||
|
|
|
|||
|
|
@ -354,33 +354,22 @@
|
|||
"syncing": "Synchronisation",
|
||||
"sync_password": "Mot de passe (au moins 8 caractères)",
|
||||
"sync_logged": "Connexion réussie",
|
||||
"syncing_subtitle": "Synchronisez vos progrès sur plusieurs appareils via un serveur auto-hébergé. Assurez-vous de télécharger d'abord si c'est votre première synchronisation ou de télécharger avant d'utiliser la synchronisation (auto) sur cet appareil !",
|
||||
"last_sync": "Dernière synchronisation : ",
|
||||
"last_upload": "Dernier téléversement : ",
|
||||
"last_download": "Dernier téléchargement : ",
|
||||
"syncing_subtitle": "Synchronisez votre progression sur plusieurs appareils via un serveur auto-hébergé. Consultez notre serveur discord pour plus d'informations !",
|
||||
"last_sync_manga": "Dernière synchro du manga à :",
|
||||
"last_sync_history": "Dernière synchro historique au :",
|
||||
"last_sync_update": "Dernière mise à jour de la synchronisation au :",
|
||||
"sync_server": "Adresse du serveur de synchronisation",
|
||||
"sync_login_invalid_creds": "E-mail ou mot de passe invalide",
|
||||
"sync_checking": "Vérification de la synchronisation...",
|
||||
"sync_uploading": "Téléversement en cours...",
|
||||
"sync_downloading": "Téléchargement en cours...",
|
||||
"sync_upload_finished": "Téléversement terminé",
|
||||
"sync_download_finished": "Téléchargement terminé",
|
||||
"sync_up_to_date": "Synchronisation à jour",
|
||||
"sync_upload_failed": "Échec du téléversement",
|
||||
"sync_download_failed": "Échec du téléchargement",
|
||||
"sync_starting": "Synchronisation de départ...",
|
||||
"sync_finished": "Synchronisation terminée",
|
||||
"sync_failed": "Échec de la synchronisation",
|
||||
"sync_button_sync": "Synchroniser les progrès",
|
||||
"sync_button_upload": "Téléversement complet",
|
||||
"sync_button_download": "Téléchargement complet",
|
||||
"sync_confirm_upload": "Un téléversement complet remplacera entièrement les données distantes par vos données actuelles !",
|
||||
"sync_confirm_download": "Un téléchargement complet remplacera entièrement vos données actuelles par les données distantes !",
|
||||
"dialog_confirm": "Confirmer",
|
||||
"full_screen_player": "Utiliser le mode plein écran",
|
||||
"full_screen_player_info": "Utiliser automatiquement le mode plein écran lors de la lecture d'une vidéo.",
|
||||
"novel_sources": "Sources de romans",
|
||||
"novel_extensions": "Extensions de romans",
|
||||
"novel": "Roman",
|
||||
"sync_after_reading": "Synchroniser après lecture ou visionnage",
|
||||
"sync_on_app_launch": "Synchroniser à l'ouverture de l'application",
|
||||
"n_hour_ago": "Il y a {hour} heure",
|
||||
"n_hours_ago": "Il y a {hours} heures",
|
||||
"n_minute_ago": "Il y a {minute} minute",
|
||||
|
|
@ -406,25 +395,7 @@
|
|||
"statistics": "Statistiques",
|
||||
"default_subtitle_language": "Langue des sous-titres par défaut",
|
||||
"follow_system_theme": "Suivre le thème du système",
|
||||
"sync_button_snapshot": "Créer un instantané",
|
||||
"sync_confirm_snapshot": "Demandez au serveur de créer une copie de sauvegarde distante !",
|
||||
"sync_on": "Activer la synchronisation",
|
||||
"sync_pending_manga": "Modifications en attente pour les mangas",
|
||||
"sync_pending_category": "Modifications en attente pour les catégories",
|
||||
"sync_pending_chapter": "Modifications en attente pour les chapitres",
|
||||
"sync_pending_history": "Modifications en attente pour l'historique",
|
||||
"sync_pending_update": "Modifications en attente pour les mises à jour",
|
||||
"sync_pending_extension": "Modifications en attente pour les extensions",
|
||||
"sync_pending_track": "Modifications en attente pour le suivi",
|
||||
"sync_snapshot_creating": "Création de l'instantané...",
|
||||
"sync_snapshot_created": "Instantané créé !",
|
||||
"sync_snapshot_deleting": "Suppression de l'instantané...",
|
||||
"sync_snapshot_deleted": "Instantané supprimé !",
|
||||
"sync_snapshot_no_data": "Aucune donnée pour créer un instantané ! Effectuez d'abord un téléchargement complet !",
|
||||
"sync_browse_snapshots": "Parcourir les sauvegardes précédentes",
|
||||
"sync_snapshots": "Instantanés",
|
||||
"sync_load_snapshot": "Charger l'instantané",
|
||||
"sync_delete_snapshot": "Supprimer l'instantané",
|
||||
"sync_auto": "Synchronisation automatique",
|
||||
"sync_auto_warning": "La synchronisation automatique est actuellement une fonctionnalité expérimentale !",
|
||||
"sync_auto_off": "Désactivé",
|
||||
|
|
|
|||
|
|
@ -353,33 +353,22 @@
|
|||
"syncing": "Sinkronisasi",
|
||||
"sync_password": "Kata sandi (minimal 8 karakter)",
|
||||
"sync_logged": "Berhasil masuk",
|
||||
"syncing_subtitle": "Sinkronkan progres Anda di beberapa perangkat melalui server \nself-hosted. Pastikan untuk mengunggah terlebih dahulu jika ini \nadalah pertama kalinya Anda menyinkronkan, atau unduh sebelum menggunakan sinkronisasi (otomatis) di perangkat ini!",
|
||||
"last_sync": "Sinkronisasi terakhir pada: ",
|
||||
"last_upload": "Unggahan terakhir pada: ",
|
||||
"last_download": "Unduhan terakhir pada: ",
|
||||
"syncing_subtitle": "Sinkronkan kemajuan Anda di beberapa perangkat melalui \nserver yang dihosting sendiri. Lihat server discord kami untuk info lebih lanjut!",
|
||||
"last_sync_manga": "Sinkronisasi manga terakhir di:",
|
||||
"last_sync_history": "Sinkronisasi riwayat terakhir pada:",
|
||||
"last_sync_update": "Sinkronisasi pembaruan terakhir pada:",
|
||||
"sync_server": "Alamat Server Sinkronisasi",
|
||||
"sync_login_invalid_creds": "Email atau kata sandi tidak valid",
|
||||
"sync_checking": "Memeriksa sinkronisasi...",
|
||||
"sync_uploading": "Unggahan dimulai...",
|
||||
"sync_downloading": "Unduhan dimulai...",
|
||||
"sync_upload_finished": "Unggahan selesai",
|
||||
"sync_download_finished": "Unduhan selesai",
|
||||
"sync_up_to_date": "Sinkronisasi terkini",
|
||||
"sync_upload_failed": "Unggahan gagal",
|
||||
"sync_download_failed": "Unduhan gagal",
|
||||
"sync_starting": "Memulai sinkronisasi...",
|
||||
"sync_finished": "Sinkronisasi selesai",
|
||||
"sync_failed": "Sinkronisasi gagal",
|
||||
"sync_button_sync": "Sinkronkan progres",
|
||||
"sync_button_upload": "Unggah penuh",
|
||||
"sync_button_download": "Unduh penuh",
|
||||
"sync_confirm_upload": "Unggahan penuh akan sepenuhnya menggantikan data jarak jauh dengan data Anda saat ini!",
|
||||
"sync_confirm_download": "Unduhan penuh akan sepenuhnya menggantikan data Anda saat ini dengan data jarak jauh!",
|
||||
"dialog_confirm": "Konfirmasi",
|
||||
"full_screen_player": "Gunakan Layar Penuh",
|
||||
"full_screen_player_info": "Otomatis gunakan layar penuh saat memutar video.",
|
||||
"novel_sources": "Sumber Novel",
|
||||
"novel_extensions": "Ekstensi Novel",
|
||||
"novel": "Novel",
|
||||
"sync_after_reading": "Sinkronkan setelah membaca atau menonton",
|
||||
"sync_on_app_launch": "Sinkronkan saat membuka aplikasi",
|
||||
"skip_opening": "Lewati pembukaan",
|
||||
"skip_ending": "Lewati penutupan",
|
||||
"n_hour_ago": "{hour} jam yang lalu",
|
||||
|
|
@ -406,25 +395,7 @@
|
|||
"statistics": "Statistik",
|
||||
"default_subtitle_language": "Bahasa subtitle default",
|
||||
"follow_system_theme": "Ikuti tema sistem",
|
||||
"sync_button_snapshot": "Buat snapshot",
|
||||
"sync_confirm_snapshot": "Minta server untuk membuat salinan cadangan jarak jauh!",
|
||||
"sync_on": "Aktifkan sinkronisasi",
|
||||
"sync_pending_manga": "Perubahan manga tertunda",
|
||||
"sync_pending_category": "Perubahan kategori tertunda",
|
||||
"sync_pending_chapter": "Perubahan bab tertunda",
|
||||
"sync_pending_history": "Perubahan riwayat tertunda",
|
||||
"sync_pending_update": "Perubahan pembaruan tertunda",
|
||||
"sync_pending_extension": "Perubahan ekstensi tertunda",
|
||||
"sync_pending_track": "Perubahan pelacakan tertunda",
|
||||
"sync_snapshot_creating": "Membuat snapshot...",
|
||||
"sync_snapshot_created": "Snapshot dibuat!",
|
||||
"sync_snapshot_deleting": "Menghapus snapshot...",
|
||||
"sync_snapshot_deleted": "Snapshot dihapus!",
|
||||
"sync_snapshot_no_data": "Tidak ada data untuk membuat snapshot! Lakukan unggahan penuh terlebih dahulu!",
|
||||
"sync_browse_snapshots": "Jelajahi cadangan lama",
|
||||
"sync_snapshots": "Snapshot",
|
||||
"sync_load_snapshot": "Muat snapshot",
|
||||
"sync_delete_snapshot": "Hapus snapshot",
|
||||
"sync_auto": "Sinkronisasi otomatis",
|
||||
"sync_auto_warning": "Sinkronisasi otomatis saat ini adalah fitur eksperimental!",
|
||||
"sync_auto_off": "Mati",
|
||||
|
|
|
|||
|
|
@ -353,33 +353,22 @@
|
|||
"syncing": "Sincronizzazione",
|
||||
"sync_password": "Password (almeno 8 caratteri)",
|
||||
"sync_logged": "Accesso riuscito",
|
||||
"syncing_subtitle": "Sincronizza i tuoi progressi su più dispositivi tramite un server \nospitato autonomamente. Assicurati di caricare prima se è la \ntua prima sincronizzazione o di scaricare prima di utilizzare la \nsincronizzazione (automatica) su questo dispositivo!",
|
||||
"last_sync": "Ultima sincronizzazione: ",
|
||||
"last_upload": "Ultimo caricamento: ",
|
||||
"last_download": "Ultimo download: ",
|
||||
"syncing_subtitle": "Sincronizza i tuoi progressi su più dispositivi tramite un server discord auto-ospitato. Per maggiori informazioni, visita il nostro server discord!",
|
||||
"last_sync_manga": "Ultima sincronizzazione del manga a:",
|
||||
"last_sync_history": "Ultima storia sincronizzata a:",
|
||||
"last_sync_update": "Ultimo aggiornamento: sincronizzazione a:",
|
||||
"sync_server": "Indirizzo del server di sincronizzazione",
|
||||
"sync_login_invalid_creds": "Email o password non validi",
|
||||
"sync_checking": "Verifica sincronizzazione...",
|
||||
"sync_uploading": "Caricamento iniziato...",
|
||||
"sync_downloading": "Download iniziato...",
|
||||
"sync_upload_finished": "Caricamento completato",
|
||||
"sync_download_finished": "Download completato",
|
||||
"sync_up_to_date": "Sincronizzazione aggiornata",
|
||||
"sync_upload_failed": "Caricamento fallito",
|
||||
"sync_download_failed": "Download fallito",
|
||||
"sync_starting": "Avvio della sincronizzazione...",
|
||||
"sync_finished": "Sincronizzazione terminata",
|
||||
"sync_failed": "Sincronizzazione fallita",
|
||||
"sync_button_sync": "Sincronizza progressi",
|
||||
"sync_button_upload": "Caricamento completo",
|
||||
"sync_button_download": "Download completo",
|
||||
"sync_confirm_upload": "Un caricamento completo sostituirà completamente i dati remoti con quelli attuali!",
|
||||
"sync_confirm_download": "Un download completo sostituirà completamente i tuoi dati attuali con quelli remoti!",
|
||||
"dialog_confirm": "Conferma",
|
||||
"full_screen_player": "Usa schermo intero",
|
||||
"full_screen_player_info": "Usa automaticamente lo schermo intero durante la riproduzione di un video.",
|
||||
"novel_sources": "Fonti romanzo",
|
||||
"novel_extensions": "Estensioni romanzo",
|
||||
"novel": "Romanzo",
|
||||
"sync_after_reading": "Sincronizza dopo aver letto o guardato",
|
||||
"sync_on_app_launch": "Sincronizza all'apertura dell'app",
|
||||
"skip_opening": "Salta apertura",
|
||||
"skip_ending": "Salta finale",
|
||||
"n_hour_ago": "{hour} ora fa",
|
||||
|
|
@ -406,25 +395,7 @@
|
|||
"statistics": "Statistiche",
|
||||
"default_subtitle_language": "Lingua predefinita dei sottotitoli",
|
||||
"follow_system_theme": "Segui il tema del sistema",
|
||||
"sync_button_snapshot": "Crea istantanea",
|
||||
"sync_confirm_snapshot": "Richiedi al server di creare un backup remoto!",
|
||||
"sync_on": "Abilita sincronizzazione",
|
||||
"sync_pending_manga": "Modifiche in sospeso per i manga",
|
||||
"sync_pending_category": "Modifiche in sospeso per le categorie",
|
||||
"sync_pending_chapter": "Modifiche in sospeso per i capitoli",
|
||||
"sync_pending_history": "Modifiche in sospeso per la cronologia",
|
||||
"sync_pending_update": "Modifiche in sospeso per gli aggiornamenti",
|
||||
"sync_pending_extension": "Modifiche in sospeso per le estensioni",
|
||||
"sync_pending_track": "Modifiche in sospeso per il tracciamento",
|
||||
"sync_snapshot_creating": "Creazione dell'istantanea...",
|
||||
"sync_snapshot_created": "Istantanea creata!",
|
||||
"sync_snapshot_deleting": "Eliminazione dell'istantanea...",
|
||||
"sync_snapshot_deleted": "Istantanea eliminata!",
|
||||
"sync_snapshot_no_data": "Nessun dato per creare un'istantanea! Esegui prima un caricamento completo!",
|
||||
"sync_browse_snapshots": "Esplora vecchi backup",
|
||||
"sync_snapshots": "Istantanee",
|
||||
"sync_load_snapshot": "Carica istantanea",
|
||||
"sync_delete_snapshot": "Elimina istantanea",
|
||||
"sync_auto": "Sincronizzazione automatica",
|
||||
"sync_auto_warning": "La sincronizzazione automatica è attualmente una funzione sperimentale!",
|
||||
"sync_auto_off": "Disattivato",
|
||||
|
|
|
|||
|
|
@ -353,33 +353,22 @@
|
|||
"syncing": "Sincronizando",
|
||||
"sync_password": "Senha (pelo menos 8 caracteres)",
|
||||
"sync_logged": "Login bem-sucedido",
|
||||
"syncing_subtitle": "Sincronize seu progresso entre vários dispositivos via um servidor auto-hospedado. Certifique-se de fazer o upload primeiro se for sua primeira vez sincronizando ou baixe antes de usar a sincronização (automática) neste dispositivo!",
|
||||
"last_sync": "Última sincronização em: ",
|
||||
"last_upload": "Último upload em: ",
|
||||
"last_download": "Último download em: ",
|
||||
"syncing_subtitle": "Sincroniza o teu progresso em vários dispositivos através de um \nserver auto-hospedado. Consulta o nosso servidor discord para mais informações!",
|
||||
"last_sync_manga": "Última sincronização da manga em:",
|
||||
"last_sync_history": "Última sincronização da história em:",
|
||||
"last_sync_update": "Última atualização sincronizada em:",
|
||||
"sync_server": "Endereço do servidor de sincronização",
|
||||
"sync_login_invalid_creds": "E-mail ou senha inválidos",
|
||||
"sync_checking": "Verificando sincronização...",
|
||||
"sync_uploading": "Upload iniciado...",
|
||||
"sync_downloading": "Download iniciado...",
|
||||
"sync_upload_finished": "Upload concluído",
|
||||
"sync_download_finished": "Download concluído",
|
||||
"sync_up_to_date": "Sincronização atualizada",
|
||||
"sync_upload_failed": "Upload falhou",
|
||||
"sync_download_failed": "Download falhou",
|
||||
"sync_starting": "Iniciar a sincronização...",
|
||||
"sync_finished": "Sincronização concluída",
|
||||
"sync_failed": "A sincronização falhou",
|
||||
"sync_button_sync": "Sincronizar progresso",
|
||||
"sync_button_upload": "Upload completo",
|
||||
"sync_button_download": "Download completo",
|
||||
"sync_confirm_upload": "Um upload completo substituirá completamente os dados remotos pelos seus dados atuais!",
|
||||
"sync_confirm_download": "Um download completo substituirá completamente seus dados atuais pelos dados remotos!",
|
||||
"dialog_confirm": "Confirmar",
|
||||
"full_screen_player": "Usar tela cheia",
|
||||
"full_screen_player_info": "Usar automaticamente tela cheia ao reproduzir um vídeo.",
|
||||
"novel_sources": "Fontes de novels",
|
||||
"novel_extensions": "Extensões de novels",
|
||||
"novel": "Novel",
|
||||
"sync_after_reading": "Sincronizar após ler ou assistir",
|
||||
"sync_on_app_launch": "Sincronizar ao abrir o aplicativo",
|
||||
"skip_opening": "Pular abertura",
|
||||
"skip_ending": "Pular encerramento",
|
||||
"n_hour_ago": "há {hour} hora",
|
||||
|
|
@ -406,25 +395,7 @@
|
|||
"statistics": "Estatísticas",
|
||||
"default_subtitle_language": "Idioma padrão das legendas",
|
||||
"follow_system_theme": "Seguir o tema do sistema",
|
||||
"sync_button_snapshot": "Criar instantâneo",
|
||||
"sync_confirm_snapshot": "Solicite ao servidor para criar um backup remoto!",
|
||||
"sync_on": "Ativar sincronização",
|
||||
"sync_pending_manga": "Alterações pendentes para mangás",
|
||||
"sync_pending_category": "Alterações pendentes para categorias",
|
||||
"sync_pending_chapter": "Alterações pendentes para capítulos",
|
||||
"sync_pending_history": "Alterações pendentes para histórico",
|
||||
"sync_pending_update": "Alterações pendentes para atualizações",
|
||||
"sync_pending_extension": "Alterações pendentes para extensões",
|
||||
"sync_pending_track": "Alterações pendentes para rastreamento",
|
||||
"sync_snapshot_creating": "Criando instantâneo...",
|
||||
"sync_snapshot_created": "Instantâneo criado!",
|
||||
"sync_snapshot_deleting": "Excluindo instantâneo...",
|
||||
"sync_snapshot_deleted": "Instantâneo excluído!",
|
||||
"sync_snapshot_no_data": "Sem dados para criar um instantâneo! Faça um upload completo primeiro!",
|
||||
"sync_browse_snapshots": "Explorar backups antigos",
|
||||
"sync_snapshots": "Instantâneos",
|
||||
"sync_load_snapshot": "Carregar instantâneo",
|
||||
"sync_delete_snapshot": "Excluir instantâneo",
|
||||
"sync_auto": "Sincronização automática",
|
||||
"sync_auto_warning": "A sincronização automática é atualmente um recurso experimental!",
|
||||
"sync_auto_off": "Desativado",
|
||||
|
|
|
|||
|
|
@ -353,33 +353,22 @@
|
|||
"syncing": "Sincronizar",
|
||||
"sync_password": "Senha (pelo menos 8 caracteres)",
|
||||
"sync_logged": "Login bem-sucedido",
|
||||
"syncing_subtitle": "Sincronize seu progresso em vários dispositivos por meio de um servidor auto-hospedado.\nCertifique-se de fazer upload primeiro se for sua primeira sincronização ou de baixar antes de usar a sincronização (automática) neste dispositivo!",
|
||||
"last_sync": "Última sincronização em: ",
|
||||
"last_upload": "Último upload em: ",
|
||||
"last_download": "Último download em: ",
|
||||
"syncing_subtitle": "Sincronize seu progresso em vários dispositivos por meio de um \nservidor auto-hospedado. Confira nosso servidor discord para obter mais informações!",
|
||||
"last_sync_manga": "Última sincronização do mangá em:",
|
||||
"last_sync_history": "Última sincronização do histórico em:",
|
||||
"last_sync_update": "Última atualização sincronizada em:",
|
||||
"sync_server": "Endereço do servidor de sincronização",
|
||||
"sync_login_invalid_creds": "E-mail ou senha inválidos",
|
||||
"sync_checking": "Verificando sincronização...",
|
||||
"sync_uploading": "Iniciando upload...",
|
||||
"sync_downloading": "Iniciando download...",
|
||||
"sync_upload_finished": "Upload concluído",
|
||||
"sync_download_finished": "Download concluído",
|
||||
"sync_up_to_date": "Sincronização em dia",
|
||||
"sync_upload_failed": "Falha no upload",
|
||||
"sync_download_failed": "Falha no download",
|
||||
"sync_starting": "Iniciando a sincronização...",
|
||||
"sync_finished": "Sincronização concluída",
|
||||
"sync_failed": "Falha na sincronização",
|
||||
"sync_button_sync": "Sincronizar progresso",
|
||||
"sync_button_upload": "Upload completo",
|
||||
"sync_button_download": "Download completo",
|
||||
"sync_confirm_upload": "Um upload completo substituirá completamente os dados remotos pelos atuais!",
|
||||
"sync_confirm_download": "Um download completo substituirá completamente seus dados atuais pelos dados remotos!",
|
||||
"dialog_confirm": "Confirmar",
|
||||
"full_screen_player": "Usar tela cheia",
|
||||
"full_screen_player_info": "Usar automaticamente tela cheia ao reproduzir um vídeo.",
|
||||
"novel_sources": "Fontes de novels",
|
||||
"novel_extensions": "Extensões de novels",
|
||||
"novel": "Novel",
|
||||
"sync_after_reading": "Sincronizar após ler ou assistir",
|
||||
"sync_on_app_launch": "Sincronizar ao abrir o aplicativo",
|
||||
"skip_opening": "Pular abertura",
|
||||
"skip_ending": "Pular encerramento",
|
||||
"n_hour_ago": "há {hour} hora",
|
||||
|
|
@ -406,25 +395,7 @@
|
|||
"statistics": "Estatísticas",
|
||||
"default_subtitle_language": "Idioma padrão das legendas",
|
||||
"follow_system_theme": "Seguir o tema do sistema",
|
||||
"sync_button_snapshot": "Criar instantâneo",
|
||||
"sync_confirm_snapshot": "Solicite ao servidor para criar um backup remoto!",
|
||||
"sync_on": "Ativar sincronização",
|
||||
"sync_pending_manga": "Alterações pendentes para mangás",
|
||||
"sync_pending_category": "Alterações pendentes para categorias",
|
||||
"sync_pending_chapter": "Alterações pendentes para capítulos",
|
||||
"sync_pending_history": "Alterações pendentes para histórico",
|
||||
"sync_pending_update": "Alterações pendentes para atualizações",
|
||||
"sync_pending_extension": "Alterações pendentes para extensões",
|
||||
"sync_pending_track": "Alterações pendentes para rastreamento",
|
||||
"sync_snapshot_creating": "Criando instantâneo...",
|
||||
"sync_snapshot_created": "Instantâneo criado!",
|
||||
"sync_snapshot_deleting": "Excluindo instantâneo...",
|
||||
"sync_snapshot_deleted": "Instantâneo excluído!",
|
||||
"sync_snapshot_no_data": "Sem dados para criar um instantâneo! Faça um upload completo primeiro!",
|
||||
"sync_browse_snapshots": "Explorar backups antigos",
|
||||
"sync_snapshots": "Instantâneos",
|
||||
"sync_load_snapshot": "Carregar instantâneo",
|
||||
"sync_delete_snapshot": "Excluir instantâneo",
|
||||
"sync_auto": "Sincronização automática",
|
||||
"sync_auto_warning": "A sincronização automática é atualmente um recurso experimental!",
|
||||
"sync_auto_off": "Desativado",
|
||||
|
|
|
|||
|
|
@ -353,33 +353,22 @@
|
|||
"syncing": "Синхронизация",
|
||||
"sync_password": "Пароль (минимум 8 символов)",
|
||||
"sync_logged": "Вход выполнен успешно",
|
||||
"syncing_subtitle": "Синхронизируйте ваш прогресс на нескольких устройствах через собственный сервер. Убедитесь, что вы сначала загрузили, если это ваш первый раз синхронизации, или скачайте перед использованием (авто) синхронизации на этом устройстве!",
|
||||
"last_sync": "Последняя синхронизация: ",
|
||||
"last_upload": "Последняя загрузка: ",
|
||||
"last_download": "Последнее скачивание: ",
|
||||
"syncing_subtitle": "Синхронизируйте свой прогресс на нескольких устройствах через собственный \nserver. Загляните на наш сервер discord для получения дополнительной информации!",
|
||||
"last_sync_manga": "Последняя синхронизация манги:",
|
||||
"last_sync_history": "Последняя история синхронизирована на:",
|
||||
"last_sync_update": "Последнее обновление синхронизировано на:",
|
||||
"sync_server": "Адрес сервера синхронизации",
|
||||
"sync_login_invalid_creds": "Неверный адрес электронной почты или пароль",
|
||||
"sync_checking": "Проверка синхронизации...",
|
||||
"sync_uploading": "Загрузка началась...",
|
||||
"sync_downloading": "Скачивание началось...",
|
||||
"sync_upload_finished": "Загрузка завершена",
|
||||
"sync_download_finished": "Скачивание завершено",
|
||||
"sync_up_to_date": "Синхронизация актуальна",
|
||||
"sync_upload_failed": "Ошибка загрузки",
|
||||
"sync_download_failed": "Ошибка скачивания",
|
||||
"sync_starting": "Начало синхронизации...",
|
||||
"sync_finished": "Синхронизация завершена",
|
||||
"sync_failed": "Не удалось синхронизировать",
|
||||
"sync_button_sync": "Синхронизировать прогресс",
|
||||
"sync_button_upload": "Полная загрузка",
|
||||
"sync_button_download": "Полное скачивание",
|
||||
"sync_confirm_upload": "Полная загрузка полностью заменит удаленные данные на ваши текущие!",
|
||||
"sync_confirm_download": "Полное скачивание полностью заменит ваши текущие данные на удаленные!",
|
||||
"dialog_confirm": "Подтвердить",
|
||||
"full_screen_player": "Использовать полноэкранный режим",
|
||||
"full_screen_player_info": "Автоматически использовать полноэкранный режим при воспроизведении видео.",
|
||||
"novel_sources": "Источники романов",
|
||||
"novel_extensions": "Расширения для романов",
|
||||
"novel": "Роман",
|
||||
"sync_after_reading": "Синхронизировать после чтения или просмотра",
|
||||
"sync_on_app_launch": "Синхронизировать при запуске приложения",
|
||||
"skip_opening": "Пропустить вступление",
|
||||
"skip_ending": "Пропустить концовку",
|
||||
"n_hour_ago": "{hour} час назад",
|
||||
|
|
@ -406,25 +395,7 @@
|
|||
"statistics": "Статистика",
|
||||
"default_subtitle_language": "Язык субтитров по умолчанию",
|
||||
"follow_system_theme": "Следовать системной теме",
|
||||
"sync_button_snapshot": "Создать снимок",
|
||||
"sync_confirm_snapshot": "Запросите у сервера создание удаленной резервной копии!",
|
||||
"sync_on": "Включить синхронизацию",
|
||||
"sync_pending_manga": "Ожидающие изменения манги",
|
||||
"sync_pending_category": "Ожидающие изменения категорий",
|
||||
"sync_pending_chapter": "Ожидающие изменения глав",
|
||||
"sync_pending_history": "Ожидающие изменения истории",
|
||||
"sync_pending_update": "Ожидающие изменения обновлений",
|
||||
"sync_pending_extension": "Ожидающие изменения расширений",
|
||||
"sync_pending_track": "Ожидающие изменения трекинга",
|
||||
"sync_snapshot_creating": "Создание снимка...",
|
||||
"sync_snapshot_created": "Снимок создан!",
|
||||
"sync_snapshot_deleting": "Удаление снимка...",
|
||||
"sync_snapshot_deleted": "Снимок удален!",
|
||||
"sync_snapshot_no_data": "Нет данных для создания снимка! Сначала выполните полную загрузку!",
|
||||
"sync_browse_snapshots": "Просмотр старых резервных копий",
|
||||
"sync_snapshots": "Снимки",
|
||||
"sync_load_snapshot": "Загрузить снимок",
|
||||
"sync_delete_snapshot": "Удалить снимок",
|
||||
"sync_auto": "Автосинхронизация",
|
||||
"sync_auto_warning": "Автосинхронизация в настоящее время является экспериментальной функцией!",
|
||||
"sync_auto_off": "Выключено",
|
||||
|
|
|
|||
|
|
@ -358,33 +358,22 @@
|
|||
"syncing": "การซิงค์",
|
||||
"sync_password": "รหัสผ่าน (อย่างน้อย 8 ตัวอักษร)",
|
||||
"sync_logged": "เข้าสู่ระบบสำเร็จ",
|
||||
"syncing_subtitle": "ซิงค์ความคืบหน้าของคุณระหว่างอุปกรณ์หลายเครื่องผ่านเซิร์ฟเวอร์ที่โฮสต์เอง ตรวจสอบให้แน่ใจว่าได้อัปโหลดก่อนหากเป็นครั้งแรกที่คุณซิงค์ หรือดาวน์โหลดก่อนที่จะใช้การซิงค์ (อัตโนมัติ) บนอุปกรณ์นี้!",
|
||||
"last_sync": "ซิงค์ล่าสุดที่: ",
|
||||
"last_upload": "อัปโหลดล่าสุดที่: ",
|
||||
"last_download": "ดาวน์โหลดล่าสุดที่: ",
|
||||
"syncing_subtitle": "ซิงค์ความคืบหน้าของคุณระหว่างอุปกรณ์ต่างๆ ผ่านเซิร์ฟเวอร์ที่โฮสต์ด้วยตนเอง ดูข้อมูลเพิ่มเติมได้ที่เซิร์ฟเวอร์ Discord ของเรา",
|
||||
"last_sync_manga": "ซิงค์มังงะล่าสุดเมื่อ:",
|
||||
"last_sync_history": "ประวัติการซิงค์ครั้งล่าสุด:",
|
||||
"last_sync_update": "อัปเดตข้อมูลล่าสุดเมื่อ:",
|
||||
"sync_server": "ที่อยู่เซิร์ฟเวอร์ซิงค์",
|
||||
"sync_login_invalid_creds": "อีเมลหรือรหัสผ่านไม่ถูกต้อง",
|
||||
"sync_checking": "กำลังตรวจสอบการซิงค์...",
|
||||
"sync_uploading": "เริ่มการอัปโหลด...",
|
||||
"sync_downloading": "เริ่มการดาวน์โหลด...",
|
||||
"sync_upload_finished": "การอัปโหลดเสร็จสิ้น",
|
||||
"sync_download_finished": "การดาวน์โหลดเสร็จสิ้น",
|
||||
"sync_up_to_date": "ซิงค์ล่าสุด",
|
||||
"sync_upload_failed": "การอัปโหลดล้มเหลว",
|
||||
"sync_download_failed": "การดาวน์โหลดล้มเหลว",
|
||||
"sync_starting": "กำลังเริ่มการซิงค์...",
|
||||
"sync_finished": "การซิงค์เสร็จสิ้น",
|
||||
"sync_failed": "การซิงค์ล้มเหลว",
|
||||
"sync_button_sync": "ซิงค์ความคืบหน้า",
|
||||
"sync_button_upload": "อัปโหลดทั้งหมด",
|
||||
"sync_button_download": "ดาวน์โหลดทั้งหมด",
|
||||
"sync_confirm_upload": "การอัปโหลดทั้งหมดจะทำการแทนที่ข้อมูลระยะไกลด้วยข้อมูลปัจจุบันของคุณ!",
|
||||
"sync_confirm_download": "การดาวน์โหลดทั้งหมดจะทำการแทนที่ข้อมูลปัจจุบันของคุณด้วยข้อมูลจากระยะไกล!",
|
||||
"dialog_confirm": "ยืนยัน",
|
||||
"full_screen_player": "ใช้โหมดเต็มหน้าจอ",
|
||||
"full_screen_player_info": "ใช้โหมดเต็มหน้าจอโดยอัตโนมัติเมื่อเล่นวิดีโอ",
|
||||
"novel_sources": "แหล่งข้อมูลนวนิยาย",
|
||||
"novel_extensions": "ส่วนขยายของนวนิยาย",
|
||||
"novel": "นวนิยาย",
|
||||
"sync_after_reading": "ซิงค์หลังจากการอ่านหรือการชม",
|
||||
"sync_on_app_launch": "ซิงค์เมื่อเปิดแอป",
|
||||
"n_hour_ago": "{hour} ชั่วโมงที่แล้ว",
|
||||
"n_hours_ago": "{hours} ชั่วโมงที่แล้ว",
|
||||
"n_minute_ago": "{minute} นาทีที่แล้ว",
|
||||
|
|
@ -409,25 +398,7 @@
|
|||
"statistics": "สถิติ",
|
||||
"default_subtitle_language": "ภาษาคำบรรยายเริ่มต้น",
|
||||
"follow_system_theme": "ใช้ธีมระบบ",
|
||||
"sync_button_snapshot": "สร้างภาพรวม",
|
||||
"sync_confirm_snapshot": "ขอให้เซิร์ฟเวอร์สร้างข้อมูลสำรองระยะไกล!",
|
||||
"sync_on": "เปิดการซิงค์",
|
||||
"sync_pending_manga": "การเปลี่ยนแปลงมังงะที่รอดำเนินการ",
|
||||
"sync_pending_category": "การเปลี่ยนแปลงหมวดหมู่ที่รอดำเนินการ",
|
||||
"sync_pending_chapter": "การเปลี่ยนแปลงบทที่รอดำเนินการ",
|
||||
"sync_pending_history": "การเปลี่ยนแปลงประวัติที่รอดำเนินการ",
|
||||
"sync_pending_update": "การเปลี่ยนแปลงการอัปเดตที่รอดำเนินการ",
|
||||
"sync_pending_extension": "การเปลี่ยนแปลงส่วนขยายที่รอดำเนินการ",
|
||||
"sync_pending_track": "การเปลี่ยนแปลงการติดตามที่รอดำเนินการ",
|
||||
"sync_snapshot_creating": "กำลังสร้างภาพรวม...",
|
||||
"sync_snapshot_created": "สร้างภาพรวมแล้ว!",
|
||||
"sync_snapshot_deleting": "กำลังลบภาพรวม...",
|
||||
"sync_snapshot_deleted": "ลบภาพรวมแล้ว!",
|
||||
"sync_snapshot_no_data": "ไม่มีข้อมูลสำหรับสร้างภาพรวม! โปรดอัปโหลดทั้งหมดก่อน!",
|
||||
"sync_browse_snapshots": "เรียกดูข้อมูลสำรองเก่า",
|
||||
"sync_snapshots": "ภาพรวม",
|
||||
"sync_load_snapshot": "โหลดภาพรวม",
|
||||
"sync_delete_snapshot": "ลบภาพรวม",
|
||||
"sync_auto": "การซิงค์อัตโนมัติ",
|
||||
"sync_auto_warning": "การซิงค์อัตโนมัติเป็นฟีเจอร์ทดลองในขณะนี้!",
|
||||
"sync_auto_off": "ปิด",
|
||||
|
|
|
|||
|
|
@ -353,33 +353,22 @@
|
|||
"syncing": "Senkrone etme",
|
||||
"sync_password": "Şifre (en az 8 karakter)",
|
||||
"sync_logged": "Giriş başarılı",
|
||||
"syncing_subtitle": "Birden fazla cihazda ilerlemenizi kendinize ait bir \n sunucu üzerinden senkronize edin. İlk kez senkronize ediyorsanız, önce yüklediğinizden emin olun veya bu cihazda (otomatik) senkronize kullanmadan önce indirin!",
|
||||
"last_sync": "Son senkronizasyon zamanı: ",
|
||||
"last_upload": "Son yükleme zamanı: ",
|
||||
"last_download": "Son indirme zamanı: ",
|
||||
"syncing_subtitle": "İlerlemenizi kendi barındırdığınız bir \nserver aracılığıyla birden fazla cihaz arasında senkronize edin. Daha fazla bilgi için discord sunucumuza göz atın!",
|
||||
"last_sync_manga": "Son manga senkronizasyonu:",
|
||||
"last_sync_history": "Son tarih senkronizasyonu:",
|
||||
"last_sync_update": "Son güncelleme senkronizasyonu:",
|
||||
"sync_server": "Senkronizasyon Sunucu Adresi",
|
||||
"sync_login_invalid_creds": "Geçersiz e-posta veya şifre",
|
||||
"sync_checking": "Senkronizasyon kontrol ediliyor...",
|
||||
"sync_uploading": "Yükleme başladı...",
|
||||
"sync_downloading": "İndirme başladı...",
|
||||
"sync_upload_finished": "Yükleme tamamlandı",
|
||||
"sync_download_finished": "İndirme tamamlandı",
|
||||
"sync_up_to_date": "Senkronizasyon güncel",
|
||||
"sync_upload_failed": "Yükleme başarısız oldu",
|
||||
"sync_download_failed": "İndirme başarısız oldu",
|
||||
"sync_starting": "Senkronizasyonu başlatıyorum.",
|
||||
"sync_finished": "Senkronizasyon tamamlandı",
|
||||
"sync_failed": "Senkronizasyon başarısız",
|
||||
"sync_button_sync": "İlerlemeyi senkronize et",
|
||||
"sync_button_upload": "Tam yükleme",
|
||||
"sync_button_download": "Tam indirme",
|
||||
"sync_confirm_upload": "Tam yükleme, uzak veriyi tamamen mevcut verinizle değiştirecektir!",
|
||||
"sync_confirm_download": "Tam indirme, mevcut verinizi uzak verilerle tamamen değiştirecektir!",
|
||||
"dialog_confirm": "Onayla",
|
||||
"full_screen_player": "Tam ekran kullan",
|
||||
"full_screen_player_info": "Bir video oynatıldığında otomatik olarak tam ekran kullan.",
|
||||
"novel_sources": "Hikaye Kaynakları",
|
||||
"novel_extensions": "Hikaye Uzantıları",
|
||||
"novel": "Hikaye",
|
||||
"sync_after_reading": "Okuduktan veya izledikten sonra senkronize et",
|
||||
"sync_on_app_launch": "Uygulama açıldığında senkronize et",
|
||||
"skip_opening": "Açılışı atla",
|
||||
"skip_ending": "Sonu atla",
|
||||
"n_hour_ago": "{hour} saat önce",
|
||||
|
|
@ -406,25 +395,7 @@
|
|||
"statistics": "İstatistikler",
|
||||
"default_subtitle_language": "Varsayılan altyazı dili",
|
||||
"follow_system_theme": "Sistem temasını takip et",
|
||||
"sync_button_snapshot": "Anlık görüntü oluştur",
|
||||
"sync_confirm_snapshot": "Sunucudan uzak bir yedek oluşturmasını isteyin!",
|
||||
"sync_on": "Senkronizasyonu etkinleştir",
|
||||
"sync_pending_manga": "Bekleyen manga değişiklikleri",
|
||||
"sync_pending_category": "Bekleyen kategori değişiklikleri",
|
||||
"sync_pending_chapter": "Bekleyen bölüm değişiklikleri",
|
||||
"sync_pending_history": "Bekleyen geçmiş değişiklikleri",
|
||||
"sync_pending_update": "Bekleyen güncelleme değişiklikleri",
|
||||
"sync_pending_extension": "Bekleyen uzantı değişiklikleri",
|
||||
"sync_pending_track": "Bekleyen izleme değişiklikleri",
|
||||
"sync_snapshot_creating": "Anlık görüntü oluşturuluyor...",
|
||||
"sync_snapshot_created": "Anlık görüntü oluşturuldu!",
|
||||
"sync_snapshot_deleting": "Anlık görüntü siliniyor...",
|
||||
"sync_snapshot_deleted": "Anlık görüntü silindi!",
|
||||
"sync_snapshot_no_data": "Anlık görüntü oluşturmak için veri yok! Önce tam yükleme yapın!",
|
||||
"sync_browse_snapshots": "Eski yedekleri gözden geçir",
|
||||
"sync_snapshots": "Anlık görüntüler",
|
||||
"sync_load_snapshot": "Anlık görüntüyü yükle",
|
||||
"sync_delete_snapshot": "Anlık görüntüyü sil",
|
||||
"sync_auto": "Otomatik senkronizasyon",
|
||||
"sync_auto_warning": "Otomatik senkronizasyon şu anda deneysel bir özelliktir!",
|
||||
"sync_auto_off": "Kapalı",
|
||||
|
|
|
|||
|
|
@ -358,33 +358,22 @@
|
|||
"syncing": "同步",
|
||||
"sync_password": "密码(至少8个字符)",
|
||||
"sync_logged": "登录成功",
|
||||
"syncing_subtitle": "通过自托管服务器在多个设备间同步您的进度。首次同步时,请先上传;或者在设备上启用(自动)同步之前先下载!",
|
||||
"last_sync": "上次同步时间:",
|
||||
"last_upload": "上次上传时间:",
|
||||
"last_download": "上次下载时间:",
|
||||
"syncing_subtitle": "通过自托管的 \n服务器在多个设备上同步你的进度。查看我们的 discord 服务器,了解更多信息!",
|
||||
"last_sync_manga": "最新漫画同步于: ",
|
||||
"last_sync_history": "最后历史同步时间:",
|
||||
"last_sync_update": "最后更新同步于: ",
|
||||
"sync_server": "同步服务器地址",
|
||||
"sync_login_invalid_creds": "无效的电子邮件或密码",
|
||||
"sync_checking": "检查同步状态...",
|
||||
"sync_uploading": "上传开始...",
|
||||
"sync_downloading": "下载开始...",
|
||||
"sync_upload_finished": "上传完成",
|
||||
"sync_download_finished": "下载完成",
|
||||
"sync_up_to_date": "同步已是最新",
|
||||
"sync_upload_failed": "上传失败",
|
||||
"sync_download_failed": "下载失败",
|
||||
"sync_starting": "开始同步...",
|
||||
"sync_finished": "同步完成",
|
||||
"sync_failed": "同步失败",
|
||||
"sync_button_sync": "同步进度",
|
||||
"sync_button_upload": "完整上传",
|
||||
"sync_button_download": "完整下载",
|
||||
"sync_confirm_upload": "完整上传将用您当前的数据完全替换远程数据!",
|
||||
"sync_confirm_download": "完整下载将用远程数据完全替换您当前的数据!",
|
||||
"dialog_confirm": "确认",
|
||||
"full_screen_player": "使用全屏",
|
||||
"full_screen_player_info": "播放视频时自动使用全屏。",
|
||||
"novel_sources": "小说来源",
|
||||
"novel_extensions": "小说扩展",
|
||||
"novel": "小说",
|
||||
"sync_after_reading": "阅读或观看后同步",
|
||||
"sync_on_app_launch": "打开应用时同步",
|
||||
"skip_opening": "跳过片头",
|
||||
"skip_ending": "跳过片尾",
|
||||
"n_hour_ago": "{hour}小时前",
|
||||
|
|
@ -411,25 +400,7 @@
|
|||
"statistics": "统计",
|
||||
"default_subtitle_language": "默认字幕语言",
|
||||
"follow_system_theme": "跟随系统主题",
|
||||
"sync_button_snapshot": "创建快照",
|
||||
"sync_confirm_snapshot": "请求服务器创建当前备份的远程副本!",
|
||||
"sync_on": "启用同步",
|
||||
"sync_pending_manga": "漫画更改待处理",
|
||||
"sync_pending_category": "类别更改待处理",
|
||||
"sync_pending_chapter": "章节更改待处理",
|
||||
"sync_pending_history": "历史更改待处理",
|
||||
"sync_pending_update": "更新更改待处理",
|
||||
"sync_pending_extension": "扩展更改待处理",
|
||||
"sync_pending_track": "追踪更改待处理",
|
||||
"sync_snapshot_creating": "正在创建快照...",
|
||||
"sync_snapshot_created": "快照已创建!",
|
||||
"sync_snapshot_deleting": "正在删除快照...",
|
||||
"sync_snapshot_deleted": "快照已删除!",
|
||||
"sync_snapshot_no_data": "没有数据可创建快照!请先进行完整上传!",
|
||||
"sync_browse_snapshots": "浏览旧备份",
|
||||
"sync_snapshots": "快照",
|
||||
"sync_load_snapshot": "加载快照",
|
||||
"sync_delete_snapshot": "删除快照",
|
||||
"sync_auto": "自动同步",
|
||||
"sync_auto_warning": "自动同步目前是实验性功能!",
|
||||
"sync_auto_off": "关闭",
|
||||
|
|
|
|||
|
|
@ -1341,26 +1341,26 @@ abstract class AppLocalizations {
|
|||
/// No description provided for @syncing_subtitle.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Sync your progress across multiple devices via a self-hosted \nserver. Make sure to upload first if this is your first time \nsyncing or download before using (auto) sync on this device!'**
|
||||
/// **'Sync your progress across multiple devices via a self-hosted \nserver. Check out our discord server for more info!'**
|
||||
String get syncing_subtitle;
|
||||
|
||||
/// No description provided for @last_sync.
|
||||
/// No description provided for @last_sync_manga.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Last sync at: '**
|
||||
String get last_sync;
|
||||
/// **'Last manga sync at: '**
|
||||
String get last_sync_manga;
|
||||
|
||||
/// No description provided for @last_upload.
|
||||
/// No description provided for @last_sync_history.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Last upload at: '**
|
||||
String get last_upload;
|
||||
/// **'Last history sync at: '**
|
||||
String get last_sync_history;
|
||||
|
||||
/// No description provided for @last_download.
|
||||
/// No description provided for @last_sync_update.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Last download at: '**
|
||||
String get last_download;
|
||||
/// **'Last update sync at: '**
|
||||
String get last_sync_update;
|
||||
|
||||
/// No description provided for @sync_server.
|
||||
///
|
||||
|
|
@ -1374,53 +1374,23 @@ abstract class AppLocalizations {
|
|||
/// **'Invalid email or password'**
|
||||
String get sync_login_invalid_creds;
|
||||
|
||||
/// No description provided for @sync_checking.
|
||||
/// No description provided for @sync_starting.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Checking for sync...'**
|
||||
String get sync_checking;
|
||||
/// **'Starting sync...'**
|
||||
String get sync_starting;
|
||||
|
||||
/// No description provided for @sync_uploading.
|
||||
/// No description provided for @sync_finished.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Upload started...'**
|
||||
String get sync_uploading;
|
||||
/// **'Sync finished'**
|
||||
String get sync_finished;
|
||||
|
||||
/// No description provided for @sync_downloading.
|
||||
/// No description provided for @sync_failed.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Download started...'**
|
||||
String get sync_downloading;
|
||||
|
||||
/// No description provided for @sync_upload_finished.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Upload finished'**
|
||||
String get sync_upload_finished;
|
||||
|
||||
/// No description provided for @sync_download_finished.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Download finished'**
|
||||
String get sync_download_finished;
|
||||
|
||||
/// No description provided for @sync_up_to_date.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Sync up to date'**
|
||||
String get sync_up_to_date;
|
||||
|
||||
/// No description provided for @sync_upload_failed.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Upload failed'**
|
||||
String get sync_upload_failed;
|
||||
|
||||
/// No description provided for @sync_download_failed.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Download failed'**
|
||||
String get sync_download_failed;
|
||||
/// **'Sync failed'**
|
||||
String get sync_failed;
|
||||
|
||||
/// No description provided for @sync_button_sync.
|
||||
///
|
||||
|
|
@ -1428,144 +1398,12 @@ abstract class AppLocalizations {
|
|||
/// **'Sync progress'**
|
||||
String get sync_button_sync;
|
||||
|
||||
/// No description provided for @sync_button_snapshot.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Create snapshot'**
|
||||
String get sync_button_snapshot;
|
||||
|
||||
/// No description provided for @sync_button_upload.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Full upload'**
|
||||
String get sync_button_upload;
|
||||
|
||||
/// No description provided for @sync_button_download.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Full download'**
|
||||
String get sync_button_download;
|
||||
|
||||
/// No description provided for @sync_confirm_snapshot.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Request the server to create a remote copy of the current backup!'**
|
||||
String get sync_confirm_snapshot;
|
||||
|
||||
/// No description provided for @sync_confirm_upload.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'A full upload will completely replace the remote data with your current one!'**
|
||||
String get sync_confirm_upload;
|
||||
|
||||
/// No description provided for @sync_confirm_download.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'A full download will completely replace your current data with the remote one!'**
|
||||
String get sync_confirm_download;
|
||||
|
||||
/// No description provided for @sync_on.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Enable sync'**
|
||||
String get sync_on;
|
||||
|
||||
/// No description provided for @sync_pending_manga.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Manga changes pending'**
|
||||
String get sync_pending_manga;
|
||||
|
||||
/// No description provided for @sync_pending_category.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Category changes pending'**
|
||||
String get sync_pending_category;
|
||||
|
||||
/// No description provided for @sync_pending_chapter.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Chapter changes pending'**
|
||||
String get sync_pending_chapter;
|
||||
|
||||
/// No description provided for @sync_pending_history.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'History changes pending'**
|
||||
String get sync_pending_history;
|
||||
|
||||
/// No description provided for @sync_pending_update.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Update changes pending'**
|
||||
String get sync_pending_update;
|
||||
|
||||
/// No description provided for @sync_pending_extension.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Extension changes pending'**
|
||||
String get sync_pending_extension;
|
||||
|
||||
/// No description provided for @sync_pending_track.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Track changes pending'**
|
||||
String get sync_pending_track;
|
||||
|
||||
/// No description provided for @sync_snapshot_creating.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Creating snapshot...'**
|
||||
String get sync_snapshot_creating;
|
||||
|
||||
/// No description provided for @sync_snapshot_created.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Snapshot created!'**
|
||||
String get sync_snapshot_created;
|
||||
|
||||
/// No description provided for @sync_snapshot_deleting.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Deleting snapshot...'**
|
||||
String get sync_snapshot_deleting;
|
||||
|
||||
/// No description provided for @sync_snapshot_deleted.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Snapshot deleted!'**
|
||||
String get sync_snapshot_deleted;
|
||||
|
||||
/// No description provided for @sync_snapshot_no_data.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'No data to create a snapshot! Do a full upload first!'**
|
||||
String get sync_snapshot_no_data;
|
||||
|
||||
/// No description provided for @sync_browse_snapshots.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Browse older backups'**
|
||||
String get sync_browse_snapshots;
|
||||
|
||||
/// No description provided for @sync_snapshots.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Snapshots'**
|
||||
String get sync_snapshots;
|
||||
|
||||
/// No description provided for @sync_load_snapshot.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Load snapshot'**
|
||||
String get sync_load_snapshot;
|
||||
|
||||
/// No description provided for @sync_delete_snapshot.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Delete snapshot'**
|
||||
String get sync_delete_snapshot;
|
||||
|
||||
/// No description provided for @sync_auto.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
|
|
@ -1584,18 +1422,6 @@ abstract class AppLocalizations {
|
|||
/// **'Off'**
|
||||
String get sync_auto_off;
|
||||
|
||||
/// No description provided for @sync_auto_30_seconds.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Every 30 seconds'**
|
||||
String get sync_auto_30_seconds;
|
||||
|
||||
/// No description provided for @sync_auto_1_minute.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Every 1 minute'**
|
||||
String get sync_auto_1_minute;
|
||||
|
||||
/// No description provided for @sync_auto_5_minutes.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
|
|
|
|||
|
|
@ -644,16 +644,16 @@ class AppLocalizationsAr extends AppLocalizations {
|
|||
|
||||
@override
|
||||
String get syncing_subtitle =>
|
||||
'قم بمزامنة تقدمك عبر أجهزة متعددة باستخدام خادم مستضاف ذاتيًا.\nتأكد من التحميل أولاً إذا كانت هذه هي المرة الأولى التي تقوم فيها بالمزامنة\nأو قم بالتنزيل قبل استخدام المزامنة (التلقائية) على هذا الجهاز!';
|
||||
'قم بمزامنة تقدمك عبر أجهزة متعددة عبر خادم مستضاف ذاتيًا. اطّلع على خادم الخلاف الخاص بنا لمزيد من المعلومات!';
|
||||
|
||||
@override
|
||||
String get last_sync => 'آخر مزامنة في: ';
|
||||
String get last_sync_manga => 'آخر مزامنة مانغا في:';
|
||||
|
||||
@override
|
||||
String get last_upload => 'آخر تحميل في: ';
|
||||
String get last_sync_history => 'آخر مزامنة للتاريخ في:';
|
||||
|
||||
@override
|
||||
String get last_download => 'آخر تنزيل في: ';
|
||||
String get last_sync_update => 'آخر مزامنة تحديث في:';
|
||||
|
||||
@override
|
||||
String get sync_server => 'عنوان خادم المزامنة';
|
||||
|
|
@ -662,105 +662,20 @@ class AppLocalizationsAr extends AppLocalizations {
|
|||
String get sync_login_invalid_creds => 'بريد إلكتروني أو كلمة مرور غير صحيحة';
|
||||
|
||||
@override
|
||||
String get sync_checking => 'جارٍ التحقق من المزامنة...';
|
||||
String get sync_starting => 'بدء المزامنة...';
|
||||
|
||||
@override
|
||||
String get sync_uploading => 'بدأ التحميل...';
|
||||
String get sync_finished => 'تم الانتهاء من المزامنة';
|
||||
|
||||
@override
|
||||
String get sync_downloading => 'بدأ التنزيل...';
|
||||
|
||||
@override
|
||||
String get sync_upload_finished => 'اكتمل التحميل';
|
||||
|
||||
@override
|
||||
String get sync_download_finished => 'اكتمل التنزيل';
|
||||
|
||||
@override
|
||||
String get sync_up_to_date => 'المزامنة محدثة';
|
||||
|
||||
@override
|
||||
String get sync_upload_failed => 'فشل التحميل';
|
||||
|
||||
@override
|
||||
String get sync_download_failed => 'فشل التنزيل';
|
||||
String get sync_failed => 'فشل المزامنة';
|
||||
|
||||
@override
|
||||
String get sync_button_sync => 'مزامنة التقدم';
|
||||
|
||||
@override
|
||||
String get sync_button_snapshot => 'إنشاء لقطة';
|
||||
|
||||
@override
|
||||
String get sync_button_upload => 'تحميل كامل';
|
||||
|
||||
@override
|
||||
String get sync_button_download => 'تنزيل كامل';
|
||||
|
||||
@override
|
||||
String get sync_confirm_snapshot =>
|
||||
'اطلب من الخادم إنشاء نسخة احتياطية عن بُعد!';
|
||||
|
||||
@override
|
||||
String get sync_confirm_upload =>
|
||||
'التحميل الكامل سيستبدل البيانات الحالية على الخادم ببياناتك الحالية!';
|
||||
|
||||
@override
|
||||
String get sync_confirm_download =>
|
||||
'التنزيل الكامل سيستبدل بياناتك الحالية بالبيانات الموجودة على الخادم!';
|
||||
|
||||
@override
|
||||
String get sync_on => 'تمكين المزامنة';
|
||||
|
||||
@override
|
||||
String get sync_pending_manga => 'تغييرات المانجا معلقة';
|
||||
|
||||
@override
|
||||
String get sync_pending_category => 'تغييرات الفئة معلقة';
|
||||
|
||||
@override
|
||||
String get sync_pending_chapter => 'تغييرات الفصل معلقة';
|
||||
|
||||
@override
|
||||
String get sync_pending_history => 'تغييرات السجل معلقة';
|
||||
|
||||
@override
|
||||
String get sync_pending_update => 'تغييرات التحديث معلقة';
|
||||
|
||||
@override
|
||||
String get sync_pending_extension => 'تغييرات الامتداد معلقة';
|
||||
|
||||
@override
|
||||
String get sync_pending_track => 'تغييرات التتبع معلقة';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_creating => 'جارٍ إنشاء لقطة...';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_created => 'تم إنشاء اللقطة!';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_deleting => 'جارٍ حذف اللقطة...';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_deleted => 'تم حذف اللقطة!';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_no_data =>
|
||||
'لا توجد بيانات لإنشاء لقطة! قم بتحميل كامل أولاً!';
|
||||
|
||||
@override
|
||||
String get sync_browse_snapshots => 'تصفح النسخ الاحتياطية القديمة';
|
||||
|
||||
@override
|
||||
String get sync_snapshots => 'اللقطات';
|
||||
|
||||
@override
|
||||
String get sync_load_snapshot => 'تحميل لقطة';
|
||||
|
||||
@override
|
||||
String get sync_delete_snapshot => 'حذف لقطة';
|
||||
|
||||
@override
|
||||
String get sync_auto => 'المزامنة التلقائية';
|
||||
|
||||
|
|
@ -770,12 +685,6 @@ class AppLocalizationsAr extends AppLocalizations {
|
|||
@override
|
||||
String get sync_auto_off => 'إيقاف';
|
||||
|
||||
@override
|
||||
String get sync_auto_30_seconds => 'كل 30 ثانية';
|
||||
|
||||
@override
|
||||
String get sync_auto_1_minute => 'كل دقيقة';
|
||||
|
||||
@override
|
||||
String get sync_auto_5_minutes => 'كل 5 دقائق';
|
||||
|
||||
|
|
|
|||
|
|
@ -647,16 +647,16 @@ class AppLocalizationsDe extends AppLocalizations {
|
|||
|
||||
@override
|
||||
String get syncing_subtitle =>
|
||||
'Synchronisiere deinen Fortschritt über mehrere Geräte mithilfe \neines selbstgehosteten Servers. Beim ersten synchronisieren \nsolltest du zuerst \"Alles hochladen\" oder \"Alles herunterladen\" \nbevor du die (Auto-)Synchronisation auf diesem Gerät aktivierst!';
|
||||
'Synchronisiere deinen Fortschritt über mehrere Geräte mithilfe \neines selbstgehosteten Servers. Mehr Info gibt es bei unserem Discord Server!';
|
||||
|
||||
@override
|
||||
String get last_sync => 'Zuletzt synchronisiert: ';
|
||||
String get last_sync_manga => 'Manga zuletzt synchronisiert: ';
|
||||
|
||||
@override
|
||||
String get last_upload => 'Zuletzt hochgeladen: ';
|
||||
String get last_sync_history => 'Verlauf zuletzt synchronisiert: ';
|
||||
|
||||
@override
|
||||
String get last_download => 'Zuletzt heruntergeladen: ';
|
||||
String get last_sync_update => 'Update zuletzt synchronisiert: ';
|
||||
|
||||
@override
|
||||
String get sync_server => 'Sync Server IP Adresse / Domain';
|
||||
|
|
@ -665,106 +665,20 @@ class AppLocalizationsDe extends AppLocalizations {
|
|||
String get sync_login_invalid_creds => 'Ungültiger Email oder Passwort';
|
||||
|
||||
@override
|
||||
String get sync_checking => 'Synchronisierung wird vorbereitet...';
|
||||
String get sync_starting => 'Sync gestartet...';
|
||||
|
||||
@override
|
||||
String get sync_uploading => 'Hochladen...';
|
||||
String get sync_finished => 'Sync erfolgreich abgeschlossen!';
|
||||
|
||||
@override
|
||||
String get sync_downloading => 'Herunterladen...';
|
||||
|
||||
@override
|
||||
String get sync_upload_finished => 'Hochladen erfolgreich';
|
||||
|
||||
@override
|
||||
String get sync_download_finished => 'Herunterladen erfolgreich';
|
||||
|
||||
@override
|
||||
String get sync_up_to_date => 'Synchronisierung ist auf den neuesten Stand';
|
||||
|
||||
@override
|
||||
String get sync_upload_failed => 'Hochladen fehlgeschlagen';
|
||||
|
||||
@override
|
||||
String get sync_download_failed => 'Herunterladen fehlgeschlagen';
|
||||
String get sync_failed => 'Sync fehlgeschlagen!';
|
||||
|
||||
@override
|
||||
String get sync_button_sync => 'Jetzt synchronisieren';
|
||||
|
||||
@override
|
||||
String get sync_button_snapshot => 'Snapshot erstellen';
|
||||
|
||||
@override
|
||||
String get sync_button_upload => 'Alles hochladen';
|
||||
|
||||
@override
|
||||
String get sync_button_download => 'Alles herunterladen';
|
||||
|
||||
@override
|
||||
String get sync_confirm_snapshot =>
|
||||
'Erstelle eine Kopie des derzeiten Backups auf den Server!';
|
||||
|
||||
@override
|
||||
String get sync_confirm_upload =>
|
||||
'Deine Daten auf dem Server werden jetzt durch deinen lokalen Daten ersetzt!';
|
||||
|
||||
@override
|
||||
String get sync_confirm_download =>
|
||||
'Deine lokalen Daten werden jetzt durch den Daten vom Server ersetzt!';
|
||||
|
||||
@override
|
||||
String get sync_on => 'Sync aktivieren';
|
||||
|
||||
@override
|
||||
String get sync_pending_manga => 'Ausstehende Änderungen für Manga';
|
||||
|
||||
@override
|
||||
String get sync_pending_category => 'Ausstehende Änderungen für Kategorien';
|
||||
|
||||
@override
|
||||
String get sync_pending_chapter => 'Ausstehende Änderungen für Kapiteln';
|
||||
|
||||
@override
|
||||
String get sync_pending_history => 'Ausstehende Änderungen für Fortschritte';
|
||||
|
||||
@override
|
||||
String get sync_pending_update => 'Ausstehende Änderungen für Updates';
|
||||
|
||||
@override
|
||||
String get sync_pending_extension =>
|
||||
'Ausstehende Änderungen für Erweiterungen';
|
||||
|
||||
@override
|
||||
String get sync_pending_track => 'Ausstehende Änderungen für Trackings';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_creating => 'Erstelle Snapshot...';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_created => 'Snapshot wurde erstellt!';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_deleting => 'Lösche Snapshot...';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_deleted => 'Snapshot wurde gelöscht!';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_no_data =>
|
||||
'Keine Daten zum Sichern! Lade erstmal alles hoch!';
|
||||
|
||||
@override
|
||||
String get sync_browse_snapshots => 'Durchsuche ältere Backups';
|
||||
|
||||
@override
|
||||
String get sync_snapshots => 'Snapshots';
|
||||
|
||||
@override
|
||||
String get sync_load_snapshot => 'Snapshot laden';
|
||||
|
||||
@override
|
||||
String get sync_delete_snapshot => 'Snapshot löschen';
|
||||
|
||||
@override
|
||||
String get sync_auto => 'Auto Sync';
|
||||
|
||||
|
|
@ -775,12 +689,6 @@ class AppLocalizationsDe extends AppLocalizations {
|
|||
@override
|
||||
String get sync_auto_off => 'Aus';
|
||||
|
||||
@override
|
||||
String get sync_auto_30_seconds => 'Alle 30 Sekunden';
|
||||
|
||||
@override
|
||||
String get sync_auto_1_minute => 'Jede Minute';
|
||||
|
||||
@override
|
||||
String get sync_auto_5_minutes => 'Alle 5 Minuten';
|
||||
|
||||
|
|
|
|||
|
|
@ -645,16 +645,16 @@ class AppLocalizationsEn extends AppLocalizations {
|
|||
|
||||
@override
|
||||
String get syncing_subtitle =>
|
||||
'Sync your progress across multiple devices via a self-hosted \nserver. Make sure to upload first if this is your first time \nsyncing or download before using (auto) sync on this device!';
|
||||
'Sync your progress across multiple devices via a self-hosted \nserver. Check out our discord server for more info!';
|
||||
|
||||
@override
|
||||
String get last_sync => 'Last sync at: ';
|
||||
String get last_sync_manga => 'Last manga sync at: ';
|
||||
|
||||
@override
|
||||
String get last_upload => 'Last upload at: ';
|
||||
String get last_sync_history => 'Last history sync at: ';
|
||||
|
||||
@override
|
||||
String get last_download => 'Last download at: ';
|
||||
String get last_sync_update => 'Last update sync at: ';
|
||||
|
||||
@override
|
||||
String get sync_server => 'Sync Server Address';
|
||||
|
|
@ -663,105 +663,20 @@ class AppLocalizationsEn extends AppLocalizations {
|
|||
String get sync_login_invalid_creds => 'Invalid email or password';
|
||||
|
||||
@override
|
||||
String get sync_checking => 'Checking for sync...';
|
||||
String get sync_starting => 'Starting sync...';
|
||||
|
||||
@override
|
||||
String get sync_uploading => 'Upload started...';
|
||||
String get sync_finished => 'Sync finished';
|
||||
|
||||
@override
|
||||
String get sync_downloading => 'Download started...';
|
||||
|
||||
@override
|
||||
String get sync_upload_finished => 'Upload finished';
|
||||
|
||||
@override
|
||||
String get sync_download_finished => 'Download finished';
|
||||
|
||||
@override
|
||||
String get sync_up_to_date => 'Sync up to date';
|
||||
|
||||
@override
|
||||
String get sync_upload_failed => 'Upload failed';
|
||||
|
||||
@override
|
||||
String get sync_download_failed => 'Download failed';
|
||||
String get sync_failed => 'Sync failed';
|
||||
|
||||
@override
|
||||
String get sync_button_sync => 'Sync progress';
|
||||
|
||||
@override
|
||||
String get sync_button_snapshot => 'Create snapshot';
|
||||
|
||||
@override
|
||||
String get sync_button_upload => 'Full upload';
|
||||
|
||||
@override
|
||||
String get sync_button_download => 'Full download';
|
||||
|
||||
@override
|
||||
String get sync_confirm_snapshot =>
|
||||
'Request the server to create a remote copy of the current backup!';
|
||||
|
||||
@override
|
||||
String get sync_confirm_upload =>
|
||||
'A full upload will completely replace the remote data with your current one!';
|
||||
|
||||
@override
|
||||
String get sync_confirm_download =>
|
||||
'A full download will completely replace your current data with the remote one!';
|
||||
|
||||
@override
|
||||
String get sync_on => 'Enable sync';
|
||||
|
||||
@override
|
||||
String get sync_pending_manga => 'Manga changes pending';
|
||||
|
||||
@override
|
||||
String get sync_pending_category => 'Category changes pending';
|
||||
|
||||
@override
|
||||
String get sync_pending_chapter => 'Chapter changes pending';
|
||||
|
||||
@override
|
||||
String get sync_pending_history => 'History changes pending';
|
||||
|
||||
@override
|
||||
String get sync_pending_update => 'Update changes pending';
|
||||
|
||||
@override
|
||||
String get sync_pending_extension => 'Extension changes pending';
|
||||
|
||||
@override
|
||||
String get sync_pending_track => 'Track changes pending';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_creating => 'Creating snapshot...';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_created => 'Snapshot created!';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_deleting => 'Deleting snapshot...';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_deleted => 'Snapshot deleted!';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_no_data =>
|
||||
'No data to create a snapshot! Do a full upload first!';
|
||||
|
||||
@override
|
||||
String get sync_browse_snapshots => 'Browse older backups';
|
||||
|
||||
@override
|
||||
String get sync_snapshots => 'Snapshots';
|
||||
|
||||
@override
|
||||
String get sync_load_snapshot => 'Load snapshot';
|
||||
|
||||
@override
|
||||
String get sync_delete_snapshot => 'Delete snapshot';
|
||||
|
||||
@override
|
||||
String get sync_auto => 'Auto Sync';
|
||||
|
||||
|
|
@ -772,12 +687,6 @@ class AppLocalizationsEn extends AppLocalizations {
|
|||
@override
|
||||
String get sync_auto_off => 'Off';
|
||||
|
||||
@override
|
||||
String get sync_auto_30_seconds => 'Every 30 seconds';
|
||||
|
||||
@override
|
||||
String get sync_auto_1_minute => 'Every 1 minute';
|
||||
|
||||
@override
|
||||
String get sync_auto_5_minutes => 'Every 5 minutes';
|
||||
|
||||
|
|
|
|||
|
|
@ -649,16 +649,16 @@ class AppLocalizationsEs extends AppLocalizations {
|
|||
|
||||
@override
|
||||
String get syncing_subtitle =>
|
||||
'Sincroniza tu progreso entre varios dispositivos a través de un servidor autogestionado. Asegúrate de cargar primero si es la primera vez que sincronizas o descarga antes de usar la sincronización (automática) en este dispositivo.';
|
||||
'Sincroniza tu progreso en varios dispositivos a través de un servidor propio. Echa un vistazo a nuestro servidor Discord para más información.';
|
||||
|
||||
@override
|
||||
String get last_sync => 'Última sincronización: ';
|
||||
String get last_sync_manga => 'Última sincronización del manga en:';
|
||||
|
||||
@override
|
||||
String get last_upload => 'Última carga: ';
|
||||
String get last_sync_history => 'Última sincronización de la historia en:';
|
||||
|
||||
@override
|
||||
String get last_download => 'Última descarga: ';
|
||||
String get last_sync_update => 'Última actualización sincronizada en:';
|
||||
|
||||
@override
|
||||
String get sync_server => 'Dirección del servidor de sincronización';
|
||||
|
|
@ -667,105 +667,20 @@ class AppLocalizationsEs extends AppLocalizations {
|
|||
String get sync_login_invalid_creds => 'Correo o contraseña inválidos';
|
||||
|
||||
@override
|
||||
String get sync_checking => 'Comprobando sincronización...';
|
||||
String get sync_starting => 'Empezando la sincronización...';
|
||||
|
||||
@override
|
||||
String get sync_uploading => 'Iniciando carga...';
|
||||
String get sync_finished => 'Sincronización finalizada';
|
||||
|
||||
@override
|
||||
String get sync_downloading => 'Iniciando descarga...';
|
||||
|
||||
@override
|
||||
String get sync_upload_finished => 'Carga finalizada';
|
||||
|
||||
@override
|
||||
String get sync_download_finished => 'Descarga finalizada';
|
||||
|
||||
@override
|
||||
String get sync_up_to_date => 'Sincronización actualizada';
|
||||
|
||||
@override
|
||||
String get sync_upload_failed => 'Carga fallida';
|
||||
|
||||
@override
|
||||
String get sync_download_failed => 'Descarga fallida';
|
||||
String get sync_failed => 'Error de sincronización';
|
||||
|
||||
@override
|
||||
String get sync_button_sync => 'Sincronizar progreso';
|
||||
|
||||
@override
|
||||
String get sync_button_snapshot => 'Crear instantánea';
|
||||
|
||||
@override
|
||||
String get sync_button_upload => 'Carga completa';
|
||||
|
||||
@override
|
||||
String get sync_button_download => 'Descarga completa';
|
||||
|
||||
@override
|
||||
String get sync_confirm_snapshot =>
|
||||
'¡Solicita al servidor crear una copia de seguridad remota!';
|
||||
|
||||
@override
|
||||
String get sync_confirm_upload =>
|
||||
'¡Una carga completa reemplazará completamente los datos remotos con los actuales!';
|
||||
|
||||
@override
|
||||
String get sync_confirm_download =>
|
||||
'¡Una descarga completa reemplazará completamente tus datos actuales con los remotos!';
|
||||
|
||||
@override
|
||||
String get sync_on => 'Habilitar sincronización';
|
||||
|
||||
@override
|
||||
String get sync_pending_manga => 'Cambios pendientes en manga';
|
||||
|
||||
@override
|
||||
String get sync_pending_category => 'Cambios pendientes en categorías';
|
||||
|
||||
@override
|
||||
String get sync_pending_chapter => 'Cambios pendientes en capítulos';
|
||||
|
||||
@override
|
||||
String get sync_pending_history => 'Cambios pendientes en historial';
|
||||
|
||||
@override
|
||||
String get sync_pending_update => 'Cambios pendientes en actualizaciones';
|
||||
|
||||
@override
|
||||
String get sync_pending_extension => 'Cambios pendientes en extensiones';
|
||||
|
||||
@override
|
||||
String get sync_pending_track => 'Cambios pendientes en seguimiento';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_creating => 'Creando instantánea...';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_created => '¡Instantánea creada!';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_deleting => 'Eliminando instantánea...';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_deleted => '¡Instantánea eliminada!';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_no_data =>
|
||||
'¡No hay datos para crear una instantánea! ¡Haz una carga completa primero!';
|
||||
|
||||
@override
|
||||
String get sync_browse_snapshots => 'Explorar copias de seguridad antiguas';
|
||||
|
||||
@override
|
||||
String get sync_snapshots => 'Instantáneas';
|
||||
|
||||
@override
|
||||
String get sync_load_snapshot => 'Cargar instantánea';
|
||||
|
||||
@override
|
||||
String get sync_delete_snapshot => 'Eliminar instantánea';
|
||||
|
||||
@override
|
||||
String get sync_auto => 'Sincronización automática';
|
||||
|
||||
|
|
@ -776,12 +691,6 @@ class AppLocalizationsEs extends AppLocalizations {
|
|||
@override
|
||||
String get sync_auto_off => 'Desactivado';
|
||||
|
||||
@override
|
||||
String get sync_auto_30_seconds => 'Cada 30 segundos';
|
||||
|
||||
@override
|
||||
String get sync_auto_1_minute => 'Cada 1 minuto';
|
||||
|
||||
@override
|
||||
String get sync_auto_5_minutes => 'Cada 5 minutos';
|
||||
|
||||
|
|
@ -2194,16 +2103,16 @@ class AppLocalizationsEs419 extends AppLocalizationsEs {
|
|||
|
||||
@override
|
||||
String get syncing_subtitle =>
|
||||
'Sincroniza tu progreso en varios dispositivos mediante un servidor \npropio. Asegúrate de cargar primero si es la primera vez que \nsincronizas o de descargar antes de usar la sincronización \n(automática) en este dispositivo.';
|
||||
'Sincroniza tu progreso en varios dispositivos a través de un servidor propio. Echa un vistazo a nuestro servidor Discord para más información.';
|
||||
|
||||
@override
|
||||
String get last_sync => 'Última sincronización: ';
|
||||
String get last_sync_manga => 'Última sincronización del manga en:';
|
||||
|
||||
@override
|
||||
String get last_upload => 'Última carga: ';
|
||||
String get last_sync_history => 'Última sincronización de la historia en:';
|
||||
|
||||
@override
|
||||
String get last_download => 'Última descarga: ';
|
||||
String get last_sync_update => 'Última actualización sincronizada en:';
|
||||
|
||||
@override
|
||||
String get sync_server => 'Dirección del servidor de sincronización';
|
||||
|
|
@ -2213,105 +2122,20 @@ class AppLocalizationsEs419 extends AppLocalizationsEs {
|
|||
'Correo electrónico o contraseña inválidos';
|
||||
|
||||
@override
|
||||
String get sync_checking => 'Comprobando sincronización...';
|
||||
String get sync_starting => 'Empezando la sincronización...';
|
||||
|
||||
@override
|
||||
String get sync_uploading => 'Iniciando carga...';
|
||||
String get sync_finished => 'Sincronización finalizada';
|
||||
|
||||
@override
|
||||
String get sync_downloading => 'Iniciando descarga...';
|
||||
|
||||
@override
|
||||
String get sync_upload_finished => 'Carga completada';
|
||||
|
||||
@override
|
||||
String get sync_download_finished => 'Descarga completada';
|
||||
|
||||
@override
|
||||
String get sync_up_to_date => 'Sincronización al día';
|
||||
|
||||
@override
|
||||
String get sync_upload_failed => 'Error en la carga';
|
||||
|
||||
@override
|
||||
String get sync_download_failed => 'Error en la descarga';
|
||||
String get sync_failed => 'Error de sincronización';
|
||||
|
||||
@override
|
||||
String get sync_button_sync => 'Sincronizar progreso';
|
||||
|
||||
@override
|
||||
String get sync_button_snapshot => 'Crear instantánea';
|
||||
|
||||
@override
|
||||
String get sync_button_upload => 'Carga completa';
|
||||
|
||||
@override
|
||||
String get sync_button_download => 'Descarga completa';
|
||||
|
||||
@override
|
||||
String get sync_confirm_snapshot =>
|
||||
'¡Solicita al servidor crear una copia de seguridad remota!';
|
||||
|
||||
@override
|
||||
String get sync_confirm_upload =>
|
||||
'¡Una carga completa reemplazará por completo los datos remotos con los actuales!';
|
||||
|
||||
@override
|
||||
String get sync_confirm_download =>
|
||||
'¡Una descarga completa reemplazará por completo tus datos actuales con los remotos!';
|
||||
|
||||
@override
|
||||
String get sync_on => 'Habilitar sincronización';
|
||||
|
||||
@override
|
||||
String get sync_pending_manga => 'Cambios pendientes en manga';
|
||||
|
||||
@override
|
||||
String get sync_pending_category => 'Cambios pendientes en categorías';
|
||||
|
||||
@override
|
||||
String get sync_pending_chapter => 'Cambios pendientes en capítulos';
|
||||
|
||||
@override
|
||||
String get sync_pending_history => 'Cambios pendientes en historial';
|
||||
|
||||
@override
|
||||
String get sync_pending_update => 'Cambios pendientes en actualizaciones';
|
||||
|
||||
@override
|
||||
String get sync_pending_extension => 'Cambios pendientes en extensiones';
|
||||
|
||||
@override
|
||||
String get sync_pending_track => 'Cambios pendientes en seguimiento';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_creating => 'Creando instantánea...';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_created => '¡Instantánea creada!';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_deleting => 'Eliminando instantánea...';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_deleted => '¡Instantánea eliminada!';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_no_data =>
|
||||
'¡No hay datos para crear una instantánea! ¡Haz una carga completa primero!';
|
||||
|
||||
@override
|
||||
String get sync_browse_snapshots => 'Explorar copias de seguridad antiguas';
|
||||
|
||||
@override
|
||||
String get sync_snapshots => 'Instantáneas';
|
||||
|
||||
@override
|
||||
String get sync_load_snapshot => 'Cargar instantánea';
|
||||
|
||||
@override
|
||||
String get sync_delete_snapshot => 'Eliminar instantánea';
|
||||
|
||||
@override
|
||||
String get sync_auto => 'Sincronización automática';
|
||||
|
||||
|
|
@ -2322,12 +2146,6 @@ class AppLocalizationsEs419 extends AppLocalizationsEs {
|
|||
@override
|
||||
String get sync_auto_off => 'Desactivado';
|
||||
|
||||
@override
|
||||
String get sync_auto_30_seconds => 'Cada 30 segundos';
|
||||
|
||||
@override
|
||||
String get sync_auto_1_minute => 'Cada 1 minuto';
|
||||
|
||||
@override
|
||||
String get sync_auto_5_minutes => 'Cada 5 minutos';
|
||||
|
||||
|
|
|
|||
|
|
@ -651,16 +651,17 @@ class AppLocalizationsFr extends AppLocalizations {
|
|||
|
||||
@override
|
||||
String get syncing_subtitle =>
|
||||
'Synchronisez vos progrès sur plusieurs appareils via un serveur auto-hébergé. Assurez-vous de télécharger d\'abord si c\'est votre première synchronisation ou de télécharger avant d\'utiliser la synchronisation (auto) sur cet appareil !';
|
||||
'Synchronisez votre progression sur plusieurs appareils via un serveur auto-hébergé. Consultez notre serveur discord pour plus d\'informations !';
|
||||
|
||||
@override
|
||||
String get last_sync => 'Dernière synchronisation : ';
|
||||
String get last_sync_manga => 'Dernière synchro du manga à :';
|
||||
|
||||
@override
|
||||
String get last_upload => 'Dernier téléversement : ';
|
||||
String get last_sync_history => 'Dernière synchro historique au :';
|
||||
|
||||
@override
|
||||
String get last_download => 'Dernier téléchargement : ';
|
||||
String get last_sync_update =>
|
||||
'Dernière mise à jour de la synchronisation au :';
|
||||
|
||||
@override
|
||||
String get sync_server => 'Adresse du serveur de synchronisation';
|
||||
|
|
@ -669,110 +670,20 @@ class AppLocalizationsFr extends AppLocalizations {
|
|||
String get sync_login_invalid_creds => 'E-mail ou mot de passe invalide';
|
||||
|
||||
@override
|
||||
String get sync_checking => 'Vérification de la synchronisation...';
|
||||
String get sync_starting => 'Synchronisation de départ...';
|
||||
|
||||
@override
|
||||
String get sync_uploading => 'Téléversement en cours...';
|
||||
String get sync_finished => 'Synchronisation terminée';
|
||||
|
||||
@override
|
||||
String get sync_downloading => 'Téléchargement en cours...';
|
||||
|
||||
@override
|
||||
String get sync_upload_finished => 'Téléversement terminé';
|
||||
|
||||
@override
|
||||
String get sync_download_finished => 'Téléchargement terminé';
|
||||
|
||||
@override
|
||||
String get sync_up_to_date => 'Synchronisation à jour';
|
||||
|
||||
@override
|
||||
String get sync_upload_failed => 'Échec du téléversement';
|
||||
|
||||
@override
|
||||
String get sync_download_failed => 'Échec du téléchargement';
|
||||
String get sync_failed => 'Échec de la synchronisation';
|
||||
|
||||
@override
|
||||
String get sync_button_sync => 'Synchroniser les progrès';
|
||||
|
||||
@override
|
||||
String get sync_button_snapshot => 'Créer un instantané';
|
||||
|
||||
@override
|
||||
String get sync_button_upload => 'Téléversement complet';
|
||||
|
||||
@override
|
||||
String get sync_button_download => 'Téléchargement complet';
|
||||
|
||||
@override
|
||||
String get sync_confirm_snapshot =>
|
||||
'Demandez au serveur de créer une copie de sauvegarde distante !';
|
||||
|
||||
@override
|
||||
String get sync_confirm_upload =>
|
||||
'Un téléversement complet remplacera entièrement les données distantes par vos données actuelles !';
|
||||
|
||||
@override
|
||||
String get sync_confirm_download =>
|
||||
'Un téléchargement complet remplacera entièrement vos données actuelles par les données distantes !';
|
||||
|
||||
@override
|
||||
String get sync_on => 'Activer la synchronisation';
|
||||
|
||||
@override
|
||||
String get sync_pending_manga => 'Modifications en attente pour les mangas';
|
||||
|
||||
@override
|
||||
String get sync_pending_category =>
|
||||
'Modifications en attente pour les catégories';
|
||||
|
||||
@override
|
||||
String get sync_pending_chapter =>
|
||||
'Modifications en attente pour les chapitres';
|
||||
|
||||
@override
|
||||
String get sync_pending_history =>
|
||||
'Modifications en attente pour l\'historique';
|
||||
|
||||
@override
|
||||
String get sync_pending_update =>
|
||||
'Modifications en attente pour les mises à jour';
|
||||
|
||||
@override
|
||||
String get sync_pending_extension =>
|
||||
'Modifications en attente pour les extensions';
|
||||
|
||||
@override
|
||||
String get sync_pending_track => 'Modifications en attente pour le suivi';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_creating => 'Création de l\'instantané...';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_created => 'Instantané créé !';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_deleting => 'Suppression de l\'instantané...';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_deleted => 'Instantané supprimé !';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_no_data =>
|
||||
'Aucune donnée pour créer un instantané ! Effectuez d\'abord un téléchargement complet !';
|
||||
|
||||
@override
|
||||
String get sync_browse_snapshots => 'Parcourir les sauvegardes précédentes';
|
||||
|
||||
@override
|
||||
String get sync_snapshots => 'Instantanés';
|
||||
|
||||
@override
|
||||
String get sync_load_snapshot => 'Charger l\'instantané';
|
||||
|
||||
@override
|
||||
String get sync_delete_snapshot => 'Supprimer l\'instantané';
|
||||
|
||||
@override
|
||||
String get sync_auto => 'Synchronisation automatique';
|
||||
|
||||
|
|
@ -783,12 +694,6 @@ class AppLocalizationsFr extends AppLocalizations {
|
|||
@override
|
||||
String get sync_auto_off => 'Désactivé';
|
||||
|
||||
@override
|
||||
String get sync_auto_30_seconds => 'Toutes les 30 secondes';
|
||||
|
||||
@override
|
||||
String get sync_auto_1_minute => 'Toutes les 1 minute';
|
||||
|
||||
@override
|
||||
String get sync_auto_5_minutes => 'Toutes les 5 minutes';
|
||||
|
||||
|
|
|
|||
|
|
@ -649,16 +649,16 @@ class AppLocalizationsId extends AppLocalizations {
|
|||
|
||||
@override
|
||||
String get syncing_subtitle =>
|
||||
'Sinkronkan progres Anda di beberapa perangkat melalui server \nself-hosted. Pastikan untuk mengunggah terlebih dahulu jika ini \nadalah pertama kalinya Anda menyinkronkan, atau unduh sebelum menggunakan sinkronisasi (otomatis) di perangkat ini!';
|
||||
'Sinkronkan kemajuan Anda di beberapa perangkat melalui \nserver yang dihosting sendiri. Lihat server discord kami untuk info lebih lanjut!';
|
||||
|
||||
@override
|
||||
String get last_sync => 'Sinkronisasi terakhir pada: ';
|
||||
String get last_sync_manga => 'Sinkronisasi manga terakhir di:';
|
||||
|
||||
@override
|
||||
String get last_upload => 'Unggahan terakhir pada: ';
|
||||
String get last_sync_history => 'Sinkronisasi riwayat terakhir pada:';
|
||||
|
||||
@override
|
||||
String get last_download => 'Unduhan terakhir pada: ';
|
||||
String get last_sync_update => 'Sinkronisasi pembaruan terakhir pada:';
|
||||
|
||||
@override
|
||||
String get sync_server => 'Alamat Server Sinkronisasi';
|
||||
|
|
@ -667,105 +667,20 @@ class AppLocalizationsId extends AppLocalizations {
|
|||
String get sync_login_invalid_creds => 'Email atau kata sandi tidak valid';
|
||||
|
||||
@override
|
||||
String get sync_checking => 'Memeriksa sinkronisasi...';
|
||||
String get sync_starting => 'Memulai sinkronisasi...';
|
||||
|
||||
@override
|
||||
String get sync_uploading => 'Unggahan dimulai...';
|
||||
String get sync_finished => 'Sinkronisasi selesai';
|
||||
|
||||
@override
|
||||
String get sync_downloading => 'Unduhan dimulai...';
|
||||
|
||||
@override
|
||||
String get sync_upload_finished => 'Unggahan selesai';
|
||||
|
||||
@override
|
||||
String get sync_download_finished => 'Unduhan selesai';
|
||||
|
||||
@override
|
||||
String get sync_up_to_date => 'Sinkronisasi terkini';
|
||||
|
||||
@override
|
||||
String get sync_upload_failed => 'Unggahan gagal';
|
||||
|
||||
@override
|
||||
String get sync_download_failed => 'Unduhan gagal';
|
||||
String get sync_failed => 'Sinkronisasi gagal';
|
||||
|
||||
@override
|
||||
String get sync_button_sync => 'Sinkronkan progres';
|
||||
|
||||
@override
|
||||
String get sync_button_snapshot => 'Buat snapshot';
|
||||
|
||||
@override
|
||||
String get sync_button_upload => 'Unggah penuh';
|
||||
|
||||
@override
|
||||
String get sync_button_download => 'Unduh penuh';
|
||||
|
||||
@override
|
||||
String get sync_confirm_snapshot =>
|
||||
'Minta server untuk membuat salinan cadangan jarak jauh!';
|
||||
|
||||
@override
|
||||
String get sync_confirm_upload =>
|
||||
'Unggahan penuh akan sepenuhnya menggantikan data jarak jauh dengan data Anda saat ini!';
|
||||
|
||||
@override
|
||||
String get sync_confirm_download =>
|
||||
'Unduhan penuh akan sepenuhnya menggantikan data Anda saat ini dengan data jarak jauh!';
|
||||
|
||||
@override
|
||||
String get sync_on => 'Aktifkan sinkronisasi';
|
||||
|
||||
@override
|
||||
String get sync_pending_manga => 'Perubahan manga tertunda';
|
||||
|
||||
@override
|
||||
String get sync_pending_category => 'Perubahan kategori tertunda';
|
||||
|
||||
@override
|
||||
String get sync_pending_chapter => 'Perubahan bab tertunda';
|
||||
|
||||
@override
|
||||
String get sync_pending_history => 'Perubahan riwayat tertunda';
|
||||
|
||||
@override
|
||||
String get sync_pending_update => 'Perubahan pembaruan tertunda';
|
||||
|
||||
@override
|
||||
String get sync_pending_extension => 'Perubahan ekstensi tertunda';
|
||||
|
||||
@override
|
||||
String get sync_pending_track => 'Perubahan pelacakan tertunda';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_creating => 'Membuat snapshot...';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_created => 'Snapshot dibuat!';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_deleting => 'Menghapus snapshot...';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_deleted => 'Snapshot dihapus!';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_no_data =>
|
||||
'Tidak ada data untuk membuat snapshot! Lakukan unggahan penuh terlebih dahulu!';
|
||||
|
||||
@override
|
||||
String get sync_browse_snapshots => 'Jelajahi cadangan lama';
|
||||
|
||||
@override
|
||||
String get sync_snapshots => 'Snapshot';
|
||||
|
||||
@override
|
||||
String get sync_load_snapshot => 'Muat snapshot';
|
||||
|
||||
@override
|
||||
String get sync_delete_snapshot => 'Hapus snapshot';
|
||||
|
||||
@override
|
||||
String get sync_auto => 'Sinkronisasi otomatis';
|
||||
|
||||
|
|
@ -776,12 +691,6 @@ class AppLocalizationsId extends AppLocalizations {
|
|||
@override
|
||||
String get sync_auto_off => 'Mati';
|
||||
|
||||
@override
|
||||
String get sync_auto_30_seconds => 'Setiap 30 detik';
|
||||
|
||||
@override
|
||||
String get sync_auto_1_minute => 'Setiap 1 menit';
|
||||
|
||||
@override
|
||||
String get sync_auto_5_minutes => 'Setiap 5 menit';
|
||||
|
||||
|
|
|
|||
|
|
@ -649,16 +649,16 @@ class AppLocalizationsIt extends AppLocalizations {
|
|||
|
||||
@override
|
||||
String get syncing_subtitle =>
|
||||
'Sincronizza i tuoi progressi su più dispositivi tramite un server \nospitato autonomamente. Assicurati di caricare prima se è la \ntua prima sincronizzazione o di scaricare prima di utilizzare la \nsincronizzazione (automatica) su questo dispositivo!';
|
||||
'Sincronizza i tuoi progressi su più dispositivi tramite un server discord auto-ospitato. Per maggiori informazioni, visita il nostro server discord!';
|
||||
|
||||
@override
|
||||
String get last_sync => 'Ultima sincronizzazione: ';
|
||||
String get last_sync_manga => 'Ultima sincronizzazione del manga a:';
|
||||
|
||||
@override
|
||||
String get last_upload => 'Ultimo caricamento: ';
|
||||
String get last_sync_history => 'Ultima storia sincronizzata a:';
|
||||
|
||||
@override
|
||||
String get last_download => 'Ultimo download: ';
|
||||
String get last_sync_update => 'Ultimo aggiornamento: sincronizzazione a:';
|
||||
|
||||
@override
|
||||
String get sync_server => 'Indirizzo del server di sincronizzazione';
|
||||
|
|
@ -667,106 +667,20 @@ class AppLocalizationsIt extends AppLocalizations {
|
|||
String get sync_login_invalid_creds => 'Email o password non validi';
|
||||
|
||||
@override
|
||||
String get sync_checking => 'Verifica sincronizzazione...';
|
||||
String get sync_starting => 'Avvio della sincronizzazione...';
|
||||
|
||||
@override
|
||||
String get sync_uploading => 'Caricamento iniziato...';
|
||||
String get sync_finished => 'Sincronizzazione terminata';
|
||||
|
||||
@override
|
||||
String get sync_downloading => 'Download iniziato...';
|
||||
|
||||
@override
|
||||
String get sync_upload_finished => 'Caricamento completato';
|
||||
|
||||
@override
|
||||
String get sync_download_finished => 'Download completato';
|
||||
|
||||
@override
|
||||
String get sync_up_to_date => 'Sincronizzazione aggiornata';
|
||||
|
||||
@override
|
||||
String get sync_upload_failed => 'Caricamento fallito';
|
||||
|
||||
@override
|
||||
String get sync_download_failed => 'Download fallito';
|
||||
String get sync_failed => 'Sincronizzazione fallita';
|
||||
|
||||
@override
|
||||
String get sync_button_sync => 'Sincronizza progressi';
|
||||
|
||||
@override
|
||||
String get sync_button_snapshot => 'Crea istantanea';
|
||||
|
||||
@override
|
||||
String get sync_button_upload => 'Caricamento completo';
|
||||
|
||||
@override
|
||||
String get sync_button_download => 'Download completo';
|
||||
|
||||
@override
|
||||
String get sync_confirm_snapshot =>
|
||||
'Richiedi al server di creare un backup remoto!';
|
||||
|
||||
@override
|
||||
String get sync_confirm_upload =>
|
||||
'Un caricamento completo sostituirà completamente i dati remoti con quelli attuali!';
|
||||
|
||||
@override
|
||||
String get sync_confirm_download =>
|
||||
'Un download completo sostituirà completamente i tuoi dati attuali con quelli remoti!';
|
||||
|
||||
@override
|
||||
String get sync_on => 'Abilita sincronizzazione';
|
||||
|
||||
@override
|
||||
String get sync_pending_manga => 'Modifiche in sospeso per i manga';
|
||||
|
||||
@override
|
||||
String get sync_pending_category => 'Modifiche in sospeso per le categorie';
|
||||
|
||||
@override
|
||||
String get sync_pending_chapter => 'Modifiche in sospeso per i capitoli';
|
||||
|
||||
@override
|
||||
String get sync_pending_history => 'Modifiche in sospeso per la cronologia';
|
||||
|
||||
@override
|
||||
String get sync_pending_update =>
|
||||
'Modifiche in sospeso per gli aggiornamenti';
|
||||
|
||||
@override
|
||||
String get sync_pending_extension => 'Modifiche in sospeso per le estensioni';
|
||||
|
||||
@override
|
||||
String get sync_pending_track => 'Modifiche in sospeso per il tracciamento';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_creating => 'Creazione dell\'istantanea...';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_created => 'Istantanea creata!';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_deleting => 'Eliminazione dell\'istantanea...';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_deleted => 'Istantanea eliminata!';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_no_data =>
|
||||
'Nessun dato per creare un\'istantanea! Esegui prima un caricamento completo!';
|
||||
|
||||
@override
|
||||
String get sync_browse_snapshots => 'Esplora vecchi backup';
|
||||
|
||||
@override
|
||||
String get sync_snapshots => 'Istantanee';
|
||||
|
||||
@override
|
||||
String get sync_load_snapshot => 'Carica istantanea';
|
||||
|
||||
@override
|
||||
String get sync_delete_snapshot => 'Elimina istantanea';
|
||||
|
||||
@override
|
||||
String get sync_auto => 'Sincronizzazione automatica';
|
||||
|
||||
|
|
@ -777,12 +691,6 @@ class AppLocalizationsIt extends AppLocalizations {
|
|||
@override
|
||||
String get sync_auto_off => 'Disattivato';
|
||||
|
||||
@override
|
||||
String get sync_auto_30_seconds => 'Ogni 30 secondi';
|
||||
|
||||
@override
|
||||
String get sync_auto_1_minute => 'Ogni 1 minuto';
|
||||
|
||||
@override
|
||||
String get sync_auto_5_minutes => 'Ogni 5 minuti';
|
||||
|
||||
|
|
|
|||
|
|
@ -649,16 +649,16 @@ class AppLocalizationsPt extends AppLocalizations {
|
|||
|
||||
@override
|
||||
String get syncing_subtitle =>
|
||||
'Sincronize seu progresso entre vários dispositivos via um servidor auto-hospedado. Certifique-se de fazer o upload primeiro se for sua primeira vez sincronizando ou baixe antes de usar a sincronização (automática) neste dispositivo!';
|
||||
'Sincroniza o teu progresso em vários dispositivos através de um \nserver auto-hospedado. Consulta o nosso servidor discord para mais informações!';
|
||||
|
||||
@override
|
||||
String get last_sync => 'Última sincronização em: ';
|
||||
String get last_sync_manga => 'Última sincronização da manga em:';
|
||||
|
||||
@override
|
||||
String get last_upload => 'Último upload em: ';
|
||||
String get last_sync_history => 'Última sincronização da história em:';
|
||||
|
||||
@override
|
||||
String get last_download => 'Último download em: ';
|
||||
String get last_sync_update => 'Última atualização sincronizada em:';
|
||||
|
||||
@override
|
||||
String get sync_server => 'Endereço do servidor de sincronização';
|
||||
|
|
@ -667,105 +667,20 @@ class AppLocalizationsPt extends AppLocalizations {
|
|||
String get sync_login_invalid_creds => 'E-mail ou senha inválidos';
|
||||
|
||||
@override
|
||||
String get sync_checking => 'Verificando sincronização...';
|
||||
String get sync_starting => 'Iniciar a sincronização...';
|
||||
|
||||
@override
|
||||
String get sync_uploading => 'Upload iniciado...';
|
||||
String get sync_finished => 'Sincronização concluída';
|
||||
|
||||
@override
|
||||
String get sync_downloading => 'Download iniciado...';
|
||||
|
||||
@override
|
||||
String get sync_upload_finished => 'Upload concluído';
|
||||
|
||||
@override
|
||||
String get sync_download_finished => 'Download concluído';
|
||||
|
||||
@override
|
||||
String get sync_up_to_date => 'Sincronização atualizada';
|
||||
|
||||
@override
|
||||
String get sync_upload_failed => 'Upload falhou';
|
||||
|
||||
@override
|
||||
String get sync_download_failed => 'Download falhou';
|
||||
String get sync_failed => 'A sincronização falhou';
|
||||
|
||||
@override
|
||||
String get sync_button_sync => 'Sincronizar progresso';
|
||||
|
||||
@override
|
||||
String get sync_button_snapshot => 'Criar instantâneo';
|
||||
|
||||
@override
|
||||
String get sync_button_upload => 'Upload completo';
|
||||
|
||||
@override
|
||||
String get sync_button_download => 'Download completo';
|
||||
|
||||
@override
|
||||
String get sync_confirm_snapshot =>
|
||||
'Solicite ao servidor para criar um backup remoto!';
|
||||
|
||||
@override
|
||||
String get sync_confirm_upload =>
|
||||
'Um upload completo substituirá completamente os dados remotos pelos seus dados atuais!';
|
||||
|
||||
@override
|
||||
String get sync_confirm_download =>
|
||||
'Um download completo substituirá completamente seus dados atuais pelos dados remotos!';
|
||||
|
||||
@override
|
||||
String get sync_on => 'Ativar sincronização';
|
||||
|
||||
@override
|
||||
String get sync_pending_manga => 'Alterações pendentes para mangás';
|
||||
|
||||
@override
|
||||
String get sync_pending_category => 'Alterações pendentes para categorias';
|
||||
|
||||
@override
|
||||
String get sync_pending_chapter => 'Alterações pendentes para capítulos';
|
||||
|
||||
@override
|
||||
String get sync_pending_history => 'Alterações pendentes para histórico';
|
||||
|
||||
@override
|
||||
String get sync_pending_update => 'Alterações pendentes para atualizações';
|
||||
|
||||
@override
|
||||
String get sync_pending_extension => 'Alterações pendentes para extensões';
|
||||
|
||||
@override
|
||||
String get sync_pending_track => 'Alterações pendentes para rastreamento';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_creating => 'Criando instantâneo...';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_created => 'Instantâneo criado!';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_deleting => 'Excluindo instantâneo...';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_deleted => 'Instantâneo excluído!';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_no_data =>
|
||||
'Sem dados para criar um instantâneo! Faça um upload completo primeiro!';
|
||||
|
||||
@override
|
||||
String get sync_browse_snapshots => 'Explorar backups antigos';
|
||||
|
||||
@override
|
||||
String get sync_snapshots => 'Instantâneos';
|
||||
|
||||
@override
|
||||
String get sync_load_snapshot => 'Carregar instantâneo';
|
||||
|
||||
@override
|
||||
String get sync_delete_snapshot => 'Excluir instantâneo';
|
||||
|
||||
@override
|
||||
String get sync_auto => 'Sincronização automática';
|
||||
|
||||
|
|
@ -776,12 +691,6 @@ class AppLocalizationsPt extends AppLocalizations {
|
|||
@override
|
||||
String get sync_auto_off => 'Desativado';
|
||||
|
||||
@override
|
||||
String get sync_auto_30_seconds => 'A cada 30 segundos';
|
||||
|
||||
@override
|
||||
String get sync_auto_1_minute => 'A cada 1 minuto';
|
||||
|
||||
@override
|
||||
String get sync_auto_5_minutes => 'A cada 5 minutos';
|
||||
|
||||
|
|
@ -2191,16 +2100,16 @@ class AppLocalizationsPtBr extends AppLocalizationsPt {
|
|||
|
||||
@override
|
||||
String get syncing_subtitle =>
|
||||
'Sincronize seu progresso em vários dispositivos por meio de um servidor auto-hospedado.\nCertifique-se de fazer upload primeiro se for sua primeira sincronização ou de baixar antes de usar a sincronização (automática) neste dispositivo!';
|
||||
'Sincronize seu progresso em vários dispositivos por meio de um \nservidor auto-hospedado. Confira nosso servidor discord para obter mais informações!';
|
||||
|
||||
@override
|
||||
String get last_sync => 'Última sincronização em: ';
|
||||
String get last_sync_manga => 'Última sincronização do mangá em:';
|
||||
|
||||
@override
|
||||
String get last_upload => 'Último upload em: ';
|
||||
String get last_sync_history => 'Última sincronização do histórico em:';
|
||||
|
||||
@override
|
||||
String get last_download => 'Último download em: ';
|
||||
String get last_sync_update => 'Última atualização sincronizada em:';
|
||||
|
||||
@override
|
||||
String get sync_server => 'Endereço do servidor de sincronização';
|
||||
|
|
@ -2209,105 +2118,20 @@ class AppLocalizationsPtBr extends AppLocalizationsPt {
|
|||
String get sync_login_invalid_creds => 'E-mail ou senha inválidos';
|
||||
|
||||
@override
|
||||
String get sync_checking => 'Verificando sincronização...';
|
||||
String get sync_starting => 'Iniciando a sincronização...';
|
||||
|
||||
@override
|
||||
String get sync_uploading => 'Iniciando upload...';
|
||||
String get sync_finished => 'Sincronização concluída';
|
||||
|
||||
@override
|
||||
String get sync_downloading => 'Iniciando download...';
|
||||
|
||||
@override
|
||||
String get sync_upload_finished => 'Upload concluído';
|
||||
|
||||
@override
|
||||
String get sync_download_finished => 'Download concluído';
|
||||
|
||||
@override
|
||||
String get sync_up_to_date => 'Sincronização em dia';
|
||||
|
||||
@override
|
||||
String get sync_upload_failed => 'Falha no upload';
|
||||
|
||||
@override
|
||||
String get sync_download_failed => 'Falha no download';
|
||||
String get sync_failed => 'Falha na sincronização';
|
||||
|
||||
@override
|
||||
String get sync_button_sync => 'Sincronizar progresso';
|
||||
|
||||
@override
|
||||
String get sync_button_snapshot => 'Criar instantâneo';
|
||||
|
||||
@override
|
||||
String get sync_button_upload => 'Upload completo';
|
||||
|
||||
@override
|
||||
String get sync_button_download => 'Download completo';
|
||||
|
||||
@override
|
||||
String get sync_confirm_snapshot =>
|
||||
'Solicite ao servidor para criar um backup remoto!';
|
||||
|
||||
@override
|
||||
String get sync_confirm_upload =>
|
||||
'Um upload completo substituirá completamente os dados remotos pelos atuais!';
|
||||
|
||||
@override
|
||||
String get sync_confirm_download =>
|
||||
'Um download completo substituirá completamente seus dados atuais pelos dados remotos!';
|
||||
|
||||
@override
|
||||
String get sync_on => 'Ativar sincronização';
|
||||
|
||||
@override
|
||||
String get sync_pending_manga => 'Alterações pendentes para mangás';
|
||||
|
||||
@override
|
||||
String get sync_pending_category => 'Alterações pendentes para categorias';
|
||||
|
||||
@override
|
||||
String get sync_pending_chapter => 'Alterações pendentes para capítulos';
|
||||
|
||||
@override
|
||||
String get sync_pending_history => 'Alterações pendentes para histórico';
|
||||
|
||||
@override
|
||||
String get sync_pending_update => 'Alterações pendentes para atualizações';
|
||||
|
||||
@override
|
||||
String get sync_pending_extension => 'Alterações pendentes para extensões';
|
||||
|
||||
@override
|
||||
String get sync_pending_track => 'Alterações pendentes para rastreamento';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_creating => 'Criando instantâneo...';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_created => 'Instantâneo criado!';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_deleting => 'Excluindo instantâneo...';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_deleted => 'Instantâneo excluído!';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_no_data =>
|
||||
'Sem dados para criar um instantâneo! Faça um upload completo primeiro!';
|
||||
|
||||
@override
|
||||
String get sync_browse_snapshots => 'Explorar backups antigos';
|
||||
|
||||
@override
|
||||
String get sync_snapshots => 'Instantâneos';
|
||||
|
||||
@override
|
||||
String get sync_load_snapshot => 'Carregar instantâneo';
|
||||
|
||||
@override
|
||||
String get sync_delete_snapshot => 'Excluir instantâneo';
|
||||
|
||||
@override
|
||||
String get sync_auto => 'Sincronização automática';
|
||||
|
||||
|
|
@ -2318,12 +2142,6 @@ class AppLocalizationsPtBr extends AppLocalizationsPt {
|
|||
@override
|
||||
String get sync_auto_off => 'Desativado';
|
||||
|
||||
@override
|
||||
String get sync_auto_30_seconds => 'A cada 30 segundos';
|
||||
|
||||
@override
|
||||
String get sync_auto_1_minute => 'A cada 1 minuto';
|
||||
|
||||
@override
|
||||
String get sync_auto_5_minutes => 'A cada 5 minutos';
|
||||
|
||||
|
|
|
|||
|
|
@ -650,16 +650,16 @@ class AppLocalizationsRu extends AppLocalizations {
|
|||
|
||||
@override
|
||||
String get syncing_subtitle =>
|
||||
'Синхронизируйте ваш прогресс на нескольких устройствах через собственный сервер. Убедитесь, что вы сначала загрузили, если это ваш первый раз синхронизации, или скачайте перед использованием (авто) синхронизации на этом устройстве!';
|
||||
'Синхронизируйте свой прогресс на нескольких устройствах через собственный \nserver. Загляните на наш сервер discord для получения дополнительной информации!';
|
||||
|
||||
@override
|
||||
String get last_sync => 'Последняя синхронизация: ';
|
||||
String get last_sync_manga => 'Последняя синхронизация манги:';
|
||||
|
||||
@override
|
||||
String get last_upload => 'Последняя загрузка: ';
|
||||
String get last_sync_history => 'Последняя история синхронизирована на:';
|
||||
|
||||
@override
|
||||
String get last_download => 'Последнее скачивание: ';
|
||||
String get last_sync_update => 'Последнее обновление синхронизировано на:';
|
||||
|
||||
@override
|
||||
String get sync_server => 'Адрес сервера синхронизации';
|
||||
|
|
@ -669,105 +669,20 @@ class AppLocalizationsRu extends AppLocalizations {
|
|||
'Неверный адрес электронной почты или пароль';
|
||||
|
||||
@override
|
||||
String get sync_checking => 'Проверка синхронизации...';
|
||||
String get sync_starting => 'Начало синхронизации...';
|
||||
|
||||
@override
|
||||
String get sync_uploading => 'Загрузка началась...';
|
||||
String get sync_finished => 'Синхронизация завершена';
|
||||
|
||||
@override
|
||||
String get sync_downloading => 'Скачивание началось...';
|
||||
|
||||
@override
|
||||
String get sync_upload_finished => 'Загрузка завершена';
|
||||
|
||||
@override
|
||||
String get sync_download_finished => 'Скачивание завершено';
|
||||
|
||||
@override
|
||||
String get sync_up_to_date => 'Синхронизация актуальна';
|
||||
|
||||
@override
|
||||
String get sync_upload_failed => 'Ошибка загрузки';
|
||||
|
||||
@override
|
||||
String get sync_download_failed => 'Ошибка скачивания';
|
||||
String get sync_failed => 'Не удалось синхронизировать';
|
||||
|
||||
@override
|
||||
String get sync_button_sync => 'Синхронизировать прогресс';
|
||||
|
||||
@override
|
||||
String get sync_button_snapshot => 'Создать снимок';
|
||||
|
||||
@override
|
||||
String get sync_button_upload => 'Полная загрузка';
|
||||
|
||||
@override
|
||||
String get sync_button_download => 'Полное скачивание';
|
||||
|
||||
@override
|
||||
String get sync_confirm_snapshot =>
|
||||
'Запросите у сервера создание удаленной резервной копии!';
|
||||
|
||||
@override
|
||||
String get sync_confirm_upload =>
|
||||
'Полная загрузка полностью заменит удаленные данные на ваши текущие!';
|
||||
|
||||
@override
|
||||
String get sync_confirm_download =>
|
||||
'Полное скачивание полностью заменит ваши текущие данные на удаленные!';
|
||||
|
||||
@override
|
||||
String get sync_on => 'Включить синхронизацию';
|
||||
|
||||
@override
|
||||
String get sync_pending_manga => 'Ожидающие изменения манги';
|
||||
|
||||
@override
|
||||
String get sync_pending_category => 'Ожидающие изменения категорий';
|
||||
|
||||
@override
|
||||
String get sync_pending_chapter => 'Ожидающие изменения глав';
|
||||
|
||||
@override
|
||||
String get sync_pending_history => 'Ожидающие изменения истории';
|
||||
|
||||
@override
|
||||
String get sync_pending_update => 'Ожидающие изменения обновлений';
|
||||
|
||||
@override
|
||||
String get sync_pending_extension => 'Ожидающие изменения расширений';
|
||||
|
||||
@override
|
||||
String get sync_pending_track => 'Ожидающие изменения трекинга';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_creating => 'Создание снимка...';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_created => 'Снимок создан!';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_deleting => 'Удаление снимка...';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_deleted => 'Снимок удален!';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_no_data =>
|
||||
'Нет данных для создания снимка! Сначала выполните полную загрузку!';
|
||||
|
||||
@override
|
||||
String get sync_browse_snapshots => 'Просмотр старых резервных копий';
|
||||
|
||||
@override
|
||||
String get sync_snapshots => 'Снимки';
|
||||
|
||||
@override
|
||||
String get sync_load_snapshot => 'Загрузить снимок';
|
||||
|
||||
@override
|
||||
String get sync_delete_snapshot => 'Удалить снимок';
|
||||
|
||||
@override
|
||||
String get sync_auto => 'Автосинхронизация';
|
||||
|
||||
|
|
@ -778,12 +693,6 @@ class AppLocalizationsRu extends AppLocalizations {
|
|||
@override
|
||||
String get sync_auto_off => 'Выключено';
|
||||
|
||||
@override
|
||||
String get sync_auto_30_seconds => 'Каждые 30 секунд';
|
||||
|
||||
@override
|
||||
String get sync_auto_1_minute => 'Каждую минуту';
|
||||
|
||||
@override
|
||||
String get sync_auto_5_minutes => 'Каждые 5 минут';
|
||||
|
||||
|
|
|
|||
|
|
@ -646,16 +646,16 @@ class AppLocalizationsTh extends AppLocalizations {
|
|||
|
||||
@override
|
||||
String get syncing_subtitle =>
|
||||
'ซิงค์ความคืบหน้าของคุณระหว่างอุปกรณ์หลายเครื่องผ่านเซิร์ฟเวอร์ที่โฮสต์เอง ตรวจสอบให้แน่ใจว่าได้อัปโหลดก่อนหากเป็นครั้งแรกที่คุณซิงค์ หรือดาวน์โหลดก่อนที่จะใช้การซิงค์ (อัตโนมัติ) บนอุปกรณ์นี้!';
|
||||
'ซิงค์ความคืบหน้าของคุณระหว่างอุปกรณ์ต่างๆ ผ่านเซิร์ฟเวอร์ที่โฮสต์ด้วยตนเอง ดูข้อมูลเพิ่มเติมได้ที่เซิร์ฟเวอร์ Discord ของเรา';
|
||||
|
||||
@override
|
||||
String get last_sync => 'ซิงค์ล่าสุดที่: ';
|
||||
String get last_sync_manga => 'ซิงค์มังงะล่าสุดเมื่อ:';
|
||||
|
||||
@override
|
||||
String get last_upload => 'อัปโหลดล่าสุดที่: ';
|
||||
String get last_sync_history => 'ประวัติการซิงค์ครั้งล่าสุด:';
|
||||
|
||||
@override
|
||||
String get last_download => 'ดาวน์โหลดล่าสุดที่: ';
|
||||
String get last_sync_update => 'อัปเดตข้อมูลล่าสุดเมื่อ:';
|
||||
|
||||
@override
|
||||
String get sync_server => 'ที่อยู่เซิร์ฟเวอร์ซิงค์';
|
||||
|
|
@ -664,105 +664,20 @@ class AppLocalizationsTh extends AppLocalizations {
|
|||
String get sync_login_invalid_creds => 'อีเมลหรือรหัสผ่านไม่ถูกต้อง';
|
||||
|
||||
@override
|
||||
String get sync_checking => 'กำลังตรวจสอบการซิงค์...';
|
||||
String get sync_starting => 'กำลังเริ่มการซิงค์...';
|
||||
|
||||
@override
|
||||
String get sync_uploading => 'เริ่มการอัปโหลด...';
|
||||
String get sync_finished => 'การซิงค์เสร็จสิ้น';
|
||||
|
||||
@override
|
||||
String get sync_downloading => 'เริ่มการดาวน์โหลด...';
|
||||
|
||||
@override
|
||||
String get sync_upload_finished => 'การอัปโหลดเสร็จสิ้น';
|
||||
|
||||
@override
|
||||
String get sync_download_finished => 'การดาวน์โหลดเสร็จสิ้น';
|
||||
|
||||
@override
|
||||
String get sync_up_to_date => 'ซิงค์ล่าสุด';
|
||||
|
||||
@override
|
||||
String get sync_upload_failed => 'การอัปโหลดล้มเหลว';
|
||||
|
||||
@override
|
||||
String get sync_download_failed => 'การดาวน์โหลดล้มเหลว';
|
||||
String get sync_failed => 'การซิงค์ล้มเหลว';
|
||||
|
||||
@override
|
||||
String get sync_button_sync => 'ซิงค์ความคืบหน้า';
|
||||
|
||||
@override
|
||||
String get sync_button_snapshot => 'สร้างภาพรวม';
|
||||
|
||||
@override
|
||||
String get sync_button_upload => 'อัปโหลดทั้งหมด';
|
||||
|
||||
@override
|
||||
String get sync_button_download => 'ดาวน์โหลดทั้งหมด';
|
||||
|
||||
@override
|
||||
String get sync_confirm_snapshot =>
|
||||
'ขอให้เซิร์ฟเวอร์สร้างข้อมูลสำรองระยะไกล!';
|
||||
|
||||
@override
|
||||
String get sync_confirm_upload =>
|
||||
'การอัปโหลดทั้งหมดจะทำการแทนที่ข้อมูลระยะไกลด้วยข้อมูลปัจจุบันของคุณ!';
|
||||
|
||||
@override
|
||||
String get sync_confirm_download =>
|
||||
'การดาวน์โหลดทั้งหมดจะทำการแทนที่ข้อมูลปัจจุบันของคุณด้วยข้อมูลจากระยะไกล!';
|
||||
|
||||
@override
|
||||
String get sync_on => 'เปิดการซิงค์';
|
||||
|
||||
@override
|
||||
String get sync_pending_manga => 'การเปลี่ยนแปลงมังงะที่รอดำเนินการ';
|
||||
|
||||
@override
|
||||
String get sync_pending_category => 'การเปลี่ยนแปลงหมวดหมู่ที่รอดำเนินการ';
|
||||
|
||||
@override
|
||||
String get sync_pending_chapter => 'การเปลี่ยนแปลงบทที่รอดำเนินการ';
|
||||
|
||||
@override
|
||||
String get sync_pending_history => 'การเปลี่ยนแปลงประวัติที่รอดำเนินการ';
|
||||
|
||||
@override
|
||||
String get sync_pending_update => 'การเปลี่ยนแปลงการอัปเดตที่รอดำเนินการ';
|
||||
|
||||
@override
|
||||
String get sync_pending_extension => 'การเปลี่ยนแปลงส่วนขยายที่รอดำเนินการ';
|
||||
|
||||
@override
|
||||
String get sync_pending_track => 'การเปลี่ยนแปลงการติดตามที่รอดำเนินการ';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_creating => 'กำลังสร้างภาพรวม...';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_created => 'สร้างภาพรวมแล้ว!';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_deleting => 'กำลังลบภาพรวม...';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_deleted => 'ลบภาพรวมแล้ว!';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_no_data =>
|
||||
'ไม่มีข้อมูลสำหรับสร้างภาพรวม! โปรดอัปโหลดทั้งหมดก่อน!';
|
||||
|
||||
@override
|
||||
String get sync_browse_snapshots => 'เรียกดูข้อมูลสำรองเก่า';
|
||||
|
||||
@override
|
||||
String get sync_snapshots => 'ภาพรวม';
|
||||
|
||||
@override
|
||||
String get sync_load_snapshot => 'โหลดภาพรวม';
|
||||
|
||||
@override
|
||||
String get sync_delete_snapshot => 'ลบภาพรวม';
|
||||
|
||||
@override
|
||||
String get sync_auto => 'การซิงค์อัตโนมัติ';
|
||||
|
||||
|
|
@ -772,12 +687,6 @@ class AppLocalizationsTh extends AppLocalizations {
|
|||
@override
|
||||
String get sync_auto_off => 'ปิด';
|
||||
|
||||
@override
|
||||
String get sync_auto_30_seconds => 'ทุก 30 วินาที';
|
||||
|
||||
@override
|
||||
String get sync_auto_1_minute => 'ทุก 1 นาที';
|
||||
|
||||
@override
|
||||
String get sync_auto_5_minutes => 'ทุก 5 นาที';
|
||||
|
||||
|
|
|
|||
|
|
@ -646,16 +646,16 @@ class AppLocalizationsTr extends AppLocalizations {
|
|||
|
||||
@override
|
||||
String get syncing_subtitle =>
|
||||
'Birden fazla cihazda ilerlemenizi kendinize ait bir \n sunucu üzerinden senkronize edin. İlk kez senkronize ediyorsanız, önce yüklediğinizden emin olun veya bu cihazda (otomatik) senkronize kullanmadan önce indirin!';
|
||||
'İlerlemenizi kendi barındırdığınız bir \nserver aracılığıyla birden fazla cihaz arasında senkronize edin. Daha fazla bilgi için discord sunucumuza göz atın!';
|
||||
|
||||
@override
|
||||
String get last_sync => 'Son senkronizasyon zamanı: ';
|
||||
String get last_sync_manga => 'Son manga senkronizasyonu:';
|
||||
|
||||
@override
|
||||
String get last_upload => 'Son yükleme zamanı: ';
|
||||
String get last_sync_history => 'Son tarih senkronizasyonu:';
|
||||
|
||||
@override
|
||||
String get last_download => 'Son indirme zamanı: ';
|
||||
String get last_sync_update => 'Son güncelleme senkronizasyonu:';
|
||||
|
||||
@override
|
||||
String get sync_server => 'Senkronizasyon Sunucu Adresi';
|
||||
|
|
@ -664,105 +664,20 @@ class AppLocalizationsTr extends AppLocalizations {
|
|||
String get sync_login_invalid_creds => 'Geçersiz e-posta veya şifre';
|
||||
|
||||
@override
|
||||
String get sync_checking => 'Senkronizasyon kontrol ediliyor...';
|
||||
String get sync_starting => 'Senkronizasyonu başlatıyorum.';
|
||||
|
||||
@override
|
||||
String get sync_uploading => 'Yükleme başladı...';
|
||||
String get sync_finished => 'Senkronizasyon tamamlandı';
|
||||
|
||||
@override
|
||||
String get sync_downloading => 'İndirme başladı...';
|
||||
|
||||
@override
|
||||
String get sync_upload_finished => 'Yükleme tamamlandı';
|
||||
|
||||
@override
|
||||
String get sync_download_finished => 'İndirme tamamlandı';
|
||||
|
||||
@override
|
||||
String get sync_up_to_date => 'Senkronizasyon güncel';
|
||||
|
||||
@override
|
||||
String get sync_upload_failed => 'Yükleme başarısız oldu';
|
||||
|
||||
@override
|
||||
String get sync_download_failed => 'İndirme başarısız oldu';
|
||||
String get sync_failed => 'Senkronizasyon başarısız';
|
||||
|
||||
@override
|
||||
String get sync_button_sync => 'İlerlemeyi senkronize et';
|
||||
|
||||
@override
|
||||
String get sync_button_snapshot => 'Anlık görüntü oluştur';
|
||||
|
||||
@override
|
||||
String get sync_button_upload => 'Tam yükleme';
|
||||
|
||||
@override
|
||||
String get sync_button_download => 'Tam indirme';
|
||||
|
||||
@override
|
||||
String get sync_confirm_snapshot =>
|
||||
'Sunucudan uzak bir yedek oluşturmasını isteyin!';
|
||||
|
||||
@override
|
||||
String get sync_confirm_upload =>
|
||||
'Tam yükleme, uzak veriyi tamamen mevcut verinizle değiştirecektir!';
|
||||
|
||||
@override
|
||||
String get sync_confirm_download =>
|
||||
'Tam indirme, mevcut verinizi uzak verilerle tamamen değiştirecektir!';
|
||||
|
||||
@override
|
||||
String get sync_on => 'Senkronizasyonu etkinleştir';
|
||||
|
||||
@override
|
||||
String get sync_pending_manga => 'Bekleyen manga değişiklikleri';
|
||||
|
||||
@override
|
||||
String get sync_pending_category => 'Bekleyen kategori değişiklikleri';
|
||||
|
||||
@override
|
||||
String get sync_pending_chapter => 'Bekleyen bölüm değişiklikleri';
|
||||
|
||||
@override
|
||||
String get sync_pending_history => 'Bekleyen geçmiş değişiklikleri';
|
||||
|
||||
@override
|
||||
String get sync_pending_update => 'Bekleyen güncelleme değişiklikleri';
|
||||
|
||||
@override
|
||||
String get sync_pending_extension => 'Bekleyen uzantı değişiklikleri';
|
||||
|
||||
@override
|
||||
String get sync_pending_track => 'Bekleyen izleme değişiklikleri';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_creating => 'Anlık görüntü oluşturuluyor...';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_created => 'Anlık görüntü oluşturuldu!';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_deleting => 'Anlık görüntü siliniyor...';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_deleted => 'Anlık görüntü silindi!';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_no_data =>
|
||||
'Anlık görüntü oluşturmak için veri yok! Önce tam yükleme yapın!';
|
||||
|
||||
@override
|
||||
String get sync_browse_snapshots => 'Eski yedekleri gözden geçir';
|
||||
|
||||
@override
|
||||
String get sync_snapshots => 'Anlık görüntüler';
|
||||
|
||||
@override
|
||||
String get sync_load_snapshot => 'Anlık görüntüyü yükle';
|
||||
|
||||
@override
|
||||
String get sync_delete_snapshot => 'Anlık görüntüyü sil';
|
||||
|
||||
@override
|
||||
String get sync_auto => 'Otomatik senkronizasyon';
|
||||
|
||||
|
|
@ -773,12 +688,6 @@ class AppLocalizationsTr extends AppLocalizations {
|
|||
@override
|
||||
String get sync_auto_off => 'Kapalı';
|
||||
|
||||
@override
|
||||
String get sync_auto_30_seconds => 'Her 30 saniyede bir';
|
||||
|
||||
@override
|
||||
String get sync_auto_1_minute => 'Her 1 dakikada bir';
|
||||
|
||||
@override
|
||||
String get sync_auto_5_minutes => 'Her 5 dakikada bir';
|
||||
|
||||
|
|
|
|||
|
|
@ -639,16 +639,16 @@ class AppLocalizationsZh extends AppLocalizations {
|
|||
|
||||
@override
|
||||
String get syncing_subtitle =>
|
||||
'通过自托管服务器在多个设备间同步您的进度。首次同步时,请先上传;或者在设备上启用(自动)同步之前先下载!';
|
||||
'通过自托管的 \n服务器在多个设备上同步你的进度。查看我们的 discord 服务器,了解更多信息!';
|
||||
|
||||
@override
|
||||
String get last_sync => '上次同步时间:';
|
||||
String get last_sync_manga => '最新漫画同步于: ';
|
||||
|
||||
@override
|
||||
String get last_upload => '上次上传时间:';
|
||||
String get last_sync_history => '最后历史同步时间:';
|
||||
|
||||
@override
|
||||
String get last_download => '上次下载时间:';
|
||||
String get last_sync_update => '最后更新同步于: ';
|
||||
|
||||
@override
|
||||
String get sync_server => '同步服务器地址';
|
||||
|
|
@ -657,101 +657,20 @@ class AppLocalizationsZh extends AppLocalizations {
|
|||
String get sync_login_invalid_creds => '无效的电子邮件或密码';
|
||||
|
||||
@override
|
||||
String get sync_checking => '检查同步状态...';
|
||||
String get sync_starting => '开始同步...';
|
||||
|
||||
@override
|
||||
String get sync_uploading => '上传开始...';
|
||||
String get sync_finished => '同步完成';
|
||||
|
||||
@override
|
||||
String get sync_downloading => '下载开始...';
|
||||
|
||||
@override
|
||||
String get sync_upload_finished => '上传完成';
|
||||
|
||||
@override
|
||||
String get sync_download_finished => '下载完成';
|
||||
|
||||
@override
|
||||
String get sync_up_to_date => '同步已是最新';
|
||||
|
||||
@override
|
||||
String get sync_upload_failed => '上传失败';
|
||||
|
||||
@override
|
||||
String get sync_download_failed => '下载失败';
|
||||
String get sync_failed => '同步失败';
|
||||
|
||||
@override
|
||||
String get sync_button_sync => '同步进度';
|
||||
|
||||
@override
|
||||
String get sync_button_snapshot => '创建快照';
|
||||
|
||||
@override
|
||||
String get sync_button_upload => '完整上传';
|
||||
|
||||
@override
|
||||
String get sync_button_download => '完整下载';
|
||||
|
||||
@override
|
||||
String get sync_confirm_snapshot => '请求服务器创建当前备份的远程副本!';
|
||||
|
||||
@override
|
||||
String get sync_confirm_upload => '完整上传将用您当前的数据完全替换远程数据!';
|
||||
|
||||
@override
|
||||
String get sync_confirm_download => '完整下载将用远程数据完全替换您当前的数据!';
|
||||
|
||||
@override
|
||||
String get sync_on => '启用同步';
|
||||
|
||||
@override
|
||||
String get sync_pending_manga => '漫画更改待处理';
|
||||
|
||||
@override
|
||||
String get sync_pending_category => '类别更改待处理';
|
||||
|
||||
@override
|
||||
String get sync_pending_chapter => '章节更改待处理';
|
||||
|
||||
@override
|
||||
String get sync_pending_history => '历史更改待处理';
|
||||
|
||||
@override
|
||||
String get sync_pending_update => '更新更改待处理';
|
||||
|
||||
@override
|
||||
String get sync_pending_extension => '扩展更改待处理';
|
||||
|
||||
@override
|
||||
String get sync_pending_track => '追踪更改待处理';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_creating => '正在创建快照...';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_created => '快照已创建!';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_deleting => '正在删除快照...';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_deleted => '快照已删除!';
|
||||
|
||||
@override
|
||||
String get sync_snapshot_no_data => '没有数据可创建快照!请先进行完整上传!';
|
||||
|
||||
@override
|
||||
String get sync_browse_snapshots => '浏览旧备份';
|
||||
|
||||
@override
|
||||
String get sync_snapshots => '快照';
|
||||
|
||||
@override
|
||||
String get sync_load_snapshot => '加载快照';
|
||||
|
||||
@override
|
||||
String get sync_delete_snapshot => '删除快照';
|
||||
|
||||
@override
|
||||
String get sync_auto => '自动同步';
|
||||
|
||||
|
|
@ -761,12 +680,6 @@ class AppLocalizationsZh extends AppLocalizations {
|
|||
@override
|
||||
String get sync_auto_off => '关闭';
|
||||
|
||||
@override
|
||||
String get sync_auto_30_seconds => '每30秒';
|
||||
|
||||
@override
|
||||
String get sync_auto_1_minute => '每1分钟';
|
||||
|
||||
@override
|
||||
String get sync_auto_5_minutes => '每5分钟';
|
||||
|
||||
|
|
|
|||
|
|
@ -48,6 +48,6 @@ class Category {
|
|||
'forItemType': forItemType.index,
|
||||
'pos': pos,
|
||||
'hide': hide,
|
||||
'updatedAt': updatedAt,
|
||||
'updatedAt': updatedAt ?? 0,
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -69,6 +69,6 @@ class Chapter {
|
|||
'name': name,
|
||||
'scanlator': scanlator,
|
||||
'url': url,
|
||||
'updatedAt': updatedAt,
|
||||
'updatedAt': updatedAt ?? 0,
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -49,6 +49,6 @@ class History {
|
|||
'id': id,
|
||||
'itemType': itemType.index,
|
||||
'mangaId': mangaId,
|
||||
'updatedAt': updatedAt,
|
||||
'updatedAt': updatedAt ?? 0,
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -125,7 +125,7 @@ class Manga {
|
|||
'source': source,
|
||||
'status': status.index,
|
||||
'customCoverFromTracker': customCoverFromTracker,
|
||||
'updatedAt': updatedAt,
|
||||
'updatedAt': updatedAt ?? 0,
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -170,7 +170,7 @@ class Source {
|
|||
'isLocal': isLocal,
|
||||
'notes': notes,
|
||||
'repo': repo?.toJson(),
|
||||
'updatedAt': updatedAt,
|
||||
'updatedAt': updatedAt ?? 0,
|
||||
};
|
||||
|
||||
bool get isTorrent => (typeSource?.toLowerCase() ?? "") == "torrent";
|
||||
|
|
|
|||
|
|
@ -10,11 +10,11 @@ class SyncPreference {
|
|||
|
||||
String? authToken;
|
||||
|
||||
int? lastSync;
|
||||
int? lastSyncManga;
|
||||
|
||||
int? lastUpload;
|
||||
int? lastSyncHistory;
|
||||
|
||||
int? lastDownload;
|
||||
int? lastSyncUpdate;
|
||||
|
||||
String? server;
|
||||
|
||||
|
|
@ -26,9 +26,9 @@ class SyncPreference {
|
|||
this.syncId,
|
||||
this.email,
|
||||
this.authToken,
|
||||
this.lastSync,
|
||||
this.lastUpload,
|
||||
this.lastDownload,
|
||||
this.lastSyncManga,
|
||||
this.lastSyncHistory,
|
||||
this.lastSyncUpdate,
|
||||
this.server,
|
||||
this.syncOn = false,
|
||||
this.autoSyncFrequency = 0,
|
||||
|
|
@ -38,9 +38,9 @@ class SyncPreference {
|
|||
syncId = json['syncId'];
|
||||
email = json['email'];
|
||||
authToken = json['authToken'];
|
||||
lastSync = json['lastSync'];
|
||||
lastUpload = json['lastUpload'];
|
||||
lastDownload = json['lastDownload'];
|
||||
lastSyncManga = json['lastSyncManga'];
|
||||
lastSyncHistory = json['lastSyncHistory'];
|
||||
lastSyncUpdate = json['lastSyncUpdate'];
|
||||
server = json['server'];
|
||||
syncOn = json['syncOn'] ?? false;
|
||||
syncOn = json['autoSyncFrequency'] ?? 0;
|
||||
|
|
@ -50,9 +50,9 @@ class SyncPreference {
|
|||
'syncId': syncId,
|
||||
'email': email,
|
||||
'authToken': authToken,
|
||||
'lastSync': lastSync,
|
||||
'lastUpload': lastUpload,
|
||||
'lastDownload': lastDownload,
|
||||
'lastSyncManga': lastSyncManga,
|
||||
'lastSyncHistory': lastSyncHistory,
|
||||
'lastSyncUpdate': lastSyncUpdate,
|
||||
'syncOn': syncOn,
|
||||
'autoSyncFrequency': autoSyncFrequency,
|
||||
};
|
||||
|
|
|
|||
|
|
@ -32,19 +32,19 @@ const SyncPreferenceSchema = CollectionSchema(
|
|||
name: r'email',
|
||||
type: IsarType.string,
|
||||
),
|
||||
r'lastDownload': PropertySchema(
|
||||
r'lastSyncHistory': PropertySchema(
|
||||
id: 3,
|
||||
name: r'lastDownload',
|
||||
name: r'lastSyncHistory',
|
||||
type: IsarType.long,
|
||||
),
|
||||
r'lastSync': PropertySchema(
|
||||
r'lastSyncManga': PropertySchema(
|
||||
id: 4,
|
||||
name: r'lastSync',
|
||||
name: r'lastSyncManga',
|
||||
type: IsarType.long,
|
||||
),
|
||||
r'lastUpload': PropertySchema(
|
||||
r'lastSyncUpdate': PropertySchema(
|
||||
id: 5,
|
||||
name: r'lastUpload',
|
||||
name: r'lastSyncUpdate',
|
||||
type: IsarType.long,
|
||||
),
|
||||
r'server': PropertySchema(
|
||||
|
|
@ -108,9 +108,9 @@ void _syncPreferenceSerialize(
|
|||
writer.writeString(offsets[0], object.authToken);
|
||||
writer.writeLong(offsets[1], object.autoSyncFrequency);
|
||||
writer.writeString(offsets[2], object.email);
|
||||
writer.writeLong(offsets[3], object.lastDownload);
|
||||
writer.writeLong(offsets[4], object.lastSync);
|
||||
writer.writeLong(offsets[5], object.lastUpload);
|
||||
writer.writeLong(offsets[3], object.lastSyncHistory);
|
||||
writer.writeLong(offsets[4], object.lastSyncManga);
|
||||
writer.writeLong(offsets[5], object.lastSyncUpdate);
|
||||
writer.writeString(offsets[6], object.server);
|
||||
writer.writeBool(offsets[7], object.syncOn);
|
||||
}
|
||||
|
|
@ -125,9 +125,9 @@ SyncPreference _syncPreferenceDeserialize(
|
|||
authToken: reader.readStringOrNull(offsets[0]),
|
||||
autoSyncFrequency: reader.readLongOrNull(offsets[1]) ?? 0,
|
||||
email: reader.readStringOrNull(offsets[2]),
|
||||
lastDownload: reader.readLongOrNull(offsets[3]),
|
||||
lastSync: reader.readLongOrNull(offsets[4]),
|
||||
lastUpload: reader.readLongOrNull(offsets[5]),
|
||||
lastSyncHistory: reader.readLongOrNull(offsets[3]),
|
||||
lastSyncManga: reader.readLongOrNull(offsets[4]),
|
||||
lastSyncUpdate: reader.readLongOrNull(offsets[5]),
|
||||
server: reader.readStringOrNull(offsets[6]),
|
||||
syncId: id,
|
||||
syncOn: reader.readBoolOrNull(offsets[7]) ?? false,
|
||||
|
|
@ -622,63 +622,63 @@ extension SyncPreferenceQueryFilter
|
|||
}
|
||||
|
||||
QueryBuilder<SyncPreference, SyncPreference, QAfterFilterCondition>
|
||||
lastDownloadIsNull() {
|
||||
lastSyncHistoryIsNull() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(const FilterCondition.isNull(
|
||||
property: r'lastDownload',
|
||||
property: r'lastSyncHistory',
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<SyncPreference, SyncPreference, QAfterFilterCondition>
|
||||
lastDownloadIsNotNull() {
|
||||
lastSyncHistoryIsNotNull() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(const FilterCondition.isNotNull(
|
||||
property: r'lastDownload',
|
||||
property: r'lastSyncHistory',
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<SyncPreference, SyncPreference, QAfterFilterCondition>
|
||||
lastDownloadEqualTo(int? value) {
|
||||
lastSyncHistoryEqualTo(int? value) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.equalTo(
|
||||
property: r'lastDownload',
|
||||
property: r'lastSyncHistory',
|
||||
value: value,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<SyncPreference, SyncPreference, QAfterFilterCondition>
|
||||
lastDownloadGreaterThan(
|
||||
lastSyncHistoryGreaterThan(
|
||||
int? value, {
|
||||
bool include = false,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.greaterThan(
|
||||
include: include,
|
||||
property: r'lastDownload',
|
||||
property: r'lastSyncHistory',
|
||||
value: value,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<SyncPreference, SyncPreference, QAfterFilterCondition>
|
||||
lastDownloadLessThan(
|
||||
lastSyncHistoryLessThan(
|
||||
int? value, {
|
||||
bool include = false,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.lessThan(
|
||||
include: include,
|
||||
property: r'lastDownload',
|
||||
property: r'lastSyncHistory',
|
||||
value: value,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<SyncPreference, SyncPreference, QAfterFilterCondition>
|
||||
lastDownloadBetween(
|
||||
lastSyncHistoryBetween(
|
||||
int? lower,
|
||||
int? upper, {
|
||||
bool includeLower = true,
|
||||
|
|
@ -686,7 +686,7 @@ extension SyncPreferenceQueryFilter
|
|||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.between(
|
||||
property: r'lastDownload',
|
||||
property: r'lastSyncHistory',
|
||||
lower: lower,
|
||||
includeLower: includeLower,
|
||||
upper: upper,
|
||||
|
|
@ -696,63 +696,63 @@ extension SyncPreferenceQueryFilter
|
|||
}
|
||||
|
||||
QueryBuilder<SyncPreference, SyncPreference, QAfterFilterCondition>
|
||||
lastSyncIsNull() {
|
||||
lastSyncMangaIsNull() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(const FilterCondition.isNull(
|
||||
property: r'lastSync',
|
||||
property: r'lastSyncManga',
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<SyncPreference, SyncPreference, QAfterFilterCondition>
|
||||
lastSyncIsNotNull() {
|
||||
lastSyncMangaIsNotNull() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(const FilterCondition.isNotNull(
|
||||
property: r'lastSync',
|
||||
property: r'lastSyncManga',
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<SyncPreference, SyncPreference, QAfterFilterCondition>
|
||||
lastSyncEqualTo(int? value) {
|
||||
lastSyncMangaEqualTo(int? value) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.equalTo(
|
||||
property: r'lastSync',
|
||||
property: r'lastSyncManga',
|
||||
value: value,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<SyncPreference, SyncPreference, QAfterFilterCondition>
|
||||
lastSyncGreaterThan(
|
||||
lastSyncMangaGreaterThan(
|
||||
int? value, {
|
||||
bool include = false,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.greaterThan(
|
||||
include: include,
|
||||
property: r'lastSync',
|
||||
property: r'lastSyncManga',
|
||||
value: value,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<SyncPreference, SyncPreference, QAfterFilterCondition>
|
||||
lastSyncLessThan(
|
||||
lastSyncMangaLessThan(
|
||||
int? value, {
|
||||
bool include = false,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.lessThan(
|
||||
include: include,
|
||||
property: r'lastSync',
|
||||
property: r'lastSyncManga',
|
||||
value: value,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<SyncPreference, SyncPreference, QAfterFilterCondition>
|
||||
lastSyncBetween(
|
||||
lastSyncMangaBetween(
|
||||
int? lower,
|
||||
int? upper, {
|
||||
bool includeLower = true,
|
||||
|
|
@ -760,7 +760,7 @@ extension SyncPreferenceQueryFilter
|
|||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.between(
|
||||
property: r'lastSync',
|
||||
property: r'lastSyncManga',
|
||||
lower: lower,
|
||||
includeLower: includeLower,
|
||||
upper: upper,
|
||||
|
|
@ -770,63 +770,63 @@ extension SyncPreferenceQueryFilter
|
|||
}
|
||||
|
||||
QueryBuilder<SyncPreference, SyncPreference, QAfterFilterCondition>
|
||||
lastUploadIsNull() {
|
||||
lastSyncUpdateIsNull() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(const FilterCondition.isNull(
|
||||
property: r'lastUpload',
|
||||
property: r'lastSyncUpdate',
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<SyncPreference, SyncPreference, QAfterFilterCondition>
|
||||
lastUploadIsNotNull() {
|
||||
lastSyncUpdateIsNotNull() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(const FilterCondition.isNotNull(
|
||||
property: r'lastUpload',
|
||||
property: r'lastSyncUpdate',
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<SyncPreference, SyncPreference, QAfterFilterCondition>
|
||||
lastUploadEqualTo(int? value) {
|
||||
lastSyncUpdateEqualTo(int? value) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.equalTo(
|
||||
property: r'lastUpload',
|
||||
property: r'lastSyncUpdate',
|
||||
value: value,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<SyncPreference, SyncPreference, QAfterFilterCondition>
|
||||
lastUploadGreaterThan(
|
||||
lastSyncUpdateGreaterThan(
|
||||
int? value, {
|
||||
bool include = false,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.greaterThan(
|
||||
include: include,
|
||||
property: r'lastUpload',
|
||||
property: r'lastSyncUpdate',
|
||||
value: value,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<SyncPreference, SyncPreference, QAfterFilterCondition>
|
||||
lastUploadLessThan(
|
||||
lastSyncUpdateLessThan(
|
||||
int? value, {
|
||||
bool include = false,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.lessThan(
|
||||
include: include,
|
||||
property: r'lastUpload',
|
||||
property: r'lastSyncUpdate',
|
||||
value: value,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<SyncPreference, SyncPreference, QAfterFilterCondition>
|
||||
lastUploadBetween(
|
||||
lastSyncUpdateBetween(
|
||||
int? lower,
|
||||
int? upper, {
|
||||
bool includeLower = true,
|
||||
|
|
@ -834,7 +834,7 @@ extension SyncPreferenceQueryFilter
|
|||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.between(
|
||||
property: r'lastUpload',
|
||||
property: r'lastSyncUpdate',
|
||||
lower: lower,
|
||||
includeLower: includeLower,
|
||||
upper: upper,
|
||||
|
|
@ -1130,43 +1130,44 @@ extension SyncPreferenceQuerySortBy
|
|||
}
|
||||
|
||||
QueryBuilder<SyncPreference, SyncPreference, QAfterSortBy>
|
||||
sortByLastDownload() {
|
||||
sortByLastSyncHistory() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'lastDownload', Sort.asc);
|
||||
return query.addSortBy(r'lastSyncHistory', Sort.asc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<SyncPreference, SyncPreference, QAfterSortBy>
|
||||
sortByLastDownloadDesc() {
|
||||
sortByLastSyncHistoryDesc() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'lastDownload', Sort.desc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<SyncPreference, SyncPreference, QAfterSortBy> sortByLastSync() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'lastSync', Sort.asc);
|
||||
return query.addSortBy(r'lastSyncHistory', Sort.desc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<SyncPreference, SyncPreference, QAfterSortBy>
|
||||
sortByLastSyncDesc() {
|
||||
sortByLastSyncManga() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'lastSync', Sort.desc);
|
||||
return query.addSortBy(r'lastSyncManga', Sort.asc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<SyncPreference, SyncPreference, QAfterSortBy>
|
||||
sortByLastUpload() {
|
||||
sortByLastSyncMangaDesc() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'lastUpload', Sort.asc);
|
||||
return query.addSortBy(r'lastSyncManga', Sort.desc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<SyncPreference, SyncPreference, QAfterSortBy>
|
||||
sortByLastUploadDesc() {
|
||||
sortByLastSyncUpdate() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'lastUpload', Sort.desc);
|
||||
return query.addSortBy(r'lastSyncUpdate', Sort.asc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<SyncPreference, SyncPreference, QAfterSortBy>
|
||||
sortByLastSyncUpdateDesc() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'lastSyncUpdate', Sort.desc);
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -1239,43 +1240,44 @@ extension SyncPreferenceQuerySortThenBy
|
|||
}
|
||||
|
||||
QueryBuilder<SyncPreference, SyncPreference, QAfterSortBy>
|
||||
thenByLastDownload() {
|
||||
thenByLastSyncHistory() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'lastDownload', Sort.asc);
|
||||
return query.addSortBy(r'lastSyncHistory', Sort.asc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<SyncPreference, SyncPreference, QAfterSortBy>
|
||||
thenByLastDownloadDesc() {
|
||||
thenByLastSyncHistoryDesc() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'lastDownload', Sort.desc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<SyncPreference, SyncPreference, QAfterSortBy> thenByLastSync() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'lastSync', Sort.asc);
|
||||
return query.addSortBy(r'lastSyncHistory', Sort.desc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<SyncPreference, SyncPreference, QAfterSortBy>
|
||||
thenByLastSyncDesc() {
|
||||
thenByLastSyncManga() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'lastSync', Sort.desc);
|
||||
return query.addSortBy(r'lastSyncManga', Sort.asc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<SyncPreference, SyncPreference, QAfterSortBy>
|
||||
thenByLastUpload() {
|
||||
thenByLastSyncMangaDesc() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'lastUpload', Sort.asc);
|
||||
return query.addSortBy(r'lastSyncManga', Sort.desc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<SyncPreference, SyncPreference, QAfterSortBy>
|
||||
thenByLastUploadDesc() {
|
||||
thenByLastSyncUpdate() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'lastUpload', Sort.desc);
|
||||
return query.addSortBy(r'lastSyncUpdate', Sort.asc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<SyncPreference, SyncPreference, QAfterSortBy>
|
||||
thenByLastSyncUpdateDesc() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'lastSyncUpdate', Sort.desc);
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -1343,22 +1345,23 @@ extension SyncPreferenceQueryWhereDistinct
|
|||
}
|
||||
|
||||
QueryBuilder<SyncPreference, SyncPreference, QDistinct>
|
||||
distinctByLastDownload() {
|
||||
distinctByLastSyncHistory() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addDistinctBy(r'lastDownload');
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<SyncPreference, SyncPreference, QDistinct> distinctByLastSync() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addDistinctBy(r'lastSync');
|
||||
return query.addDistinctBy(r'lastSyncHistory');
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<SyncPreference, SyncPreference, QDistinct>
|
||||
distinctByLastUpload() {
|
||||
distinctByLastSyncManga() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addDistinctBy(r'lastUpload');
|
||||
return query.addDistinctBy(r'lastSyncManga');
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<SyncPreference, SyncPreference, QDistinct>
|
||||
distinctByLastSyncUpdate() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addDistinctBy(r'lastSyncUpdate');
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -1403,21 +1406,23 @@ extension SyncPreferenceQueryProperty
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<SyncPreference, int?, QQueryOperations> lastDownloadProperty() {
|
||||
QueryBuilder<SyncPreference, int?, QQueryOperations>
|
||||
lastSyncHistoryProperty() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addPropertyName(r'lastDownload');
|
||||
return query.addPropertyName(r'lastSyncHistory');
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<SyncPreference, int?, QQueryOperations> lastSyncProperty() {
|
||||
QueryBuilder<SyncPreference, int?, QQueryOperations> lastSyncMangaProperty() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addPropertyName(r'lastSync');
|
||||
return query.addPropertyName(r'lastSyncManga');
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<SyncPreference, int?, QQueryOperations> lastUploadProperty() {
|
||||
QueryBuilder<SyncPreference, int?, QQueryOperations>
|
||||
lastSyncUpdateProperty() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addPropertyName(r'lastUpload');
|
||||
return query.addPropertyName(r'lastSyncUpdate');
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -90,7 +90,7 @@ class Track {
|
|||
'totalChapter': totalChapter,
|
||||
'trackingUrl': trackingUrl,
|
||||
'isManga': isManga,
|
||||
'updatedAt': updatedAt,
|
||||
'updatedAt': updatedAt ?? 0,
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -38,6 +38,6 @@ class Update {
|
|||
'mangaId': mangaId,
|
||||
'chapterName': chapterName,
|
||||
'date': date,
|
||||
'updatedAt': updatedAt,
|
||||
'updatedAt': updatedAt ?? 0,
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -31,21 +31,21 @@ class Synching extends _$Synching {
|
|||
ref.invalidate(syncServerProvider(syncId: syncId!));
|
||||
}
|
||||
|
||||
void setLastUpload(int timestamp) {
|
||||
void setLastSyncManga(int timestamp) {
|
||||
isar.writeTxnSync(() {
|
||||
isar.syncPreferences.putSync(state..lastUpload = timestamp);
|
||||
isar.syncPreferences.putSync(state..lastSyncManga = timestamp);
|
||||
});
|
||||
}
|
||||
|
||||
void setLastDownload(int timestamp) {
|
||||
void setLastSyncHistory(int timestamp) {
|
||||
isar.writeTxnSync(() {
|
||||
isar.syncPreferences.putSync(state..lastDownload = timestamp);
|
||||
isar.syncPreferences.putSync(state..lastSyncHistory = timestamp);
|
||||
});
|
||||
}
|
||||
|
||||
void setLastSync(int timestamp) {
|
||||
void setLastSyncUpdate(int timestamp) {
|
||||
isar.writeTxnSync(() {
|
||||
isar.syncPreferences.putSync(state..lastSync = timestamp);
|
||||
isar.syncPreferences.putSync(state..lastSyncUpdate = timestamp);
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -190,17 +190,23 @@ class Synching extends _$Synching {
|
|||
}
|
||||
}
|
||||
|
||||
void clearChangedParts(List<ActionType> actions) {
|
||||
Future<void> clearChangedParts(List<ActionType> actions, bool txn) async {
|
||||
var temp = isar.changedParts.filter().idIsNotNull().and().actionTypeEqualTo(
|
||||
actions.first,
|
||||
);
|
||||
for (ActionType action in actions.skip(1)) {
|
||||
temp = temp.or().actionTypeEqualTo(action);
|
||||
}
|
||||
final changedParts = temp.findAllSync().map((cp) => cp.id as Id).toList();
|
||||
isar.writeTxnSync(() {
|
||||
isar.changedParts.deleteAllSync(changedParts);
|
||||
});
|
||||
final changedParts = (await temp.findAll())
|
||||
.map((cp) => cp.id as Id)
|
||||
.toList();
|
||||
if (txn) {
|
||||
await isar.writeTxn(() async {
|
||||
await isar.changedParts.deleteAll(changedParts);
|
||||
});
|
||||
} else {
|
||||
await isar.changedParts.deleteAll(changedParts);
|
||||
}
|
||||
}
|
||||
|
||||
void clearAllChangedParts(bool txn) {
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ part of 'sync_providers.dart';
|
|||
// RiverpodGenerator
|
||||
// **************************************************************************
|
||||
|
||||
String _$synchingHash() => r'8a4f7f408bf0ac26f4a21368620051ecba3adf53';
|
||||
String _$synchingHash() => r'40ebe2223be56e155f099124d3cf3676adc253e5';
|
||||
|
||||
/// Copied from Dart SDK
|
||||
class _SystemHash {
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@ import 'package:flutter/material.dart';
|
|||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:isar/isar.dart';
|
||||
import 'package:mangayomi/main.dart';
|
||||
import 'package:mangayomi/models/changed.dart';
|
||||
import 'package:mangayomi/modules/more/settings/sync/providers/sync_providers.dart';
|
||||
import 'package:mangayomi/utils/date.dart';
|
||||
import 'package:mangayomi/models/sync_preference.dart';
|
||||
|
|
@ -18,7 +17,6 @@ class SyncScreen extends ConsumerWidget {
|
|||
@override
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
final syncProvider = ref.watch(synchingProvider(syncId: 1));
|
||||
final changedParts = ref.watch(synchingProvider(syncId: 1).notifier);
|
||||
final autoSyncFrequency = ref
|
||||
.watch(synchingProvider(syncId: 1))
|
||||
.autoSyncFrequency;
|
||||
|
|
@ -50,15 +48,19 @@ class SyncScreen extends ConsumerWidget {
|
|||
SwitchListTile(
|
||||
value: syncProvider.syncOn,
|
||||
title: Text(context.l10n.sync_on),
|
||||
onChanged: !isLogged
|
||||
? null
|
||||
: (value) {
|
||||
ref
|
||||
.read(SynchingProvider(syncId: 1).notifier)
|
||||
.setSyncOn(value);
|
||||
},
|
||||
onChanged: (value) {
|
||||
ref
|
||||
.read(SynchingProvider(syncId: 1).notifier)
|
||||
.setSyncOn(value);
|
||||
if (!value) {
|
||||
ref
|
||||
.read(SynchingProvider(syncId: 1).notifier)
|
||||
.setAutoSyncFrequency(0);
|
||||
}
|
||||
},
|
||||
),
|
||||
ListTile(
|
||||
enabled: syncPreference.syncOn,
|
||||
onTap: () {
|
||||
showDialog(
|
||||
context: context,
|
||||
|
|
@ -169,6 +171,7 @@ class SyncScreen extends ConsumerWidget {
|
|||
),
|
||||
),
|
||||
SyncListile(
|
||||
enabled: syncPreference.syncOn,
|
||||
onTap: () async {
|
||||
_showDialogLogin(context, ref);
|
||||
},
|
||||
|
|
@ -208,7 +211,7 @@ class SyncScreen extends ConsumerWidget {
|
|||
children: [
|
||||
const SizedBox(width: 20),
|
||||
Text(
|
||||
"${l10n.last_sync}: ${dateFormat((syncPreference.lastSync ?? 0).toString(), ref: ref, context: context)} ${dateFormatHour((syncPreference.lastSync ?? 0).toString(), context)}",
|
||||
"${l10n.last_sync_manga}: ${dateFormat((syncPreference.lastSyncManga ?? 0).toString(), ref: ref, context: context)} ${dateFormatHour((syncPreference.lastSyncManga ?? 0).toString(), context)}",
|
||||
style: TextStyle(
|
||||
fontSize: 11,
|
||||
color: context.secondaryColor,
|
||||
|
|
@ -216,7 +219,7 @@ class SyncScreen extends ConsumerWidget {
|
|||
),
|
||||
const SizedBox(width: 20),
|
||||
Text(
|
||||
"${l10n.last_upload}: ${dateFormat((syncPreference.lastUpload ?? 0).toString(), ref: ref, context: context)} ${dateFormatHour((syncPreference.lastUpload ?? 0).toString(), context)}",
|
||||
"${l10n.last_sync_history}: ${dateFormat((syncPreference.lastSyncHistory ?? 0).toString(), ref: ref, context: context)} ${dateFormatHour((syncPreference.lastSyncHistory ?? 0).toString(), context)}",
|
||||
style: TextStyle(
|
||||
fontSize: 11,
|
||||
color: context.secondaryColor,
|
||||
|
|
@ -224,7 +227,7 @@ class SyncScreen extends ConsumerWidget {
|
|||
),
|
||||
const SizedBox(width: 20),
|
||||
Text(
|
||||
"${l10n.last_download}: ${dateFormat((syncPreference.lastDownload ?? 0).toString(), ref: ref, context: context)} ${dateFormatHour((syncPreference.lastDownload ?? 0).toString(), context)}",
|
||||
"${l10n.last_sync_update}: ${dateFormat((syncPreference.lastSyncUpdate ?? 0).toString(), ref: ref, context: context)} ${dateFormatHour((syncPreference.lastSyncUpdate ?? 0).toString(), context)}",
|
||||
style: TextStyle(
|
||||
fontSize: 11,
|
||||
color: context.secondaryColor,
|
||||
|
|
@ -243,7 +246,7 @@ class SyncScreen extends ConsumerWidget {
|
|||
Column(
|
||||
children: [
|
||||
IconButton(
|
||||
onPressed: !isLogged
|
||||
onPressed: !syncPreference.syncOn || !isLogged
|
||||
? null
|
||||
: () {
|
||||
ref
|
||||
|
|
@ -254,7 +257,7 @@ class SyncScreen extends ConsumerWidget {
|
|||
},
|
||||
icon: Icon(
|
||||
Icons.sync,
|
||||
color: !isLogged
|
||||
color: !syncPreference.syncOn || !isLogged
|
||||
? context.secondaryColor
|
||||
: context.primaryColor,
|
||||
),
|
||||
|
|
@ -262,590 +265,8 @@ class SyncScreen extends ConsumerWidget {
|
|||
Text(l10n.sync_button_sync),
|
||||
],
|
||||
),
|
||||
const SizedBox(width: 20),
|
||||
Column(
|
||||
children: [
|
||||
IconButton(
|
||||
onPressed: !isLogged
|
||||
? null
|
||||
: () {
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (context) {
|
||||
return AlertDialog(
|
||||
title: Text(l10n.sync_confirm_snapshot),
|
||||
actions: [
|
||||
Row(
|
||||
mainAxisAlignment:
|
||||
MainAxisAlignment.end,
|
||||
children: [
|
||||
ElevatedButton(
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor:
|
||||
Colors.transparent,
|
||||
shadowColor:
|
||||
Colors.transparent,
|
||||
surfaceTintColor:
|
||||
Colors.transparent,
|
||||
shape: RoundedRectangleBorder(
|
||||
side: BorderSide(
|
||||
color: context
|
||||
.secondaryColor,
|
||||
),
|
||||
borderRadius:
|
||||
BorderRadius.circular(
|
||||
20,
|
||||
),
|
||||
),
|
||||
),
|
||||
onPressed: () {
|
||||
Navigator.pop(context);
|
||||
},
|
||||
child: Text(
|
||||
l10n.cancel,
|
||||
style: TextStyle(
|
||||
color:
|
||||
context.secondaryColor,
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 15),
|
||||
ElevatedButton(
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: Colors.red
|
||||
.withValues(alpha: 0.7),
|
||||
),
|
||||
onPressed: () {
|
||||
ref
|
||||
.read(
|
||||
syncServerProvider(
|
||||
syncId: 1,
|
||||
).notifier,
|
||||
)
|
||||
.createSnapshot(l10n);
|
||||
Navigator.pop(context);
|
||||
},
|
||||
child: Text(
|
||||
l10n.dialog_confirm,
|
||||
style: TextStyle(
|
||||
color:
|
||||
context.secondaryColor,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
);
|
||||
},
|
||||
icon: Icon(
|
||||
Icons.save_as,
|
||||
color: !isLogged
|
||||
? context.secondaryColor
|
||||
: context.primaryColor,
|
||||
),
|
||||
),
|
||||
Text(l10n.sync_button_snapshot),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
const SizedBox(height: 20),
|
||||
Row(
|
||||
children: [
|
||||
const SizedBox(width: 30),
|
||||
Column(
|
||||
children: [
|
||||
IconButton(
|
||||
onPressed: !isLogged
|
||||
? null
|
||||
: () {
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (context) {
|
||||
return AlertDialog(
|
||||
title: Text(l10n.sync_confirm_upload),
|
||||
actions: [
|
||||
Row(
|
||||
mainAxisAlignment:
|
||||
MainAxisAlignment.end,
|
||||
children: [
|
||||
ElevatedButton(
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor:
|
||||
Colors.transparent,
|
||||
shadowColor:
|
||||
Colors.transparent,
|
||||
surfaceTintColor:
|
||||
Colors.transparent,
|
||||
shape: RoundedRectangleBorder(
|
||||
side: BorderSide(
|
||||
color: context
|
||||
.secondaryColor,
|
||||
),
|
||||
borderRadius:
|
||||
BorderRadius.circular(
|
||||
20,
|
||||
),
|
||||
),
|
||||
),
|
||||
onPressed: () {
|
||||
Navigator.pop(context);
|
||||
},
|
||||
child: Text(
|
||||
l10n.cancel,
|
||||
style: TextStyle(
|
||||
color:
|
||||
context.secondaryColor,
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 15),
|
||||
ElevatedButton(
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: Colors.red
|
||||
.withValues(alpha: 0.7),
|
||||
),
|
||||
onPressed: () {
|
||||
ref
|
||||
.read(
|
||||
syncServerProvider(
|
||||
syncId: 1,
|
||||
).notifier,
|
||||
)
|
||||
.uploadToServer(l10n);
|
||||
Navigator.pop(context);
|
||||
},
|
||||
child: Text(
|
||||
l10n.dialog_confirm,
|
||||
style: TextStyle(
|
||||
color:
|
||||
context.secondaryColor,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
);
|
||||
},
|
||||
icon: Icon(
|
||||
Icons.cloud_upload_outlined,
|
||||
color: !isLogged
|
||||
? context.secondaryColor
|
||||
: context.primaryColor,
|
||||
),
|
||||
),
|
||||
Text(l10n.sync_button_upload),
|
||||
],
|
||||
),
|
||||
const SizedBox(width: 30),
|
||||
Column(
|
||||
children: [
|
||||
IconButton(
|
||||
onPressed: !isLogged
|
||||
? null
|
||||
: () {
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (context) {
|
||||
return AlertDialog(
|
||||
title: Text(l10n.sync_confirm_download),
|
||||
actions: [
|
||||
Row(
|
||||
mainAxisAlignment:
|
||||
MainAxisAlignment.end,
|
||||
children: [
|
||||
ElevatedButton(
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor:
|
||||
Colors.transparent,
|
||||
shadowColor:
|
||||
Colors.transparent,
|
||||
surfaceTintColor:
|
||||
Colors.transparent,
|
||||
shape: RoundedRectangleBorder(
|
||||
side: BorderSide(
|
||||
color: context
|
||||
.secondaryColor,
|
||||
),
|
||||
borderRadius:
|
||||
BorderRadius.circular(
|
||||
20,
|
||||
),
|
||||
),
|
||||
),
|
||||
onPressed: () {
|
||||
Navigator.pop(context);
|
||||
},
|
||||
child: Text(
|
||||
l10n.cancel,
|
||||
style: TextStyle(
|
||||
color:
|
||||
context.secondaryColor,
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 15),
|
||||
ElevatedButton(
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: Colors.red
|
||||
.withValues(alpha: 0.7),
|
||||
),
|
||||
onPressed: () {
|
||||
ref
|
||||
.read(
|
||||
syncServerProvider(
|
||||
syncId: 1,
|
||||
).notifier,
|
||||
)
|
||||
.downloadFromServer(
|
||||
l10n,
|
||||
false,
|
||||
true,
|
||||
);
|
||||
Navigator.pop(context);
|
||||
},
|
||||
child: Text(
|
||||
l10n.dialog_confirm,
|
||||
style: TextStyle(
|
||||
color:
|
||||
context.secondaryColor,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
);
|
||||
},
|
||||
icon: Icon(
|
||||
Icons.cloud_download_outlined,
|
||||
color: !isLogged
|
||||
? context.secondaryColor
|
||||
: context.primaryColor,
|
||||
),
|
||||
),
|
||||
Text(l10n.sync_button_download),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
const SizedBox(height: 40),
|
||||
buildChangedItemWidget(
|
||||
l10n.sync_pending_manga,
|
||||
changedParts.getChangedParts([ActionType.removeItem]),
|
||||
),
|
||||
const SizedBox(height: 15),
|
||||
buildChangedItemWidget(
|
||||
l10n.sync_pending_chapter,
|
||||
changedParts.getChangedParts([ActionType.removeChapter]),
|
||||
),
|
||||
const SizedBox(height: 15),
|
||||
buildChangedItemWidget(
|
||||
l10n.sync_pending_category,
|
||||
changedParts.getChangedParts([ActionType.removeCategory]),
|
||||
),
|
||||
const SizedBox(height: 15),
|
||||
buildChangedItemWidget(
|
||||
l10n.sync_pending_history,
|
||||
changedParts.getChangedParts([ActionType.removeHistory]),
|
||||
),
|
||||
const SizedBox(height: 15),
|
||||
buildChangedItemWidget(
|
||||
l10n.sync_pending_update,
|
||||
changedParts.getChangedParts([ActionType.removeUpdate]),
|
||||
),
|
||||
const SizedBox(height: 15),
|
||||
buildChangedItemWidget(
|
||||
l10n.sync_pending_extension,
|
||||
changedParts.getChangedParts([ActionType.removeExtension]),
|
||||
),
|
||||
const SizedBox(height: 15),
|
||||
buildChangedItemWidget(
|
||||
l10n.sync_pending_track,
|
||||
changedParts.getChangedParts([ActionType.removeTrack]),
|
||||
),
|
||||
const SizedBox(height: 20),
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(
|
||||
left: 15,
|
||||
right: 15,
|
||||
bottom: 10,
|
||||
top: 5,
|
||||
),
|
||||
child: Row(
|
||||
children: [
|
||||
ElevatedButton(
|
||||
onPressed: !isLogged
|
||||
? null
|
||||
: () async {
|
||||
final snapshots = await ref
|
||||
.read(
|
||||
syncServerProvider(syncId: 1).notifier,
|
||||
)
|
||||
.getSnapshots(l10n);
|
||||
if (context.mounted) {
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (context) {
|
||||
return AlertDialog(
|
||||
title: Text(l10n.sync_snapshots),
|
||||
content: SizedBox(
|
||||
width: context.width(0.8),
|
||||
child: SuperListView.builder(
|
||||
shrinkWrap: true,
|
||||
itemCount: snapshots.length,
|
||||
itemBuilder: (context, index) {
|
||||
return Padding(
|
||||
padding:
|
||||
const EdgeInsets.symmetric(
|
||||
horizontal: 5,
|
||||
),
|
||||
child: Card(
|
||||
child: Column(
|
||||
children: [
|
||||
ElevatedButton(
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor:
|
||||
Colors
|
||||
.transparent,
|
||||
elevation: 0,
|
||||
shadowColor: Colors
|
||||
.transparent,
|
||||
shape: const RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.only(
|
||||
bottomLeft:
|
||||
Radius.circular(
|
||||
0,
|
||||
),
|
||||
bottomRight:
|
||||
Radius.circular(
|
||||
0,
|
||||
),
|
||||
topRight:
|
||||
Radius.circular(
|
||||
10,
|
||||
),
|
||||
topLeft:
|
||||
Radius.circular(
|
||||
10,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
onPressed: () {},
|
||||
child: Row(
|
||||
crossAxisAlignment:
|
||||
CrossAxisAlignment
|
||||
.end,
|
||||
children: [
|
||||
const Icon(
|
||||
Icons.save,
|
||||
),
|
||||
const SizedBox(
|
||||
width: 10,
|
||||
),
|
||||
Expanded(
|
||||
child: Text(
|
||||
"${dateFormat((snapshots[index].createdAt!).toString(), ref: ref, context: context)} ${dateFormatHour((snapshots[index].createdAt!).toString(), context)}",
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
Row(
|
||||
mainAxisAlignment:
|
||||
MainAxisAlignment
|
||||
.end,
|
||||
children: [
|
||||
Row(
|
||||
children: [
|
||||
IconButton(
|
||||
onPressed: () {
|
||||
showDialog(
|
||||
context:
|
||||
context,
|
||||
builder: (context) {
|
||||
return StatefulBuilder(
|
||||
builder:
|
||||
(
|
||||
context,
|
||||
setState,
|
||||
) {
|
||||
return AlertDialog(
|
||||
title: Text(
|
||||
l10n.sync_load_snapshot,
|
||||
),
|
||||
actions: [
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.end,
|
||||
children: [
|
||||
TextButton(
|
||||
onPressed: () {
|
||||
Navigator.pop(
|
||||
context,
|
||||
);
|
||||
},
|
||||
child: Text(
|
||||
l10n.cancel,
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
width: 15,
|
||||
),
|
||||
TextButton(
|
||||
onPressed: () async {
|
||||
await ref
|
||||
.read(
|
||||
SyncServerProvider(
|
||||
syncId: 1,
|
||||
).notifier,
|
||||
)
|
||||
.downloadSnapshot(
|
||||
l10n,
|
||||
snapshots[index].uuid!,
|
||||
);
|
||||
if (context.mounted) {
|
||||
Navigator.pop(
|
||||
context,
|
||||
);
|
||||
}
|
||||
},
|
||||
child: Text(
|
||||
l10n.ok,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
);
|
||||
},
|
||||
);
|
||||
},
|
||||
icon: const Icon(
|
||||
Icons
|
||||
.cloud_download_outlined,
|
||||
),
|
||||
),
|
||||
IconButton(
|
||||
onPressed: () {
|
||||
showDialog(
|
||||
context:
|
||||
context,
|
||||
builder: (context) {
|
||||
return StatefulBuilder(
|
||||
builder:
|
||||
(
|
||||
context,
|
||||
setState,
|
||||
) {
|
||||
return AlertDialog(
|
||||
title: Text(
|
||||
l10n.sync_delete_snapshot,
|
||||
),
|
||||
actions: [
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.end,
|
||||
children: [
|
||||
TextButton(
|
||||
onPressed: () {
|
||||
Navigator.pop(
|
||||
context,
|
||||
);
|
||||
},
|
||||
child: Text(
|
||||
l10n.cancel,
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
width: 15,
|
||||
),
|
||||
TextButton(
|
||||
onPressed: () async {
|
||||
await ref
|
||||
.read(
|
||||
syncServerProvider(
|
||||
syncId: 1,
|
||||
).notifier,
|
||||
)
|
||||
.deleteSnapshot(
|
||||
l10n,
|
||||
snapshots[index].uuid!,
|
||||
);
|
||||
if (context.mounted) {
|
||||
Navigator.pop(
|
||||
context,
|
||||
);
|
||||
}
|
||||
},
|
||||
child: Text(
|
||||
l10n.ok,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
);
|
||||
},
|
||||
);
|
||||
},
|
||||
icon: const Icon(
|
||||
Icons
|
||||
.delete_outlined,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
actions: [
|
||||
Row(
|
||||
mainAxisAlignment:
|
||||
MainAxisAlignment.end,
|
||||
children: [
|
||||
TextButton(
|
||||
onPressed: () async {
|
||||
Navigator.pop(context);
|
||||
},
|
||||
child: Text(
|
||||
l10n.cancel,
|
||||
style: TextStyle(
|
||||
color: context.primaryColor,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
},
|
||||
child: Text(l10n.sync_browse_snapshots),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 20),
|
||||
],
|
||||
);
|
||||
},
|
||||
|
|
@ -855,32 +276,6 @@ class SyncScreen extends ConsumerWidget {
|
|||
}
|
||||
}
|
||||
|
||||
Widget buildChangedItemWidget(String text, List<ChangedPart> changedParts) {
|
||||
return Padding(
|
||||
padding: const EdgeInsets.only(left: 25, right: 25, bottom: 10, top: 5),
|
||||
child: Row(
|
||||
children: [
|
||||
Text(
|
||||
"$text: ${changedParts.length}",
|
||||
style: TextStyle(
|
||||
fontSize: 14,
|
||||
fontWeight: FontWeight.normal,
|
||||
background: Paint()
|
||||
..color = changedParts.isEmpty
|
||||
? Color.fromARGB(125, 78, 182, 92)
|
||||
: Color.fromARGB(123, 245, 233, 132)
|
||||
..strokeWidth = 20
|
||||
..strokeJoin = StrokeJoin.round
|
||||
..strokeCap = StrokeCap.round
|
||||
..style = PaintingStyle.stroke,
|
||||
color: Colors.white,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
void _showDialogLogin(BuildContext context, WidgetRef ref) {
|
||||
final serverController = TextEditingController();
|
||||
final emailController = TextEditingController();
|
||||
|
|
|
|||
|
|
@ -10,12 +10,14 @@ class SyncListile extends ConsumerWidget {
|
|||
final int id;
|
||||
final SyncPreference preference;
|
||||
final String? text;
|
||||
final bool enabled;
|
||||
const SyncListile({
|
||||
super.key,
|
||||
required this.onTap,
|
||||
required this.id,
|
||||
required this.preference,
|
||||
this.text,
|
||||
this.enabled = true,
|
||||
});
|
||||
|
||||
@override
|
||||
|
|
@ -38,6 +40,7 @@ class SyncListile extends ConsumerWidget {
|
|||
trailing: (isLogged
|
||||
? const Icon(Icons.check, size: 30, color: Colors.green)
|
||||
: null),
|
||||
enabled: enabled,
|
||||
onTap: isLogged
|
||||
? () {
|
||||
showDialog(
|
||||
|
|
|
|||
|
|
@ -1,19 +1,15 @@
|
|||
import 'package:crypto/crypto.dart';
|
||||
import 'package:flutter_qjs/quickjs/ffi.dart';
|
||||
import 'package:isar/isar.dart';
|
||||
import 'package:mangayomi/eval/model/m_bridge.dart';
|
||||
import 'package:mangayomi/eval/model/source_preference.dart';
|
||||
import 'package:mangayomi/main.dart';
|
||||
import 'package:mangayomi/models/category.dart';
|
||||
import 'package:mangayomi/models/changed.dart';
|
||||
import 'package:mangayomi/models/chapter.dart';
|
||||
import 'package:mangayomi/models/history.dart';
|
||||
import 'package:mangayomi/models/manga.dart';
|
||||
import 'package:mangayomi/models/settings.dart';
|
||||
import 'package:mangayomi/models/source.dart';
|
||||
import 'package:mangayomi/models/sync_preference.dart';
|
||||
import 'package:mangayomi/models/track.dart';
|
||||
import 'package:mangayomi/models/update.dart';
|
||||
import 'package:mangayomi/modules/more/data_and_storage/providers/restore.dart';
|
||||
import 'package:mangayomi/modules/more/settings/sync/models/jwt.dart';
|
||||
import 'package:mangayomi/modules/more/settings/sync/providers/sync_providers.dart';
|
||||
import 'package:mangayomi/services/http/m_client.dart';
|
||||
import 'dart:convert';
|
||||
|
|
@ -25,11 +21,9 @@ part 'sync_server.g.dart';
|
|||
class SyncServer extends _$SyncServer {
|
||||
final http = MClient.init(reqcopyWith: {'useDartHttpClient': true});
|
||||
final String _loginUrl = '/login';
|
||||
final String _uploadUrl = '/upload/full';
|
||||
final String _downloadUrl = '/download';
|
||||
final String _snapshotUrl = '/snapshot';
|
||||
final String _checkUrl = '/check';
|
||||
final String _syncUrl = '/sync';
|
||||
final String _syncMangaUrl = '/sync/manga';
|
||||
final String _syncHistoryUrl = '/sync/histories';
|
||||
final String _syncUpdateUrl = '/sync/updates';
|
||||
|
||||
@override
|
||||
void build({required int syncId}) {}
|
||||
|
|
@ -52,7 +46,7 @@ class SyncServer extends _$SyncServer {
|
|||
var cookieHeader = response.headers["set-cookie"];
|
||||
var startIdx = cookieHeader?.indexOf("id=") ?? -1;
|
||||
var endIdx = cookieHeader?.indexOf(";", startIdx) ?? -1;
|
||||
if (startIdx != -1 && endIdx != -1) {
|
||||
if (startIdx == -1 || endIdx == -1) {
|
||||
return (false, "Auth failed");
|
||||
}
|
||||
final authToken = cookieHeader!.substring(startIdx + 3, endIdx);
|
||||
|
|
@ -74,370 +68,395 @@ class SyncServer extends _$SyncServer {
|
|||
}
|
||||
|
||||
Future<void> startSync(AppLocalizations l10n, bool silent) async {
|
||||
botToast(l10n.sync_checking, second: 2);
|
||||
try {
|
||||
final changedParts = ref
|
||||
.read(synchingProvider(syncId: syncId).notifier)
|
||||
.getAllChangedParts();
|
||||
|
||||
if (changedParts.isNotEmpty) {
|
||||
final accessToken = _getAccessToken();
|
||||
|
||||
var response = await http.post(
|
||||
Uri.parse('${_getServer()}$_syncUrl'),
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'Cookie': 'id=$accessToken',
|
||||
},
|
||||
body: jsonEncode({'changedParts': changedParts}),
|
||||
);
|
||||
if (response.statusCode != 200) {
|
||||
botToast(l10n.sync_upload_failed, second: 5);
|
||||
return;
|
||||
}
|
||||
var jsonData = jsonDecode(response.body) as Map<String, dynamic>;
|
||||
final localHash = _getDataHash(_getData(true));
|
||||
final remoteHash = jsonData["hash"];
|
||||
if (localHash != remoteHash) {
|
||||
await downloadFromServer(l10n, true, false);
|
||||
}
|
||||
} else {
|
||||
await forceCheck(l10n, silent);
|
||||
}
|
||||
|
||||
final syncNotifier = ref.read(synchingProvider(syncId: syncId).notifier);
|
||||
syncNotifier.setLastSync(DateTime.now().millisecondsSinceEpoch);
|
||||
syncNotifier.clearAllChangedParts(true);
|
||||
|
||||
ref.invalidate(synchingProvider(syncId: syncId));
|
||||
} catch (error) {
|
||||
botToast(error.toString(), second: 5);
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> forceCheck(AppLocalizations l10n, bool silent) async {
|
||||
if (!silent) {
|
||||
botToast(l10n.sync_checking, second: 2);
|
||||
botToast(l10n.sync_starting, second: 2);
|
||||
}
|
||||
try {
|
||||
final accessToken = _getAccessToken();
|
||||
final localHash = _getDataHash(_getData(true));
|
||||
var response = await http.get(
|
||||
Uri.parse('${_getServer()}$_checkUrl'),
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'Cookie': 'id=$accessToken',
|
||||
},
|
||||
);
|
||||
if (response.statusCode != 200) {
|
||||
botToast(l10n.sync_download_failed, second: 2);
|
||||
return;
|
||||
}
|
||||
var jsonData = jsonDecode(response.body) as Map<String, dynamic>;
|
||||
final remoteHash = jsonData["hash"];
|
||||
if (localHash != remoteHash) {
|
||||
await downloadFromServer(l10n, silent, false);
|
||||
} else if (!silent) {
|
||||
botToast(l10n.sync_up_to_date, second: 2);
|
||||
}
|
||||
} catch (error) {
|
||||
botToast(error.toString(), second: 5);
|
||||
}
|
||||
}
|
||||
|
||||
Future<List<Snapshot>> getSnapshots(AppLocalizations l10n) async {
|
||||
try {
|
||||
final accessToken = _getAccessToken();
|
||||
|
||||
var response = await http.get(
|
||||
Uri.parse('${_getServer()}$_snapshotUrl'),
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'Cookie': 'id=$accessToken',
|
||||
},
|
||||
);
|
||||
if (response.statusCode != 200) {
|
||||
botToast(l10n.server_error, second: 5);
|
||||
return List.empty();
|
||||
}
|
||||
var temp = jsonDecode(response.body) as List;
|
||||
final snapshots = List<Snapshot>.empty(growable: true);
|
||||
for (final snapshot in temp) {
|
||||
snapshots.add(Snapshot.fromJson(snapshot));
|
||||
}
|
||||
return snapshots;
|
||||
} catch (error) {
|
||||
botToast(error.toString(), second: 5);
|
||||
}
|
||||
return List.empty();
|
||||
}
|
||||
|
||||
Future<void> downloadSnapshot(
|
||||
AppLocalizations l10n,
|
||||
String snapshotId,
|
||||
) async {
|
||||
botToast(l10n.sync_downloading, second: 2);
|
||||
try {
|
||||
final accessToken = _getAccessToken();
|
||||
|
||||
var response = await http.get(
|
||||
Uri.parse('${_getServer()}$_snapshotUrl/$snapshotId'),
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'Cookie': 'id=$accessToken',
|
||||
},
|
||||
);
|
||||
if (response.statusCode != 200) {
|
||||
botToast(l10n.sync_download_failed, second: 5);
|
||||
return;
|
||||
}
|
||||
var jsonData = jsonDecode(response.body) as Map<String, dynamic>;
|
||||
_restore(
|
||||
jsonData["backupData"] is String
|
||||
? jsonDecode(jsonData["backupData"])
|
||||
: jsonData["backupData"],
|
||||
true,
|
||||
);
|
||||
ref
|
||||
.read(synchingProvider(syncId: syncId).notifier)
|
||||
.setLastDownload(DateTime.now().millisecondsSinceEpoch);
|
||||
ref.invalidate(synchingProvider(syncId: syncId));
|
||||
botToast(l10n.sync_download_finished, second: 2);
|
||||
} catch (error) {
|
||||
botToast(error.toString(), second: 5);
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> createSnapshot(AppLocalizations l10n) async {
|
||||
botToast(l10n.sync_snapshot_creating, second: 2);
|
||||
try {
|
||||
final accessToken = _getAccessToken();
|
||||
|
||||
var response = await http.post(
|
||||
Uri.parse('${_getServer()}$_snapshotUrl'),
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'Cookie': 'id=$accessToken',
|
||||
},
|
||||
);
|
||||
if (response.statusCode == 400) {
|
||||
botToast(l10n.sync_snapshot_no_data, second: 5);
|
||||
return;
|
||||
} else if (response.statusCode != 200) {
|
||||
botToast(l10n.server_error, second: 5);
|
||||
return;
|
||||
}
|
||||
botToast(l10n.sync_snapshot_created, second: 2);
|
||||
} catch (error) {
|
||||
botToast(error.toString(), second: 5);
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> deleteSnapshot(AppLocalizations l10n, String snapshotId) async {
|
||||
botToast(l10n.sync_snapshot_deleting, second: 2);
|
||||
try {
|
||||
final accessToken = _getAccessToken();
|
||||
|
||||
var response = await http.delete(
|
||||
Uri.parse('${_getServer()}$_snapshotUrl/$snapshotId'),
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'Cookie': 'id=$accessToken',
|
||||
},
|
||||
);
|
||||
if (response.statusCode != 200) {
|
||||
botToast(l10n.server_error, second: 5);
|
||||
return;
|
||||
}
|
||||
botToast(l10n.sync_snapshot_deleted, second: 2);
|
||||
} catch (error) {
|
||||
botToast(error.toString(), second: 5);
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> uploadToServer(AppLocalizations l10n) async {
|
||||
botToast(l10n.sync_uploading, second: 2);
|
||||
try {
|
||||
final datas = _getData(false);
|
||||
final accessToken = _getAccessToken();
|
||||
|
||||
var response = await http.post(
|
||||
Uri.parse('${_getServer()}$_uploadUrl'),
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'Cookie': 'id=$accessToken',
|
||||
},
|
||||
body: jsonEncode({'backupData': datas}),
|
||||
);
|
||||
if (response.statusCode != 200) {
|
||||
botToast(l10n.sync_upload_failed, second: 5);
|
||||
return;
|
||||
}
|
||||
|
||||
final syncNotifier = ref.read(synchingProvider(syncId: syncId).notifier);
|
||||
syncNotifier.setLastUpload(DateTime.now().millisecondsSinceEpoch);
|
||||
syncNotifier.clearAllChangedParts(true);
|
||||
|
||||
ref.invalidate(synchingProvider(syncId: syncId));
|
||||
botToast(l10n.sync_upload_finished, second: 2);
|
||||
} catch (error) {
|
||||
botToast(error.toString(), second: 5);
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> downloadFromServer(
|
||||
AppLocalizations l10n,
|
||||
bool silent,
|
||||
bool full,
|
||||
) async {
|
||||
if (!silent) {
|
||||
botToast(l10n.sync_downloading, second: 2);
|
||||
}
|
||||
try {
|
||||
final accessToken = _getAccessToken();
|
||||
|
||||
var response = await http.get(
|
||||
Uri.parse('${_getServer()}$_downloadUrl'),
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'Cookie': 'id=$accessToken',
|
||||
},
|
||||
);
|
||||
if (response.statusCode != 200) {
|
||||
botToast(l10n.sync_download_failed, second: 5);
|
||||
final resultManga = await _syncManga(l10n, syncNotifier);
|
||||
if (!resultManga) {
|
||||
botToast(l10n.sync_failed, second: 5);
|
||||
return;
|
||||
}
|
||||
var jsonData = jsonDecode(response.body) as Map<String, dynamic>;
|
||||
_restore(
|
||||
jsonData["backupData"] is String
|
||||
? jsonDecode(jsonData["backupData"])
|
||||
: jsonData["backupData"],
|
||||
full,
|
||||
);
|
||||
ref
|
||||
.read(synchingProvider(syncId: syncId).notifier)
|
||||
.setLastDownload(DateTime.now().millisecondsSinceEpoch);
|
||||
final resultHistory = await _syncHistory(l10n, syncNotifier);
|
||||
if (!resultHistory) {
|
||||
botToast(l10n.sync_failed, second: 5);
|
||||
return;
|
||||
}
|
||||
final resultUpdate = await _syncUpdate(l10n, syncNotifier);
|
||||
if (!resultUpdate) {
|
||||
botToast(l10n.sync_failed, second: 5);
|
||||
return;
|
||||
}
|
||||
|
||||
ref.invalidate(synchingProvider(syncId: syncId));
|
||||
if (!silent) {
|
||||
botToast(l10n.sync_download_finished, second: 2);
|
||||
botToast(l10n.sync_finished, second: 2);
|
||||
}
|
||||
} catch (error) {
|
||||
botToast(error.toString(), second: 5);
|
||||
}
|
||||
}
|
||||
|
||||
String _getDataHash(Map<String, dynamic> data) {
|
||||
Map<String, dynamic> datas = {};
|
||||
datas["version"] = data["version"];
|
||||
datas["manga"] = data["manga"];
|
||||
datas["categories"] = data["categories"];
|
||||
datas["chapters"] = data["chapters"];
|
||||
datas["tracks"] = data["tracks"];
|
||||
datas["history"] = data["history"];
|
||||
datas["updates"] = data["updates"];
|
||||
datas["extensions"] = data["extensions"];
|
||||
var encodedJson = jsonEncode(datas);
|
||||
return sha256.convert(utf8.encode(encodedJson)).toString();
|
||||
Future<bool> _syncManga(AppLocalizations l10n, Synching syncNotifier) async {
|
||||
final mangaData = _getMangaData();
|
||||
final accessToken = _getAccessToken();
|
||||
var response = await http.post(
|
||||
Uri.parse('${_getServer()}$_syncMangaUrl'),
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'Cookie': 'id=$accessToken',
|
||||
},
|
||||
body: mangaData,
|
||||
);
|
||||
if (response.statusCode != 200) {
|
||||
botToast(l10n.sync_failed, second: 5);
|
||||
return false;
|
||||
}
|
||||
|
||||
final jsonData = jsonDecode(response.body) as Map<String, dynamic>;
|
||||
await _upsertCategories(jsonData, syncNotifier);
|
||||
await _upsertManga(jsonData, syncNotifier);
|
||||
await _upsertChapters(jsonData, syncNotifier);
|
||||
await _upsertTracks(jsonData, syncNotifier);
|
||||
|
||||
syncNotifier.setLastSyncManga(DateTime.now().millisecondsSinceEpoch);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
Map<String, dynamic> _getData(bool hashCheck) {
|
||||
Map<String, dynamic> datas = {};
|
||||
datas.addAll({"version": "2"});
|
||||
final mangas = isar.mangas
|
||||
.filter()
|
||||
.idIsNotNull()
|
||||
.favoriteEqualTo(true)
|
||||
.isLocalArchiveEqualTo(false)
|
||||
.findAllSync()
|
||||
.map((e) => hashCheck ? (e..id = 0).toJson() : e.toJson())
|
||||
.toList();
|
||||
datas.addAll({"manga": mangas});
|
||||
final categorys = isar.categorys
|
||||
.filter()
|
||||
.idIsNotNull()
|
||||
.findAllSync()
|
||||
.map((e) => hashCheck ? (e..id = 0).toJson() : e.toJson())
|
||||
.toList();
|
||||
datas.addAll({"categories": categorys});
|
||||
final chapters = isar.chapters
|
||||
.filter()
|
||||
.idIsNotNull()
|
||||
.findAllSync()
|
||||
.map((e) => hashCheck ? (e..id = 0).toJson() : e.toJson())
|
||||
.toList();
|
||||
datas.addAll({"chapters": chapters});
|
||||
datas.addAll({"downloads": []});
|
||||
final tracks = isar.tracks
|
||||
.filter()
|
||||
.idIsNotNull()
|
||||
.findAllSync()
|
||||
.map((e) => hashCheck ? (e..id = 0).toJson() : e.toJson())
|
||||
.toList();
|
||||
datas.addAll({"tracks": tracks});
|
||||
datas.addAll({"trackPreferences": []});
|
||||
final historys = isar.historys
|
||||
.filter()
|
||||
.idIsNotNull()
|
||||
.findAllSync()
|
||||
.map((e) => hashCheck ? (e..id = 0).toJson() : e.toJson())
|
||||
.toList();
|
||||
datas.addAll({"history": historys});
|
||||
final settings = isar.settings
|
||||
.filter()
|
||||
.idIsNotNull()
|
||||
.findAllSync()
|
||||
.map((e) => hashCheck ? (e..id = 0).toJson() : e.toJson())
|
||||
.toList();
|
||||
datas.addAll({"settings": settings});
|
||||
final sources = isar.sources
|
||||
.filter()
|
||||
.idIsNotNull()
|
||||
.findAllSync()
|
||||
.map((e) => hashCheck ? (e..id = 0).toJson() : e.toJson())
|
||||
.toList();
|
||||
datas.addAll({"extensions": sources});
|
||||
final sourcePreferences = isar.sourcePreferences
|
||||
.filter()
|
||||
.idIsNotNull()
|
||||
.keyIsNotNull()
|
||||
.findAllSync()
|
||||
.map((e) => hashCheck ? (e..id = 0).toJson() : e.toJson())
|
||||
.toList();
|
||||
datas.addAll({"extensions_preferences": sourcePreferences});
|
||||
final updates = isar.updates
|
||||
.filter()
|
||||
.idIsNotNull()
|
||||
.findAllSync()
|
||||
.map((e) => hashCheck ? (e..id = 0).toJson() : e.toJson())
|
||||
.toList();
|
||||
datas.addAll({"updates": updates});
|
||||
return datas;
|
||||
Future<bool> _syncHistory(
|
||||
AppLocalizations l10n,
|
||||
Synching syncNotifier,
|
||||
) async {
|
||||
final historyData = _getHistoryData();
|
||||
final accessToken = _getAccessToken();
|
||||
var response = await http.post(
|
||||
Uri.parse('${_getServer()}$_syncHistoryUrl'),
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'Cookie': 'id=$accessToken',
|
||||
},
|
||||
body: historyData,
|
||||
);
|
||||
if (response.statusCode != 200) {
|
||||
botToast(l10n.sync_failed, second: 5);
|
||||
return false;
|
||||
}
|
||||
|
||||
final jsonData = jsonDecode(response.body) as Map<String, dynamic>;
|
||||
await _upsertHistories(jsonData, syncNotifier);
|
||||
|
||||
syncNotifier.setLastSyncHistory(DateTime.now().millisecondsSinceEpoch);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void _restore(Map<String, dynamic> backup, bool full) {
|
||||
ref.read(restoreBackupProvider(backup, full: full));
|
||||
Future<bool> _syncUpdate(AppLocalizations l10n, Synching syncNotifier) async {
|
||||
final updateData = _getUpdateData();
|
||||
final accessToken = _getAccessToken();
|
||||
var response = await http.post(
|
||||
Uri.parse('${_getServer()}$_syncUpdateUrl'),
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'Cookie': 'id=$accessToken',
|
||||
},
|
||||
body: updateData,
|
||||
);
|
||||
if (response.statusCode != 200) {
|
||||
botToast(l10n.sync_failed, second: 5);
|
||||
return false;
|
||||
}
|
||||
|
||||
final jsonData = jsonDecode(response.body) as Map<String, dynamic>;
|
||||
await _upsertUpdates(jsonData, syncNotifier);
|
||||
|
||||
syncNotifier.setLastSyncUpdate(DateTime.now().millisecondsSinceEpoch);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
Future<void> _upsertCategories(
|
||||
Map<String, dynamic> jsonData,
|
||||
Synching syncNotifier,
|
||||
) async {
|
||||
final categories =
|
||||
(jsonData["categories"] as List?)
|
||||
?.map((e) => Category.fromJson(e))
|
||||
.toList() ??
|
||||
[];
|
||||
await isar.writeTxn(() async {
|
||||
for (var category
|
||||
in await isar.categorys.filter().idIsNotNull().findAll()) {
|
||||
final temp = categories.firstWhereOrNull((e) => e.id == category.id);
|
||||
if (temp != null) {
|
||||
await isar.categorys.put(category);
|
||||
categories.remove(temp);
|
||||
} else {
|
||||
await isar.categorys.delete(category.id!);
|
||||
}
|
||||
}
|
||||
for (var category in categories) {
|
||||
await isar.categorys.put(category);
|
||||
}
|
||||
await syncNotifier.clearChangedParts([ActionType.removeCategory], false);
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> _upsertManga(
|
||||
Map<String, dynamic> jsonData,
|
||||
Synching syncNotifier,
|
||||
) async {
|
||||
final mangas =
|
||||
(jsonData["manga"] as List?)?.map((e) => Manga.fromJson(e)).toList() ??
|
||||
[];
|
||||
await isar.writeTxn(() async {
|
||||
for (var manga in await isar.mangas.filter().idIsNotNull().findAll()) {
|
||||
final temp = mangas.firstWhereOrNull((e) => e.id == manga.id);
|
||||
if (temp != null) {
|
||||
await isar.mangas.put(manga);
|
||||
mangas.remove(temp);
|
||||
} else {
|
||||
await isar.mangas.delete(manga.id!);
|
||||
}
|
||||
}
|
||||
for (var manga in mangas) {
|
||||
await isar.mangas.put(manga);
|
||||
}
|
||||
await syncNotifier.clearChangedParts([ActionType.removeItem], false);
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> _upsertChapters(
|
||||
Map<String, dynamic> jsonData,
|
||||
Synching syncNotifier,
|
||||
) async {
|
||||
final chapters =
|
||||
(jsonData["chapters"] as List?)
|
||||
?.map((e) => Chapter.fromJson(e))
|
||||
.toList() ??
|
||||
[];
|
||||
await isar.writeTxn(() async {
|
||||
for (var chapter
|
||||
in await isar.chapters.filter().idIsNotNull().findAll()) {
|
||||
final temp = chapters.firstWhereOrNull((e) => e.id == chapter.id);
|
||||
if (temp != null) {
|
||||
final manga = await isar.mangas.get(temp.mangaId!);
|
||||
if (manga != null) {
|
||||
await isar.chapters.put(chapter..manga.value = manga);
|
||||
await chapter.manga.save();
|
||||
}
|
||||
chapters.remove(temp);
|
||||
} else {
|
||||
await isar.chapters.delete(chapter.id!);
|
||||
}
|
||||
}
|
||||
for (var chapter in chapters) {
|
||||
final manga = await isar.mangas.get(chapter.mangaId!);
|
||||
if (manga != null) {
|
||||
await isar.chapters.put(chapter..manga.value = manga);
|
||||
await chapter.manga.save();
|
||||
}
|
||||
}
|
||||
await syncNotifier.clearChangedParts([ActionType.removeChapter], false);
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> _upsertTracks(
|
||||
Map<String, dynamic> jsonData,
|
||||
Synching syncNotifier,
|
||||
) async {
|
||||
final tracks =
|
||||
(jsonData["tracks"] as List?)?.map((e) => Track.fromJson(e)).toList() ??
|
||||
[];
|
||||
await isar.writeTxn(() async {
|
||||
for (var track in await isar.tracks.filter().idIsNotNull().findAll()) {
|
||||
final temp = tracks.firstWhereOrNull((e) => e.id == track.id);
|
||||
if (temp != null) {
|
||||
await isar.tracks.put(track);
|
||||
tracks.remove(temp);
|
||||
} else {
|
||||
await isar.tracks.delete(track.id!);
|
||||
}
|
||||
}
|
||||
for (var track in tracks) {
|
||||
await isar.tracks.put(track);
|
||||
}
|
||||
await syncNotifier.clearChangedParts([ActionType.removeTrack], false);
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> _upsertHistories(
|
||||
Map<String, dynamic> jsonData,
|
||||
Synching syncNotifier,
|
||||
) async {
|
||||
final histories =
|
||||
(jsonData["histories"] as List?)
|
||||
?.map((e) => History.fromJson(e))
|
||||
.toList() ??
|
||||
[];
|
||||
await isar.writeTxn(() async {
|
||||
for (var history
|
||||
in await isar.historys.filter().idIsNotNull().findAll()) {
|
||||
final temp = histories.firstWhereOrNull((e) => e.id == history.id);
|
||||
if (temp != null) {
|
||||
final chapter = await isar.chapters.get(temp.chapterId!);
|
||||
if (chapter != null) {
|
||||
await isar.historys.put(history..chapter.value = chapter);
|
||||
await history.chapter.save();
|
||||
}
|
||||
histories.remove(temp);
|
||||
} else {
|
||||
await isar.historys.delete(history.id!);
|
||||
}
|
||||
}
|
||||
for (var history in histories) {
|
||||
final chapter = await isar.chapters.get(history.chapterId!);
|
||||
if (chapter != null) {
|
||||
await isar.historys.put(history..chapter.value = chapter);
|
||||
await history.chapter.save();
|
||||
}
|
||||
}
|
||||
await syncNotifier.clearChangedParts([ActionType.removeHistory], false);
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> _upsertUpdates(
|
||||
Map<String, dynamic> jsonData,
|
||||
Synching syncNotifier,
|
||||
) async {
|
||||
final updates =
|
||||
(jsonData["updates"] as List?)
|
||||
?.map((e) => Update.fromJson(e))
|
||||
.toList() ??
|
||||
[];
|
||||
await isar.writeTxn(() async {
|
||||
for (var update in await isar.updates.filter().idIsNotNull().findAll()) {
|
||||
final temp = updates.firstWhereOrNull((e) => e.id == update.id);
|
||||
if (temp != null) {
|
||||
final chapter = await isar.chapters
|
||||
.filter()
|
||||
.mangaIdEqualTo(temp.mangaId)
|
||||
.nameEqualTo(temp.chapterName)
|
||||
.findFirst();
|
||||
if (chapter != null) {
|
||||
await isar.updates.put(update..chapter.value = chapter);
|
||||
await update.chapter.save();
|
||||
}
|
||||
updates.remove(temp);
|
||||
} else {
|
||||
await isar.updates.delete(update.id!);
|
||||
}
|
||||
}
|
||||
for (var update in updates) {
|
||||
final chapter = await isar.chapters
|
||||
.filter()
|
||||
.mangaIdEqualTo(update.mangaId)
|
||||
.nameEqualTo(update.chapterName)
|
||||
.findFirst();
|
||||
if (chapter != null) {
|
||||
await isar.updates.put(update..chapter.value = chapter);
|
||||
await update.chapter.save();
|
||||
}
|
||||
}
|
||||
await syncNotifier.clearChangedParts([ActionType.removeUpdate], false);
|
||||
});
|
||||
}
|
||||
|
||||
String _getMangaData() {
|
||||
Map<String, dynamic> data = {};
|
||||
data["categories"] = _getCategories();
|
||||
data["deleted_categories"] = _getDeletedObjects(ActionType.removeCategory);
|
||||
data["manga"] = _getManga();
|
||||
data["deleted_manga"] = _getDeletedObjects(ActionType.removeItem);
|
||||
data["chapters"] = _getChapters();
|
||||
data["deleted_chapters"] = _getDeletedObjects(ActionType.removeChapter);
|
||||
data["tracks"] = _getTracks();
|
||||
data["deleted_tracks"] = _getDeletedObjects(ActionType.removeTrack);
|
||||
return jsonEncode(data);
|
||||
}
|
||||
|
||||
String _getHistoryData() {
|
||||
Map<String, dynamic> data = {};
|
||||
data["histories"] = _getHistories();
|
||||
data["deleted_histories"] = _getDeletedObjects(ActionType.removeHistory);
|
||||
return jsonEncode(data);
|
||||
}
|
||||
|
||||
String _getUpdateData() {
|
||||
Map<String, dynamic> data = {};
|
||||
data["updates"] = _getUpdates();
|
||||
data["deleted_updates"] = _getDeletedObjects(ActionType.removeUpdate);
|
||||
return jsonEncode(data);
|
||||
}
|
||||
|
||||
List<int> _getDeletedObjects(ActionType actionType) {
|
||||
return ref
|
||||
.read(synchingProvider(syncId: syncId).notifier)
|
||||
.getChangedParts([actionType])
|
||||
.map((e) => e.isarId)
|
||||
.nonNulls
|
||||
.toList();
|
||||
}
|
||||
|
||||
List<Map<String, dynamic>> _getManga() {
|
||||
return isar.mangas
|
||||
.filter()
|
||||
.idIsNotNull()
|
||||
.findAllSync()
|
||||
.map((e) => e.toJson())
|
||||
.toList();
|
||||
}
|
||||
|
||||
List<Map<String, dynamic>> _getCategories() {
|
||||
return isar.categorys
|
||||
.filter()
|
||||
.idIsNotNull()
|
||||
.findAllSync()
|
||||
.map((e) => e.toJson())
|
||||
.toList();
|
||||
}
|
||||
|
||||
List<Map<String, dynamic>> _getChapters() {
|
||||
return isar.chapters
|
||||
.filter()
|
||||
.idIsNotNull()
|
||||
.findAllSync()
|
||||
.map((e) => e.toJson())
|
||||
.toList();
|
||||
}
|
||||
|
||||
List<Map<String, dynamic>> _getTracks() {
|
||||
return isar.tracks
|
||||
.filter()
|
||||
.idIsNotNull()
|
||||
.findAllSync()
|
||||
.map((e) => e.toJson())
|
||||
.toList();
|
||||
}
|
||||
|
||||
List<Map<String, dynamic>> _getHistories() {
|
||||
return isar.historys
|
||||
.filter()
|
||||
.idIsNotNull()
|
||||
.findAllSync()
|
||||
.map((e) => e.toJson())
|
||||
.toList();
|
||||
}
|
||||
|
||||
List<Map<String, dynamic>> _getUpdates() {
|
||||
return isar.updates
|
||||
.filter()
|
||||
.idIsNotNull()
|
||||
.findAllSync()
|
||||
.map((e) => e.toJson())
|
||||
.toList();
|
||||
}
|
||||
|
||||
String _getAccessToken() {
|
||||
final syncPrefs = ref.watch(synchingProvider(syncId: syncId));
|
||||
if (syncPrefs.authToken == null) {
|
||||
return "";
|
||||
}
|
||||
var paddedPayload = syncPrefs.authToken!.split(".")[1];
|
||||
if (paddedPayload.length % 4 > 0) {
|
||||
paddedPayload += '=' * (4 - paddedPayload.length % 4);
|
||||
}
|
||||
final decodedJwt =
|
||||
jsonDecode(utf8.decode(base64Decode(paddedPayload)))
|
||||
as Map<String, dynamic>;
|
||||
final auth = JWToken.fromJson(decodedJwt);
|
||||
final expiresIn = DateTime.fromMillisecondsSinceEpoch(auth.exp!);
|
||||
if (DateTime.now().isAfter(expiresIn)) {
|
||||
ref.read(synchingProvider(syncId: syncId).notifier).logout();
|
||||
botToast("SyncServer Token expired");
|
||||
throw Exception("Token expired");
|
||||
}
|
||||
return syncPrefs.authToken!;
|
||||
return syncPrefs.authToken ?? "";
|
||||
}
|
||||
|
||||
String _getServer() {
|
||||
|
|
@ -445,14 +464,3 @@ class SyncServer extends _$SyncServer {
|
|||
return syncPrefs.server ?? "";
|
||||
}
|
||||
}
|
||||
|
||||
class Snapshot {
|
||||
String? uuid;
|
||||
int? createdAt;
|
||||
Snapshot({required this.uuid, required this.createdAt});
|
||||
|
||||
Snapshot.fromJson(Map<String, dynamic> json) {
|
||||
uuid = json['id'];
|
||||
createdAt = DateTime.parse(json["dbCreatedAt"]).millisecondsSinceEpoch;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ part of 'sync_server.dart';
|
|||
// RiverpodGenerator
|
||||
// **************************************************************************
|
||||
|
||||
String _$syncServerHash() => r'46e14525f2bc99d08884e35f45dda5902e835bb5';
|
||||
String _$syncServerHash() => r'6cf39e16b077842342c100463a1fc32c317493e3';
|
||||
|
||||
/// Copied from Dart SDK
|
||||
class _SystemHash {
|
||||
|
|
|
|||
Loading…
Reference in a new issue