diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index edec855a5..783e87003 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -32,6 +32,7 @@ rules = "1.6.1" shadow = "8.1.1" sqliteJdbc = "3.45.1.0" uiautomator = "2.3.0" +documentfile = "1.0.1" [libraries] annotation = { group = "androidx.annotation", name = "annotation", version.ref = "annotation" } @@ -73,6 +74,7 @@ opencsv = { group = "com.opencsv", name = "opencsv", version.ref = "opencsv" } rules = { group = "androidx.test", name = "rules", version.ref = "rules" } sqlite-jdbc = { module = "org.xerial:sqlite-jdbc", version.ref = "sqliteJdbc" } uiautomator = { group = "androidx.test.uiautomator", name = "uiautomator", version.ref = "uiautomator" } +documentfile = { group = "androidx.documentfile", name = "documentfile", version.ref = "documentfile" } [bundles] androidTest = [ diff --git a/uhabits-android/build.gradle.kts b/uhabits-android/build.gradle.kts index 1bfbfb730..960333f35 100644 --- a/uhabits-android/build.gradle.kts +++ b/uhabits-android/build.gradle.kts @@ -106,6 +106,7 @@ dependencies { implementation(libs.legacy.preference.v14) implementation(libs.legacy.support.v4) implementation(libs.material) + implementation(libs.documentfile) implementation(libs.opencsv) implementation(libs.konfetti.xml) implementation(project(":uhabits-core")) diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/BackupTest.kt b/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/BackupTest.kt index 065b0524d..879a8774d 100644 --- a/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/BackupTest.kt +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/BackupTest.kt @@ -33,6 +33,8 @@ import org.isoron.uhabits.acceptance.steps.clearDownloadFolder import org.isoron.uhabits.acceptance.steps.copyBackupToDownloadFolder import org.isoron.uhabits.acceptance.steps.exportFullBackup import org.isoron.uhabits.acceptance.steps.importBackupFromDownloadFolder +import org.isoron.uhabits.acceptance.steps.selectPublicBackupFolder +import org.isoron.uhabits.acceptance.steps.verifyBackupInDownloadFolder import org.junit.Test @LargeTest @@ -51,4 +53,14 @@ class BackupTest : BaseUserInterfaceTest() { importBackupFromDownloadFolder() verifyDisplaysText("Wake up early") } + + @Test + fun shouldExportBackupToPublicFolder() { + launchApp() + clearDownloadFolder() + clearBackupFolder() + selectPublicBackupFolder() + exportFullBackup() + verifyBackupInDownloadFolder() + } } diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/steps/BackupSteps.kt b/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/steps/BackupSteps.kt index 0d4b09f36..368816663 100644 --- a/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/steps/BackupSteps.kt +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/steps/BackupSteps.kt @@ -19,8 +19,10 @@ package org.isoron.uhabits.acceptance.steps +import android.net.Uri import android.os.Build.VERSION.SDK_INT -import android.os.SystemClock.sleep +import androidx.preference.PreferenceManager +import androidx.test.platform.app.InstrumentationRegistry import androidx.test.uiautomator.By import androidx.test.uiautomator.UiSelector import org.isoron.uhabits.BaseUserInterfaceTest.Companion.device @@ -28,6 +30,8 @@ import org.isoron.uhabits.acceptance.steps.CommonSteps.clickText import org.isoron.uhabits.acceptance.steps.CommonSteps.pressBack import org.isoron.uhabits.acceptance.steps.ListHabitsSteps.MenuItem.SETTINGS import org.isoron.uhabits.acceptance.steps.ListHabitsSteps.clickMenu +import org.junit.Assert.assertTrue +import java.io.File const val BACKUP_FOLDER = "/sdcard/Android/data/org.isoron.uhabits/files/Backups/" const val DOWNLOAD_FOLDER = "/sdcard/Download/" @@ -41,6 +45,7 @@ fun exportFullBackup() { fun clearDownloadFolder() { device.executeShellCommand("rm -rf /sdcard/Download") + device.executeShellCommand("mkdir /sdcard/Download") } fun clearBackupFolder() { @@ -52,6 +57,13 @@ fun copyBackupToDownloadFolder() { device.executeShellCommand("chown root $DOWNLOAD_FOLDER") } +fun selectPublicBackupFolder() { + val context = InstrumentationRegistry.getInstrumentation().targetContext + val prefs = PreferenceManager.getDefaultSharedPreferences(context) + val uri = Uri.fromFile(File(DOWNLOAD_FOLDER)) + prefs.edit().putString("publicBackupFolder", uri.toString()).commit() +} + fun importBackupFromDownloadFolder() { clickMenu(SETTINGS) clickText("Import data") @@ -93,6 +105,11 @@ fun importBackupFromDownloadFolder() { } } +fun verifyBackupInDownloadFolder() { + val listing = device.executeShellCommand("ls $DOWNLOAD_FOLDER") + assertTrue(listing.contains("Loop Habits Backup")) +} + fun openLauncher() { device.pressHome() device.waitForIdle() diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/settings/SettingsFragment.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/settings/SettingsFragment.kt index ea8ec11c5..a6cb34422 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/settings/SettingsFragment.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/settings/SettingsFragment.kt @@ -24,6 +24,8 @@ import android.content.SharedPreferences import android.content.SharedPreferences.OnSharedPreferenceChangeListener import android.net.Uri import android.os.Bundle +import android.os.Environment +import android.provider.DocumentsContract import android.provider.Settings import android.util.Log import android.view.LayoutInflater @@ -60,10 +62,21 @@ class SettingsFragment : PreferenceFragmentCompat(), OnSharedPreferenceChangeLis @Deprecated("Deprecated in Java") override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - if (requestCode == RINGTONE_REQUEST_CODE) { - ringtoneManager!!.update(data) - updateRingtoneDescription() - return + when (requestCode) { + RINGTONE_REQUEST_CODE -> { + ringtoneManager!!.update(data) + updateRingtoneDescription() + return + } + PUBLIC_BACKUP_REQUEST_CODE -> { + val uri = data?.data ?: return + val flags = + Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION + requireContext().contentResolver.takePersistableUriPermission(uri, flags) + sharedPrefs?.edit()?.putString("publicBackupFolder", uri.toString())?.apply() + updatePublicBackupFolderSummary() + return + } } super.onActivityResult(requestCode, resultCode, data) } @@ -127,6 +140,16 @@ class SettingsFragment : PreferenceFragmentCompat(), OnSharedPreferenceChangeLis activity?.startActivitySafely(intent) return true } + "publicBackupFolder" -> { + val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE) + intent.addFlags( + Intent.FLAG_GRANT_READ_URI_PERMISSION or + Intent.FLAG_GRANT_WRITE_URI_PERMISSION or + Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION + ) + startActivityForResult(intent, PUBLIC_BACKUP_REQUEST_CODE) + return true + } } return super.onPreferenceTreeClick(preference) } @@ -141,6 +164,7 @@ class SettingsFragment : PreferenceFragmentCompat(), OnSharedPreferenceChangeLis devCategory.isVisible = false } updateWeekdayPreference() + updatePublicBackupFolderSummary() findPreference("reminderSound").isVisible = false } @@ -205,7 +229,39 @@ class SettingsFragment : PreferenceFragmentCompat(), OnSharedPreferenceChangeLis ringtonePreference.summary = ringtoneName } + private fun updatePublicBackupFolderSummary() { + val pref = findPreference("publicBackupFolder") + val uriString = sharedPrefs?.getString("publicBackupFolder", null) + if (uriString == null) { + pref.summary = getString(R.string.no_public_backup_folder_selected) + return + } + val uri = Uri.parse(uriString) + val path = fullPathFor(uri) + pref.summary = path ?: uriString + } + + private fun fullPathFor(uri: Uri): String? { + return when (uri.scheme) { + "content" -> { + val docId = DocumentsContract.getTreeDocumentId(uri) + val (type, rel) = docId.split(":", limit = 2).let { + it[0] to it.getOrElse(1) { "" } + } + val base = if (type.equals("primary", true)) { + Environment.getExternalStorageDirectory().absolutePath + } else { + "/storage/$type" + } + if (rel.isEmpty()) base else "$base/$rel" + } + "file" -> java.io.File(uri.path!!).absolutePath + else -> null + } + } + companion object { private const val RINGTONE_REQUEST_CODE = 1 + private const val PUBLIC_BACKUP_REQUEST_CODE = 2 } } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/database/AutoBackup.kt b/uhabits-android/src/main/java/org/isoron/uhabits/database/AutoBackup.kt index 4f68e830b..f78165a1a 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/database/AutoBackup.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/database/AutoBackup.kt @@ -20,7 +20,10 @@ package org.isoron.uhabits.database import android.content.Context +import android.net.Uri import android.util.Log +import androidx.documentfile.provider.DocumentFile +import androidx.preference.PreferenceManager import org.isoron.uhabits.AndroidDirFinder import org.isoron.uhabits.core.utils.DateUtils import org.isoron.uhabits.utils.DatabaseUtils @@ -28,37 +31,69 @@ import java.io.File class AutoBackup(private val context: Context) { - private val basedir = AndroidDirFinder(context).getFilesDir("Backups")!! + private val backupPattern = Regex("^Loop Habits Backup .+\\.db$") fun run(keep: Int = 5) { Log.i("AutoBackup", "Starting automatic backups...") - val files = listBackupFiles() - var newestTimestamp = 0L - if (files.isNotEmpty()) { - newestTimestamp = files.last().lastModified() + val prefs = PreferenceManager.getDefaultSharedPreferences(context) + val uriString = prefs.getString("publicBackupFolder", null) + if (uriString != null) { + val uri = Uri.parse(uriString) + val dir = if (uri.scheme == "content") { + DocumentFile.fromTreeUri(context, uri) + } else { + DocumentFile.fromFile(File(uri.path!!)) + } + if (dir != null) { + runInPublicDir(dir, keep) + return + } } + + val basedir = AndroidDirFinder(context).getFilesDir("Backups") ?: return + runInPrivateDir(basedir, keep) + } + + private fun runInPrivateDir(dir: File, keep: Int) { + val files = dir.listFiles()?.toMutableList() ?: mutableListOf() + files.sortBy { it.lastModified() } + val newestTimestamp = files.lastOrNull()?.lastModified() ?: 0L + removeOldestPrivate(files, keep) + val now = DateUtils.getLocalTime() + if (now - newestTimestamp > DateUtils.DAY_LENGTH) { + DatabaseUtils.saveDatabaseCopy(context, dir) + } else { + Log.i("AutoBackup", "Fresh backup found (timestamp=$newestTimestamp)") + } + } + + private fun runInPublicDir(dir: DocumentFile, keep: Int) { + val files = dir.listFiles() + .filter { it.isFile && it.name?.matches(backupPattern) == true } + .sortedBy { it.lastModified() } + val newestTimestamp = files.lastOrNull()?.lastModified() ?: 0L + removeOldestPublic(files, keep) val now = DateUtils.getLocalTime() - removeOldest(files, keep) if (now - newestTimestamp > DateUtils.DAY_LENGTH) { - DatabaseUtils.saveDatabaseCopy(context, basedir) + DatabaseUtils.saveDatabaseCopy(context, dir) } else { Log.i("AutoBackup", "Fresh backup found (timestamp=$newestTimestamp)") } } - private fun removeOldest(files: ArrayList, keep: Int) { - files.sortBy { -it.lastModified() } - for (k in keep until files.size) { - Log.i("AutoBackup", "Removing ${files[k]}") - files[k].delete() + private fun removeOldestPrivate(files: List, keep: Int) { + for (k in 0 until (files.size - keep)) { + val file = files[k] + Log.i("AutoBackup", "Removing $file") + file.delete() } } - private fun listBackupFiles(): ArrayList { - val files = ArrayList() - for (path in basedir.list()!!) { - files.add(File("${basedir.path}/$path")) + private fun removeOldestPublic(files: List, keep: Int) { + for (k in 0 until (files.size - keep)) { + val file = files[k] + Log.i("AutoBackup", "Removing ${file.uri}") + file.delete() } - return files } } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/tasks/ExportDBTask.kt b/uhabits-android/src/main/java/org/isoron/uhabits/tasks/ExportDBTask.kt index 0c4d866b5..3804e885e 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/tasks/ExportDBTask.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/tasks/ExportDBTask.kt @@ -19,10 +19,14 @@ package org.isoron.uhabits.tasks import android.content.Context +import android.net.Uri +import androidx.documentfile.provider.DocumentFile +import androidx.preference.PreferenceManager import org.isoron.uhabits.AndroidDirFinder import org.isoron.uhabits.core.tasks.Task import org.isoron.uhabits.inject.AppContext import org.isoron.uhabits.utils.DatabaseUtils.saveDatabaseCopy +import java.io.File import java.io.IOException class ExportDBTask( @@ -34,8 +38,26 @@ class ExportDBTask( override fun doInBackground() { filename = null filename = try { - val dir = system.getFilesDir("Backups") ?: return - saveDatabaseCopy(context, dir) + val prefs = PreferenceManager.getDefaultSharedPreferences(context) + val uriString = prefs.getString("publicBackupFolder", null) + if (uriString != null) { + // if public backup folder is selected, use it for backup + val uri = Uri.parse(uriString) + val dir = if (uri.scheme == "content") { + DocumentFile.fromTreeUri(context, uri) + } else { + DocumentFile.fromFile(File(uri.path!!)) + } + if (dir != null) { + saveDatabaseCopy(context, dir) + } else { + null + } + } else { + // if public backup folder is unset, use default system folder to backup + val dir = system.getFilesDir("Backups") ?: return + saveDatabaseCopy(context, dir) + } } catch (e: IOException) { throw RuntimeException(e) } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/utils/DatabaseUtils.kt b/uhabits-android/src/main/java/org/isoron/uhabits/utils/DatabaseUtils.kt index f789baf6c..de2f1b7b6 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/utils/DatabaseUtils.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/utils/DatabaseUtils.kt @@ -21,6 +21,7 @@ package org.isoron.uhabits.utils import android.content.Context import android.database.sqlite.SQLiteDatabase import android.util.Log +import androidx.documentfile.provider.DocumentFile import org.isoron.uhabits.HabitsApplication.Companion.isTestMode import org.isoron.uhabits.HabitsDatabaseOpener import org.isoron.uhabits.core.DATABASE_FILENAME @@ -28,6 +29,7 @@ import org.isoron.uhabits.core.DATABASE_VERSION import org.isoron.uhabits.core.utils.DateFormats.Companion.getBackupDateFormat import org.isoron.uhabits.core.utils.DateUtils.Companion.getLocalTime import java.io.File +import java.io.FileInputStream import java.io.IOException import java.text.SimpleDateFormat @@ -69,6 +71,23 @@ object DatabaseUtils { return dbCopy.absolutePath } + @JvmStatic + @Throws(IOException::class) + fun saveDatabaseCopy(context: Context, dir: DocumentFile): String { + val dateFormat: SimpleDateFormat = getBackupDateFormat() + val date = dateFormat.format(getLocalTime()) + val file = dir.createFile("application/octet-stream", "Loop Habits Backup $date.db") + ?: throw IOException("Unable to create backup file") + Log.i("DatabaseUtils", "Writing: ${file.uri}") + val db = getDatabaseFile(context) + FileInputStream(db).use { input -> + context.contentResolver.openOutputStream(file.uri)?.use { output -> + input.copyTo(output) + } + } + return file.uri.toString() + } + fun openDatabase(): SQLiteDatabase { checkNotNull(opener) return opener!!.writableDatabase diff --git a/uhabits-android/src/main/res/values-af-rZA/strings.xml b/uhabits-android/src/main/res/values-af-rZA/strings.xml index 2e606c819..5255c4190 100644 --- a/uhabits-android/src/main/res/values-af-rZA/strings.xml +++ b/uhabits-android/src/main/res/values-af-rZA/strings.xml @@ -38,4 +38,6 @@ 8 ure 24 ure Instellings + Kies openbare rugsteunmap + Geen vouer gekies nie diff --git a/uhabits-android/src/main/res/values-ar-rSA/strings.xml b/uhabits-android/src/main/res/values-ar-rSA/strings.xml index 7af06406e..4b46b6b1d 100644 --- a/uhabits-android/src/main/res/values-ar-rSA/strings.xml +++ b/uhabits-android/src/main/res/values-ar-rSA/strings.xml @@ -242,4 +242,6 @@ لم يتم العثور على تطبيق لإتمام هذا الإجراء تمديد اليوم بضع ساعات بعد منتصف الليل انتظر حتى 3:00 صباحاً لعرض يوم جديد. مفيد إذا كنت عادة تذهب إلى السكون بعد منتصف الليل. يتطلب إعادة تشغيل التطبيق. + اختر مجلد النسخ الاحتياطي العام + لم يتم اختيار مجلد diff --git a/uhabits-android/src/main/res/values-bg-rBG/strings.xml b/uhabits-android/src/main/res/values-bg-rBG/strings.xml index ffa7f03b9..611990ddf 100644 --- a/uhabits-android/src/main/res/values-bg-rBG/strings.xml +++ b/uhabits-android/src/main/res/values-bg-rBG/strings.xml @@ -218,4 +218,6 @@ Не е намерено приложение, което да поддържа това действие Удължаване на деня с няколко часа след полунощ Изчакване до 3:00 часа сутринта за показване на нов ден. Полезно, ако обичайно си лягате да спите след полунощ. Изисква рестартиране на приложението. + Изберете публична папка за резервни копия + Не е избрана папка diff --git a/uhabits-android/src/main/res/values-ca-rES/strings.xml b/uhabits-android/src/main/res/values-ca-rES/strings.xml index 62f73a69c..9b354492b 100644 --- a/uhabits-android/src/main/res/values-ca-rES/strings.xml +++ b/uhabits-android/src/main/res/values-ca-rES/strings.xml @@ -209,4 +209,6 @@ No s\'ha trobat cap aplicació per a gestionar aquesta acció Ampliar el dia unes hores després de la mitjanit Esperar fins a les 3:00 per mostrar un nou dia. Útil si normalment vas a dormir després de la mitjanit. Requereix el reinici de l\'aplicació. + Seleccioneu la carpeta pública de còpia de seguretat + No s\'ha seleccionat cap carpeta diff --git a/uhabits-android/src/main/res/values-cs-rCZ/strings.xml b/uhabits-android/src/main/res/values-cs-rCZ/strings.xml index 6e41d917a..f860badd9 100644 --- a/uhabits-android/src/main/res/values-cs-rCZ/strings.xml +++ b/uhabits-android/src/main/res/values-cs-rCZ/strings.xml @@ -230,4 +230,6 @@ Nenalezen program podporující tento krok Prodloužit den o pár hodin po půlnoci Počkat do tří ráno pro zobrazení nového dne. Užitečné, pokud chodíte spát po půlnoci. Vyžaduje restartování aplikace. + Vyberte veřejnou složku zálohy + Nebyla vybrána žádná složka diff --git a/uhabits-android/src/main/res/values-da-rDK/strings.xml b/uhabits-android/src/main/res/values-da-rDK/strings.xml index 524578864..8388e83ae 100644 --- a/uhabits-android/src/main/res/values-da-rDK/strings.xml +++ b/uhabits-android/src/main/res/values-da-rDK/strings.xml @@ -221,4 +221,6 @@ Ingen app fundet til at understøtte denne handling Forlæng dagen et par timer efter midnat Vent til 3:00 for at vise en ny dag. Nyttigt, hvis du typisk går i seng efter midnat. Kræver genstart af app. + Vælg offentlig sikkerhedskopimappe + Ingen mappe valgt diff --git a/uhabits-android/src/main/res/values-de-rDE/strings.xml b/uhabits-android/src/main/res/values-de-rDE/strings.xml index 571294552..56186bad7 100644 --- a/uhabits-android/src/main/res/values-de-rDE/strings.xml +++ b/uhabits-android/src/main/res/values-de-rDE/strings.xml @@ -218,4 +218,6 @@ Für diese Aktion wurde keine App gefunden. Verlängere den Tag um ein paar Stunden nach Mitternacht Bis 3:00 Uhr warten, bevor ein neuer Tag angezeigt wird. Nützlich, wenn du normalerweise nach Mitternacht schlafen gehst. Benötigt einen Neustart der App. + Öffentlichen Backup-Ordner auswählen + Kein Ordner ausgewählt diff --git a/uhabits-android/src/main/res/values-el-rGR/strings.xml b/uhabits-android/src/main/res/values-el-rGR/strings.xml index 1c31ba4f0..e137b5c2a 100644 --- a/uhabits-android/src/main/res/values-el-rGR/strings.xml +++ b/uhabits-android/src/main/res/values-el-rGR/strings.xml @@ -218,4 +218,6 @@ Δεν βρέθηκε εφαρμογή για την υποστήριξη αυτής της ενέργειας Επεκτείνετε την ημέρα λίγες ώρες μετά τα μεσάνυχτα Περιμένετε μέχρι τις 3:00 πμ για να εμφανιστεί μια νέα μέρα. Χρήσιμο αν συνήθως πάτε για ύπνο μετά τα μεσάνυχτα. Απαιτεί επανεκκίνηση της εφαρμογής. + Επιλέξτε δημόσιο φάκελο αντιγράφων ασφαλείας + Δεν επιλέχθηκε φάκελος diff --git a/uhabits-android/src/main/res/values-eo-rUY/strings.xml b/uhabits-android/src/main/res/values-eo-rUY/strings.xml index 6b0cffa76..5ac58a301 100644 --- a/uhabits-android/src/main/res/values-eo-rUY/strings.xml +++ b/uhabits-android/src/main/res/values-eo-rUY/strings.xml @@ -151,4 +151,6 @@ Vidu privatecan politikon Rigardi ĉiujn kontribuantojn… Datumbazo + Elektu publikan sekurkopi-dosierujon + Neniu dosierujo elektita diff --git a/uhabits-android/src/main/res/values-es-rES/strings.xml b/uhabits-android/src/main/res/values-es-rES/strings.xml index 791702551..4a4dd91a5 100644 --- a/uhabits-android/src/main/res/values-es-rES/strings.xml +++ b/uhabits-android/src/main/res/values-es-rES/strings.xml @@ -218,4 +218,6 @@ No se encontró ninguna aplicación que admita esta acción Ampliar día unas horas después de medianoche Esperar hasta las 3:00 AM para mostrar un nuevo día. Útil si normalmente vas a dormir después de medianoche. Requiere reiniciar la aplicación. + Seleccionar carpeta de copia de seguridad pública + Ninguna carpeta seleccionada diff --git a/uhabits-android/src/main/res/values-eu-rES/strings.xml b/uhabits-android/src/main/res/values-eu-rES/strings.xml index 98f7441cc..aba002e7b 100644 --- a/uhabits-android/src/main/res/values-eu-rES/strings.xml +++ b/uhabits-android/src/main/res/values-eu-rES/strings.xml @@ -216,4 +216,6 @@ Ez da aurkitu akzio hau gauzatu dezakeen aplikaziorik Luzatu eguna gauerdia osteko ordu batzuetara Itxaron goizeko 3:00ak arte egun berri bat erakusteko. Erabilgarria normalean gauerdia pasata lotara joaten bazara. Aplikazioa berrabiarazi behar da. + Hautatu babeskopia publikoaren karpeta + Ez da karpetarik hautatu diff --git a/uhabits-android/src/main/res/values-fa-rIR/strings.xml b/uhabits-android/src/main/res/values-fa-rIR/strings.xml index b76f26b7a..3e6cf9fa9 100644 --- a/uhabits-android/src/main/res/values-fa-rIR/strings.xml +++ b/uhabits-android/src/main/res/values-fa-rIR/strings.xml @@ -218,4 +218,6 @@ هیچ برنامه‌ای برای انجام این کار یافت نشد. تمدید کردن روز تا چند ساعت بعد از نیمه‌شب تا ساعت ۳ نیمه‌شب برای نمایش یک روز جدید صبر می‌کند. اگر معمولاً بعد از نیمه‌شب می‌خوابید، برای شما می‌تواند مفید باشد. نیازمند راه‌اندازی مجدد برنامه است. + انتخاب پوشهٔ پشتیبان‌گیری عمومی + هیچ پوشه‌ای انتخاب نشده است diff --git a/uhabits-android/src/main/res/values-fi-rFI/strings.xml b/uhabits-android/src/main/res/values-fi-rFI/strings.xml index cce9cd287..5b62c982c 100644 --- a/uhabits-android/src/main/res/values-fi-rFI/strings.xml +++ b/uhabits-android/src/main/res/values-fi-rFI/strings.xml @@ -218,4 +218,6 @@ Tälle toiminnolle ei löytynyt yhtään sovellusta Pidennä päivää muutama tunti keskiyön jälkeen Odota kello 3.00 asti ennen uuden päivän näyttämistä. Hyödyllinen jos menet nukkumaan yleensä keskiyön jälkeen. Vaatii sovelluksen uudelleenkäynnistyksen. + Valitse julkinen varmuuskopiokansio + Kansiota ei valittu diff --git a/uhabits-android/src/main/res/values-fr-rFR/strings.xml b/uhabits-android/src/main/res/values-fr-rFR/strings.xml index 30825bbbd..0e89bfe34 100644 --- a/uhabits-android/src/main/res/values-fr-rFR/strings.xml +++ b/uhabits-android/src/main/res/values-fr-rFR/strings.xml @@ -219,4 +219,6 @@ Combien de pages avez-vous lu ? Aucune application trouvée pour faire cette action Prolonger les jours de quelques heures après minuit Attendre jusqu\'à trois heures du matin pour changer de jour. Très utile si vous avez l\'habitude d\'aller dormir après minuit. (Redémarrage nécessaire) + Sélectionner le dossier de sauvegarde public + Aucun dossier sélectionné diff --git a/uhabits-android/src/main/res/values-gu-rIN/strings.xml b/uhabits-android/src/main/res/values-gu-rIN/strings.xml index c325d623e..6205ab23f 100644 --- a/uhabits-android/src/main/res/values-gu-rIN/strings.xml +++ b/uhabits-android/src/main/res/values-gu-rIN/strings.xml @@ -17,4 +17,6 @@ ~ You should have received a copy of the GNU General Public License along ~ with this program. If not, see . --> - + જાહેર બેકઅપ ફોલ્ડર પસંદ કરો + કોઈ ફોલ્ડર પસંદ કરાયેલ નથી + diff --git a/uhabits-android/src/main/res/values-hi-rIN/strings.xml b/uhabits-android/src/main/res/values-hi-rIN/strings.xml index 2d3f8119e..48b4c3bae 100644 --- a/uhabits-android/src/main/res/values-hi-rIN/strings.xml +++ b/uhabits-android/src/main/res/values-hi-rIN/strings.xml @@ -247,4 +247,6 @@ इस कार्रवाई को संभालने के लिए कोई ऐप नहीं मिला मध्यरात्रि से कुछ घंटे बाद तक दिन बढ़ाएँ नया दिन दिखाने के लिए सुबह 3:00 बजे तक प्रतीक्षा करें। उपयोगी अगर आप आमतौर पर आधी रात के बाद सोने जाते हैं। ऐप पुनरारंभ की आवश्यकता होगी। + सार्वजनिक बैकअप फ़ोल्डर चुनें + कोई फ़ोल्डर चयनित नहीं है diff --git a/uhabits-android/src/main/res/values-hr-rHR/strings.xml b/uhabits-android/src/main/res/values-hr-rHR/strings.xml index 4b16ee6ee..6a69d227e 100644 --- a/uhabits-android/src/main/res/values-hr-rHR/strings.xml +++ b/uhabits-android/src/main/res/values-hr-rHR/strings.xml @@ -198,4 +198,6 @@ Navike nisu pronađene Mjerljive navike nisu pronađene Da/Ne navike nisu pronađene + Odaberite javnu mapu sigurnosne kopije + Nije odabrana nijedna mapa diff --git a/uhabits-android/src/main/res/values-hu-rHU/strings.xml b/uhabits-android/src/main/res/values-hu-rHU/strings.xml index 003996595..bd3cd51a5 100644 --- a/uhabits-android/src/main/res/values-hu-rHU/strings.xml +++ b/uhabits-android/src/main/res/values-hu-rHU/strings.xml @@ -223,4 +223,6 @@ Ezen művelet elvégzéséhez nem található alkalmazás. A nap meghosszabbítása éjfél után néhány órával Várjon hajnali 3 -ig, hogy új napot mutasson. Hasznos, ha általában éjfél után fekszik le. Az alkalmazás újraindítását igényli. + Nyilvános biztonsági mentési mappa kiválasztása + Nincs mappa kiválasztva diff --git a/uhabits-android/src/main/res/values-hy-rAM/strings.xml b/uhabits-android/src/main/res/values-hy-rAM/strings.xml index 02e8b0865..355ccfb27 100644 --- a/uhabits-android/src/main/res/values-hy-rAM/strings.xml +++ b/uhabits-android/src/main/res/values-hy-rAM/strings.xml @@ -82,4 +82,6 @@ Ամսական %d անգամ Գույն Այսօր + Ընտրեք հանրային պահուստային թղթապանակը + Թղթապանակ չի ընտրվել diff --git a/uhabits-android/src/main/res/values-in-rID/strings.xml b/uhabits-android/src/main/res/values-in-rID/strings.xml index 80227e090..45cfe87e1 100644 --- a/uhabits-android/src/main/res/values-in-rID/strings.xml +++ b/uhabits-android/src/main/res/values-in-rID/strings.xml @@ -221,4 +221,6 @@ Aplikasi untuk mendukung tindakan ini tidak ditemukan Perpanjang hari beberapa jam setelah tengah malam Tunggu sampai jam 3 pagi untuk menampilkan hari yang baru. Berguna jika kamu biasanya tidur setelah tengah malam. Aplikasi perlu dimulai ulang. + Pilih folder cadangan publik + Tidak ada folder yang dipilih diff --git a/uhabits-android/src/main/res/values-is-rIS/strings.xml b/uhabits-android/src/main/res/values-is-rIS/strings.xml index 843e3b475..7d111ae01 100644 --- a/uhabits-android/src/main/res/values-is-rIS/strings.xml +++ b/uhabits-android/src/main/res/values-is-rIS/strings.xml @@ -170,4 +170,6 @@ Lækka Lengja daginn nokkrar klukkustundir yfir miðnætti Bíða til klukkan 03:00 til að sýna nýjan dag. Gagnlegt ef þú ferð að sofa eftir miðnætti. Krefst endurræsingar forritsins. + Veldu opinbera öryggisafritunarmöppu + Engin mappa valin diff --git a/uhabits-android/src/main/res/values-it-rIT/strings.xml b/uhabits-android/src/main/res/values-it-rIT/strings.xml index 9d4e64763..e1cdf9c2b 100644 --- a/uhabits-android/src/main/res/values-it-rIT/strings.xml +++ b/uhabits-android/src/main/res/values-it-rIT/strings.xml @@ -218,4 +218,6 @@ Nessuna app disponibile per gestire questa azione Prolunga il giorno di alcune ore dopo la mezzanotte Attendere fino alle 3:00 per mostrare il nuovo giorno. Utile se solitamente vai a dormire dopo mezzanotte. È necessario riavviare l\'app. + Seleziona cartella di backup pubblica + Nessuna cartella selezionata diff --git a/uhabits-android/src/main/res/values-iw-rIL/strings.xml b/uhabits-android/src/main/res/values-iw-rIL/strings.xml index 69f794c25..6914955ea 100644 --- a/uhabits-android/src/main/res/values-iw-rIL/strings.xml +++ b/uhabits-android/src/main/res/values-iw-rIL/strings.xml @@ -230,4 +230,6 @@ לא נמצא יישום שתומך בפעולה זו הארכת היום בכמה שעות לאחר החצות המתנה עד 3:00 לפני הצגת יום חדש. שימושי אם לרוב הולכים לישון אחרי חצות. דורש הפעלה מחדש של היישום. + בחר תיקיית גיבוי ציבורית + לא נבחרה תיקיה diff --git a/uhabits-android/src/main/res/values-ja-rJP/strings.xml b/uhabits-android/src/main/res/values-ja-rJP/strings.xml index 3e157b8ec..36ee4af5c 100644 --- a/uhabits-android/src/main/res/values-ja-rJP/strings.xml +++ b/uhabits-android/src/main/res/values-ja-rJP/strings.xml @@ -212,4 +212,6 @@ この操作を行うアプリが見つかりませんでした。 一日の終わりを午前0時から数時間延長する 一日の始まりを午前3時にします。よく午前0時以降に就寝する場合に役立ちます。アプリの再起動が必要です。 + 公開バックアップフォルダを選択 + フォルダが選択されていません diff --git a/uhabits-android/src/main/res/values-ka-rGE/strings.xml b/uhabits-android/src/main/res/values-ka-rGE/strings.xml index dfbe11c9e..31849279c 100644 --- a/uhabits-android/src/main/res/values-ka-rGE/strings.xml +++ b/uhabits-android/src/main/res/values-ka-rGE/strings.xml @@ -218,4 +218,6 @@ ვერ მოიძებნა აპლიკაცია ამ ოპერაციის განსახორციელებლად ახალი დღის დასაწყისის გადატანა ნაშუაღამევის რამდენიმე საათისთვის ახალი დღის 03:00 საათზე დაწყება. ხელსაყრელია თუ ზოგადად შუაღამის შემდეგ იძინებ. საჭიროებს აპლიკაციის გადატვირთვას. + აირჩიეთ საჯარო სარეზერვო საქაღალდე + საქაღალდე არჩეული არ არის diff --git a/uhabits-android/src/main/res/values-ko-rKR/strings.xml b/uhabits-android/src/main/res/values-ko-rKR/strings.xml index 3987c7f79..5172ce8e4 100644 --- a/uhabits-android/src/main/res/values-ko-rKR/strings.xml +++ b/uhabits-android/src/main/res/values-ko-rKR/strings.xml @@ -212,4 +212,6 @@ 이 작업을 지원하는 앱을 찾을 수 없습니다. 하루를 자정 이후까지 연장합니다. 오전 3시를 기점으로 하루가 변경됩니다. 자정 이후 잠드는 경우 유용합니다. 변경시 앱 재시작 후 적용됩니다. + 공용 백업 폴더 선택 + 선택된 폴더가 없습니다 diff --git a/uhabits-android/src/main/res/values-ml-rIN/strings.xml b/uhabits-android/src/main/res/values-ml-rIN/strings.xml index f24b9b59d..69e55d3d0 100644 --- a/uhabits-android/src/main/res/values-ml-rIN/strings.xml +++ b/uhabits-android/src/main/res/values-ml-rIN/strings.xml @@ -218,4 +218,6 @@ ഈ പ്രവർത്തനത്തെ പിന്തുണയ്ക്കുന്ന ഒരു ആപ്പും കണ്ടെത്തിയില്ല അർദ്ധരാത്രി കഴിഞ്ഞ് കുറച്ച് മണിക്കൂറുകൾ പകൽ നീട്ടുക ഒരു പുതിയ ദിവസം കാണിക്കാൻ 3:00 AM വരെ കാത്തിരിക്കുക. നിങ്ങൾ സാധാരണയായി അർദ്ധരാത്രിക്ക് ശേഷം ഉറങ്ങാൻ പോകുകയാണെങ്കിൽ ഉപയോഗപ്രദമാണ്. ആപ്പ് പുനരാരംഭിക്കേണ്ടതുണ്ട്. + പൊതു ബാക്കപ്പ് ഫോൾഡർ തിരഞ്ഞെടുക്കുക + ഫോൾഡർ ഒന്നും തിരഞ്ഞെടുത്തിട്ടില്ല diff --git a/uhabits-android/src/main/res/values-nl-rNL/strings.xml b/uhabits-android/src/main/res/values-nl-rNL/strings.xml index fc8123a06..437dee0c2 100644 --- a/uhabits-android/src/main/res/values-nl-rNL/strings.xml +++ b/uhabits-android/src/main/res/values-nl-rNL/strings.xml @@ -218,4 +218,6 @@ Er is geen app gevonden om deze actie uit te voeren. Verleng de dag tot een paar uur na middernacht Wacht tot 3:00 uur om een nieuwe dag te beginnen. Handig als je normaal gesproken na middernacht gaat slapen. Dit vereist het opnieuw opstarten van de app. + Openbare back-upmap selecteren + Geen map geselecteerd diff --git a/uhabits-android/src/main/res/values-no-rNO/strings.xml b/uhabits-android/src/main/res/values-no-rNO/strings.xml index a7109ec00..8d566522d 100644 --- a/uhabits-android/src/main/res/values-no-rNO/strings.xml +++ b/uhabits-android/src/main/res/values-no-rNO/strings.xml @@ -136,4 +136,6 @@ Eksportér Spørsmål %d ganger på %d dager + Velg offentlig sikkerhetskopimappe + Ingen mappe valgt diff --git a/uhabits-android/src/main/res/values-pl-rPL/strings.xml b/uhabits-android/src/main/res/values-pl-rPL/strings.xml index 5a76d25f4..3e5159cae 100644 --- a/uhabits-android/src/main/res/values-pl-rPL/strings.xml +++ b/uhabits-android/src/main/res/values-pl-rPL/strings.xml @@ -230,4 +230,6 @@ Nie znaleziono aplikacji obsługującej to działanie Przedłuż dzień o kilka godzin po północy Poczekaj do 3:00, aby pokazać nowy dzień. Przydatne, jeśli zwykle kładziesz się spać po północy. Wymaga ponownego uruchomienia aplikacji. + Wybierz publiczny folder kopii zapasowych + Nie wybrano folderu diff --git a/uhabits-android/src/main/res/values-pt-rBR/strings.xml b/uhabits-android/src/main/res/values-pt-rBR/strings.xml index 81cadd924..ab3d6721a 100644 --- a/uhabits-android/src/main/res/values-pt-rBR/strings.xml +++ b/uhabits-android/src/main/res/values-pt-rBR/strings.xml @@ -218,4 +218,6 @@ Nenhum app encontrado para executar esta ação Prolongar dia algumas horas depois da meia-noite Espere até às 3:00 para mostrar um novo dia. Útil se você costuma dormir depois da meia-noite. Requer reinicialização do aplicativo. + Selecionar pasta pública de backup + Nenhuma pasta selecionada diff --git a/uhabits-android/src/main/res/values-pt-rPT/strings.xml b/uhabits-android/src/main/res/values-pt-rPT/strings.xml index 8b8adbc79..78ee261c8 100644 --- a/uhabits-android/src/main/res/values-pt-rPT/strings.xml +++ b/uhabits-android/src/main/res/values-pt-rPT/strings.xml @@ -178,4 +178,6 @@ Decrementar Agora é um programador! Nenhuma aplicação foi encontrada para oferecer suporte a esta ação + Selecionar pasta pública de cópia de segurança + Nenhuma pasta selecionada diff --git a/uhabits-android/src/main/res/values-ro-rRO/strings.xml b/uhabits-android/src/main/res/values-ro-rRO/strings.xml index 51b12d866..2eb059588 100644 --- a/uhabits-android/src/main/res/values-ro-rRO/strings.xml +++ b/uhabits-android/src/main/res/values-ro-rRO/strings.xml @@ -193,4 +193,6 @@ Nu a fost găsită nicio aplicație care să efectueze această acțiune. Extinde ziua câteva ore după miezul nopții Așteaptă până la ora 3:00 dimineața pentru a arăta o nouă zi. O funcție utilă dacă în mod normal obișnuiești să mergi la somn după miezul nopții. Necesită repornirea aplicației. + Selectează dosarul public pentru backup + Niciun dosar selectat diff --git a/uhabits-android/src/main/res/values-ru-rRU/strings.xml b/uhabits-android/src/main/res/values-ru-rRU/strings.xml index fb9370330..54ed6e6b7 100644 --- a/uhabits-android/src/main/res/values-ru-rRU/strings.xml +++ b/uhabits-android/src/main/res/values-ru-rRU/strings.xml @@ -135,6 +135,8 @@ Поддерживает полные резервные копии, экспортированные из этого приложения, а также файлы, сгенерированные приложениями Tickmate, HabitBull и Rewire. Подробнее смотрите в FAQ. Генерирует файлы, которые можно открыть в ПО для работы с таблицами (таком как Microsoft Excel или OpenOffice Calc). Этот файл нельзя импортировать обратно. Генерирует файл, который содержит все ваши данные. Этот файл можно импортировать обратно. + Выбрать публичную папку для резервных копий + Папка не выбрана Ошибка генерации отчёта об ошибке. Сгенерировать отчёт об ошибке Устранение неполадок diff --git a/uhabits-android/src/main/res/values-sk-rSK/strings.xml b/uhabits-android/src/main/res/values-sk-rSK/strings.xml index 7831143d9..f13d654bd 100644 --- a/uhabits-android/src/main/res/values-sk-rSK/strings.xml +++ b/uhabits-android/src/main/res/values-sk-rSK/strings.xml @@ -230,4 +230,6 @@ Nenašla sa žiadna aplikácia podporujúca túto akciu Predĺžte deň o niekoľko hodín po polnoci Na zobrazenie nového dňa počkajte do 3:00. Užitočné, ak zvyčajne chodíte spať po polnoci. Vyžaduje reštart aplikácie. + Vybrať verejný priečinok zálohy + Nie je vybratý žiadny priečinok diff --git a/uhabits-android/src/main/res/values-sl-rSI/strings.xml b/uhabits-android/src/main/res/values-sl-rSI/strings.xml index a45828766..84705fbb5 100644 --- a/uhabits-android/src/main/res/values-sl-rSI/strings.xml +++ b/uhabits-android/src/main/res/values-sl-rSI/strings.xml @@ -230,4 +230,6 @@ Najdena ni bila nobena aplikacija, ki bi podpirala to dejanje Podaljšajte dan nekaj ur čez polnoč Počakajte do 3.00, da prikažete nov dan. Uporabno, če greste običajno spat po polnoči. Zahteva ponovni zagon aplikacije. + Izberite javno mapo za varnostne kopije + Mapa ni izbrana diff --git a/uhabits-android/src/main/res/values-sr-rCS/strings.xml b/uhabits-android/src/main/res/values-sr-rCS/strings.xml index e76df6d95..d15a0b72b 100644 --- a/uhabits-android/src/main/res/values-sr-rCS/strings.xml +++ b/uhabits-android/src/main/res/values-sr-rCS/strings.xml @@ -217,4 +217,6 @@ Nema aplikacije koja podržava ovu radnju Produžite dan nekoliko sati iza ponoći Čeka do 03:00 da pokaže novi dan. Korisno ako obično idete na spavanje posle ponoći. Zahteva ponovno pokretanje. + Izaberite javni folder za rezervnu kopiju + Nijedan folder nije izabran diff --git a/uhabits-android/src/main/res/values-sr-rSP/strings.xml b/uhabits-android/src/main/res/values-sr-rSP/strings.xml index 4c9c0db50..5dac32d15 100644 --- a/uhabits-android/src/main/res/values-sr-rSP/strings.xml +++ b/uhabits-android/src/main/res/values-sr-rSP/strings.xml @@ -224,4 +224,6 @@ Нема апликације која подржава ову радњу Продужите дан неколико сати иза поноћи Чека до 03:00 да покаже нови дан. Корисно ако обично идете на спавање после поноћи. Захтева поновно покретање. + Изаберите јавну фасциклу за резервну копију + Ниједна фасцикла није изабрана diff --git a/uhabits-android/src/main/res/values-sv-rSE/strings.xml b/uhabits-android/src/main/res/values-sv-rSE/strings.xml index 3119d6c3c..30de986ab 100644 --- a/uhabits-android/src/main/res/values-sv-rSE/strings.xml +++ b/uhabits-android/src/main/res/values-sv-rSE/strings.xml @@ -227,4 +227,6 @@ Ingen app som stödjer åtgärden hittades. Förläng dagen några timmar efter midnatt Vänta till 3:00 innan en ny dag visas. Användbart om du vanligtvis går och lägger dig efter midnatt. Kräver omstart av appen. + Välj offentlig säkerhetskopieringsmapp + Ingen mapp vald diff --git a/uhabits-android/src/main/res/values-ta-rIN/strings.xml b/uhabits-android/src/main/res/values-ta-rIN/strings.xml index 6c27d400f..ffc555bba 100644 --- a/uhabits-android/src/main/res/values-ta-rIN/strings.xml +++ b/uhabits-android/src/main/res/values-ta-rIN/strings.xml @@ -218,4 +218,6 @@ இந்தச் செயலைச் செய்வதற்கான பயன்பாடு எதுவுமில்லை. நாளை, நள்ளிரவை தாண்டி சில மணிநேரங்கள் நீட்டிக்கவும் புதிய நாளைக் காண்பிக்க அதிகாலை 3:00 மணிவரை காத்திருக்கவும். நீங்கள் பொதுவாக நடுஇரவுக்கு பின் உறங்குபவரரெனில் உபயோகமானது. பயன்பாட்டை மறுதுவக்கம் செய்தல் அவசியமானது + பொது காப்பு கோப்புறையைத் தேர்ந்தெடுக்கவும் + எந்த கோப்புறையும் தேர்ந்தெடுக்கப்படவில்லை diff --git a/uhabits-android/src/main/res/values-te-rIN/strings.xml b/uhabits-android/src/main/res/values-te-rIN/strings.xml index d74537020..081a145b8 100644 --- a/uhabits-android/src/main/res/values-te-rIN/strings.xml +++ b/uhabits-android/src/main/res/values-te-rIN/strings.xml @@ -52,4 +52,6 @@ ఎల్లప్పుడూ అడుగు సెట్టింగులు తొలగించుము + పబ్లిక్ బ్యాకప్ ఫోల్డర్‌ను ఎంచుకోండి + ఏ ఫోల్డర్‌ కూడా ఎంపిక చేయబడలేదు diff --git a/uhabits-android/src/main/res/values-tr-rTR/strings.xml b/uhabits-android/src/main/res/values-tr-rTR/strings.xml index 246880953..a0649af0d 100644 --- a/uhabits-android/src/main/res/values-tr-rTR/strings.xml +++ b/uhabits-android/src/main/res/values-tr-rTR/strings.xml @@ -218,4 +218,6 @@ Bu işlemi gerçekleştirebilecek bir uygulama bulunamadı. Yeni günü gece yarısından birkaç saat sonra başlat Yeni gün saat 03:00\'ten sonra başlar. Geç saatlerde uyuyanlar için kullanışlıdır. Uygulamanın yeniden başlatılmasını gerektirir. + Genel yedekleme klasörünü seç + Klasör seçilmedi diff --git a/uhabits-android/src/main/res/values-ug-rCN/strings.xml b/uhabits-android/src/main/res/values-ug-rCN/strings.xml index 873a9f064..4ecf4a3a2 100644 --- a/uhabits-android/src/main/res/values-ug-rCN/strings.xml +++ b/uhabits-android/src/main/res/values-ug-rCN/strings.xml @@ -28,4 +28,6 @@ رەڭ ئۆزگەردى ئادەت قۇرۇلدى تەڭشەك + ئاممىۋى زاپاس قىسقۇچىنى تاللاڭ + ھېچقانداق قىسقۇچ تاللانمىدى diff --git a/uhabits-android/src/main/res/values-uk-rUA/strings.xml b/uhabits-android/src/main/res/values-uk-rUA/strings.xml index 3886b6fc4..b6fbac9d6 100644 --- a/uhabits-android/src/main/res/values-uk-rUA/strings.xml +++ b/uhabits-android/src/main/res/values-uk-rUA/strings.xml @@ -239,4 +239,6 @@ Не знайдено програми для підтримки цієї дії Продовжити день на кілька годин після опівночі Почекати до 3:00 перед показом нового дня. Корисно, якщо ви зазвичай лягаєте спати після опівночі. Потрібно перезапустити програму. + Виберіть загальнодоступну теку для резервних копій + Теку не вибрано diff --git a/uhabits-android/src/main/res/values-vi-rVN/strings.xml b/uhabits-android/src/main/res/values-vi-rVN/strings.xml index 37c186882..5d6b1c211 100644 --- a/uhabits-android/src/main/res/values-vi-rVN/strings.xml +++ b/uhabits-android/src/main/res/values-vi-rVN/strings.xml @@ -212,4 +212,6 @@ Không tìm thấy ứng dụng nào để hỗ trợ hành động này Kéo dài ngày thêm một vài giờ sau nửa đêm Chờ đến 3:00 sáng để hiện một ngày mới. Rất hữu ích nếu bạn thường đi ngủ sau nửa đêm. Yêu cầu khởi động lại ứng dụng. + Chọn thư mục sao lưu công khai + Không có thư mục nào được chọn diff --git a/uhabits-android/src/main/res/values-zh-rCN/strings.xml b/uhabits-android/src/main/res/values-zh-rCN/strings.xml index c09a8662c..74e7cdde4 100644 --- a/uhabits-android/src/main/res/values-zh-rCN/strings.xml +++ b/uhabits-android/src/main/res/values-zh-rCN/strings.xml @@ -213,4 +213,6 @@ 找不到支持此操作的应用 将一天延长到午夜后的几个小时 凌晨 3 点后再显示新的一天。如果你通常在午夜后入睡,这会很有用。重启应用后生效。 + 选择公共备份文件夹 + 未选择文件夹 diff --git a/uhabits-android/src/main/res/values-zh-rTW/strings.xml b/uhabits-android/src/main/res/values-zh-rTW/strings.xml index ce48bfe86..d983dd7ed 100644 --- a/uhabits-android/src/main/res/values-zh-rTW/strings.xml +++ b/uhabits-android/src/main/res/values-zh-rTW/strings.xml @@ -216,4 +216,6 @@ 找不到可以處理這個動作的應用程式。 將一天延長到午夜過後幾個小時 凌晨3點後再顯示新的一天。如果你通常在午夜以後才睡,這能幫上忙。重新啟動後才生效。 + 選擇公開備份資料夾 + 未選取資料夾 diff --git a/uhabits-android/src/main/res/values/strings.xml b/uhabits-android/src/main/res/values/strings.xml index 3a7582bc5..883e5aa68 100644 --- a/uhabits-android/src/main/res/values/strings.xml +++ b/uhabits-android/src/main/res/values/strings.xml @@ -137,6 +137,8 @@ Supports full backups exported by this app, as well as files generated by Tickmate, HabitBull or Rewire. See FAQ for more information. Generates files that can be opened by spreadsheet software such as Microsoft Excel or OpenOffice Calc. This file cannot be imported back. Generates a file that contains all your data. This file can be imported back. + Select public backup folder + No folder selected Failed to generate bug report. Generate bug report Troubleshooting diff --git a/uhabits-android/src/main/res/xml/preferences.xml b/uhabits-android/src/main/res/xml/preferences.xml index b5f651068..ee2eaa43c 100644 --- a/uhabits-android/src/main/res/xml/preferences.xml +++ b/uhabits-android/src/main/res/xml/preferences.xml @@ -136,6 +136,12 @@ android:title="@string/import_data" app:iconSpaceReserved="false" /> + +