diff --git a/controller/app/src/main/java/org/appdevforall/k2go/backup/domain/BackupEngine.java b/controller/app/src/main/java/org/appdevforall/k2go/backup/domain/BackupEngine.java index 8d24af4b..29e669ca 100644 --- a/controller/app/src/main/java/org/appdevforall/k2go/backup/domain/BackupEngine.java +++ b/controller/app/src/main/java/org/appdevforall/k2go/backup/domain/BackupEngine.java @@ -26,6 +26,7 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.zip.GZIPOutputStream; public final class BackupEngine { @@ -63,10 +64,13 @@ public static String suggestedFileName(Context ctx) { * (over {@code dest}), so the bytes tar produces are observable and metered against the tree's total size * ({@code du -sb}). Byte progress tracks the gzip+write time far better than a member count, which * front-loads on the many small files and then stalls on the few large ones. When {@code listener} is - * null or the pre-count fails, it streams without progress (indeterminate). This Java loop is also the - * seam a later backup-cancel interrupts. + * null or the pre-count fails, it streams without progress (indeterminate). + * + *

K2GO-384: {@code cancelled} (may be null) aborts the stream — the read loop kills tar and stops. The + * caller distinguishes a cancel from a failure by that same flag and removes the incomplete SAF file. */ - public static boolean streamBackup(Context ctx, OutputStream dest, ProgressListener listener) { + public static boolean streamBackup(Context ctx, OutputStream dest, ProgressListener listener, + AtomicBoolean cancelled) { File iiabRootDir = new File(ctx.getFilesDir(), "rootfs"); File nativeDir = new File(ctx.getApplicationInfo().nativeLibraryDir); File staticTar = new File(nativeDir, "libtar.so"); @@ -126,6 +130,8 @@ public static boolean streamBackup(Context ctx, OutputStream dest, ProgressListe final long startNs = System.nanoTime(); int n; while ((n = in.read(buf)) > 0) { + // K2GO-384: cancel stops tar mid-stream (backup is read-only, so this is always safe). + if (cancelled != null && cancelled.get()) { p.destroy(); break; } gz.write(buf, 0, n); processed += n; if (listener != null && totalBytes > 0L) { @@ -143,9 +149,10 @@ public static boolean streamBackup(Context ctx, OutputStream dest, ProgressListe int exit = p.waitFor(); if (errDrain != null) { try { errDrain.join(1500); } catch (InterruptedException ignored) { } } String tail; synchronized (errTail) { tail = errTail.toString().trim(); } - if (exit != 0) { + final boolean userCancelled = cancelled != null && cancelled.get(); + if (exit != 0 && !userCancelled) { // a cancel kills tar (non-zero) on purpose -- not a failure to log Log.w(TAG, "backup tar exited " + exit + (tail.isEmpty() ? "" : "; stderr tail:\n" + tail)); - } else if (!tail.isEmpty()) { + } else if (exit == 0 && !tail.isEmpty()) { // K2GO-384: succeeded, but --ignore-failed-read let tar skip unreadable entries. Expected ones // are proot mount stubs (iiab/sdcard, ...); RECORD them so a genuinely dropped file is never // silent (the honesty this slice restored -- the old tar|gzip pipe masked all of this). diff --git a/controller/app/src/main/java/org/appdevforall/k2go/deepop/DeepOpService.java b/controller/app/src/main/java/org/appdevforall/k2go/deepop/DeepOpService.java index cc559814..70b169c0 100644 --- a/controller/app/src/main/java/org/appdevforall/k2go/deepop/DeepOpService.java +++ b/controller/app/src/main/java/org/appdevforall/k2go/deepop/DeepOpService.java @@ -106,6 +106,9 @@ public final class DeepOpService extends Service { * pass outcome (complete / error / cancelled / held). Guards the re-callable attemptVerifyAndExtract so a * "Keep restoring" cannot start a second pass over the same temp while one is running. */ private volatile boolean passRunning = false; + /** K2GO-384: cancel for the (read-only, single-pass) BACKUP. streamBackup's read loop reads it and kills + * tar. Always safe (nothing on the device is touched); the terminal removes the incomplete SAF file. */ + private final java.util.concurrent.atomic.AtomicBoolean backupCancelled = new java.util.concurrent.atomic.AtomicBoolean(false); /** K2GO-384: true while the user is deciding on a paused COPY (Cancel pressed). The copy loop blocks on * it; ACTION_RESUME clears it (continue), ACTION_CANCEL_CONFIRM sets cancelBeforeExtract and clears it * (abort). Only the copy is pausable -- verify/extract are external tar processes. */ @@ -201,25 +204,44 @@ public int onStartCommand(Intent intent, int flags, int startId) { // ---- BACKUP (read-only) ---- private void runBackup(final String uriStr) { if (done) return; + currentCancelKind = DeepOpState.CancelKind.CANCELLABLE; // K2GO-384: backup is cancellable throughout (read-only) setStep(getString(R.string.k2go_br_status_backing), -1); AppExecutors.get().io().execute(() -> { boolean ok; try (OutputStream os = getContentResolver().openOutputStream(Uri.parse(uriStr))) { // K2GO-384: byte-accurate progress + ETA; streamBackup reports from its tar-stdout read loop. - // post() is thread-safe and carries cancelKind=NONE (backup's Cancel stays on the notification, - // so no on-screen Cancel appears). + // post() is thread-safe. backupCancelled lets the on-screen (or notification) Cancel stop tar. ok = os != null && BackupEngine.streamBackup(this, os, - (percent, etaSeconds) -> post(getString(R.string.k2go_br_status_backing), percent, etaSeconds)); + (percent, etaSeconds) -> post(getString(R.string.k2go_br_status_backing), percent, etaSeconds), + backupCancelled); } catch (Exception e) { Log.e(TAG, "backup failed", e); ok = false; } final boolean success = ok; - main.post(() -> finishJob(success, - getString(R.string.k2go_br_backup_done), getString(R.string.k2go_br_backup_failed))); + main.post(() -> { + if (done) return; + if (!success) { + // K2GO-384: an unfinished backup left an incomplete/damaged .tar.gz at the SAF destination. + // Removing it is the default (no prompt) -- a partial gzip'd tar is useless and unresumable. + deleteBackupDoc(uriStr); + if (backupCancelled.get()) { finishCancelled(); return; } // user cancel -> bifurcation + } + finishJob(success, getString(R.string.k2go_br_backup_done), getString(R.string.k2go_br_backup_failed)); + }); }); } + /** K2GO-384: remove the incomplete/damaged backup file a cancelled or failed run left at the SAF + * destination. Best-effort -- a document picked via CREATE_DOCUMENT supports delete; if not, leave it. */ + private void deleteBackupDoc(String uriStr) { + try { + android.provider.DocumentsContract.deleteDocument(getContentResolver(), Uri.parse(uriStr)); + } catch (Exception e) { + Log.w(TAG, "could not delete incomplete backup doc: " + e.getMessage()); + } + } + // ---- RESTORE (destructive) ---- /** @@ -550,13 +572,14 @@ private void finishCancelled() { } /** - * Notification "Cancel" — offered only for BACKUP (read-only, safe to abandon). Restore has no - * Cancel action (destructive, hard gate). The in-flight backup stream sees {@code done} and no-ops - * on completion. Runs the same cleanup as a failure so the lock is released and the op ends. + * Cancel (from the on-screen button's confirm, or the notification action — BACKUP only). Restore has no + * Cancel action here (it takes the CANCELLABLE hold / DESTRUCTIVE force-cancel paths below). */ private void cancel() { if (owner == EnvironmentLock.Owner.BACKUP) { - finishJob(false, "", getString(R.string.k2go_br_backup_failed)); + // K2GO-384: stop the backup for real -- the read loop sees this, kills tar, and the terminal + // removes the incomplete file (was: mark done + FAILED, which left tar running and the file behind). + backupCancelled.set(true); return; } // K2GO-384: a Cancel on any pre-destructive pass (CANCELLABLE) HOLDS the run and waits for the diff --git a/controller/app/src/main/java/org/appdevforall/k2go/redesign/BackupJobFragment.java b/controller/app/src/main/java/org/appdevforall/k2go/redesign/BackupJobFragment.java index 88c3cb70..57ab2206 100644 --- a/controller/app/src/main/java/org/appdevforall/k2go/redesign/BackupJobFragment.java +++ b/controller/app/src/main/java/org/appdevforall/k2go/redesign/BackupJobFragment.java @@ -299,6 +299,9 @@ private void setStatusAnimated(String text) { */ private void onCancelTapped() { if (!isAdded()) return; + // K2GO-384: backup is read-only + single-pass, so its cancel is trivially safe -- a light guard dialog + // (against an accidental tap), then stop tar + remove the incomplete file. No hold/pause, no phases. + if (!isRestore()) { showBackupCancelDialog(); return; } if (lastCancelKind == DeepOpState.CancelKind.DESTRUCTIVE) { showDestructiveCancelDialog(); return; } if (lastCancelKind != DeepOpState.CancelKind.CANCELLABLE) return; sendToService(DeepOpService.ACTION_CANCEL); // hold the run while the user decides (no race) @@ -323,6 +326,23 @@ private void sendToService(String action) { new android.content.Intent(requireContext(), DeepOpService.class).setAction(action)); } + /** + * K2GO-384: backup is read-only, so cancelling is always safe -- this dialog only guards an accidental tap. + * Confirming stops the backup and removes the incomplete file (the default; a partial archive is useless). + * Cancelable: nothing is paused, so a scrim/Back dismiss simply keeps the backup running. + */ + private void showBackupCancelDialog() { + new BrandDialog(requireContext()) + .setTitle(getString(R.string.k2go_br_cancel_backup_title)) + .setMessage(getString(R.string.k2go_br_cancel_backup_body)) + .setPositive(R.string.k2go_br_cancel_backup_confirm, () -> { + if (cancel != null) cancel.setEnabled(false); + sendToService(DeepOpService.ACTION_CANCEL); // stop tar -> incomplete file removed -> CANCELLED + }) + .setNegative(R.string.k2go_br_cancel_backup_keep, null) // dismiss = keep backing up + .show(); + } + /** * K2GO-384: cancelling DURING the extract is destructive -- the rootfs is being overwritten. A strong * M3 dialog: RED confirm (colorError) gated by an acknowledgement checkbox. Confirming force-cancels the diff --git a/controller/app/src/main/res/values-ar/strings.xml b/controller/app/src/main/res/values-ar/strings.xml index 3a642751..60a8d277 100644 --- a/controller/app/src/main/res/values-ar/strings.xml +++ b/controller/app/src/main/res/values-ar/strings.xml @@ -646,6 +646,10 @@ أفهم أن الإلغاء الآن قد يترك نظامي تالفًا أو غير قابل للاستخدام. تم إلغاء الاستعادة. سيبدأ نظامك في وضع الاسترداد عند التشغيل التالي. حدد المربع لتأكيد فهمك. + إلغاء النسخة الاحتياطية؟ + لم تكتمل هذه النسخة الاحتياطية. يؤدي الإلغاء إلى إزالة الملف غير المكتمل — يمكنك بدء نسخة احتياطية جديدة في أي وقت. + إلغاء النسخة الاحتياطية + متابعة النسخ الاحتياطي تعذّرت قراءة الملف المحدد، لذا لم يتغيّر أي شيء. النسخ الاحتياطي والاستعادة يُبقي عملية نسخ احتياطي أو استعادة قيد التشغيل بأمان في الخلفية diff --git a/controller/app/src/main/res/values-az/strings.xml b/controller/app/src/main/res/values-az/strings.xml index b6ee64bc..b0ed4359 100644 --- a/controller/app/src/main/res/values-az/strings.xml +++ b/controller/app/src/main/res/values-az/strings.xml @@ -666,6 +666,10 @@ İndi ləğv etməyin sistemimi zədələnmiş və ya yararsız qoya biləcəyini başa düşürəm. Bərpa ləğv edildi. Sisteminiz növbəti işə salınmada bərpa rejimində başlayacaq. Başa düşdüyünüzü təsdiqləmək üçün qutunu işarələyin. + Ehtiyat nüsxə ləğv edilsin? + Bu ehtiyat nüsxə tamamlanmayıb. Ləğv etmək yarımçıq faylı silir — istənilən vaxt yeni ehtiyat nüsxə başlada bilərsiniz. + Ehtiyat nüsxəni ləğv et + Ehtiyatlamağa davam et Seçilmiş fayl oxuna bilmədi, ona görə heç nə dəyişdirilmədi. Ehtiyat nüsxə & bərpa Ehtiyat nüsxə və ya bərpanı arxa planda təhlükəsiz işlədir diff --git a/controller/app/src/main/res/values-bg/strings.xml b/controller/app/src/main/res/values-bg/strings.xml index 40d9349b..e823ea59 100644 --- a/controller/app/src/main/res/values-bg/strings.xml +++ b/controller/app/src/main/res/values-bg/strings.xml @@ -653,6 +653,10 @@ Разбирам, че отказът сега може да остави системата ми повредена или неизползваема. Възстановяването е отказано. Системата ви ще стартира в режим на възстановяване при следващото стартиране. Отметнете полето, за да потвърдите, че разбирате. + Отказ от резервното копие? + Това резервно копие не е завършено. Отказът премахва незавършения файл — можете да започнете ново резервно копие по всяко време. + Отказ от резервното копие + Продължи архивирането Избраният файл не можа да бъде прочетен, затова нищо не беше променено. Резервно копие и възстановяване Поддържа безопасното изпълнение на резервно копие или възстановяване във фонов режим diff --git a/controller/app/src/main/res/values-bn/strings.xml b/controller/app/src/main/res/values-bn/strings.xml index 35ce5781..573e5e3f 100644 --- a/controller/app/src/main/res/values-bn/strings.xml +++ b/controller/app/src/main/res/values-bn/strings.xml @@ -659,6 +659,10 @@ আমি বুঝি যে এখন বাতিল করলে আমার সিস্টেম ক্ষতিগ্রস্ত বা ব্যবহারের অযোগ্য হয়ে যেতে পারে। পুনরুদ্ধার বাতিল করা হয়েছে। পরবর্তী চালুতে আপনার সিস্টেম রিকভারি মোডে শুরু হবে। আপনি বুঝেছেন তা নিশ্চিত করতে বাক্সটি চেক করুন। + ব্যাকআপ বাতিল করবেন? + এই ব্যাকআপ শেষ হয়নি। বাতিল করলে অসম্পূর্ণ ফাইলটি সরানো হবে — আপনি যেকোনো সময় নতুন ব্যাকআপ শুরু করতে পারেন। + ব্যাকআপ বাতিল করুন + ব্যাকআপ চালিয়ে যান নির্বাচিত ফাইলটি পড়া যায়নি, তাই কিছুই পরিবর্তন করা হয়নি। ব্যাকআপ ও পুনরুদ্ধার ব্যাকআপ বা পুনরুদ্ধার ব্যাকগ্রাউন্ডে নিরাপদে চালু রাখে diff --git a/controller/app/src/main/res/values-cs/strings.xml b/controller/app/src/main/res/values-cs/strings.xml index 967a6ec9..c94db3ae 100644 --- a/controller/app/src/main/res/values-cs/strings.xml +++ b/controller/app/src/main/res/values-cs/strings.xml @@ -653,6 +653,10 @@ Rozumím, že zrušení nyní může můj systém poškodit nebo učinit nepoužitelným. Obnovení zrušeno. Váš systém se při příštím spuštění spustí v režimu obnovy. Zaškrtnutím políčka potvrďte, že rozumíte. + Zrušit zálohu? + Tato záloha není dokončena. Zrušením se odstraní neúplný soubor — novou zálohu můžete kdykoli spustit. + Zrušit zálohu + Pokračovat v zálohování Vybraný soubor se nepodařilo přečíst, takže se nic nezměnilo. Záloha & obnova Udržuje zálohu nebo obnovu bezpečně spuštěnou na pozadí diff --git a/controller/app/src/main/res/values-de/strings.xml b/controller/app/src/main/res/values-de/strings.xml index f46aa1af..a7851bf4 100644 --- a/controller/app/src/main/res/values-de/strings.xml +++ b/controller/app/src/main/res/values-de/strings.xml @@ -646,6 +646,10 @@ Ich verstehe, dass ein Abbruch jetzt mein System beschädigen oder unbrauchbar machen kann. Wiederherstellung abgebrochen. Ihr System startet beim nächsten Start im Wiederherstellungsmodus. Aktivieren Sie das Kontrollkästchen, um zu bestätigen, dass Sie es verstanden haben. + Sicherung abbrechen? + Diese Sicherung ist nicht abgeschlossen. Beim Abbrechen wird die unvollständige Datei entfernt — Sie können jederzeit eine neue Sicherung starten. + Sicherung abbrechen + Sicherung fortsetzen Die ausgewählte Datei konnte nicht gelesen werden, daher wurde nichts geändert. Sichern & wiederherstellen Hält ein Backup oder eine Wiederherstellung sicher im Hintergrund am Laufen diff --git a/controller/app/src/main/res/values-el/strings.xml b/controller/app/src/main/res/values-el/strings.xml index 867c0bf0..9cbd18e6 100644 --- a/controller/app/src/main/res/values-el/strings.xml +++ b/controller/app/src/main/res/values-el/strings.xml @@ -653,6 +653,10 @@ Καταλαβαίνω ότι η ακύρωση τώρα μπορεί να αφήσει το σύστημά μου κατεστραμμένο ή άχρηστο. Η επαναφορά ακυρώθηκε. Το σύστημά σας θα ξεκινήσει σε λειτουργία ανάκτησης κατά την επόμενη εκκίνηση. Επιλέξτε το πλαίσιο για να επιβεβαιώσετε ότι καταλαβαίνετε. + Ακύρωση αντιγράφου ασφαλείας? + Αυτό το αντίγραφο ασφαλείας δεν έχει ολοκληρωθεί. Η ακύρωση αφαιρεί το ημιτελές αρχείο — μπορείτε να ξεκινήσετε νέο αντίγραφο ασφαλείας οποιαδήποτε στιγμή. + Ακύρωση αντιγράφου ασφαλείας + Συνέχιση δημιουργίας αντιγράφου Δεν ήταν δυνατή η ανάγνωση του επιλεγμένου αρχείου, επομένως δεν άλλαξε τίποτα. Αντίγραφο ασφαλείας & επαναφορά Διατηρεί ένα αντίγραφο ασφαλείας ή μια επαναφορά σε ασφαλή εκτέλεση στο παρασκήνιο diff --git a/controller/app/src/main/res/values-es/strings.xml b/controller/app/src/main/res/values-es/strings.xml index 5550364d..0eed1854 100644 --- a/controller/app/src/main/res/values-es/strings.xml +++ b/controller/app/src/main/res/values-es/strings.xml @@ -722,6 +722,10 @@ Entiendo que cancelar ahora puede dejar mi sistema dañado o inutilizable. Restauración cancelada. Tu sistema se iniciará en modo de recuperación en el próximo arranque. Marca la casilla para confirmar que lo entiendes. + ¿Cancelar la copia de seguridad? + Esta copia de seguridad no está terminada. Al cancelar se elimina el archivo incompleto — puedes iniciar una nueva copia de seguridad en cualquier momento. + Cancelar la copia de seguridad + Seguir con la copia No se pudo leer el archivo seleccionado, así que no se cambió nada. Copia de seguridad y restauración Mantiene una copia o restauración ejecutándose de forma segura en segundo plano diff --git a/controller/app/src/main/res/values-fa/strings.xml b/controller/app/src/main/res/values-fa/strings.xml index 85dcd518..646204df 100644 --- a/controller/app/src/main/res/values-fa/strings.xml +++ b/controller/app/src/main/res/values-fa/strings.xml @@ -646,6 +646,10 @@ می‌فهمم که لغو کردن اکنون ممکن است سیستم من را آسیب‌دیده یا غیرقابل استفاده کند. بازیابی لغو شد. سیستم شما در راه‌اندازی بعدی در حالت بازیابی شروع می‌شود. برای تأیید اینکه متوجه شدید، کادر را علامت بزنید. + لغو پشتیبان‌گیری؟ + این پشتیبان‌گیری کامل نشده است. لغو کردن فایل ناقص را حذف می‌کند — می‌توانید هر زمان پشتیبان‌گیری جدیدی را شروع کنید. + لغو پشتیبان‌گیری + ادامه پشتیبان‌گیری فایل انتخاب‌شده خوانده نشد، بنابراین چیزی تغییر نکرد. پشتیبان‌گیری و بازیابی پشتیبان‌گیری یا بازیابی را با ایمنی در پس‌زمینه اجرا نگه می‌دارد diff --git a/controller/app/src/main/res/values-fr/strings.xml b/controller/app/src/main/res/values-fr/strings.xml index a6d3f650..8871fd1d 100644 --- a/controller/app/src/main/res/values-fr/strings.xml +++ b/controller/app/src/main/res/values-fr/strings.xml @@ -724,6 +724,10 @@ Je comprends que l\'annulation maintenant peut laisser mon système endommagé ou inutilisable. Restauration annulée. Votre système démarrera en mode récupération au prochain lancement. Cochez la case pour confirmer que vous avez compris. + Annuler la sauvegarde ? + Cette sauvegarde n\'est pas terminée. L\'annulation supprime le fichier incomplet — vous pouvez démarrer une nouvelle sauvegarde à tout moment. + Annuler la sauvegarde + Continuer la sauvegarde Le fichier sélectionné n\'a pas pu être lu, donc rien n\'a été modifié. Sauvegarde & restauration Maintient une sauvegarde ou une restauration en cours en toute sécurité en arrière-plan diff --git a/controller/app/src/main/res/values-gu/strings.xml b/controller/app/src/main/res/values-gu/strings.xml index d82fc630..1da7c566 100644 --- a/controller/app/src/main/res/values-gu/strings.xml +++ b/controller/app/src/main/res/values-gu/strings.xml @@ -659,6 +659,10 @@ હું સમજું છું કે હમણાં રદ કરવાથી મારી સિસ્ટમ ક્ષતિગ્રસ્ત અથવા બિનઉપયોગી થઈ શકે છે. પુનઃસ્થાપન રદ થયું. તમારી સિસ્ટમ આગલા લોન્ચ પર રિકવરી મોડમાં શરૂ થશે. તમે સમજ્યા છો તેની પુષ્ટિ કરવા બોક્સ પર ટિક કરો. + બેકઅપ રદ કરવો છે? + આ બેકઅપ પૂર્ણ થયો નથી. રદ કરવાથી અધૂરી ફાઇલ દૂર થાય છે — તમે કોઈપણ સમયે નવો બેકઅપ શરૂ કરી શકો છો. + બેકઅપ રદ કરો + બેકઅપ ચાલુ રાખો પસંદ કરેલી ફાઇલ વાંચી શકાઈ નહીં, તેથી કંઈ બદલાયું નથી. બૅકઅપ & રિસ્ટોર બૅકઅપ કે રિસ્ટોરને બૅકગ્રાઉન્ડમાં સુરક્ષિત રીતે ચાલુ રાખે છે diff --git a/controller/app/src/main/res/values-hi/strings.xml b/controller/app/src/main/res/values-hi/strings.xml index 994a63d2..f60f2652 100644 --- a/controller/app/src/main/res/values-hi/strings.xml +++ b/controller/app/src/main/res/values-hi/strings.xml @@ -723,6 +723,10 @@ मैं समझता हूँ कि अभी रद्द करने से मेरा सिस्टम क्षतिग्रस्त या अनुपयोगी हो सकता है। पुनर्स्थापना रद्द कर दी गई। आपका सिस्टम अगली बार शुरू होने पर रिकवरी मोड में शुरू होगा। पुष्टि करने के लिए बॉक्स को चेक करें कि आप समझते हैं। + बैकअप रद्द करें? + यह बैकअप पूरा नहीं हुआ है। रद्द करने से अधूरी फ़ाइल हट जाती है — आप कभी भी नया बैकअप शुरू कर सकते हैं। + बैकअप रद्द करें + बैकअप जारी रखें चुनी गई फ़ाइल पढ़ी नहीं जा सकी, इसलिए कुछ भी नहीं बदला गया। बैकअप और पुनर्स्थापना बैकअप या पुनर्स्थापना को बैकग्राउंड में सुरक्षित रूप से चलाए रखता है diff --git a/controller/app/src/main/res/values-hu/strings.xml b/controller/app/src/main/res/values-hu/strings.xml index 65934e49..8aa503af 100644 --- a/controller/app/src/main/res/values-hu/strings.xml +++ b/controller/app/src/main/res/values-hu/strings.xml @@ -646,6 +646,10 @@ Megértem, hogy a mostani megszakítás sérültté vagy használhatatlanná teheti a rendszeremet. Visszaállítás megszakítva. A rendszered a következő indításkor helyreállítási módban indul. Jelöld be a négyzetet a megerősítéshez. + Megszakítja a biztonsági mentést? + Ez a biztonsági mentés nem fejeződött be. A megszakítás eltávolítja a befejezetlen fájlt — bármikor indíthat új biztonsági mentést. + Biztonsági mentés megszakítása + Mentés folytatása A kiválasztott fájlt nem sikerült beolvasni, ezért semmi sem változott. Biztonsági mentés & visszaállítás Biztonságosan futtatja a mentést vagy visszaállítást a háttérben diff --git a/controller/app/src/main/res/values-in/strings.xml b/controller/app/src/main/res/values-in/strings.xml index ed385f4c..6645ae71 100644 --- a/controller/app/src/main/res/values-in/strings.xml +++ b/controller/app/src/main/res/values-in/strings.xml @@ -653,6 +653,10 @@ Saya memahami bahwa membatalkan sekarang dapat membuat sistem saya rusak atau tidak dapat digunakan. Pemulihan dibatalkan. Sistem Anda akan memulai dalam mode pemulihan pada peluncuran berikutnya. Centang kotak untuk mengonfirmasi bahwa Anda memahami. + Batalkan cadangan? + Cadangan ini belum selesai. Membatalkan akan menghapus file yang belum selesai — Anda dapat memulai cadangan baru kapan saja. + Batalkan cadangan + Lanjutkan mencadangkan Berkas yang dipilih tidak dapat dibaca, jadi tidak ada yang diubah. Cadangkan & pulihkan Menjaga pencadangan atau pemulihan berjalan aman di latar belakang diff --git a/controller/app/src/main/res/values-it/strings.xml b/controller/app/src/main/res/values-it/strings.xml index 6a15d397..57ffeb50 100644 --- a/controller/app/src/main/res/values-it/strings.xml +++ b/controller/app/src/main/res/values-it/strings.xml @@ -646,6 +646,10 @@ Capisco che annullare ora potrebbe lasciare il mio sistema danneggiato o inutilizzabile. Ripristino annullato. Il tuo sistema si avvierà in modalità di ripristino al prossimo avvio. Seleziona la casella per confermare di aver capito. + Annullare il backup? + Questo backup non è completato. L\'annullamento rimuove il file incompleto — puoi avviare un nuovo backup in qualsiasi momento. + Annulla il backup + Continua il backup Non è stato possibile leggere il file selezionato, quindi non è stato modificato nulla. Backup & ripristino Mantiene un backup o ripristino in esecuzione in modo sicuro in background diff --git a/controller/app/src/main/res/values-ja/strings.xml b/controller/app/src/main/res/values-ja/strings.xml index 682f9856..5b8b45f0 100644 --- a/controller/app/src/main/res/values-ja/strings.xml +++ b/controller/app/src/main/res/values-ja/strings.xml @@ -647,6 +647,10 @@ 今キャンセルすると、システムが破損したり使用できなくなったりする可能性があることを理解しています。 復元をキャンセルしました。次回の起動時にシステムはリカバリーモードで起動します。 理解したことを確認するにはチェックボックスをオンにしてください。 + バックアップをキャンセルしますか? + このバックアップは完了していません。キャンセルすると未完成のファイルが削除されます — いつでも新しいバックアップを開始できます。 + バックアップをキャンセル + バックアップを続ける 選択したファイルを読み取れなかったため、何も変更されていません。 バックアップと復元 バックアップや復元をバックグラウンドで安全に実行し続けます diff --git a/controller/app/src/main/res/values-ko/strings.xml b/controller/app/src/main/res/values-ko/strings.xml index 897ed539..c7c7ca21 100644 --- a/controller/app/src/main/res/values-ko/strings.xml +++ b/controller/app/src/main/res/values-ko/strings.xml @@ -647,6 +647,10 @@ 지금 취소하면 시스템이 손상되거나 사용할 수 없게 될 수 있음을 이해합니다. 복원이 취소되었습니다. 다음 실행 시 시스템이 복구 모드로 시작됩니다. 이해했음을 확인하려면 확인란을 선택하세요. + 백업을 취소하시겠습니까? + 이 백업은 완료되지 않았습니다. 취소하면 미완성 파일이 제거됩니다 — 언제든지 새 백업을 시작할 수 있습니다. + 백업 취소 + 백업 계속하기 선택한 파일을 읽을 수 없어 아무것도 변경되지 않았습니다. 백업 및 복원 백업 또는 복원을 백그라운드에서 안전하게 계속 실행합니다 diff --git a/controller/app/src/main/res/values-lt/strings.xml b/controller/app/src/main/res/values-lt/strings.xml index 1b01fe3c..b84f5e91 100644 --- a/controller/app/src/main/res/values-lt/strings.xml +++ b/controller/app/src/main/res/values-lt/strings.xml @@ -654,6 +654,10 @@ Suprantu, kad atšaukus dabar mano sistema gali likti sugadinta arba netinkama naudoti. Atkūrimas atšauktas. Kito paleidimo metu jūsų sistema pasileis atkūrimo režimu. Pažymėkite langelį, kad patvirtintumėte, jog suprantate. + Atšaukti atsarginę kopiją? + Ši atsarginė kopija nebaigta. Atšaukus pašalinamas nebaigtas failas — naują atsarginę kopiją galite pradėti bet kada. + Atšaukti atsarginę kopiją + Tęsti kūrimą Nepavyko perskaityti pasirinkto failo, todėl niekas nebuvo pakeista. Atsarginė kopija ir atkūrimas Saugiai vykdo atsarginės kopijos kūrimą ar atkūrimą fone diff --git a/controller/app/src/main/res/values-nl/strings.xml b/controller/app/src/main/res/values-nl/strings.xml index c3d688d2..c83fe583 100644 --- a/controller/app/src/main/res/values-nl/strings.xml +++ b/controller/app/src/main/res/values-nl/strings.xml @@ -646,6 +646,10 @@ Ik begrijp dat annuleren nu mijn systeem beschadigd of onbruikbaar kan achterlaten. Herstel geannuleerd. Uw systeem start bij de volgende keer opstarten in de herstelmodus. Vink het vakje aan om te bevestigen dat u het begrijpt. + Back-up annuleren? + Deze back-up is niet voltooid. Bij annuleren wordt het onvolledige bestand verwijderd — u kunt op elk moment een nieuwe back-up starten. + Back-up annuleren + Doorgaan met back-up Het geselecteerde bestand kon niet worden gelezen, dus er is niets gewijzigd. Back-up & herstel Houdt een back-up of herstel veilig actief op de achtergrond diff --git a/controller/app/src/main/res/values-no/strings.xml b/controller/app/src/main/res/values-no/strings.xml index 0e6afb09..f003d60b 100644 --- a/controller/app/src/main/res/values-no/strings.xml +++ b/controller/app/src/main/res/values-no/strings.xml @@ -647,6 +647,10 @@ Jeg forstår at å avbryte nå kan gjøre systemet mitt skadet eller ubrukelig. Gjenoppretting avbrutt. Systemet ditt starter i gjenopprettingsmodus ved neste oppstart. Kryss av i boksen for å bekrefte at du forstår. + Avbryte sikkerhetskopien? + Denne sikkerhetskopien er ikke fullført. Avbrudd fjerner den ufullstendige filen — du kan starte en ny sikkerhetskopi når som helst. + Avbryt sikkerhetskopien + Fortsett sikkerhetskopieringen Den valgte filen kunne ikke leses, så ingenting ble endret. Sikkerhetskopiering & gjenoppretting Holder en sikkerhetskopiering eller gjenoppretting trygt i gang i bakgrunnen diff --git a/controller/app/src/main/res/values-pl/strings.xml b/controller/app/src/main/res/values-pl/strings.xml index f9ea4b7d..1d5b3af4 100644 --- a/controller/app/src/main/res/values-pl/strings.xml +++ b/controller/app/src/main/res/values-pl/strings.xml @@ -647,6 +647,10 @@ Rozumiem, że anulowanie teraz może pozostawić mój system uszkodzony lub bezużyteczny. Przywracanie anulowane. Twój system uruchomi się w trybie odzyskiwania przy następnym uruchomieniu. Zaznacz pole, aby potwierdzić, że rozumiesz. + Anulować kopię zapasową? + Ta kopia zapasowa nie została ukończona. Anulowanie usuwa niekompletny plik — nową kopię zapasową możesz rozpocząć w dowolnej chwili. + Anuluj kopię zapasową + Kontynuuj tworzenie kopii Nie udało się odczytać wybranego pliku, więc nic nie zostało zmienione. Kopia zapasowa & przywracanie Utrzymuje bezpieczne działanie kopii lub przywracania w tle diff --git a/controller/app/src/main/res/values-pt/strings.xml b/controller/app/src/main/res/values-pt/strings.xml index cba2d95f..64cf82b8 100644 --- a/controller/app/src/main/res/values-pt/strings.xml +++ b/controller/app/src/main/res/values-pt/strings.xml @@ -725,6 +725,10 @@ Compreendo que cancelar agora pode deixar o meu sistema danificado ou inutilizável. Restauro cancelado. O seu sistema iniciará em modo de recuperação no próximo arranque. Marque a caixa para confirmar que compreende. + Cancelar o backup? + Este backup não está concluído. Cancelar remove o arquivo incompleto — você pode iniciar um novo backup a qualquer momento. + Cancelar o backup + Continuar o backup Não foi possível ler o ficheiro selecionado, por isso nada foi alterado. Cópia de segurança & restauro Mantém uma cópia de segurança ou restauro a decorrer com segurança em segundo plano diff --git a/controller/app/src/main/res/values-ro/strings.xml b/controller/app/src/main/res/values-ro/strings.xml index f299f5c7..ac83dacb 100644 --- a/controller/app/src/main/res/values-ro/strings.xml +++ b/controller/app/src/main/res/values-ro/strings.xml @@ -646,6 +646,10 @@ Înțeleg că anularea acum îmi poate lăsa sistemul deteriorat sau inutilizabil. Restaurare anulată. Sistemul dvs. va porni în modul de recuperare la următoarea lansare. Bifați caseta pentru a confirma că înțelegeți. + Anulați copia de rezervă? + Această copie de rezervă nu este finalizată. Anularea elimină fișierul incomplet — puteți începe o nouă copie de rezervă oricând. + Anulați copia de rezervă + Continuați copierea de rezervă Fișierul selectat nu a putut fi citit, așa că nu s-a schimbat nimic. Copie de rezervă & restaurare Menține o copie de rezervă sau o restaurare rulând în siguranță în fundal diff --git a/controller/app/src/main/res/values-ru-rRU/strings.xml b/controller/app/src/main/res/values-ru-rRU/strings.xml index e25dcf74..43fa7ed0 100644 --- a/controller/app/src/main/res/values-ru-rRU/strings.xml +++ b/controller/app/src/main/res/values-ru-rRU/strings.xml @@ -722,6 +722,10 @@ Я понимаю, что отмена сейчас может привести к повреждению или непригодности моей системы. Восстановление отменено. При следующем запуске ваша система запустится в режиме восстановления. Установите флажок, чтобы подтвердить, что вы понимаете. + Отменить резервное копирование? + Это резервное копирование не завершено. Отмена удалит незавершённый файл — вы можете начать новое резервное копирование в любое время. + Отменить резервное копирование + Продолжить копирование Не удалось прочитать выбранный файл, поэтому ничего не изменилось. Резервное копирование и восстановление Позволяет безопасно выполнять резервное копирование или восстановление в фоне diff --git a/controller/app/src/main/res/values-sk/strings.xml b/controller/app/src/main/res/values-sk/strings.xml index a99e7518..629f9fc2 100644 --- a/controller/app/src/main/res/values-sk/strings.xml +++ b/controller/app/src/main/res/values-sk/strings.xml @@ -653,6 +653,10 @@ Rozumiem, že zrušenie teraz môže môj systém poškodiť alebo urobiť nepoužiteľným. Obnovenie zrušené. Váš systém sa pri ďalšom spustení spustí v režime obnovy. Začiarknutím políčka potvrďte, že rozumiete. + Zrušiť zálohu? + Táto záloha nie je dokončená. Zrušením sa odstráni neúplný súbor — novú zálohu môžete kedykoľvek spustiť. + Zrušiť zálohu + Pokračovať v zálohovaní Vybraný súbor sa nepodarilo prečítať, takže sa nič nezmenilo. Zálohovanie & obnova Udržiava zálohovanie alebo obnovu bezpečne bežiace na pozadí diff --git a/controller/app/src/main/res/values-sr/strings.xml b/controller/app/src/main/res/values-sr/strings.xml index 50dacbfb..36a66751 100644 --- a/controller/app/src/main/res/values-sr/strings.xml +++ b/controller/app/src/main/res/values-sr/strings.xml @@ -659,6 +659,10 @@ Разумем да отказивање сада може оставити мој систем оштећеним или неупотребљивим. Враћање је отказано. Ваш систем ће се при следећем покретању покренути у режиму опоравка. Означите поље да бисте потврдили да разумете. + Отказати резервну копију? + Ова резервна копија није завршена. Отказивање уклања недовршену датотеку — нову резервну копију можете покренути било када. + Откажи резервну копију + Настави прављење копије Изабрана датотека није могла да се прочита, па ништа није промењено. Резервна копија и враћање Одржава прављење резервне копије или враћање безбедно у позадини diff --git a/controller/app/src/main/res/values-sw/strings.xml b/controller/app/src/main/res/values-sw/strings.xml index 9b326334..81eace41 100644 --- a/controller/app/src/main/res/values-sw/strings.xml +++ b/controller/app/src/main/res/values-sw/strings.xml @@ -666,6 +666,10 @@ Ninaelewa kuwa kughairi sasa kunaweza kuacha mfumo wangu ukiwa umeharibika au usiofaa kutumika. Urejeshaji umeghairiwa. Mfumo wako utaanza katika hali ya urejeshaji wakati wa kuzindua ujao. Weka alama kwenye kisanduku ili kuthibitisha kuwa unaelewa. + Ghairi nakala rudufu? + Nakala rudufu hii haijakamilika. Kughairi kunaondoa faili ambalo halijakamilika — unaweza kuanza nakala rudufu mpya wakati wowote. + Ghairi nakala rudufu + Endelea kunakili Faili uliyochagua haikuweza kusomwa, kwa hivyo hakuna kilichobadilishwa. Hifadhi & rejesha Huweka nakala rudufu au urejeshaji ukiendelea kwa usalama chinichini diff --git a/controller/app/src/main/res/values-ta/strings.xml b/controller/app/src/main/res/values-ta/strings.xml index c6070fb0..d5b6d6bd 100644 --- a/controller/app/src/main/res/values-ta/strings.xml +++ b/controller/app/src/main/res/values-ta/strings.xml @@ -666,6 +666,10 @@ இப்போது ரத்து செய்தால் எனது கணினி சேதமடையலாம் அல்லது பயன்படுத்த முடியாததாக மாறலாம் என்பதை நான் புரிந்துகொள்கிறேன். மீட்பு ரத்து செய்யப்பட்டது. அடுத்த முறை தொடங்கும்போது உங்கள் கணினி மீட்பு பயன்முறையில் தொடங்கும். நீங்கள் புரிந்துகொண்டதை உறுதிப்படுத்த பெட்டியில் தேர்வு செய்யவும். + காப்புப்பிரதியை ரத்துசெய்யவா? + இந்தக் காப்புப்பிரதி முடிக்கப்படவில்லை. ரத்துசெய்தால் முழுமையடையாத கோப்பு அகற்றப்படும் — நீங்கள் எப்போது வேண்டுமானாலும் புதிய காப்புப்பிரதியைத் தொடங்கலாம். + காப்புப்பிரதியை ரத்துசெய் + காப்புப்பிரதி எடுப்பதைத் தொடரவும் தேர்ந்தெடுத்த கோப்பைப் படிக்க முடியவில்லை, எனவே எதுவும் மாற்றப்படவில்லை. காப்புப்பிரதி & மீட்பு காப்புப்பிரதி அல்லது மீட்பை பின்னணியில் பாதுகாப்பாக இயக்கி வைக்கிறது diff --git a/controller/app/src/main/res/values-tr/strings.xml b/controller/app/src/main/res/values-tr/strings.xml index 0061dd7d..01ec3897 100644 --- a/controller/app/src/main/res/values-tr/strings.xml +++ b/controller/app/src/main/res/values-tr/strings.xml @@ -646,6 +646,10 @@ Şimdi iptal etmenin sistemimi hasarlı veya kullanılamaz bırakabileceğini anlıyorum. Geri yükleme iptal edildi. Sisteminiz bir sonraki başlatmada kurtarma modunda başlayacak. Anladığınızı onaylamak için kutuyu işaretleyin. + Yedekleme iptal edilsin mi? + Bu yedekleme tamamlanmadı. İptal etmek tamamlanmamış dosyayı kaldırır — istediğiniz zaman yeni bir yedekleme başlatabilirsiniz. + Yedeklemeyi iptal et + Yedeklemeye devam et Seçilen dosya okunamadı, bu yüzden hiçbir şey değiştirilmedi. Yedekle & geri yükle Bir yedekleme veya geri yüklemeyi arka planda güvenle çalışır durumda tutar diff --git a/controller/app/src/main/res/values-uk/strings.xml b/controller/app/src/main/res/values-uk/strings.xml index 1137dd41..dd66695a 100644 --- a/controller/app/src/main/res/values-uk/strings.xml +++ b/controller/app/src/main/res/values-uk/strings.xml @@ -646,6 +646,10 @@ Я розумію, що скасування зараз може залишити мою систему пошкодженою або непридатною до використання. Відновлення скасовано. Під час наступного запуску ваша система запуститься в режимі відновлення. Позначте прапорець, щоб підтвердити, що ви розумієте. + Скасувати резервне копіювання? + Це резервне копіювання не завершено. Скасування видалить незавершений файл — ви можете розпочати нове резервне копіювання будь-коли. + Скасувати резервне копіювання + Продовжити копіювання Не вдалося прочитати вибраний файл, тому нічого не змінено. Резервне копіювання та відновлення Безпечно виконує резервне копіювання чи відновлення у фоні diff --git a/controller/app/src/main/res/values-vi/strings.xml b/controller/app/src/main/res/values-vi/strings.xml index 6cc3b4aa..84f2e8d0 100644 --- a/controller/app/src/main/res/values-vi/strings.xml +++ b/controller/app/src/main/res/values-vi/strings.xml @@ -646,6 +646,10 @@ Tôi hiểu rằng việc hủy bây giờ có thể khiến hệ thống của tôi bị hỏng hoặc không sử dụng được. Đã hủy khôi phục. Hệ thống của bạn sẽ khởi động ở chế độ khôi phục trong lần khởi chạy tiếp theo. Chọn ô để xác nhận rằng bạn hiểu. + Hủy sao lưu? + Bản sao lưu này chưa hoàn tất. Việc hủy sẽ xóa tệp chưa hoàn chỉnh — bạn có thể bắt đầu bản sao lưu mới bất cứ lúc nào. + Hủy sao lưu + Tiếp tục sao lưu Không thể đọc tệp đã chọn, nên không có gì bị thay đổi. Sao lưu & khôi phục Giữ quá trình sao lưu hoặc khôi phục chạy an toàn ở chế độ nền diff --git a/controller/app/src/main/res/values-yo/strings.xml b/controller/app/src/main/res/values-yo/strings.xml index 20bf6b1a..4d0685bb 100644 --- a/controller/app/src/main/res/values-yo/strings.xml +++ b/controller/app/src/main/res/values-yo/strings.xml @@ -666,6 +666,10 @@ Mo ye mi pé fífagilee báyìí lè mú kí ẹ̀rọ mi bàjẹ́ tàbí kí ó máṣe wúlò. A ti fagilee ìmúpadà. Ẹ̀rọ rẹ yóò bẹ̀rẹ̀ ní ipo ìgbàpadà ní ìfilọlẹ̀ tó kàn. Sàmì sí àpótí náà láti jẹ́rìí sí i pé o ye ọ́. + Fagilé àkọsílẹ̀ ìdáàbòbò? + Àkọsílẹ̀ ìdáàbòbò yìí kò tíì parí. Fífagilé yóò yọ fáìlì tí kò pé kúrò — o lè bẹ̀rẹ̀ àkọsílẹ̀ ìdáàbòbò tuntun nígbàkigbà. + Fagilé àkọsílẹ̀ ìdáàbòbò + Máa bá àkọsílẹ̀ lọ A kò lè ka fáìlì tí a yàn, nítorí náà kò sí ohun tí ó yípadà. Àfẹ̀yìntì & ìmúpadà Ń jẹ́ kí àfẹ̀yìntì tàbí ìmúpadà máa ṣiṣẹ́ láìséwu lẹ́yìn ẹ̀rọ diff --git a/controller/app/src/main/res/values-zh-rCN/strings.xml b/controller/app/src/main/res/values-zh-rCN/strings.xml index 3d184859..4b4882f0 100644 --- a/controller/app/src/main/res/values-zh-rCN/strings.xml +++ b/controller/app/src/main/res/values-zh-rCN/strings.xml @@ -647,6 +647,10 @@ 我明白现在取消可能会使我的系统损坏或无法使用。 恢复已取消。您的系统将在下次启动时进入恢复模式。 勾选此框以确认您已了解。 + 取消备份? + 此备份尚未完成。取消将删除未完成的文件 — 您可以随时开始新的备份。 + 取消备份 + 继续备份 无法读取所选文件,因此未做任何更改。 备份与恢复 使备份或恢复在后台安全运行 diff --git a/controller/app/src/main/res/values/strings.xml b/controller/app/src/main/res/values/strings.xml index 5e7ec71e..f97f0ba1 100644 --- a/controller/app/src/main/res/values/strings.xml +++ b/controller/app/src/main/res/values/strings.xml @@ -792,6 +792,11 @@ I understand that cancelling now may leave my system damaged or unusable. Restore cancelled. Your system will start in recovery on the next launch. Check the box to confirm you understand. + + Cancel backup? + This backup isn\'t finished. Cancelling removes the incomplete file — you can start a new backup anytime. + Cancel backup + Keep backing up The selected file could not be read, so nothing was changed. Backup & restore Keeps a backup or restore running safely in the background