From 403d1058aad688104bd9aa74b1f5d6703495698c Mon Sep 17 00:00:00 2001 From: mihanentalpo Date: Sun, 24 Aug 2025 21:55:58 +0700 Subject: [PATCH 1/4] Automatic public backup: Implementation of SAF for AutoBackup --- gradle/libs.versions.toml | 2 + uhabits-android/build.gradle.kts | 1 + .../activities/settings/SettingsFragment.kt | 64 +++++++++++++++-- .../org/isoron/uhabits/database/AutoBackup.kt | 70 ++++++++++++++----- .../org/isoron/uhabits/tasks/ExportDBTask.kt | 26 ++++++- .../org/isoron/uhabits/utils/DatabaseUtils.kt | 19 +++++ .../src/main/res/xml/preferences.xml | 6 ++ 7 files changed, 165 insertions(+), 23 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index edec855a..783e8700 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 bffb150b..4d1aa7d2 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/main/java/org/isoron/uhabits/activities/settings/SettingsFragment.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/settings/SettingsFragment.kt index 0fc1f43c..45792509 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.View @@ -56,10 +58,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) } @@ -114,6 +127,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) } @@ -128,6 +151,7 @@ class SettingsFragment : PreferenceFragmentCompat(), OnSharedPreferenceChangeLis devCategory.isVisible = false } updateWeekdayPreference() + updatePublicBackupFolderSummary() findPreference("reminderSound").isVisible = false } @@ -192,7 +216,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 03480e91..0f3e7cbe 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,70 @@ 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() - 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 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() + if (now - newestTimestamp > DateUtils.DAY_LENGTH) { + DatabaseUtils.saveDatabaseCopy(context, dir) + } else { + Log.i("AutoBackup", "Fresh backup found (timestamp=$newestTimestamp)") } } - private fun listBackupFiles(): ArrayList { - val files = ArrayList() - for (path in basedir.list()!!) { - files.add(File("${basedir.path}/$path")) + 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 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 45db42a7..c4385a0b 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 public backup folder is selected, use it for backup + 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) { + saveDatabaseCopy(context, dir) + } else { + null + } + // if public backup folder is unset, use default system folder to backup + } else { + 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 81ea121d..09a59a2e 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/xml/preferences.xml b/uhabits-android/src/main/res/xml/preferences.xml index 6072e711..9c818050 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" /> + + Date: Sun, 24 Aug 2025 21:56:11 +0700 Subject: [PATCH 2/4] Automatic public backup: Tests for AutoBackup to public folder --- .../isoron/uhabits/acceptance/BackupTest.kt | 12 ++++++++++++ .../uhabits/acceptance/steps/BackupSteps.kt | 19 ++++++++++++++++++- 2 files changed, 30 insertions(+), 1 deletion(-) 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 f2449615..a61e6b5f 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 f9816434..fe96573c 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 @@ -20,7 +20,9 @@ package org.isoron.uhabits.acceptance.steps import android.os.Build.VERSION.SDK_INT -import android.os.SystemClock.sleep +import android.net.Uri +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() From b7a7d5f076b5a7d9f46123985f9366f6dc6763e9 Mon Sep 17 00:00:00 2001 From: mihanentalpo Date: Sun, 24 Aug 2025 21:56:25 +0700 Subject: [PATCH 3/4] Automatic public backup: Translation to all the languages --- uhabits-android/src/main/res/values-af-rZA/strings.xml | 2 ++ uhabits-android/src/main/res/values-ar-rSA/strings.xml | 2 ++ uhabits-android/src/main/res/values-bg-rBG/strings.xml | 2 ++ uhabits-android/src/main/res/values-ca-rES/strings.xml | 2 ++ uhabits-android/src/main/res/values-cs-rCZ/strings.xml | 2 ++ uhabits-android/src/main/res/values-da-rDK/strings.xml | 2 ++ uhabits-android/src/main/res/values-de-rDE/strings.xml | 2 ++ uhabits-android/src/main/res/values-el-rGR/strings.xml | 2 ++ uhabits-android/src/main/res/values-eo-rUY/strings.xml | 2 ++ uhabits-android/src/main/res/values-es-rES/strings.xml | 2 ++ uhabits-android/src/main/res/values-eu-rES/strings.xml | 2 ++ uhabits-android/src/main/res/values-fa-rIR/strings.xml | 2 ++ uhabits-android/src/main/res/values-fi-rFI/strings.xml | 2 ++ uhabits-android/src/main/res/values-fr-rFR/strings.xml | 2 ++ uhabits-android/src/main/res/values-gu-rIN/strings.xml | 4 +++- uhabits-android/src/main/res/values-hi-rIN/strings.xml | 2 ++ uhabits-android/src/main/res/values-hr-rHR/strings.xml | 2 ++ uhabits-android/src/main/res/values-hu-rHU/strings.xml | 2 ++ uhabits-android/src/main/res/values-hy-rAM/strings.xml | 2 ++ uhabits-android/src/main/res/values-in-rID/strings.xml | 2 ++ uhabits-android/src/main/res/values-is-rIS/strings.xml | 2 ++ uhabits-android/src/main/res/values-it-rIT/strings.xml | 2 ++ uhabits-android/src/main/res/values-iw-rIL/strings.xml | 2 ++ uhabits-android/src/main/res/values-ja-rJP/strings.xml | 2 ++ uhabits-android/src/main/res/values-ka-rGE/strings.xml | 2 ++ uhabits-android/src/main/res/values-ko-rKR/strings.xml | 2 ++ uhabits-android/src/main/res/values-ml-rIN/strings.xml | 2 ++ uhabits-android/src/main/res/values-nl-rNL/strings.xml | 2 ++ uhabits-android/src/main/res/values-no-rNO/strings.xml | 2 ++ uhabits-android/src/main/res/values-pl-rPL/strings.xml | 2 ++ uhabits-android/src/main/res/values-pt-rBR/strings.xml | 2 ++ uhabits-android/src/main/res/values-pt-rPT/strings.xml | 2 ++ uhabits-android/src/main/res/values-ro-rRO/strings.xml | 2 ++ uhabits-android/src/main/res/values-ru-rRU/strings.xml | 2 ++ uhabits-android/src/main/res/values-sk-rSK/strings.xml | 2 ++ uhabits-android/src/main/res/values-sl-rSI/strings.xml | 2 ++ uhabits-android/src/main/res/values-sr-rCS/strings.xml | 2 ++ uhabits-android/src/main/res/values-sr-rSP/strings.xml | 2 ++ uhabits-android/src/main/res/values-sv-rSE/strings.xml | 2 ++ uhabits-android/src/main/res/values-ta-rIN/strings.xml | 2 ++ uhabits-android/src/main/res/values-te-rIN/strings.xml | 2 ++ uhabits-android/src/main/res/values-tr-rTR/strings.xml | 2 ++ uhabits-android/src/main/res/values-ug-rCN/strings.xml | 2 ++ uhabits-android/src/main/res/values-uk-rUA/strings.xml | 2 ++ uhabits-android/src/main/res/values-vi-rVN/strings.xml | 2 ++ uhabits-android/src/main/res/values-zh-rCN/strings.xml | 2 ++ uhabits-android/src/main/res/values-zh-rTW/strings.xml | 2 ++ uhabits-android/src/main/res/values/strings.xml | 2 ++ 48 files changed, 97 insertions(+), 1 deletion(-) 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 90c8a169..41bf482f 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 33ce2d62..d2b2d3e9 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 0ac1b362..0210c73a 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 85af1832..fcdbc255 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 2f1ced2a..4a3673ff 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 fdf19c6a..99e75d90 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 90959fbb..fcd3be42 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 bf322f48..50000bbe 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 cfbf83e9..34b629ee 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 28d1fae9..2a85955d 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 f40266ce..d4c96d33 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 391e558d..0b4561bc 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 5dbc61f0..8c53b6a9 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 1132dd26..d6770113 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 3a895c00..ed3f7be5 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 2bd2de18..e7c42c90 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 a73ec99b..93a10ca5 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 f206c05f..5fe8da51 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 dc98ed87..f2b83799 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 115daceb..28310261 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 7753f38f..163897e0 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 2ddf6e76..cf74085d 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 6c2b6f39..2b2a114a 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 2f2a419d..2210c1ed 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 7c01aceb..fb9d7d56 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 fcea1557..f0bf7859 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 f078bbac..4056fd94 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 9770354c..feea06a0 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 16d054db..901e7e96 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 fcfd1b80..0afa83a6 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 c5687a1f..cd5f5d3e 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 065c3cdf..c380631e 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 d9df1c25..8c1a2119 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 892b07e8..4f77aa88 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 09acf99f..4448b979 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 2a8db667..8ab878f2 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 0374b68a..74796809 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 fcb584b3..76f23684 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 12766459..74dc3f65 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 a7a14be4..88dcc583 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 56acf23a..f71c76f0 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 932d07bf..02efc927 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 88cdb3db..4672483e 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 725d695c..cc6c82a8 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 f0db5716..be6a4dba 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 5c80c99f..5f66b61f 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 7afe2d55..b7392408 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 1b33c023..b4c9f1f4 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 From 7a04abc8e53d086cfa3d6e5cc0e02e7bc140ea3b Mon Sep 17 00:00:00 2001 From: mihanentalpo Date: Sun, 24 Aug 2025 22:14:45 +0700 Subject: [PATCH 4/4] Automatic public backup: Fixed for the ktlint --- .../java/org/isoron/uhabits/acceptance/steps/BackupSteps.kt | 2 +- .../src/main/java/org/isoron/uhabits/database/AutoBackup.kt | 1 - .../src/main/java/org/isoron/uhabits/tasks/ExportDBTask.kt | 4 ++-- 3 files changed, 3 insertions(+), 4 deletions(-) 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 fe96573c..1ee01e97 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,8 @@ package org.isoron.uhabits.acceptance.steps -import android.os.Build.VERSION.SDK_INT import android.net.Uri +import android.os.Build.VERSION.SDK_INT import androidx.preference.PreferenceManager import androidx.test.platform.app.InstrumentationRegistry import androidx.test.uiautomator.By 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 0f3e7cbe..6527b47d 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 @@ -97,4 +97,3 @@ class AutoBackup(private val context: Context) { } } } - 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 c4385a0b..91253b78 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 @@ -40,8 +40,8 @@ class ExportDBTask( filename = try { val prefs = PreferenceManager.getDefaultSharedPreferences(context) val uriString = prefs.getString("publicBackupFolder", null) - // if public backup folder is selected, use it for backup 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) @@ -53,8 +53,8 @@ class ExportDBTask( } else { null } - // if public backup folder is unset, use default system folder to backup } else { + // if public backup folder is unset, use default system folder to backup val dir = system.getFilesDir("Backups") ?: return saveDatabaseCopy(context, dir) }