Merge branch 'dev' into edit-redesign

pull/605/head
Alinson S. Xavier 5 years ago
commit 6070a7af2e

1
.gitignore vendored

@ -4,6 +4,7 @@
*.perspectivev3 *.perspectivev3
*.swp *.swp
*~.nib *~.nib
*.hprof
.DS_Store .DS_Store
.externalNativeBuild .externalNativeBuild
.gradle .gradle

@ -1,4 +1,5 @@
apply plugin: 'com.android.library' apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
android { android {
compileSdkVersion COMPILE_SDK_VERSION as Integer compileSdkVersion COMPILE_SDK_VERSION as Integer
@ -28,4 +29,5 @@ dependencies {
implementation "org.apache.commons:commons-lang3:3.5" implementation "org.apache.commons:commons-lang3:3.5"
annotationProcessor "com.google.dagger:dagger-compiler:$DAGGER_VERSION" annotationProcessor "com.google.dagger:dagger-compiler:$DAGGER_VERSION"
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$KOTLIN_VERSION"
} }

@ -1,156 +0,0 @@
/*
* Copyright (C) 2017 Álinson Santos Xavier <isoron@gmail.com>
*
* This file is part of Loop Habit Tracker.
*
* Loop Habit Tracker is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* Loop Habit Tracker is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.isoron.androidbase;
import android.content.*;
import android.os.*;
import android.view.*;
import androidx.annotation.NonNull;
import java.io.*;
import java.text.*;
import java.util.*;
import javax.inject.*;
public class AndroidBugReporter
{
private final Context context;
@Inject
public AndroidBugReporter(@NonNull @AppContext Context context)
{
this.context = context;
}
/**
* Captures and returns a bug report. The bug report contains some device
* information and the logcat.
*
* @return a String containing the bug report.
* @throws IOException when any I/O error occur.
*/
@NonNull
public String getBugReport() throws IOException
{
String logcat = getLogcat();
String deviceInfo = getDeviceInfo();
String log = "---------- BUG REPORT BEGINS ----------\n";
log += deviceInfo + "\n" + logcat;
log += "---------- BUG REPORT ENDS ------------\n";
return log;
}
public String getDeviceInfo()
{
if (context == null) return "null context\n";
WindowManager wm =
(WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
return
String.format("App Version Name: %s\n", BuildConfig.VERSION_NAME) +
String.format("App Version Code: %s\n", BuildConfig.VERSION_CODE) +
String.format("OS Version: %s (%s)\n",
System.getProperty("os.version"), Build.VERSION.INCREMENTAL) +
String.format("OS API Level: %s\n", Build.VERSION.SDK) +
String.format("Device: %s\n", Build.DEVICE) +
String.format("Model (Product): %s (%s)\n", Build.MODEL,
Build.PRODUCT) +
String.format("Manufacturer: %s\n", Build.MANUFACTURER) +
String.format("Other tags: %s\n", Build.TAGS) +
String.format("Screen Width: %s\n",
wm.getDefaultDisplay().getWidth()) +
String.format("Screen Height: %s\n",
wm.getDefaultDisplay().getHeight()) +
String.format("External storage state: %s\n\n",
Environment.getExternalStorageState());
}
public String getLogcat() throws IOException
{
int maxLineCount = 250;
StringBuilder builder = new StringBuilder();
String[] command = new String[]{ "logcat", "-d" };
java.lang.Process process = Runtime.getRuntime().exec(command);
InputStreamReader in = new InputStreamReader(process.getInputStream());
BufferedReader bufferedReader = new BufferedReader(in);
LinkedList<String> log = new LinkedList<>();
String line;
while ((line = bufferedReader.readLine()) != null)
{
log.addLast(line);
if (log.size() > maxLineCount) log.removeFirst();
}
for (String l : log)
{
builder.append(l);
builder.append('\n');
}
return builder.toString();
}
/**
* Captures a bug report and saves it to a file in the SD card.
* <p>
* The contents of the file are generated by the method {@link
* #getBugReport()}. The file is saved in the apps's external private
* storage.
*
* @return the generated file.
* @throws IOException when I/O errors occur.
*/
@NonNull
public void dumpBugReportToFile()
{
try
{
String date =
new SimpleDateFormat("yyyy-MM-dd HHmmss", Locale.US).format(
new Date());
if (context == null) throw new IllegalStateException();
File dir = new AndroidDirFinder(context).getFilesDir("Logs");
if (dir == null)
throw new IOException("log dir should not be null");
File logFile =
new File(String.format("%s/Log %s.txt", dir.getPath(), date));
FileWriter output = new FileWriter(logFile);
output.write(getBugReport());
output.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}

@ -0,0 +1,110 @@
/*
* Copyright (C) 2017 Álinson Santos Xavier <isoron@gmail.com>
*
* This file is part of Loop Habit Tracker.
*
* Loop Habit Tracker is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* Loop Habit Tracker is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.isoron.androidbase
import android.content.Context
import android.os.Build
import android.os.Environment
import android.view.WindowManager
import java.io.*
import java.text.SimpleDateFormat
import java.util.*
import javax.inject.Inject
open class AndroidBugReporter @Inject constructor(@AppContext private val context: Context) {
/**
* Captures and returns a bug report. The bug report contains some device
* information and the logcat.
*
* @return a String containing the bug report.
* @throws IOException when any I/O error occur.
*/
@Throws(IOException::class)
fun getBugReport(): String {
var log = "---------- BUG REPORT BEGINS ----------\n"
log += "${getLogcat()}\n"
log += "${getDeviceInfo()}\n"
log += "---------- BUG REPORT ENDS ------------\n"
return log
}
@Throws(IOException::class)
fun getLogcat(): String {
val maxLineCount = 250
val builder = StringBuilder()
val process = Runtime.getRuntime().exec(arrayOf("logcat", "-d"))
val inputReader = InputStreamReader(process.inputStream)
val bufferedReader = BufferedReader(inputReader)
val log = LinkedList<String>()
var line: String?
while (true) {
line = bufferedReader.readLine()
if (line == null) break;
log.addLast(line)
if (log.size > maxLineCount) log.removeFirst()
}
for (l in log) {
builder.appendln(l)
}
return builder.toString()
}
/**
* Captures a bug report and saves it to a file in the SD card.
*
* The contents of the file are generated by the method [ ][.getBugReport]. The file is saved
* in the apps's external private storage.
*
* @return the generated file.
* @throws IOException when I/O errors occur.
*/
fun dumpBugReportToFile() {
try {
val date = SimpleDateFormat("yyyy-MM-dd HHmmss", Locale.US).format(Date())
val dir = AndroidDirFinder(context).getFilesDir("Logs")
?: throw IOException("log dir should not be null")
val logFile = File(String.format("%s/Log %s.txt", dir.path, date))
val output = FileWriter(logFile)
output.write(getBugReport())
output.close()
} catch (e: IOException) {
e.printStackTrace()
}
}
private fun getDeviceInfo(): String {
val wm = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
return buildString {
appendln("App Version Name: ${BuildConfig.VERSION_NAME}")
appendln("App Version Code: ${BuildConfig.VERSION_CODE}")
appendln("OS Version: ${System.getProperty("os.version")} (${Build.VERSION.INCREMENTAL})")
appendln("OS API Level: ${Build.VERSION.SDK}")
appendln("Device: ${Build.DEVICE}")
appendln("Model (Product): ${Build.MODEL} (${Build.PRODUCT})")
appendln("Manufacturer: ${Build.MANUFACTURER}")
appendln("Other tags: ${Build.TAGS}")
appendln("Screen Width: ${wm.defaultDisplay.width}")
appendln("Screen Height: ${wm.defaultDisplay.height}")
appendln("External storage state: ${Environment.getExternalStorageState()}")
appendln()
}
}
}

@ -1,60 +0,0 @@
/*
* Copyright (C) 2017 Álinson Santos Xavier <isoron@gmail.com>
*
* This file is part of Loop Habit Tracker.
*
* Loop Habit Tracker is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* Loop Habit Tracker is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.isoron.androidbase;
import android.content.*;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.*;
import android.util.*;
import org.isoron.androidbase.utils.*;
import java.io.*;
import javax.inject.*;
public class AndroidDirFinder
{
@NonNull
private Context context;
@Inject
public AndroidDirFinder(@NonNull @AppContext Context context)
{
this.context = context;
}
@Nullable
public File getFilesDir(@Nullable String relativePath)
{
File externalFilesDirs[] =
ContextCompat.getExternalFilesDirs(context, null);
if (externalFilesDirs == null)
{
Log.e("BaseSystem",
"getFilesDir: getExternalFilesDirs returned null");
return null;
}
return FileUtils.getDir(externalFilesDirs, relativePath);
}
}

@ -16,15 +16,19 @@
* You should have received a copy of the GNU General Public License along * You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>. * with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package org.isoron.uhabits.activities.about; package org.isoron.androidbase
import org.isoron.uhabits.core.ui.screens.about.*; import android.content.Context
import androidx.core.content.ContextCompat
import org.isoron.androidbase.utils.FileUtils
import java.io.File
import javax.inject.Inject
import dagger.*; class AndroidDirFinder @Inject constructor(@param:AppContext private val context: Context) {
fun getFilesDir(relativePath: String?): File? {
@Module return FileUtils.getDir(
public abstract class AboutModule ContextCompat.getExternalFilesDirs(context, null),
{ relativePath
@Binds )
abstract AboutBehavior.Screen getScreen(AboutScreen screen); }
} }

@ -16,16 +16,14 @@
* You should have received a copy of the GNU General Public License along * You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>. * with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package org.isoron.androidbase
package org.isoron.androidbase; import java.lang.annotation.Documented
import java.lang.annotation.Retention
import java.lang.annotation.*; import java.lang.annotation.RetentionPolicy
import javax.inject.Qualifier
import javax.inject.*;
@Qualifier @Qualifier
@Documented @Documented
@Retention(RetentionPolicy.RUNTIME) @Retention(RetentionPolicy.RUNTIME)
public @interface AppContext annotation class AppContext
{
}

@ -1,68 +0,0 @@
/*
* Copyright (C) 2017 Álinson Santos Xavier <isoron@gmail.com>
*
* This file is part of Loop Habit Tracker.
*
* Loop Habit Tracker is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* Loop Habit Tracker is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.isoron.androidbase;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.isoron.androidbase.activities.*;
public class BaseExceptionHandler implements Thread.UncaughtExceptionHandler
{
@Nullable
private Thread.UncaughtExceptionHandler originalHandler;
@NonNull
private BaseActivity activity;
public BaseExceptionHandler(@NonNull BaseActivity activity)
{
this.activity = activity;
originalHandler = Thread.getDefaultUncaughtExceptionHandler();
}
@Override
public void uncaughtException(@Nullable Thread thread,
@Nullable Throwable ex)
{
if (ex == null) return;
try
{
ex.printStackTrace();
new AndroidBugReporter(activity).dumpBugReportToFile();
}
catch (Exception e)
{
e.printStackTrace();
}
// if (ex.getCause() instanceof InconsistentDatabaseException)
// {
// HabitsApplication app = (HabitsApplication) activity.getApplication();
// HabitList habits = app.getComponent().getHabitList();
// habits.repair();
// System.exit(0);
// }
if (originalHandler != null)
originalHandler.uncaughtException(thread, ex);
}
}

@ -0,0 +1,39 @@
/*
* Copyright (C) 2017 Álinson Santos Xavier <isoron@gmail.com>
*
* This file is part of Loop Habit Tracker.
*
* Loop Habit Tracker is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* Loop Habit Tracker is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.isoron.androidbase
import org.isoron.androidbase.activities.BaseActivity
class BaseExceptionHandler(private val activity: BaseActivity) : Thread.UncaughtExceptionHandler {
private val originalHandler: Thread.UncaughtExceptionHandler? =
Thread.getDefaultUncaughtExceptionHandler()
override fun uncaughtException(thread: Thread?, ex: Throwable?) {
if (ex == null) return
if (thread == null) return
try {
ex.printStackTrace()
AndroidBugReporter(activity).dumpBugReportToFile()
} catch (e: Exception) {
e.printStackTrace()
}
originalHandler?.uncaughtException(thread, ex)
}
}

@ -1,70 +0,0 @@
/*
* Copyright (C) 2017 Álinson Santos Xavier <isoron@gmail.com>
*
* This file is part of Loop Habit Tracker.
*
* Loop Habit Tracker is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* Loop Habit Tracker is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.isoron.androidbase;
import android.content.*;
import androidx.annotation.NonNull;
import java.io.*;
import java.security.*;
import java.security.cert.Certificate;
import java.security.cert.*;
import javax.inject.*;
import javax.net.ssl.*;
public class SSLContextProvider
{
private Context context;
@Inject
public SSLContextProvider(@NonNull @AppContext Context context)
{
this.context = context;
}
public SSLContext getCACertSSLContext()
{
try
{
CertificateFactory cf = CertificateFactory.getInstance("X.509");
InputStream caInput = context.getAssets().open("cacert.pem");
Certificate ca = cf.generateCertificate(caInput);
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
ks.load(null, null);
ks.setCertificateEntry("ca", ca);
TrustManagerFactory tmf = TrustManagerFactory.getInstance(
TrustManagerFactory.getDefaultAlgorithm());
tmf.init(ks);
SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(null, tmf.getTrustManagers(), null);
return ctx;
}
catch (Exception e)
{
throw new RuntimeException(e);
}
}
}

@ -0,0 +1,48 @@
/*
* Copyright (C) 2017 Álinson Santos Xavier <isoron@gmail.com>
*
* This file is part of Loop Habit Tracker.
*
* Loop Habit Tracker is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* Loop Habit Tracker is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.isoron.androidbase
import android.content.Context
import java.security.KeyStore
import java.security.cert.CertificateFactory
import javax.inject.Inject
import javax.net.ssl.SSLContext
import javax.net.ssl.TrustManagerFactory
class SSLContextProvider @Inject constructor(@param:AppContext private val context: Context) {
fun getCACertSSLContext(): SSLContext {
try {
val cf = CertificateFactory.getInstance("X.509")
val ca = cf.generateCertificate(context.assets.open("cacert.pem"))
val ks = KeyStore.getInstance(KeyStore.getDefaultType()).apply {
load(null, null)
setCertificateEntry("ca", ca)
}
val alg = TrustManagerFactory.getDefaultAlgorithm()
val tmf = TrustManagerFactory.getInstance(alg).apply {
init(ks)
}
return SSLContext.getInstance("TLS").apply {
init(null, tmf.trustManagers, null)
}
} catch (e: Exception) {
throw RuntimeException(e)
}
}
}

@ -878,7 +878,7 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue
// When the first digit is 2, the second digit may be 4-5. // When the first digit is 2, the second digit may be 4-5.
secondDigit = new Node(k4, k5); secondDigit = new Node(k4, k5);
firstDigit.addChild(secondDigit); firstDigit.addChild(secondDigit);
// We must now be followd by the last minute digit. E.g. 2:40, 2:53. // We must now be followed by the last minute digit. E.g. 2:40, 2:53.
secondDigit.addChild(minuteSecondDigit); secondDigit.addChild(minuteSecondDigit);
// The first digit may be 3-9. // The first digit may be 3-9.

@ -25,294 +25,256 @@ OUTPUTS_DIR=uhabits-android/build/outputs
VERSION=$(cat gradle.properties | grep VERSION_NAME | sed -e 's/.*=//g;s/ //g') VERSION=$(cat gradle.properties | grep VERSION_NAME | sed -e 's/.*=//g;s/ //g')
if [ ! -f "${ANDROID_HOME}/platform-tools/adb" ]; then if [ ! -f "${ANDROID_HOME}/platform-tools/adb" ]; then
echo "Error: ANDROID_HOME is not set correctly" echo "Error: ANDROID_HOME is not set correctly"
exit 1 exit 1
fi fi
log_error() { log_error() {
if [ ! -z "$TEAMCITY_VERSION" ]; then if [ ! -z "$TEAMCITY_VERSION" ]; then
echo "###teamcity[progressMessage '$1']" echo "###teamcity[progressMessage '$1']"
else else
local COLOR='\033[1;31m' local COLOR='\033[1;31m'
local NC='\033[0m' local NC='\033[0m'
echo -e "$COLOR>>> $1 $NC" echo -e "$COLOR>>> $1 $NC"
fi fi
} }
log_info() { log_info() {
if [ ! -z "$TEAMCITY_VERSION" ]; then if [ ! -z "$TEAMCITY_VERSION" ]; then
echo "###teamcity[progressMessage '$1']" echo "###teamcity[progressMessage '$1']"
else else
local COLOR='\033[1;32m' local COLOR='\033[1;32m'
local NC='\033[0m' local NC='\033[0m'
echo -e "$COLOR>>> $1 $NC" echo -e "$COLOR>>> $1 $NC"
fi fi
} }
fail() { fail() {
if [ ! -z ${AVD_NAME} ]; then log_error "BUILD FAILED"
stop_emulator exit 1
stop_gradle_daemon
fi
log_error "BUILD FAILED"
exit 1
} }
if [ ! -z $RELEASE ]; then if [ ! -z $RELEASE ]; then
log_info "Reading secret env variables from ../.secret/env" log_info "Reading secret env variables from ../.secret/env"
source ../.secret/env || fail source ../.secret/env || fail
fi fi
start_emulator() {
log_info "Starting emulator ($AVD_NAME)"
$EMULATOR -avd ${AVD_NAME} -port ${AVD_SERIAL} -no-audio -no-window &
$ADB wait-for-device shell 'while [[ -z $(getprop sys.boot_completed) ]]; do sleep 1; done; input keyevent 82'
}
stop_emulator() {
log_info "Stopping emulator"
$ADB emu kill
}
stop_gradle_daemon() {
log_info "Stopping gradle daemon"
$GRADLE --stop
}
run_adb_as_root() { run_adb_as_root() {
log_info "Running adb as root" log_info "Running adb as root"
$ADB root $ADB root
} }
build_apk() { build_apk() {
log_info "Removing old APKs..." log_info "Removing old APKs..."
rm -vf build/*.apk rm -vf build/*.apk
if [ ! -z $RELEASE ]; then if [ ! -z $RELEASE ]; then
log_info "Building release APK" log_info "Building release APK"
./gradlew assembleRelease ./gradlew assembleRelease
cp -v uhabits-android/build/outputs/apk/release/uhabits-android-release.apk build/loop-$VERSION-release.apk cp -v uhabits-android/build/outputs/apk/release/uhabits-android-release.apk build/loop-$VERSION-release.apk
fi fi
log_info "Building debug APK" log_info "Building debug APK"
./gradlew assembleDebug || fail ./gradlew assembleDebug || fail
cp -v uhabits-android/build/outputs/apk/debug/uhabits-android-debug.apk build/loop-$VERSION-debug.apk cp -v uhabits-android/build/outputs/apk/debug/uhabits-android-debug.apk build/loop-$VERSION-debug.apk
} }
build_instrumentation_apk() { build_instrumentation_apk() {
log_info "Building instrumentation APK" log_info "Building instrumentation APK"
if [ ! -z $RELEASE ]; then if [ ! -z $RELEASE ]; then
$GRADLE assembleAndroidTest \ $GRADLE assembleAndroidTest \
-Pandroid.injected.signing.store.file=$LOOP_KEY_STORE \ -Pandroid.injected.signing.store.file=$LOOP_KEY_STORE \
-Pandroid.injected.signing.store.password=$LOOP_STORE_PASSWORD \ -Pandroid.injected.signing.store.password=$LOOP_STORE_PASSWORD \
-Pandroid.injected.signing.key.alias=$LOOP_KEY_ALIAS \ -Pandroid.injected.signing.key.alias=$LOOP_KEY_ALIAS \
-Pandroid.injected.signing.key.password=$LOOP_KEY_PASSWORD || fail -Pandroid.injected.signing.key.password=$LOOP_KEY_PASSWORD || fail
else else
$GRADLE assembleAndroidTest || fail $GRADLE assembleAndroidTest || fail
fi fi
}
clean_output_dir() {
log_info "Cleaning output directory"
rm -rf ${OUTPUTS_DIR}
mkdir -p ${OUTPUTS_DIR}
} }
uninstall_apk() { uninstall_apk() {
log_info "Uninstalling existing APK" log_info "Uninstalling existing APK"
$ADB uninstall ${PACKAGE_NAME} $ADB uninstall ${PACKAGE_NAME}
} }
install_test_butler() { install_test_butler() {
log_info "Installing Test Butler" log_info "Installing Test Butler"
$ADB uninstall com.linkedin.android.testbutler $ADB uninstall com.linkedin.android.testbutler
$ADB install tools/test-butler-app-2.0.2.apk $ADB install tools/test-butler-app-2.0.2.apk
} }
install_apk() { install_apk() {
log_info "Installing APK" log_info "Installing APK"
if [ ! -z $RELEASE ]; then if [ ! -z $RELEASE ]; then
$ADB install -r ${OUTPUTS_DIR}/apk/release/uhabits-android-release.apk || fail $ADB install -r ${OUTPUTS_DIR}/apk/release/uhabits-android-release.apk || fail
else else
$ADB install -t -r ${OUTPUTS_DIR}/apk/debug/uhabits-android-debug.apk || fail $ADB install -t -r ${OUTPUTS_DIR}/apk/debug/uhabits-android-debug.apk || fail
fi fi
} }
install_test_apk() { install_test_apk() {
log_info "Uninstalling existing test APK" log_info "Uninstalling existing test APK"
$ADB uninstall ${PACKAGE_NAME}.test $ADB uninstall ${PACKAGE_NAME}.test
log_info "Installing test APK" log_info "Installing test APK"
$ADB install -r ${OUTPUTS_DIR}/apk/androidTest/debug/uhabits-android-debug-androidTest.apk || fail $ADB install -r ${OUTPUTS_DIR}/apk/androidTest/debug/uhabits-android-debug-androidTest.apk || fail
} }
run_instrumented_tests() { run_instrumented_tests() {
SIZE=$1 SIZE=$1
log_info "Running instrumented tests" log_info "Running instrumented tests"
$ADB shell am instrument \ $ADB shell am instrument \
-r -e coverage true -e size $SIZE \ -r -e coverage true -e size $SIZE \
-w ${PACKAGE_NAME}.test/android.support.test.runner.AndroidJUnitRunner \ -w ${PACKAGE_NAME}.test/androidx.test.runner.AndroidJUnitRunner \
| tee ${OUTPUTS_DIR}/instrument.txt | tee ${OUTPUTS_DIR}/instrument.txt
if grep FAILURES $OUTPUTS_DIR/instrument.txt; then if grep "\(INSTRUMENTATION_STATUS_CODE.*-1\|FAILURES\)" $OUTPUTS_DIR/instrument.txt; then
log_error "Some instrumented tests failed" log_error "Some instrumented tests failed"
fetch_images fetch_images
fetch_logcat fetch_logcat
exit 1 exit 1
fi fi
#mkdir -p ${OUTPUTS_DIR}/code-coverage/connected/ #mkdir -p ${OUTPUTS_DIR}/code-coverage/connected/
#$ADB pull /data/user/0/${PACKAGE_NAME}/files/coverage.ec \ #$ADB pull /data/user/0/${PACKAGE_NAME}/files/coverage.ec \
# ${OUTPUTS_DIR}/code-coverage/connected/ \ # ${OUTPUTS_DIR}/code-coverage/connected/ \
# || log_error "COVERAGE REPORT NOT AVAILABLE" # || log_error "COVERAGE REPORT NOT AVAILABLE"
} }
parse_instrumentation_results() { parse_instrumentation_results() {
log_info "Parsing instrumented test results" log_info "Parsing instrumented test results"
java -jar tools/automator-log-converter-1.5.0.jar ${OUTPUTS_DIR}/instrument.txt || fail java -jar tools/automator-log-converter-1.5.0.jar ${OUTPUTS_DIR}/instrument.txt || fail
} }
generate_coverage_badge() { generate_coverage_badge() {
log_info "Generating code coverage badge" log_info "Generating code coverage badge"
CORE_REPORT=uhabits-core/build/reports/jacoco/test/jacocoTestReport.xml CORE_REPORT=uhabits-core/build/reports/jacoco/test/jacocoTestReport.xml
rm -f ${OUTPUTS_DIR}/coverage-badge.svg rm -f ${OUTPUTS_DIR}/coverage-badge.svg
python3 tools/coverage-badge/badge.py -i $CORE_REPORT -o ${OUTPUTS_DIR}/coverage-badge python3 tools/coverage-badge/badge.py -i $CORE_REPORT -o ${OUTPUTS_DIR}/coverage-badge
} }
fetch_logcat() { fetch_logcat() {
log_info "Fetching logcat" log_info "Fetching logcat"
$ADB logcat -d > ${OUTPUTS_DIR}/logcat.txt $ADB logcat -d > ${OUTPUTS_DIR}/logcat.txt
} }
run_jvm_tests() { run_jvm_tests() {
log_info "Running JVM tests" log_info "Running JVM tests"
if [ ! -z $RELEASE ]; then if [ ! -z $RELEASE ]; then
$GRADLE testReleaseUnitTest :uhabits-core:check || fail $GRADLE testReleaseUnitTest :uhabits-core:check || fail
else else
$GRADLE testDebugUnitTest :uhabits-core:check || fail $GRADLE testDebugUnitTest :uhabits-core:check || fail
fi fi
} }
uninstall_test_apk() { uninstall_test_apk() {
log_info "Uninstalling test APK" log_info "Uninstalling test APK"
$ADB uninstall ${PACKAGE_NAME}.test $ADB uninstall ${PACKAGE_NAME}.test
} }
fetch_images() { fetch_images() {
log_info "Fetching images" log_info "Fetching images"
rm -rf $OUTPUTS_DIR/test-screenshots rm -rf $OUTPUTS_DIR/test-screenshots
$ADB pull /sdcard/Android/data/${PACKAGE_NAME}/files/test-screenshots/ $OUTPUTS_DIR $ADB pull /sdcard/Android/data/${PACKAGE_NAME}/files/test-screenshots/ $OUTPUTS_DIR
$ADB shell rm -r /sdcard/Android/data/${PACKAGE_NAME}/files/test-screenshots/ $ADB shell rm -r /sdcard/Android/data/${PACKAGE_NAME}/files/test-screenshots/
} }
accept_images() { accept_images() {
find tmp/test-screenshots -name '*.expected*' -delete find tmp/test-screenshots -name '*.expected*' -delete
rsync -av tmp/test-screenshots/ uhabits-android/src/androidTest/assets/ rsync -av tmp/test-screenshots/ uhabits-android/src/androidTest/assets/
} }
run_tests() { run_tests() {
SIZE=$1 SIZE=$1
run_adb_as_root run_adb_as_root
install_test_butler install_test_butler
uninstall_apk uninstall_apk
install_apk install_apk
install_test_apk install_test_apk
run_instrumented_tests $SIZE run_instrumented_tests $SIZE
parse_instrumentation_results parse_instrumentation_results
fetch_logcat fetch_logcat
uninstall_test_apk uninstall_test_apk
} }
parse_opts() { parse_opts() {
OPTS=`getopt -o ur --long uninstall-first,release -n 'build.sh' -- "$@"` OPTS=`getopt -o r --long release -n 'build.sh' -- "$@"`
if [ $? != 0 ] ; then exit 1; fi if [ $? != 0 ] ; then exit 1; fi
eval set -- "$OPTS" eval set -- "$OPTS"
while true; do while true; do
case "$1" in case "$1" in
-u | --uninstall-first ) UNINSTALL_FIRST=1; shift ;; -r | --release ) RELEASE=1; shift ;;
-r | --release ) RELEASE=1; shift ;; * ) break ;;
* ) break ;; esac
esac done
done }
remove_build_dir() {
rm -rfv .gradle
rm -rfv build
rm -rfv android-base/build
rm -rfv android-pickers/build
rm -rfv uhabits-android/build
rm -rfv uhabits-core/build
} }
case "$1" in case "$1" in
build) build)
shift; parse_opts $* shift; parse_opts $*
build_apk build_apk
build_instrumentation_apk build_instrumentation_apk
run_jvm_tests run_jvm_tests
#generate_coverage_badge #generate_coverage_badge
;; ;;
ci-tests) medium-tests)
if [ -z $3 ]; then shift; parse_opts $*
cat <<- END run_tests medium
Usage: $0 ci-tests AVD_NAME AVD_SERIAL [options] ;;
Parameters: large-tests)
AVD_NAME name of the virtual android device to start shift; parse_opts $*
AVD_SERIAL adb port to use (e.g. 5560) run_tests large
;;
Options:
-u --uninstall-first Uninstall existing APK first fetch-images)
-r --release Test release APK, instead of debug fetch_images
END ;;
exit 1
fi accept-images)
accept_images
shift; AVD_NAME=$1 ;;
shift; AVD_SERIAL=$1
shift; parse_opts $* install)
ADB="${ADB} -s emulator-${AVD_SERIAL}" shift; parse_opts $*
build_apk
start_emulator install_apk
run_tests medium ;;
stop_emulator
stop_gradle_daemon clean)
;; remove_build_dir
;;
medium-tests)
shift; parse_opts $* *)
run_tests medium cat <<END
;; Usage: $0 <command> [options]
Builds, installs and tests Loop Habit Tracker
large-tests)
shift; parse_opts $* Commands:
run_tests large accept-images Copies fetched images to corresponding assets folder
;; build Build APK and run JVM tests
clean Remove build directory
fetch-images) fetch-images Fetches failed view test images from device
fetch_images install Install app on connected device
;; large-tests Run large-sized tests on connected device
medium-tests Run medium-sized tests on connected device
accept-images)
accept_images Options:
;; -r --release Build and test release APK, instead of debug
END
install) exit 1
shift; parse_opts $* ;;
build_apk
install_apk
;;
*)
cat <<- END
Usage: $0 <command> [options]
Builds, installs and tests Loop Habit Tracker
Commands:
ci-tests Start emulator silently, run tests then kill emulator
local-tests Run all tests on connected device
install Install app on connected device
fetch-images Fetches failed view test images from device
accept-images Copies fetched images to corresponding assets folder
Options:
-r --release Build and test release APK, instead of debug
END
exit 1
esac esac

@ -9,7 +9,7 @@ DAGGER_VERSION = 2.25.4
KOTLIN_VERSION = 1.3.61 KOTLIN_VERSION = 1.3.61
SUPPORT_LIBRARY_VERSION = 28.0.0 SUPPORT_LIBRARY_VERSION = 28.0.0
AUTO_FACTORY_VERSION = 1.0-beta6 AUTO_FACTORY_VERSION = 1.0-beta6
BUILD_TOOLS_VERSION = 3.5.3 BUILD_TOOLS_VERSION = 4.0.0
org.gradle.parallel=false org.gradle.parallel=false
org.gradle.daemon=true org.gradle.daemon=true

@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.0.1-all.zip
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip

@ -55,7 +55,7 @@ def get_total(report):
def get_color(total): def get_color(total):
""" """
Return color for current coverage precent Return color for current coverage percent
""" """
try: try:
xtotal = int(total) xtotal = int(total)

@ -88,6 +88,7 @@ dependencies {
implementation "com.google.code.gson:gson:2.8.5" implementation "com.google.code.gson:gson:2.8.5"
implementation "com.google.code.findbugs:jsr305:3.0.2" implementation "com.google.code.findbugs:jsr305:3.0.2"
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$KOTLIN_VERSION" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$KOTLIN_VERSION"
implementation "androidx.constraintlayout:constraintlayout:2.0.0-beta4"
implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
compileOnly "javax.annotation:jsr250-api:1.0" compileOnly "javax.annotation:jsr250-api:1.0"

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

@ -39,6 +39,7 @@ import static androidx.test.uiautomator.UiDevice.*;
public class BaseUserInterfaceTest public class BaseUserInterfaceTest
{ {
private static final String PKG = "org.isoron.uhabits"; private static final String PKG = "org.isoron.uhabits";
public static final String EMPTY_DESCRIPTION_HABIT_NAME = "Read books";
public static UiDevice device; public static UiDevice device;
@ -96,25 +97,29 @@ public class BaseUserInterfaceTest
Habit h1 = fixtures.createEmptyHabit(); Habit h1 = fixtures.createEmptyHabit();
h1.setName("Wake up early"); h1.setName("Wake up early");
h1.setDescription("Did you wake up early today?"); h1.setQuestion("Did you wake up early today?");
h1.setDescription("test description 1");
h1.setColor(5); h1.setColor(5);
habitList.update(h1); habitList.update(h1);
Habit h2 = fixtures.createShortHabit(); Habit h2 = fixtures.createShortHabit();
h2.setName("Track time"); h2.setName("Track time");
h2.setDescription("Did you track your time?"); h2.setQuestion("Did you track your time?");
h2.setDescription("test description 2");
h2.setColor(5); h2.setColor(5);
habitList.update(h2); habitList.update(h2);
Habit h3 = fixtures.createLongHabit(); Habit h3 = fixtures.createLongHabit();
h3.setName("Meditate"); h3.setName("Meditate");
h3.setDescription("Did meditate today?"); h3.setQuestion("Did meditate today?");
h3.setDescription("test description 3");
h3.setColor(10); h3.setColor(10);
habitList.update(h3); habitList.update(h3);
Habit h4 = fixtures.createEmptyHabit(); Habit h4 = fixtures.createEmptyHabit();
h4.setName("Read books"); h4.setName(EMPTY_DESCRIPTION_HABIT_NAME);
h4.setDescription("Did you read books today?"); h4.setQuestion("Did you read books today?");
h4.setDescription("");
h4.setColor(2); h4.setColor(2);
habitList.update(h4); habitList.update(h4);
} }

@ -52,7 +52,8 @@ public class HabitFixtures
{ {
Habit habit = modelFactory.buildHabit(); Habit habit = modelFactory.buildHabit();
habit.setName("Meditate"); habit.setName("Meditate");
habit.setDescription("Did you meditate this morning?"); habit.setQuestion("Did you meditate this morning?");
habit.setDescription("This is a test description");
habit.setColor(5); habit.setColor(5);
habit.setFrequency(Frequency.DAILY); habit.setFrequency(Frequency.DAILY);
habit.setId(id); habit.setId(id);
@ -81,7 +82,7 @@ public class HabitFixtures
{ {
Habit habit = modelFactory.buildHabit(); Habit habit = modelFactory.buildHabit();
habit.setName("Take a walk"); habit.setName("Take a walk");
habit.setDescription("How many steps did you walk today?"); habit.setQuestion("How many steps did you walk today?");
habit.setType(Habit.NUMBER_HABIT); habit.setType(Habit.NUMBER_HABIT);
habit.setTargetType(Habit.AT_LEAST); habit.setTargetType(Habit.AT_LEAST);
habit.setTargetValue(200.0); habit.setTargetValue(200.0);
@ -103,7 +104,7 @@ public class HabitFixtures
{ {
Habit habit = modelFactory.buildHabit(); Habit habit = modelFactory.buildHabit();
habit.setName("Wake up early"); habit.setName("Wake up early");
habit.setDescription("Did you wake up before 6am?"); habit.setQuestion("Did you wake up before 6am?");
habit.setFrequency(new Frequency(2, 3)); habit.setFrequency(new Frequency(2, 3));
habitList.add(habit); habitList.add(habit);

@ -37,7 +37,6 @@ class TestModule {
@ActivityScope @ActivityScope
@Component(modules = arrayOf( @Component(modules = arrayOf(
ActivityContextModule::class, ActivityContextModule::class,
AboutModule::class,
HabitsActivityModule::class, HabitsActivityModule::class,
ListHabitsModule::class, ListHabitsModule::class,
ShowHabitModule::class, ShowHabitModule::class,

@ -20,7 +20,6 @@
package org.isoron.uhabits.acceptance; package org.isoron.uhabits.acceptance;
import androidx.test.filters.*; import androidx.test.filters.*;
import androidx.test.runner.*;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
@ -39,7 +38,16 @@ import static org.isoron.uhabits.acceptance.steps.ListHabitsSteps.*;
public class HabitsTest extends BaseUserInterfaceTest public class HabitsTest extends BaseUserInterfaceTest
{ {
@Test @Test
public void shouldCreateHabit() throws Exception public void shouldCreateHabit() throws Exception {
shouldCreateHabit("this is a test description");
}
@Test
public void shouldCreateHabitBlankDescription() throws Exception {
shouldCreateHabit("");
}
private void shouldCreateHabit(String description) throws Exception
{ {
launchApp(); launchApp();
@ -47,14 +55,16 @@ public class HabitsTest extends BaseUserInterfaceTest
clickMenu(ADD); clickMenu(ADD);
verifyShowsScreen(EDIT_HABIT); verifyShowsScreen(EDIT_HABIT);
typeName("Hello world"); String testName = "Hello world";
typeName(testName);
typeQuestion("Did you say hello to the world today?"); typeQuestion("Did you say hello to the world today?");
typeDescription(description);
pickFrequency("Every week"); pickFrequency("Every week");
pickColor(5); pickColor(5);
clickSave(); clickSave();
verifyShowsScreen(LIST_HABITS); verifyShowsScreen(LIST_HABITS);
verifyDisplaysText("Hello world"); verifyDisplaysText(testName);
} }
@Test @Test
@ -81,7 +91,16 @@ public class HabitsTest extends BaseUserInterfaceTest
} }
@Test @Test
public void shouldEditHabit() throws Exception public void shouldEditHabit() throws Exception {
shouldEditHabit("this is a test description");
}
@Test
public void shouldEditHabitBlankDescription() throws Exception {
shouldEditHabit("");
}
private void shouldEditHabit(String description) throws Exception
{ {
launchApp(); launchApp();
@ -92,6 +111,7 @@ public class HabitsTest extends BaseUserInterfaceTest
verifyShowsScreen(EDIT_HABIT); verifyShowsScreen(EDIT_HABIT);
typeName("Take a walk"); typeName("Take a walk");
typeQuestion("Did you take a walk today?"); typeQuestion("Did you take a walk today?");
typeDescription(description);
clickSave(); clickSave();
verifyShowsScreen(LIST_HABITS); verifyShowsScreen(LIST_HABITS);
@ -174,4 +194,12 @@ public class HabitsTest extends BaseUserInterfaceTest
verifyDisplaysText("Track time"); verifyDisplaysText("Track time");
verifyDisplaysText("Wake up early"); verifyDisplaysText("Wake up early");
} }
@Test
public void shouldHideNotesCard() throws Exception
{
launchApp();
clickText(EMPTY_DESCRIPTION_HABIT_NAME);
verifyShowsScreen(SHOW_HABIT, false);
}
} }

@ -19,14 +19,16 @@
package org.isoron.uhabits.acceptance.steps; package org.isoron.uhabits.acceptance.steps;
import android.view.View;
import androidx.annotation.StringRes; import androidx.annotation.StringRes;
import androidx.test.espresso.*; import androidx.test.espresso.*;
import androidx.test.espresso.contrib.*; import androidx.test.espresso.contrib.*;
import androidx.test.uiautomator.*; import androidx.test.uiautomator.*;
import androidx.appcompat.widget.*;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import org.hamcrest.Matcher;
import org.isoron.uhabits.*; import org.isoron.uhabits.*;
import org.isoron.uhabits.R; import org.isoron.uhabits.R;
import org.isoron.uhabits.activities.habits.list.*; import org.isoron.uhabits.activities.habits.list.*;
@ -153,7 +155,11 @@ public class CommonSteps extends BaseUserInterfaceTest
LIST_HABITS, SHOW_HABIT, EDIT_HABIT LIST_HABITS, SHOW_HABIT, EDIT_HABIT
} }
public static void verifyShowsScreen(Screen screen) public static void verifyShowsScreen(Screen screen) {
verifyShowsScreen(screen, true);
}
public static void verifyShowsScreen(Screen screen, boolean notesCardVisibleExpected)
{ {
switch(screen) switch(screen)
{ {
@ -163,10 +169,14 @@ public class CommonSteps extends BaseUserInterfaceTest
break; break;
case SHOW_HABIT: case SHOW_HABIT:
Matcher<View> noteCardViewMatcher = notesCardVisibleExpected ? isDisplayed() :
withEffectiveVisibility(Visibility.GONE);
onView(withId(R.id.subtitleCard)).check(matches(isDisplayed())); onView(withId(R.id.subtitleCard)).check(matches(isDisplayed()));
onView(withId(R.id.notesCard)).check(matches(noteCardViewMatcher));
break; break;
case EDIT_HABIT: case EDIT_HABIT:
onView(withId(R.id.tvQuestion)).check(matches(isDisplayed()));
onView(withId(R.id.tvDescription)).check(matches(isDisplayed())); onView(withId(R.id.tvDescription)).check(matches(isDisplayed()));
break; break;
} }

@ -55,7 +55,12 @@ public class EditHabitSteps
public static void typeQuestion(String name) public static void typeQuestion(String name)
{ {
typeTextWithId(R.id.tvDescription, name); typeTextWithId(R.id.tvQuestion, name);
}
public static void typeDescription(String description)
{
typeTextWithId(R.id.tvDescription, description);
} }
public static void setReminder() public static void setReminder()

@ -0,0 +1,79 @@
/*
* Copyright (C) 2016 Álinson Santos Xavier <isoron@gmail.com>
*
* This file is part of Loop Habit Tracker.
*
* Loop Habit Tracker is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* Loop Habit Tracker is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.isoron.uhabits.activities.habits.show.views;
import android.view.LayoutInflater;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.MediumTest;
import org.isoron.uhabits.BaseViewTest;
import org.isoron.uhabits.R;
import org.isoron.uhabits.core.models.Habit;
import org.isoron.uhabits.core.models.Reminder;
import org.isoron.uhabits.core.models.WeekdayList;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(AndroidJUnit4.class)
@MediumTest
public class NotesCardTest extends BaseViewTest
{
public static final String PATH = "habits/show/NotesCard/";
private NotesCard view;
private Habit habit;
@Before
@Override
public void setUp()
{
super.setUp();
habit = fixtures.createLongHabit();
habit.setReminder(new Reminder(8, 30, WeekdayList.EVERY_DAY));
view = LayoutInflater
.from(targetContext)
.inflate(R.layout.show_habit, null)
.findViewById(R.id.notesCard);
view.setHabit(habit);
view.refreshData();
measureView(view, 800, 200);
}
@Test
public void testRender() throws Exception
{
assertRenders(view, PATH + "render.png");
}
@Test
public void testRenderEmptyDescription() throws Exception
{
habit.setDescription("");
view.refreshData();
assertRenders(view, PATH + "render-empty-description.png");
}
}

@ -49,7 +49,7 @@ public class SubtitleCardTest extends BaseViewTest
habit = fixtures.createLongHabit(); habit = fixtures.createLongHabit();
habit.setReminder(new Reminder(8, 30, WeekdayList.EVERY_DAY)); habit.setReminder(new Reminder(8, 30, WeekdayList.EVERY_DAY));
view = (SubtitleCard) LayoutInflater view = LayoutInflater
.from(targetContext) .from(targetContext)
.inflate(R.layout.show_habit, null) .inflate(R.layout.show_habit, null)
.findViewById(R.id.subtitleCard); .findViewById(R.id.subtitleCard);

@ -1,61 +0,0 @@
/*
* Copyright (C) 2016 Álinson Santos Xavier <isoron@gmail.com>
*
* This file is part of Loop Habit Tracker.
*
* Loop Habit Tracker is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* Loop Habit Tracker is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.isoron.uhabits.tasks;
import androidx.test.filters.*;
import androidx.test.runner.*;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.isoron.uhabits.*;
import org.junit.*;
import org.junit.runner.*;
@RunWith(AndroidJUnit4.class)
@MediumTest
public class ExportCSVTaskTest extends BaseAndroidTest
{
@Before
@Override
public void setUp()
{
super.setUp();
}
// @Test
// public void testExportCSV() throws Throwable
// {
// fixtures.purgeHabits(habitList);
// fixtures.createShortHabit();
//
// List<Habit> selected = new LinkedList<>();
// for (Habit h : habitList) selected.add(h);
// File outputDir = new AndroidDirFinder(targetContext).getFilesDir("CSV");
// assertNotNull(outputDir);
//
// taskRunner.execute(
// new ExportCSVTask(habitList, selected, outputDir, archiveFilename -> {
// assertThat(archiveFilename, is(not(nullValue())));
// File f = new File(archiveFilename);
// assertTrue(f.exists());
// assertTrue(f.canRead());
// }));
// }
}

@ -1,57 +0,0 @@
/*
* Copyright (C) 2016 Álinson Santos Xavier <isoron@gmail.com>
*
* This file is part of Loop Habit Tracker.
*
* Loop Habit Tracker is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* Loop Habit Tracker is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.isoron.uhabits.tasks;
import androidx.test.filters.*;
import androidx.test.runner.*;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.isoron.uhabits.*;
import org.junit.*;
import org.junit.runner.*;
@RunWith(AndroidJUnit4.class)
@MediumTest
public class ExportDBTaskTest extends BaseAndroidTest
{
@Override
@Before
public void setUp()
{
super.setUp();
}
// @Test
// public void testExportCSV() throws Throwable
// {
// ExportDBTask task =
// new ExportDBTask(targetContext, new AndroidDirFinder(targetContext),
// filename ->
// {
// assertNotNull(filename);
// File f = new File(filename);
// assertTrue(f.exists());
// assertTrue(f.canRead());
// });
//
// taskRunner.execute(task);
// }
}

@ -34,15 +34,12 @@ import org.isoron.uhabits.core.ui.screens.habits.list.*
@Component(modules = arrayOf( @Component(modules = arrayOf(
ActivityContextModule::class, ActivityContextModule::class,
BaseActivityModule::class, BaseActivityModule::class,
AboutModule::class,
HabitsActivityModule::class, HabitsActivityModule::class,
ListHabitsModule::class, ListHabitsModule::class,
ShowHabitModule::class, ShowHabitModule::class,
HabitModule::class HabitModule::class
), dependencies = arrayOf(HabitsApplicationComponent::class)) ), dependencies = arrayOf(HabitsApplicationComponent::class))
interface HabitsActivityComponent { interface HabitsActivityComponent {
val aboutRootView: AboutRootView
val aboutScreen: AboutScreen
val colorPickerDialogFactory: ColorPickerDialogFactory val colorPickerDialogFactory: ColorPickerDialogFactory
val habitCardListAdapter: HabitCardListAdapter val habitCardListAdapter: HabitCardListAdapter
val listHabitsBehavior: ListHabitsBehavior val listHabitsBehavior: ListHabitsBehavior

@ -21,6 +21,7 @@ package org.isoron.uhabits.activities.about;
import android.os.*; import android.os.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.activities.*; import org.isoron.uhabits.activities.*;
/** /**
@ -33,8 +34,12 @@ public class AboutActivity extends HabitsActivity
protected void onCreate(Bundle savedInstanceState) protected void onCreate(Bundle savedInstanceState)
{ {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
AboutScreen screen = getComponent().getAboutScreen(); HabitsApplication app = (HabitsApplication) getApplication();
screen.setRootView(getComponent().getAboutRootView()); AboutScreen screen = new AboutScreen(this,
app.getComponent().getIntentFactory(),
app.getComponent().getPreferences());
AboutRootView rootView = new AboutRootView(this, screen);
screen.setRootView(rootView);
setScreen(screen); setScreen(screen);
} }
} }

@ -22,13 +22,12 @@ package org.isoron.uhabits.activities.about;
import android.content.*; import android.content.*;
import android.widget.*; import android.widget.*;
import androidx.annotation.NonNull; import androidx.annotation.*;
import org.isoron.androidbase.activities.*; import org.isoron.androidbase.activities.*;
import org.isoron.androidbase.utils.*; import org.isoron.androidbase.utils.*;
import org.isoron.uhabits.BuildConfig; import org.isoron.uhabits.BuildConfig;
import org.isoron.uhabits.R; import org.isoron.uhabits.R;
import org.isoron.uhabits.core.ui.screens.about.*;
import javax.inject.*; import javax.inject.*;
@ -40,14 +39,14 @@ public class AboutRootView extends BaseRootView
TextView tvVersion; TextView tvVersion;
@NonNull @NonNull
private final AboutBehavior behavior; private final AboutScreen screen;
@Inject @Inject
public AboutRootView(@NonNull @ActivityContext Context context, public AboutRootView(@NonNull @ActivityContext Context context,
@NonNull AboutBehavior behavior) @NonNull AboutScreen screen)
{ {
super(context); super(context);
this.behavior = behavior; this.screen = screen;
addView(inflate(getContext(), R.layout.about, null)); addView(inflate(getContext(), R.layout.about, null));
ButterKnife.bind(this); ButterKnife.bind(this);
@ -71,46 +70,45 @@ public class AboutRootView extends BaseRootView
@OnClick(R.id.tvFeedback) @OnClick(R.id.tvFeedback)
public void onClickFeedback() public void onClickFeedback()
{ {
behavior.onSendFeedback(); screen.showSendFeedbackScreen();
} }
@OnClick(R.id.tvVersion) @OnClick(R.id.tvVersion)
public void onClickIcon() public void onClickIcon()
{ {
behavior.onPressDeveloperCountdown(); screen.onPressDeveloperCountdown();
} }
@OnClick(R.id.tvRate) @OnClick(R.id.tvRate)
public void onClickRate() public void onClickRate()
{ {
behavior.onRateApp(); screen.showRateAppWebsite();
} }
@OnClick(R.id.tvSource) @OnClick(R.id.tvSource)
public void onClickSource() public void onClickSource()
{ {
behavior.onViewSourceCode(); screen.showSourceCodeWebsite();
} }
@OnClick(R.id.tvTranslate) @OnClick(R.id.tvTranslate)
public void onClickTranslate() public void onClickTranslate()
{ {
behavior.onTranslateApp(); screen.showTranslationWebsite();
} }
@OnClick(R.id.tvPrivacy) @OnClick(R.id.tvPrivacy)
public void onClickPrivacy() public void onClickPrivacy()
{ {
behavior.onClickPrivacy(); screen.showPrivacyPolicyWebsite();
} }
@OnClick(R.id.tvContributors) @OnClick(R.id.tvContributors)
public void onClickContributors() public void onClickContributors()
{ {
behavior.onClickCodeContributors(); screen.showCodeContributorsWebsite();
} }
@Override @Override
protected void initToolbar() protected void initToolbar()
{ {

@ -21,69 +21,67 @@ package org.isoron.uhabits.activities.about;
import android.widget.*; import android.widget.*;
import androidx.annotation.NonNull; import androidx.annotation.*;
import org.isoron.androidbase.activities.*; import org.isoron.androidbase.activities.*;
import org.isoron.uhabits.core.ui.screens.about.*; import org.isoron.uhabits.core.preferences.*;
import org.isoron.uhabits.intents.*; import org.isoron.uhabits.intents.*;
import javax.inject.*; public class AboutScreen extends BaseScreen
{
@NonNull
private final Preferences prefs;
import static org.isoron.uhabits.core.ui.screens.about.AboutBehavior.Message.*; private int developerCountdown = 5;
public class AboutScreen extends BaseScreen implements AboutBehavior.Screen
{
@NonNull @NonNull
private final IntentFactory intents; private final IntentFactory intents;
@Inject
public AboutScreen(@NonNull BaseActivity activity, public AboutScreen(@NonNull BaseActivity activity,
@NonNull IntentFactory intents) @NonNull IntentFactory intents,
@NonNull Preferences prefs)
{ {
super(activity); super(activity);
this.intents = intents; this.intents = intents;
this.prefs = prefs;
} }
@Override
public void showMessage(AboutBehavior.Message message)
{
if (message == YOU_ARE_NOW_A_DEVELOPER) Toast
.makeText(activity, "You are now a developer", Toast.LENGTH_LONG)
.show();
}
@Override
public void showRateAppWebsite() public void showRateAppWebsite()
{ {
activity.startActivity(intents.rateApp(activity)); activity.startActivity(intents.rateApp(activity));
} }
@Override
public void showSendFeedbackScreen() public void showSendFeedbackScreen()
{ {
activity.startActivity(intents.sendFeedback(activity)); activity.startActivity(intents.sendFeedback(activity));
} }
@Override
public void showSourceCodeWebsite() public void showSourceCodeWebsite()
{ {
activity.startActivity(intents.viewSourceCode(activity)); activity.startActivity(intents.viewSourceCode(activity));
} }
@Override
public void showTranslationWebsite() public void showTranslationWebsite()
{ {
activity.startActivity(intents.helpTranslate(activity)); activity.startActivity(intents.helpTranslate(activity));
} }
@Override
public void showPrivacyPolicyWebsite() public void showPrivacyPolicyWebsite()
{ {
activity.startActivity(intents.privacyPolicy(activity)); activity.startActivity(intents.privacyPolicy(activity));
} }
@Override public void showCodeContributorsWebsite()
public void showCodeContributorsWebsite() { {
activity.startActivity(intents.codeContributors(activity)); activity.startActivity(intents.codeContributors(activity));
} }
public void onPressDeveloperCountdown()
{
developerCountdown--;
if (developerCountdown == 0) {
prefs.setDeveloper(true);
Toast.makeText(activity, "You are now a developer", Toast.LENGTH_LONG).show();
}
}
} }

@ -187,6 +187,7 @@ public class EditHabitDialog extends AppCompatDialogFragment
habit.copyFrom(originalHabit); habit.copyFrom(originalHabit);
habit.setName(namePanel.getName()); habit.setName(namePanel.getName());
habit.setDescription(namePanel.getDescription()); habit.setDescription(namePanel.getDescription());
habit.setQuestion(namePanel.getQuestion());
habit.setColor(namePanel.getColor()); habit.setColor(namePanel.getColor());
habit.setReminder(reminderPanel.getReminder()); habit.setReminder(reminderPanel.getReminder());
habit.setFrequency(frequencyPanel.getFrequency()); habit.setFrequency(frequencyPanel.getFrequency());

@ -24,6 +24,7 @@ import android.text.*;
import android.util.*; import android.util.*;
import android.view.*; import android.view.*;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatEditText; import androidx.appcompat.widget.AppCompatEditText;
@ -82,7 +83,7 @@ public class ExampleEditText extends AppCompatEditText
updateText(); updateText();
} }
public void setRealText(String realText) public void setRealText(@NonNull String realText)
{ {
this.realText = realText; this.realText = realText;
updateText(); updateText();

@ -42,6 +42,9 @@ public class NameDescriptionPanel extends FrameLayout
@BindView(R.id.tvName) @BindView(R.id.tvName)
EditText tvName; EditText tvName;
@BindView(R.id.tvQuestion)
ExampleEditText tvQuestion;
@BindView(R.id.tvDescription) @BindView(R.id.tvDescription)
ExampleEditText tvDescription; ExampleEditText tvDescription;
@ -79,6 +82,12 @@ public class NameDescriptionPanel extends FrameLayout
return tvDescription.getRealText().trim(); return tvDescription.getRealText().trim();
} }
@NonNull
public String getQuestion()
{
return tvQuestion.getRealText().trim();
}
@NonNull @NonNull
public String getName() public String getName()
{ {
@ -90,12 +99,13 @@ public class NameDescriptionPanel extends FrameLayout
Resources res = getResources(); Resources res = getResources();
if(habit.isNumerical()) if(habit.isNumerical())
tvDescription.setExample(res.getString(R.string.example_question_numerical)); tvQuestion.setExample(res.getString(R.string.example_question_numerical));
else else
tvDescription.setExample(res.getString(R.string.example_question_boolean)); tvQuestion.setExample(res.getString(R.string.example_question_boolean));
setColor(habit.getColor()); setColor(habit.getColor());
tvName.setText(habit.getName()); tvName.setText(habit.getName());
tvQuestion.setRealText(habit.getQuestion());
tvDescription.setRealText(habit.getDescription()); tvDescription.setRealText(habit.getDescription());
} }

@ -21,6 +21,7 @@ package org.isoron.uhabits.activities.habits.show;
import android.content.*; import android.content.*;
import android.os.*; import android.os.*;
import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.appcompat.widget.*; import androidx.appcompat.widget.*;
@ -52,6 +53,12 @@ public class ShowHabitRootView extends BaseRootView
@BindView(R.id.subtitleCard) @BindView(R.id.subtitleCard)
SubtitleCard subtitleCard; SubtitleCard subtitleCard;
@BindView(R.id.notesCard)
NotesCard notesCard;
@BindView(R.id.habitNotes)
TextView habitNotes;
@BindView(R.id.overviewCard) @BindView(R.id.overviewCard)
OverviewCard overviewCard; OverviewCard overviewCard;
@ -136,6 +143,7 @@ public class ShowHabitRootView extends BaseRootView
private void initCards() private void initCards()
{ {
subtitleCard.setHabit(habit); subtitleCard.setHabit(habit);
notesCard.setHabit(habit);
overviewCard.setHabit(habit); overviewCard.setHabit(habit);
scoreCard.setHabit(habit); scoreCard.setHabit(habit);
historyCard.setHabit(habit); historyCard.setHabit(habit);

@ -0,0 +1,26 @@
package org.isoron.uhabits.activities.habits.show.views
import android.content.Context
import android.util.AttributeSet
import android.view.View
import android.widget.TextView
import org.isoron.uhabits.R
import org.isoron.uhabits.core.tasks.Task
class NotesCard(context: Context?, attrs: AttributeSet?) : HabitCard(context, attrs) {
private val notesTextView: TextView
init {
View.inflate(getContext(), R.layout.show_habit_notes, this)
notesTextView = findViewById(R.id.habitNotes)
}
override fun refreshData() {
notesTextView.text = habit.description
visibility = if(habit.description.isEmpty()) View.GONE else View.VISIBLE
notesTextView.visibility = visibility
}
override fun createRefreshTask(): Task = error("refresh task should never be called.")
}

@ -59,12 +59,12 @@ public class SubtitleCard extends HabitCard
questionLabel.setVisibility(VISIBLE); questionLabel.setVisibility(VISIBLE);
questionLabel.setTextColor(color); questionLabel.setTextColor(color);
questionLabel.setText(habit.getDescription()); questionLabel.setText(habit.getQuestion());
frequencyLabel.setText(toText(habit.getFrequency())); frequencyLabel.setText(toText(habit.getFrequency()));
if (habit.hasReminder()) updateReminderText(habit.getReminder()); if (habit.hasReminder()) updateReminderText(habit.getReminder());
if (habit.getDescription().isEmpty()) questionLabel.setVisibility(GONE); if (habit.getQuestion().isEmpty()) questionLabel.setVisibility(GONE);
invalidate(); invalidate();
} }

@ -112,7 +112,7 @@ class AndroidNotificationTray
val builder = NotificationCompat.Builder(context, REMINDERS_CHANNEL_ID) val builder = NotificationCompat.Builder(context, REMINDERS_CHANNEL_ID)
.setSmallIcon(R.drawable.ic_notification) .setSmallIcon(R.drawable.ic_notification)
.setContentTitle(habit.name) .setContentTitle(habit.name)
.setContentText(if(habit.description.isBlank()) defaultText else habit.description) .setContentText(if(habit.question.isBlank()) defaultText else habit.question)
.setContentIntent(pendingIntents.showHabit(habit)) .setContentIntent(pendingIntents.showHabit(habit))
.setDeleteIntent(pendingIntents.dismissNotification(habit)) .setDeleteIntent(pendingIntents.dismissNotification(habit))
.addAction(addRepetitionAction) .addAction(addRepetitionAction)

@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?><!--
<!--
~ Copyright (C) 2016 Álinson Santos Xavier <isoron@gmail.com> ~ Copyright (C) 2016 Álinson Santos Xavier <isoron@gmail.com>
~ ~
~ This file is part of Loop Habit Tracker. ~ This file is part of Loop Habit Tracker.
@ -18,53 +17,82 @@
~ with this program. If not, see <http://www.gnu.org/licenses/>. ~ with this program. If not, see <http://www.gnu.org/licenses/>.
--> -->
<LinearLayout <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://isoron.org/android" xmlns:app="http://isoron.org/android"
xmlns:app1="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="wrap_content"
android:orientation="vertical"> android:minWidth="300dp">
<LinearLayout <com.google.android.material.textfield.TextInputLayout
style="@style/dialogFormRow"> android:id="@+id/tilName"
android:layout_width="0dp"
android:layout_height="wrap_content"
app1:layout_constraintEnd_toStartOf="@+id/buttonPickColor"
app1:layout_constraintHorizontal_weight="6"
app1:layout_constraintStart_toStartOf="parent"
app1:layout_constraintTop_toTopOf="parent">
<com.google.android.material.textfield.TextInputLayout <EditText
android:id="@+id/tilName" android:id="@+id/tvName"
android:layout_width="0dp" style="@style/dialogFormInput"
android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="6"> android:ellipsize="start"
android:gravity="center_vertical"
android:hint="@string/name">
<EditText <requestFocus />
android:id="@+id/tvName" </EditText>
style="@style/dialogFormInput" </com.google.android.material.textfield.TextInputLayout>
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/name">
<requestFocus/> <ImageButton
</EditText> android:id="@+id/buttonPickColor"
</com.google.android.material.textfield.TextInputLayout> style="@style/dialogFormInputColor"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:contentDescription="@string/color_picker_default_title"
android:src="?dialogIconChangeColor"
app1:layout_constraintBottom_toBottomOf="@id/tilName"
app1:layout_constraintEnd_toEndOf="parent"
app1:layout_constraintHorizontal_weight="1"
app1:layout_constraintStart_toEndOf="@+id/tilName"
app1:layout_constraintTop_toTopOf="@id/tilName" />
<ImageButton <com.google.android.material.textfield.TextInputLayout
android:id="@+id/buttonPickColor" android:id="@+id/tilQuestion"
style="@style/dialogFormInputColor" android:layout_width="0dp"
android:layout_weight="1" android:layout_height="wrap_content"
android:contentDescription="@string/color_picker_default_title" android:hint="@string/question"
android:src="?dialogIconChangeColor"/> app1:layout_constraintEnd_toEndOf="parent"
app1:layout_constraintStart_toStartOf="parent"
app1:layout_constraintTop_toBottomOf="@id/tilName">
</LinearLayout> <org.isoron.uhabits.activities.habits.edit.views.ExampleEditText
android:id="@+id/tvQuestion"
style="@style/dialogFormInput"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:example="@string/example_question_numerical" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout <com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent" android:layout_width="0dp"
android:layout_height="wrap_content"> android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:hint="@string/notes"
app1:layout_constraintBottom_toBottomOf="parent"
app1:layout_constraintEnd_toEndOf="parent"
app1:layout_constraintStart_toStartOf="parent"
app1:layout_constraintTop_toBottomOf="@id/tilQuestion">
<org.isoron.uhabits.activities.habits.edit.views.ExampleEditText <org.isoron.uhabits.activities.habits.edit.views.ExampleEditText
android:id="@+id/tvDescription" android:id="@+id/tvDescription"
style="@style/dialogFormInputMultiline" style="@style/dialogFormInputMultiline"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:hint="@string/question" android:gravity="top"
app:example="@string/example_question_numerical"/> app:example="@string/example_notes" />
</com.google.android.material.textfield.TextInputLayout> </com.google.android.material.textfield.TextInputLayout>
</LinearLayout> </androidx.constraintlayout.widget.ConstraintLayout>

@ -38,6 +38,11 @@
android:id="@+id/subtitleCard" android:id="@+id/subtitleCard"
style="@style/ShowHabit.Subtitle"/> style="@style/ShowHabit.Subtitle"/>
<org.isoron.uhabits.activities.habits.show.views.NotesCard
android:id="@+id/notesCard"
style="@style/Card"
android:gravity="center" />
<View <View
android:id="@+id/headerShadow" android:id="@+id/headerShadow"
style="@style/ToolbarShadow"/> style="@style/ToolbarShadow"/>

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?><!--
~ Copyright (C) 2016 Álinson Santos Xavier <isoron@gmail.com>
~
~ This file is part of Loop Habit Tracker.
~
~ Loop Habit Tracker is free software: you can redistribute it and/or modify
~ it under the terms of the GNU General Public License as published by the
~ Free Software Foundation, either version 3 of the License, or (at your
~ option) any later version.
~
~ Loop Habit Tracker is distributed in the hope that it will be useful, but
~ WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
~ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
~ more details.
~
~ You should have received a copy of the GNU General Public License along
~ with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:layout_height="wrap_content"
tools:layout_width="match_parent"
tools:orientation="vertical"
tools:parentTag="android.widget.LinearLayout">
<TextView
android:id="@+id/habitNotes"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textColor="?highContrastTextColor"
android:visibility="gone"
tools:text="This is some example text for the notes" />
</merge>

@ -18,7 +18,12 @@
~ with this program. If not, see <http://www.gnu.org/licenses/>. ~ with this program. If not, see <http://www.gnu.org/licenses/>.
--> -->
<merge xmlns:android="http://schemas.android.com/apk/res/android"> <merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:parentTag="android.widget.LinearLayout"
tools:orientation="vertical"
tools:layout_width="match_parent"
tools:layout_height="wrap_content">
<TextView <TextView
android:id="@+id/questionLabel" android:id="@+id/questionLabel"
android:layout_width="match_parent" android:layout_width="match_parent"
@ -26,6 +31,7 @@
android:layout_marginBottom="8dp" android:layout_marginBottom="8dp"
android:textColor="?mediumContrastTextColor" android:textColor="?mediumContrastTextColor"
android:textSize="@dimen/regularTextSize" android:textSize="@dimen/regularTextSize"
tools:text="Have you worked out today?"
/> />
<LinearLayout <LinearLayout
@ -33,7 +39,8 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="5dp" android:layout_marginBottom="5dp"
android:gravity="center_vertical" android:gravity="center_vertical"
android:orientation="horizontal"> android:orientation="horizontal"
tools:visibility="visible">
<ImageView <ImageView
android:id="@+id/frequencyIcon" android:id="@+id/frequencyIcon"
@ -42,8 +49,7 @@
android:layout_marginEnd="5dp" android:layout_marginEnd="5dp"
android:layout_marginRight="5dp" android:layout_marginRight="5dp"
android:alpha="0.3" android:alpha="0.3"
android:src="?iconFrequency" android:src="?iconFrequency" />
/>
<TextView <TextView
android:id="@+id/frequencyLabel" android:id="@+id/frequencyLabel"
@ -51,20 +57,18 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/every_day" android:text="@string/every_day"
android:textColor="?mediumContrastTextColor" android:textColor="?mediumContrastTextColor"
android:textSize="@dimen/smallTextSize" android:textSize="@dimen/smallTextSize" />
/>
<ImageView <ImageView
android:id="@+id/reminderIcon" android:id="@+id/reminderIcon"
android:layout_width="18dp" android:layout_width="18dp"
android:layout_height="18dp" android:layout_height="18dp"
android:layout_marginEnd="5dp" android:layout_marginStart="10dp"
android:layout_marginLeft="10dp" android:layout_marginLeft="10dp"
android:layout_marginEnd="5dp"
android:layout_marginRight="5dp" android:layout_marginRight="5dp"
android:layout_marginStart="10dp"
android:alpha="0.3" android:alpha="0.3"
android:src="?iconReminder" android:src="?iconReminder" />
/>
<TextView <TextView
android:id="@+id/reminderLabel" android:id="@+id/reminderLabel"
@ -72,8 +76,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingTop="1dp" android:paddingTop="1dp"
android:textColor="?mediumContrastTextColor" android:textColor="?mediumContrastTextColor"
android:textSize="@dimen/smallTextSize" android:textSize="@dimen/smallTextSize" />
/>
</LinearLayout> </LinearLayout>
</merge> </merge>

@ -123,7 +123,7 @@
<string-array name="targetIntervals" translatable="false"> <string-array name="targetIntervals" translatable="false">
<item>daily</item> <item>daily</item>
<item>weekly</item> <item>weekly</item>
<item>montly</item> <item>monthly</item>
</string-array> </string-array>
<string name="snooze_interval_default" translatable="false">15</string> <string name="snooze_interval_default" translatable="false">15</string>

@ -244,5 +244,7 @@
<string name="widget_opacity_description">Makes widgets more transparent or more opaque in your home screen.</string> <string name="widget_opacity_description">Makes widgets more transparent or more opaque in your home screen.</string>
<string name="first_day_of_the_week">First day of the week</string> <string name="first_day_of_the_week">First day of the week</string>
<string name="default_reminder_question">Have you completed this habit today?</string> <string name="default_reminder_question">Have you completed this habit today?</string>
<string name="notes">Notes</string>
<string name="example_notes">You can put whatever you want here!</string>
</resources> </resources>

@ -1,5 +1,6 @@
apply plugin: 'idea' apply plugin: 'idea'
apply plugin: 'java' apply plugin: 'java'
apply plugin: 'kotlin'
dependencies { dependencies {
annotationProcessor "com.google.auto.factory:auto-factory:$AUTO_FACTORY_VERSION" annotationProcessor "com.google.auto.factory:auto-factory:$AUTO_FACTORY_VERSION"
@ -26,6 +27,7 @@ dependencies {
implementation('com.opencsv:opencsv:3.10') { implementation('com.opencsv:opencsv:3.10') {
exclude group: 'commons-logging', module: 'commons-logging' exclude group: 'commons-logging', module: 'commons-logging'
} }
implementation "org.jetbrains.kotlin:kotlin-stdlib:$KOTLIN_VERSION"
} }
sourceCompatibility = "1.8" sourceCompatibility = "1.8"

@ -22,5 +22,5 @@ package org.isoron.uhabits.core;
public class Config public class Config
{ {
public static final String DATABASE_FILENAME = "uhabits.db"; public static final String DATABASE_FILENAME = "uhabits.db";
public static int DATABASE_VERSION = 22; public static int DATABASE_VERSION = 23;
} }

@ -57,7 +57,7 @@ public class Repository<T>
* Returns all records matching the given SQL query. * Returns all records matching the given SQL query.
* <p> * <p>
* The query should only contain the "where" part of the SQL query, and * The query should only contain the "where" part of the SQL query, and
* optinally the "order by" part. "Group by" is not allowed. If no matching * optionally the "order by" part. "Group by" is not allowed. If no matching
* records are found, returns an empty list. * records are found, returns an empty list.
*/ */
@NonNull @NonNull

@ -87,7 +87,7 @@ public class HabitBullCSVImporter extends AbstractImporter
{ {
h = modelFactory.buildHabit(); h = modelFactory.buildHabit();
h.setName(name); h.setName(name);
h.setDescription(description); h.setDescription(description == null ? "" : description);
h.setFrequency(Frequency.DAILY); h.setFrequency(Frequency.DAILY);
habitList.add(h); habitList.add(h);
map.put(name, h); map.put(name, h);

@ -101,7 +101,7 @@ public class RewireDBImporter extends AbstractImporter
Habit habit = modelFactory.buildHabit(); Habit habit = modelFactory.buildHabit();
habit.setName(name); habit.setName(name);
habit.setDescription(description); habit.setDescription(description == null ? "" : description);
int periods[] = { 7, 31, 365 }; int periods[] = { 7, 31, 365 };
int numerator, denominator; int numerator, denominator;

@ -127,7 +127,7 @@ public class TickmateDBImporter extends AbstractImporter
Habit habit = modelFactory.buildHabit(); Habit habit = modelFactory.buildHabit();
habit.setName(name); habit.setName(name);
habit.setDescription(description); habit.setDescription(description == null ? "" : description);
habit.setFrequency(Frequency.DAILY); habit.setFrequency(Frequency.DAILY);
habitList.add(habit); habitList.add(habit);

@ -354,6 +354,15 @@ public class Habit
data.position = newPosition; data.position = newPosition;
} }
@NonNull
public String getQuestion() {
return data.question;
}
public void setQuestion(@NonNull String question) {
data.question = question;
}
public static final class HabitData public static final class HabitData
{ {
@NonNull @NonNull
@ -362,6 +371,9 @@ public class Habit
@NonNull @NonNull
public String description; public String description;
@NonNull
public String question;
@NonNull @NonNull
public Frequency frequency; public Frequency frequency;
@ -391,6 +403,7 @@ public class Habit
this.type = YES_NO_HABIT; this.type = YES_NO_HABIT;
this.name = ""; this.name = "";
this.description = ""; this.description = "";
this.question = "";
this.targetType = AT_LEAST; this.targetType = AT_LEAST;
this.targetValue = 100; this.targetValue = 100;
this.unit = ""; this.unit = "";
@ -401,6 +414,7 @@ public class Habit
{ {
this.name = model.name; this.name = model.name;
this.description = model.description; this.description = model.description;
this.question = model.question;
this.frequency = model.frequency; this.frequency = model.frequency;
this.color = model.color; this.color = model.color;
this.archived = model.archived; this.archived = model.archived;
@ -427,6 +441,7 @@ public class Habit
.append("unit", unit) .append("unit", unit)
.append("reminder", reminder) .append("reminder", reminder)
.append("position", position) .append("position", position)
.append("question", question)
.toString(); .toString();
} }
@ -451,6 +466,7 @@ public class Habit
.append(unit, habitData.unit) .append(unit, habitData.unit)
.append(reminder, habitData.reminder) .append(reminder, habitData.reminder)
.append(position, habitData.position) .append(position, habitData.position)
.append(question, habitData.question)
.isEquals(); .isEquals();
} }
@ -469,6 +485,7 @@ public class Habit
.append(unit) .append(unit)
.append(reminder) .append(reminder)
.append(position) .append(position)
.append(question)
.toHashCode(); .toHashCode();
} }
} }

@ -212,6 +212,7 @@ public abstract class HabitList implements Iterable<Habit>
String header[] = { String header[] = {
"Position", "Position",
"Name", "Name",
"Question",
"Description", "Description",
"NumRepetitions", "NumRepetitions",
"Interval", "Interval",
@ -228,6 +229,7 @@ public abstract class HabitList implements Iterable<Habit>
String[] cols = { String[] cols = {
String.format("%03d", indexOf(habit) + 1), String.format("%03d", indexOf(habit) + 1),
habit.getName(), habit.getName(),
habit.getQuestion(),
habit.getDescription(), habit.getDescription(),
Integer.toString(freq.getNumerator()), Integer.toString(freq.getNumerator()),
Integer.toString(freq.getDenominator()), Integer.toString(freq.getDenominator()),

@ -123,7 +123,7 @@ public abstract class StreakList
* habit to not performing a habit, and vice-versa. * habit to not performing a habit, and vice-versa.
* *
* @param beginning the timestamp for the first checkmark * @param beginning the timestamp for the first checkmark
* @param checks the checkmarks, ordered by decresing timestamp * @param checks the checkmarks, ordered by decreasing timestamp
* @return the list of transitions * @return the list of transitions
*/ */
@NonNull @NonNull

@ -33,6 +33,9 @@ public class HabitRecord
@Column @Column
public String description; public String description;
@Column
public String question;
@Column @Column
public String name; public String name;
@ -91,6 +94,7 @@ public class HabitRecord
this.targetValue = model.getTargetValue(); this.targetValue = model.getTargetValue();
this.unit = model.getUnit(); this.unit = model.getUnit();
this.position = model.getPosition(); this.position = model.getPosition();
this.question = model.getQuestion();
Frequency freq = model.getFrequency(); Frequency freq = model.getFrequency();
this.freqNum = freq.getNumerator(); this.freqNum = freq.getNumerator();
@ -113,6 +117,7 @@ public class HabitRecord
habit.setId(this.id); habit.setId(this.id);
habit.setName(this.name); habit.setName(this.name);
habit.setDescription(this.description); habit.setDescription(this.description);
habit.setQuestion(this.question);
habit.setFrequency(new Frequency(this.freqNum, this.freqDen)); habit.setFrequency(new Frequency(this.freqNum, this.freqDen));
habit.setColor(this.color); habit.setColor(this.color);
habit.setArchived(this.archived != 0); habit.setArchived(this.archived != 0);

@ -43,7 +43,7 @@ public class HabitFixtures
{ {
Habit habit = modelFactory.buildHabit(); Habit habit = modelFactory.buildHabit();
habit.setName("Meditate"); habit.setName("Meditate");
habit.setDescription("Did you meditate this morning?"); habit.setQuestion("Did you meditate this morning?");
habit.setColor(3); habit.setColor(3);
habit.setFrequency(Frequency.DAILY); habit.setFrequency(Frequency.DAILY);
saveIfSQLite(habit); saveIfSQLite(habit);
@ -73,7 +73,7 @@ public class HabitFixtures
Habit habit = modelFactory.buildHabit(); Habit habit = modelFactory.buildHabit();
habit.setType(Habit.NUMBER_HABIT); habit.setType(Habit.NUMBER_HABIT);
habit.setName("Run"); habit.setName("Run");
habit.setDescription("How many miles did you run today?"); habit.setQuestion("How many miles did you run today?");
habit.setUnit("miles"); habit.setUnit("miles");
habit.setTargetType(Habit.AT_LEAST); habit.setTargetType(Habit.AT_LEAST);
habit.setTargetValue(2.0); habit.setTargetValue(2.0);
@ -98,7 +98,7 @@ public class HabitFixtures
Habit habit = modelFactory.buildHabit(); Habit habit = modelFactory.buildHabit();
habit.setType(Habit.NUMBER_HABIT); habit.setType(Habit.NUMBER_HABIT);
habit.setName("Walk"); habit.setName("Walk");
habit.setDescription("How many steps did you walk today?"); habit.setQuestion("How many steps did you walk today?");
habit.setUnit("steps"); habit.setUnit("steps");
habit.setTargetType(Habit.AT_LEAST); habit.setTargetType(Habit.AT_LEAST);
habit.setTargetValue(100); habit.setTargetValue(100);
@ -133,7 +133,7 @@ public class HabitFixtures
{ {
Habit habit = modelFactory.buildHabit(); Habit habit = modelFactory.buildHabit();
habit.setName("Wake up early"); habit.setName("Wake up early");
habit.setDescription("Did you wake up before 6am?"); habit.setQuestion("Did you wake up before 6am?");
habit.setFrequency(new Frequency(2, 3)); habit.setFrequency(new Frequency(2, 3));
saveIfSQLite(habit); saveIfSQLite(habit);

@ -1,105 +0,0 @@
/*
* Copyright (C) 2017 Álinson Santos Xavier <isoron@gmail.com>
*
* This file is part of Loop Habit Tracker.
*
* Loop Habit Tracker is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* Loop Habit Tracker is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.isoron.uhabits.core.ui.screens.about;
import androidx.annotation.*;
import org.isoron.uhabits.core.preferences.*;
import javax.inject.*;
public class AboutBehavior
{
private int developerCountdown = 5;
@NonNull
private Preferences prefs;
@NonNull
private Screen screen;
@Inject
public AboutBehavior(@NonNull Preferences prefs, @NonNull Screen screen)
{
this.prefs = prefs;
this.screen = screen;
}
public void onPressDeveloperCountdown()
{
developerCountdown--;
if (developerCountdown == 0)
{
prefs.setDeveloper(true);
screen.showMessage(Message.YOU_ARE_NOW_A_DEVELOPER);
}
}
public void onRateApp()
{
screen.showRateAppWebsite();
}
public void onSendFeedback()
{
screen.showSendFeedbackScreen();
}
public void onTranslateApp()
{
screen.showTranslationWebsite();
}
public void onViewSourceCode()
{
screen.showSourceCodeWebsite();
}
public void onClickPrivacy() {
screen.showPrivacyPolicyWebsite();
}
public void onClickCodeContributors() {
screen.showCodeContributorsWebsite();
}
public enum Message
{
YOU_ARE_NOW_A_DEVELOPER
}
public interface Screen
{
void showMessage(Message message);
void showRateAppWebsite();
void showSendFeedbackScreen();
void showSourceCodeWebsite();
void showTranslationWebsite();
void showPrivacyPolicyWebsite();
void showCodeContributorsWebsite();
}
}

@ -0,0 +1,5 @@
alter table Habits add column question text;
update Habits set question = description;
update Habits set description = "";

@ -125,7 +125,7 @@ public class BaseUnitTest
DriverManager.getConnection("jdbc:sqlite::memory:")); DriverManager.getConnection("jdbc:sqlite::memory:"));
db.execute("pragma user_version=8;"); db.execute("pragma user_version=8;");
MigrationHelper helper = new MigrationHelper(db); MigrationHelper helper = new MigrationHelper(db);
helper.migrateTo(21); helper.migrateTo(23);
return db; return db;
} }
catch (SQLException e) catch (SQLException e)

@ -159,21 +159,4 @@ public class Version22Test extends BaseUnitTest
db.execute("insert into repetitions(habit, timestamp, value)" + db.execute("insert into repetitions(habit, timestamp, value)" +
"values (0, 100, 5)"); "values (0, 100, 5)");
} }
@Test
public void testKeepHabitsUnchanged() throws Exception
{
Habit original = fixtures.createLongHabit();
Reminder reminder = new Reminder(8, 30, new WeekdayList(100));
original.setReminder(reminder);
habitList.update(original);
helper.migrateTo(22);
((SQLiteHabitList) habitList).reload();
Habit modified = habitList.getById(original.getId());
assertNotNull(modified);
assertThat(original.getData(), equalTo(modified.getData()));
}
} }

@ -0,0 +1,63 @@
package org.isoron.uhabits.core.database.migrations
import org.hamcrest.MatcherAssert
import org.hamcrest.Matchers
import org.isoron.uhabits.core.BaseUnitTest
import org.isoron.uhabits.core.database.Database
import org.isoron.uhabits.core.database.MigrationHelper
import org.isoron.uhabits.core.models.sqlite.SQLModelFactory
import org.isoron.uhabits.core.test.HabitFixtures
import org.junit.Test
class Version23Test: BaseUnitTest() {
private lateinit var db: Database
private lateinit var helper: MigrationHelper
override fun setUp() {
super.setUp()
db = openDatabaseResource("/databases/022.db")
helper = MigrationHelper(db)
modelFactory = SQLModelFactory(db)
habitList = modelFactory.buildHabitList()
fixtures = HabitFixtures(modelFactory, habitList)
}
private fun migrateTo23() = helper.migrateTo(23)
@Test
fun `test migrate to 23 creates question column`() {
migrateTo23()
val cursor = db.query("select question from Habits")
cursor.moveToNext()
}
@Test
fun `test migrate to 23 moves description to question column`() {
var cursor = db.query("select description from Habits")
val descriptions = mutableListOf<String?>()
while(cursor.moveToNext()){
descriptions.add(cursor.getString(0))
}
migrateTo23()
cursor = db.query("select question from Habits")
for(i in 0 until descriptions.size){
cursor.moveToNext()
MatcherAssert.assertThat(cursor.getString(0), Matchers.equalTo(descriptions[i]))
}
}
@Test
fun `test migrate to 23 sets description to null`() {
migrateTo23()
val cursor = db.query("select description from Habits")
while(cursor.moveToNext()){
MatcherAssert.assertThat(cursor.getString(0), Matchers.equalTo(""))
}
}
}

@ -218,13 +218,15 @@ public class HabitListTest extends BaseUnitTest
Habit h1 = fixtures.createEmptyHabit(); Habit h1 = fixtures.createEmptyHabit();
h1.setName("Meditate"); h1.setName("Meditate");
h1.setDescription("Did you meditate this morning?"); h1.setQuestion("Did you meditate this morning?");
h1.setDescription("this is a test description");
h1.setFrequency(Frequency.DAILY); h1.setFrequency(Frequency.DAILY);
h1.setColor(3); h1.setColor(3);
Habit h2 = fixtures.createEmptyHabit(); Habit h2 = fixtures.createEmptyHabit();
h2.setName("Wake up early"); h2.setName("Wake up early");
h2.setDescription("Did you wake up before 6am?"); h2.setQuestion("Did you wake up before 6am?");
h2.setDescription("");
h2.setFrequency(new Frequency(2, 3)); h2.setFrequency(new Frequency(2, 3));
h2.setColor(5); h2.setColor(5);
@ -232,9 +234,9 @@ public class HabitListTest extends BaseUnitTest
list.add(h2); list.add(h2);
String expectedCSV = String expectedCSV =
"Position,Name,Description,NumRepetitions,Interval,Color\n" + "Position,Name,Question,Description,NumRepetitions,Interval,Color\n" +
"001,Meditate,Did you meditate this morning?,1,1,#FF8F00\n" + "001,Meditate,Did you meditate this morning?,this is a test description,1,1,#FF8F00\n" +
"002,Wake up early,Did you wake up before 6am?,2,3,#AFB42B\n"; "002,Wake up early,Did you wake up before 6am?,,2,3,#AFB42B\n";
StringWriter writer = new StringWriter(); StringWriter writer = new StringWriter();
list.writeCSV(writer); list.writeCSV(writer);

@ -155,7 +155,7 @@ public class HabitTest extends BaseUnitTest
" targetValue: 100.0, type: 0, unit: ," + " targetValue: 100.0, type: 0, unit: ," +
" reminder: {hour: 22, minute: 30," + " reminder: {hour: 22, minute: 30," +
" days: {weekdays: [true,true,true,true,true,true,true]}}," + " days: {weekdays: [true,true,true,true,true,true,true]}}," +
" position: 0}}"; " position: 0, question: }}";
assertThat(h.toString(), equalTo(expected)); assertThat(h.toString(), equalTo(expected));
} }

@ -36,7 +36,7 @@ public class HabitRecordTest extends BaseUnitTest
{ {
Habit original = modelFactory.buildHabit(); Habit original = modelFactory.buildHabit();
original.setName("Hello world"); original.setName("Hello world");
original.setDescription("Did you greet the world today?"); original.setQuestion("Did you greet the world today?");
original.setColor(1); original.setColor(1);
original.setArchived(true); original.setArchived(true);
original.setFrequency(Frequency.THREE_TIMES_PER_WEEK); original.setFrequency(Frequency.THREE_TIMES_PER_WEEK);
@ -58,7 +58,7 @@ public class HabitRecordTest extends BaseUnitTest
{ {
Habit original = modelFactory.buildHabit(); Habit original = modelFactory.buildHabit();
original.setName("Hello world"); original.setName("Hello world");
original.setDescription("Did you greet the world today?"); original.setQuestion("Did you greet the world today?");
original.setColor(5); original.setColor(5);
original.setArchived(false); original.setArchived(false);
original.setFrequency(Frequency.DAILY); original.setFrequency(Frequency.DAILY);

@ -1,95 +0,0 @@
/*
* Copyright (C) 2017 Álinson Santos Xavier <isoron@gmail.com>
*
* This file is part of Loop Habit Tracker.
*
* Loop Habit Tracker is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* Loop Habit Tracker is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.isoron.uhabits.core.ui.screens.about;
import org.isoron.uhabits.core.*;
import org.isoron.uhabits.core.preferences.*;
import org.junit.*;
import org.mockito.*;
import static org.isoron.uhabits.core.ui.screens.about.AboutBehavior.Message.YOU_ARE_NOW_A_DEVELOPER;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyZeroInteractions;
public class AboutBehaviorTest extends BaseUnitTest
{
private AboutBehavior behavior;
@Mock
private Preferences prefs;
@Mock
private AboutBehavior.Screen screen;
@Before
public void setUp() throws Exception
{
super.setUp();
behavior = new AboutBehavior(prefs, screen);
}
@Test
public void onPressDeveloperCountdown() throws Exception
{
behavior.onPressDeveloperCountdown();
behavior.onPressDeveloperCountdown();
behavior.onPressDeveloperCountdown();
behavior.onPressDeveloperCountdown();
verifyZeroInteractions(screen);
verifyZeroInteractions(prefs);
behavior.onPressDeveloperCountdown();
verify(screen).showMessage(YOU_ARE_NOW_A_DEVELOPER);
verify(prefs).setDeveloper(true);
behavior.onPressDeveloperCountdown();
verifyZeroInteractions(screen);
verifyZeroInteractions(prefs);
}
@Test
public void onRateApp() throws Exception
{
behavior.onRateApp();
verify(screen).showRateAppWebsite();
}
@Test
public void onSendFeedback() throws Exception
{
behavior.onSendFeedback();
verify(screen).showSendFeedbackScreen();
}
@Test
public void onTranslateApp() throws Exception
{
behavior.onTranslateApp();
verify(screen).showTranslationWebsite();
}
@Test
public void onViewSourceCode() throws Exception
{
behavior.onViewSourceCode();
verify(screen).showSourceCodeWebsite();
}
}

@ -18,7 +18,7 @@
*/ */
plugins { plugins {
id 'kotlin-multiplatform' version '1.3.21' id 'kotlin-multiplatform' version "1.3.72"
} }
repositories { repositories {
@ -32,7 +32,11 @@ kotlin {
def iosPreset = isIphone ? presets.iosArm64 : presets.iosX64 def iosPreset = isIphone ? presets.iosArm64 : presets.iosX64
fromPreset(iosPreset, 'ios') { fromPreset(iosPreset, 'ios') {
compilations.main.outputKinds('FRAMEWORK') binaries {
framework {
baseName = "LoopHabitTracker"
}
}
compilations.main { compilations.main {
cinterops { cinterops {
sqlite3 { sqlite3 {
@ -61,7 +65,7 @@ kotlin {
kotlin { srcDir "src/main/common" } kotlin { srcDir "src/main/common" }
dependencies { dependencies {
implementation kotlin('stdlib-common') implementation kotlin('stdlib-common')
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core-common:1.2.0-alpha-2' implementation "$KX_COROUTINES-core-common:$KX_COROUTINES_VERSION"
} }
} }
@ -77,7 +81,7 @@ kotlin {
kotlin { srcDir "src/main/jvm" } kotlin { srcDir "src/main/jvm" }
dependencies { dependencies {
implementation kotlin('stdlib-jdk8') implementation kotlin('stdlib-jdk8')
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.2.0-alpha-2' implementation "$KX_COROUTINES-core:$KX_COROUTINES_VERSION"
} }
} }
@ -94,7 +98,7 @@ kotlin {
kotlin { srcDir "src/main/js" } kotlin { srcDir "src/main/js" }
dependencies { dependencies {
implementation kotlin('stdlib-js') implementation kotlin('stdlib-js')
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core-js:1.2.0-alpha-2' implementation "$KX_COROUTINES-core-js:$KX_COROUTINES_VERSION"
} }
} }
@ -108,36 +112,25 @@ kotlin {
iosMain { iosMain {
kotlin { srcDir "src/main/ios" } kotlin { srcDir "src/main/ios" }
dependencies { dependencies {
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core-native:1.2.0-alpha-2' implementation "$KX_COROUTINES-core-native:$KX_COROUTINES_VERSION"
} }
} }
iosTest { iosTest {
kotlin { srcDir "src/test/ios" } kotlin { srcDir "src/test/ios" }
dependencies { dependencies {
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core-native:1.2.0-alpha-2' implementation "$KX_COROUTINES-core-native:$KX_COROUTINES_VERSION"
} }
} }
} }
task iosTestCopyResources(type: Copy) { task iosTestCopyResources(type: Copy) {
dependsOn 'linkTestIos'
from 'assets/test/' from 'assets/test/'
from 'assets/main/' from 'assets/main/'
into 'build/bin/ios/testDebugExecutable' into 'build/bin/ios/debugTest'
} }
task iosTest { if (project.tasks.findByName('iosTest')) {
dependsOn 'linkTestIos', 'iosTestCopyResources' iosTest.dependsOn(iosTestCopyResources)
group = JavaBasePlugin.VERIFICATION_GROUP
description = "Runs tests on iOS simulator"
doLast {
def emulatorName = "iPhone 8 Plus"
def binary = kotlin.targets.ios.compilations.test.getBinary('EXECUTABLE', 'DEBUG')
exec {
commandLine 'xcrun', 'simctl', 'spawn', emulatorName, binary.absolutePath
}
}
} }
} }

@ -0,0 +1,2 @@
KX_COROUTINES_VERSION=1.3.6
KX_COROUTINES=org.jetbrains.kotlinx:kotlinx-coroutines

@ -1,6 +1,5 @@
#Sun Apr 07 10:31:43 CDT 2019
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.3.1-all.zip distributionUrl=https\://services.gradle.org/distributions/gradle-6.4.1-all.zip

@ -30,14 +30,17 @@ interface Log {
*/ */
class StandardLog : Log { class StandardLog : Log {
override fun warn(tag: String, msg: String) { override fun warn(tag: String, msg: String) {
println(sprintf("W %-20s %s", tag, msg)) val ftag = format("%-20s", tag)
println("W $ftag $msg")
} }
override fun info(tag: String, msg: String) { override fun info(tag: String, msg: String) {
println(sprintf("I %-20s %s", tag, msg)) val ftag = format("%-20s", tag)
println("I $ftag $msg")
} }
override fun debug(tag: String, msg: String) { override fun debug(tag: String, msg: String) {
println(sprintf("D %-20s %s", tag, msg)) val ftag = format("%-20s", tag)
println("D $ftag $msg")
} }
} }

@ -19,4 +19,6 @@
package org.isoron.platform.io package org.isoron.platform.io
expect fun sprintf(format: String, vararg args: Any?): String expect fun format(format: String, arg: String): String
expect fun format(format: String, arg: Int): String
expect fun format(format: String, arg: Double): String

@ -24,22 +24,22 @@ import org.isoron.platform.io.*
import kotlin.math.* import kotlin.math.*
fun Double.toShortString(): String = when { fun Double.toShortString(): String = when {
this >= 1e9 -> sprintf("%.1fG", this / 1e9) this >= 1e9 -> format("%.1fG", this / 1e9)
this >= 1e8 -> sprintf("%.0fM", this / 1e6) this >= 1e8 -> format("%.0fM", this / 1e6)
this >= 1e7 -> sprintf("%.1fM", this / 1e6) this >= 1e7 -> format("%.1fM", this / 1e6)
this >= 1e6 -> sprintf("%.1fM", this / 1e6) this >= 1e6 -> format("%.1fM", this / 1e6)
this >= 1e5 -> sprintf("%.0fk", this / 1e3) this >= 1e5 -> format("%.0fk", this / 1e3)
this >= 1e4 -> sprintf("%.1fk", this / 1e3) this >= 1e4 -> format("%.1fk", this / 1e3)
this >= 1e3 -> sprintf("%.1fk", this / 1e3) this >= 1e3 -> format("%.1fk", this / 1e3)
this >= 1e2 -> sprintf("%.0f", this) this >= 1e2 -> format("%.0f", this)
this >= 1e1 -> when { this >= 1e1 -> when {
round(this) == this -> sprintf("%.0f", this) round(this) == this -> format("%.0f", this)
else -> sprintf("%.1f", this) else -> format("%.1f", this)
} }
else -> when { else -> when {
round(this) == this -> sprintf("%.0f", this) round(this) == this -> format("%.0f", this)
round(this * 10) == this * 10 -> sprintf("%.1f", this) round(this * 10) == this * 10 -> format("%.1f", this)
else -> sprintf("%.2f", this) else -> format("%.2f", this)
} }
} }

@ -47,7 +47,7 @@ class Ring(val color: Color,
if(label) { if(label) {
canvas.setColor(color) canvas.setColor(color)
canvas.setFontSize(radius * 0.4) canvas.setFontSize(radius * 0.4)
canvas.drawText(sprintf("%.0f%%", percentage * 100), width / 2, height / 2) canvas.drawText(format("%.0f%%", percentage * 100), width / 2, height / 2)
} }
} }
} }

@ -1,165 +0,0 @@
// --------------------------------------------------------------------------
// THIS FILE WAS AUTOMATICALLY GENERATED
//
// Please do not submit pull request to modify it. Corrections to translations
// may be submitted at https://translate.loophabits.org/
// --------------------------------------------------------------------------
package org.isoron.uhabits.i18n
class StringsArabic : Strings() {
override val app_name = "متعقب العادة لووب"
override val main_activity_title = "عادات"
override val action_settings = "إعدادات"
override val edit = "تعديل"
override val delete = "حذف"
override val archive = "أرشفة"
override val unarchive = "إزالة من الأرشيف"
override val add_habit = "إضافة عادة"
override val color_picker_default_title = "تغيير اللون"
override val toast_habit_created = "تم إنشاء عادة"
override val toast_habit_deleted = "تم حذف العادات"
override val toast_habit_restored = "تم إستعادة العادات"
override val toast_nothing_to_undo = "لا شيء للألغاء"
override val toast_nothing_to_redo = "لا شيء للإعادة"
override val toast_habit_changed = "تم تغيير عادة"
override val toast_habit_changed_back = "تم أرجاع العادة إلى أصلها"
override val toast_habit_archived = "تم أرشفه العادات"
override val toast_habit_unarchived = "تم الغاء ارشفه العادات"
override val overview = "نظرة عامة"
override val habit_strength = "قوة العادة"
override val history = "السجل"
override val clear = "إزالة"
override val description_hint = "السؤال (هل ... اليوم؟)"
override val repeat = "كرره"
override val times_every = "مرات كل"
override val days = "أيام"
override val reminder = "التذكرة"
override val discard = "تجاهل"
override val save = "حفظ"
override val streaks = "الانجازات"
override val no_habits_found = "لا يوجد لديك عادات مفعلة"
override val long_press_to_toggle = "أضغط و إستمر لتحقق أو ازل"
override val reminder_off = "إيقاف"
override val validation_name_should_not_be_blank = "لا يمكن أن يكون الإسم فارغ"
override val validation_number_should_be_positive = "يجب أن يكون الرقم موجب."
override val validation_at_most_one_rep_per_day = "يجب أن يكون التكرار مرة واحدة فقط كل يوم"
override val create_habit = "انشاء العادة"
override val edit_habit = "تعديل العادة"
override val check = "حقق"
override val snooze = "لاحقاً"
override val intro_title_1 = "أهلا بك"
override val intro_description_1 = "لوب يساعدك في بدأ عادات جيدة والحفاظ عليها."
override val intro_title_2 = "إنشاء عادات جديدة"
override val intro_description_2 = "كل يوم، بعد أداء عادتك، ضع علامة عليها في التطبيق."
override val intro_title_3 = "حافظ على القيام بذلك"
override val intro_description_3 = "العادة المستمرة لفترة طويلة تكسب نجمة كامله."
override val intro_title_4 = "تتبع اداءك"
override val intro_description_4 = "رسوم بيانية مفصلة تُريك كيف تحسنت عاداتك مع مرور الوقت."
override val interval_15_minutes = "15 دقيقة"
override val interval_30_minutes = "30 دقيقة"
override val interval_1_hour = "ساعة واحدة"
override val interval_2_hour = "ساعتان"
override val interval_4_hour = "٤ ساعات"
override val interval_8_hour = "8 ساعات"
override val interval_24_hour = "٢٤ ساعة"
override val pref_toggle_title = "تبديل وضعية العادة بضغطة قصيرة"
override val pref_toggle_description = "أكثر سهولة، لكنه ممكن يسبب كبسات غير مقصوده"
override val pref_snooze_interval_title = "فترتي الغفوى على التذكير"
override val pref_rate_this_app = "تقييم هذا التطبيق على جوجل بلاي"
override val pref_send_feedback = "أرسل الملاحظات إلى المطور"
override val pref_view_source_code = "إفحص التعليمات البرمجية على GitHub"
override val pref_view_app_introduction = "عرض المقدمه"
override val links = "روابط"
override val behavior = "سلوك"
override val name = "اسم"
override val settings = "إعدادات"
override val snooze_interval = "فترتي الغفوه"
override val hint_title = "هل كنت تعلم؟"
override val hint_drag = "لإعادة ترتيب القوائم، أضغط اسم من هذه العادة، ثم اسحبه إلى المكان الصحيح."
override val hint_landscape = "يمكنك ان ترى المزيد أيام عن طريق وضع الهاتف في وضع أفقي."
override val delete_habits = "حذف عادات"
override val delete_habits_message = "سيتم حذف عادات بشكل دائم. هذا العمل لا يمكن التراجع عنه."
override val habit_not_found = "العادة حذفت/لم يتم العثور عليها"
override val weekends = "عطلة نهاية الأسبوع"
override val any_weekday = "أيام الأسبوع"
override val any_day = "أي يوم"
override val select_weekdays = "إختار أيام "
override val export_to_csv = "تصدير البيانات (CSV)"
override val done_label = "منجز"
override val clear_label = "نظف"
override val select_hours = "تحديد ساعات"
override val select_minutes = "تحديد دقائق "
override val about = "معلومات حول"
override val translators = "المترجمين"
override val developers = "المطورين"
override val version_n = "الإصدار %s"
override val frequency = "تردد"
override val checkmark = "علامة الاختيار"
override val strength = "القوة"
override val best_streaks = "أكثر تقدم"
override val current_streaks = "تقدم الحالي"
override val number_of_repetitions = "عدد من حالات التكرار"
override val last_x_days = "آخر %d أيام"
override val last_x_weeks = "آخر %d أسابيع"
override val last_x_months = "آخر %d أشهر"
override val last_x_years = "آخر %d سنين"
override val all_time = "كل الوقت"
override val every_day = "كل يوم"
override val every_week = "كل اسبوع"
override val two_times_per_week = "مرتين في الأسبوع"
override val five_times_per_week = "خمس مرات في الأسبوع"
override val custom_frequency = "مخصص..."
override val help = "مساعدة والأسئلة المتداولة"
override val could_not_export = "فشل في تصدير البيانات."
override val could_not_import = "فشل في استيراد البيانات."
override val file_not_recognized = "الملف غير المعترف."
override val habits_imported = "نجح إستيراد العادات."
override val full_backup_success = "نجح تصدير النسخ الاحتياطي الكامل."
override val import_data = "استيراد بيانات."
override val export_full_backup = "صدر نسخة احتياطية كاملة."
override val import_data_summary = "تدعم النسخ الاحتياطي الكامل المصدرة من هذا التطبيق، فضلا عن الملفات التي تم إنشاؤها من Tickmate, HabitBull و Rewire. انظر التعليمات لمزيد من المعلومات."
override val export_as_csv_summary = "صدر ملف التي يمكن فتحها ببرنامج جداول البيانات مثل إكسل أو وبينوفيس. لا يمكن إستيراد هذا الملف."
override val export_full_backup_summary = "إنشاء ملف يحتوي على كافة البيانات. يمكن استيراد هذا الملف نفسه."
override val bug_report_failed = "فشل في توليد تقرير الاعطال"
override val generate_bug_report = "توليد تقرير الاعطال"
override val troubleshooting = "استكشاف الأخطاء وإصلاحها"
override val help_translate = "المساعدة في ترجمة هذا البرنامج"
override val night_mode = "الوضع الليلي"
override val use_pure_black = "استخدام أسود نقي في الوضع الليلي"
override val pure_black_description = "يستبدل خلفيات رمادية مع أسود نقي في الوضع الليلي. يقلل من استهلاك البطارية في الهواتف مع شاشة AMOLED."
override val interface_preferences = "السطح البيني"
override val reverse_days = "ترتيب عكسي أيام"
override val reverse_days_description = "عرض أيام في ترتيب عكسي على الشاشة الرئيسية"
override val day = "يوم"
override val week = "أسبوع"
override val month = "شهر"
override val quarter = "ربع سنه"
override val year = "عام"
override val total = "المجموع"
override val time_every = "مرات في"
override val every_x_days = "كل %d أيام"
override val every_x_weeks = "كل %d أسابيع"
override val every_x_months = "كل %d أشهر"
override val score = "النقاط"
override val reminder_sound = "صوت تذكير"
override val none = "صامت"
override val filter = "تصنيف"
override val hide_completed = "إخفاء المكتملة"
override val hide_archived = "إخفاء المؤرشفة"
override val sticky_notifications = "جعل الإشعارات ثابتة"
override val sticky_notifications_description = "منع الإشعارات من تمريرها بعيداً."
override val repair_database = "إصلاح قاعدة البيانات"
override val database_repaired = "تم إصلاح قاعدة البيانات."
override val uncheck = "إلغاء تحديد"
override val toggle = "تبديل"
override val action = "عمل"
override val habit = "عادة"
override val sort = "فرز"
override val manually = "يدوياً"
override val by_name = "حسب الإسم"
override val by_color = "حسب اللون"
override val by_score = "حسب النقاط"
override val download = "تحميل"
override val export = "استخراج"
}

@ -1,165 +0,0 @@
// --------------------------------------------------------------------------
// THIS FILE WAS AUTOMATICALLY GENERATED
//
// Please do not submit pull request to modify it. Corrections to translations
// may be submitted at https://translate.loophabits.org/
// --------------------------------------------------------------------------
package org.isoron.uhabits.i18n
class StringsBasque : Strings() {
override val app_name = "Loop Habit Tracker"
override val main_activity_title = "Ohiturak"
override val action_settings = "Ezarpenak"
override val edit = "Editatu"
override val delete = "Ezabatu"
override val archive = "Artxibatu"
override val unarchive = "Desartxibatu"
override val add_habit = "Gehitu ohitura"
override val color_picker_default_title = "Kolorea aldatu"
override val toast_habit_created = "Ohitura sortu da"
override val toast_habit_deleted = "Ohiturak ezabatu dira"
override val toast_habit_restored = "Ohiturak berrezarri dira"
override val toast_nothing_to_undo = "Ez dago ezer desegiteko"
override val toast_nothing_to_redo = "Ez dago ezer berregiteko"
override val toast_habit_changed = "Ohitura aldatu egin da"
override val toast_habit_changed_back = "Ohitura berrezarri da"
override val toast_habit_archived = "Ohiturak artxibatu dira"
override val toast_habit_unarchived = "Ohiturak desartxibatu dira"
override val overview = "Ikuspegi orokorra"
override val habit_strength = "Ohituraren indarra"
override val history = "Historia"
override val clear = "Garbitu"
override val description_hint = "Galdera (... al duzu gaur?)"
override val repeat = "Errepikatu"
override val times_every = "aldiz"
override val days = "egunetan"
override val reminder = "Oroigarria"
override val discard = "Baztertu"
override val save = "Gorde"
override val streaks = "Boladak"
override val no_habits_found = "Ez duzu ohitura aktiborik"
override val long_press_to_toggle = "Sakatu eta mantendu markatu edo desmarkatzeko"
override val reminder_off = "Itzalita"
override val validation_name_should_not_be_blank = "Izena ezin da hutsik egon."
override val validation_number_should_be_positive = "Zenbakia positiboa izan behar da."
override val validation_at_most_one_rep_per_day = "Gehienez errepikapen bat eguneko izan dezakezu"
override val create_habit = "Ohitura sortu"
override val edit_habit = "Ohitura editatu"
override val check = "Markatu"
override val snooze = "Geroago"
override val intro_title_1 = "Ongi etorri"
override val intro_description_1 = "Loop Habit Tracker-ek ohitura onak hartzen eta mantentzen laguntzen dizu."
override val intro_title_2 = "Sor itzazu ohitura berri batzuk"
override val intro_description_2 = "Egunero, zure ohitura egin ostean, jarri ezazu egiaztatze marka bat aplikazioan."
override val intro_title_3 = "Jarrai ezazu ohitura egiten"
override val intro_description_3 = "Denbora luzean zehar trinkotasunez egindako ohiturek izar oso bat irabaziko dute."
override val intro_title_4 = "Jarrai ezazu zure aurrerapena"
override val intro_description_4 = "Grafiko zehatzen bitartez denboran zehar zure ohiturak nola hobetu diren ikus ditzakezu"
override val interval_15_minutes = "15 minutu"
override val interval_30_minutes = "30 minutu"
override val interval_1_hour = "Ordu 1"
override val interval_2_hour = "2 ordu"
override val interval_4_hour = "4 ordu"
override val interval_8_hour = "8 ordu"
override val interval_24_hour = "24 ordu"
override val pref_toggle_title = "Ukitze laburrarekin markatu"
override val pref_toggle_description = "Ukitze bakar batekin marka jartzen du ukitu eta mantendu egin beharrean. Erosoagoa, baina nahi gabeko markak ekar litzake."
override val pref_snooze_interval_title = "Atzeratze tartea oroigarrietan"
override val pref_rate_this_app = "Aplikazio hau Google Playen puntuatu"
override val pref_send_feedback = "Zure iritzia garatzaileari bidali"
override val pref_view_source_code = "Iturburu kodea GitHuben ikusi"
override val pref_view_app_introduction = "Aplikazioaren aurkezpena ikusi"
override val links = "Loturak"
override val behavior = "Portaera"
override val name = "Izena"
override val settings = "Ezarpenak"
override val snooze_interval = "Atzeratze tartea"
override val hint_title = "Ba al zenekien?"
override val hint_drag = "Sarrerak berrantolatzeko, sakatu eta mantendu ohituraren izena, ondoren mugi ezazu leku aproposera."
override val hint_landscape = "Egun gehiago ikus ditzakezu zure gailua paisai moduan jarriz."
override val delete_habits = "Ohiturak ezabatu"
override val delete_habits_message = "Ohiturak betirako ezabatuko dira. Ekintza hau ezin da desegin."
override val habit_not_found = "Ohitura ezabatua / ez aurkitua"
override val weekends = "Asteburuak"
override val any_weekday = "Astelehenetik ostiralera"
override val any_day = "Astearen edozen egun"
override val select_weekdays = "Egunak hautatu"
override val export_to_csv = "CSV bezala esportatu"
override val done_label = "Eginda"
override val clear_label = "Garbitu"
override val select_hours = "Orduak hautatu"
override val select_minutes = "Minutuak hautatu"
override val about = "Honi buruz"
override val translators = "Itzultzaileak"
override val developers = "Garatzaileak"
override val version_n = "%s bertsioa"
override val frequency = "Maiztasuna"
override val checkmark = "Egiaztatze marka"
override val strength = "Indarra"
override val best_streaks = "Bolada onenak"
override val current_streaks = "Uneko bolada"
override val number_of_repetitions = "Errepikapenen kopurua"
override val last_x_days = "Azken %d egunak"
override val last_x_weeks = "Azken %d asteak"
override val last_x_months = "Azken %d hilabeteak"
override val last_x_years = "Azken %d urteak"
override val all_time = "Hasieratik"
override val every_day = "Egunero"
override val every_week = "Astero"
override val two_times_per_week = "Astean 2 aldiz"
override val five_times_per_week = "Astean 5 aldiz"
override val custom_frequency = "Pertsonalizatua ..."
override val help = "Laguntza eta ohiko galderak"
override val could_not_export = "Huts datuak esportatzerakoan."
override val could_not_import = "Huts datuak inportatzerakoan."
override val file_not_recognized = "Fitxategi ezezaguna."
override val habits_imported = "Ohiturak ondo inportatu dira."
override val full_backup_success = "Babes kopia osoa ondo esportatu da."
override val import_data = "Datuak inportatu"
override val export_full_backup = "Babes kopia osoa esportatu"
override val import_data_summary = "Aplikazio honek esportatutako babes kopia osoak onartzen dira, baita Tickmate, HabitBull edo Rewirek sortutako fitxategiak ere. Ikusi ohito galderak informazio gehiago lortzeko."
override val export_as_csv_summary = "Microsoft Excel edo OpenOffice Calc bezalako kalkulu orrietarako softwareak ireki dezaketen fitxategiak sortzen ditu. Fitxategi hau ezin da berriz inportatu."
override val export_full_backup_summary = "Zure datu guztiak dituen fitxategi bat sortzen du. Fitxategi hau ezin da berriz inportatu."
override val bug_report_failed = "Huts akats txostena sortzerakoan."
override val generate_bug_report = "Akats txostena sortu"
override val troubleshooting = "Arazoen konponketa"
override val help_translate = "Lagundu aplikazio hau itzultzen"
override val night_mode = "Gau modua"
override val use_pure_black = "Benetazko beltza erabili gau moduan"
override val pure_black_description = "Atzeko plano grisak beltz hutsez aldatzen ditu gau moduan. Bateriaren erabilera gutxitzen du AMOLED duten gailuetan."
override val interface_preferences = "Interfazea"
override val reverse_days = "Egunak atzekoz aurrera ordenatu"
override val reverse_days_description = "Pantaila nagusian egunak atzekoz aurrera ikusi"
override val day = "Eguna"
override val week = "Astea"
override val month = "Hilabetea"
override val quarter = "Hiruhilekoa"
override val year = "Urtea"
override val total = "Guztira"
override val time_every = "denbora"
override val every_x_days = "%d egunero"
override val every_x_weeks = "%d astero"
override val every_x_months = "%d hilabetero"
override val score = "Puntuak"
override val reminder_sound = "Oroigarriaren soinua"
override val none = "Bat ere ez"
override val filter = "Iragazkia"
override val hide_completed = "Ezkutatu lortutakoak"
override val hide_archived = "Artxibatutakoak ezkutatu"
override val sticky_notifications = "Jakinarazpenak itsaskorrak bihurtu"
override val sticky_notifications_description = "Jakinarazpenak keinu batez ezabatzea sahiesten du."
override val repair_database = "Datu basea konpondu"
override val database_repaired = "Datu basea konpondu da."
override val uncheck = "Desmarkatu"
override val toggle = "Aldatu"
override val action = "Ekintza"
override val habit = "Ohitura"
override val sort = "Ordenatu"
override val manually = "Eskuz"
override val by_name = "Izenaren arabera"
override val by_color = "Kolorearen arabera"
override val by_score = "Puntuen arabera"
override val download = "Deskargatu"
override val export = "Esportatu"
}

@ -1,165 +0,0 @@
// --------------------------------------------------------------------------
// THIS FILE WAS AUTOMATICALLY GENERATED
//
// Please do not submit pull request to modify it. Corrections to translations
// may be submitted at https://translate.loophabits.org/
// --------------------------------------------------------------------------
package org.isoron.uhabits.i18n
class StringsBulgarian : Strings() {
override val app_name = "Loop Следене на навици"
override val main_activity_title = "Навици"
override val action_settings = "Настройки"
override val edit = "Редактиране"
override val delete = "Изтриване"
override val archive = "Архивиране"
override val unarchive = "Разархивиране"
override val add_habit = "Добавяне на навик"
override val color_picker_default_title = "Промяна на цвят"
override val toast_habit_created = "Навикът е създаден"
override val toast_habit_deleted = "Навиците са изтрити"
override val toast_habit_restored = "Навиците са възстановени"
override val toast_nothing_to_undo = "Нищо за отмяна"
override val toast_nothing_to_redo = "Нищо за възстановяване"
override val toast_habit_changed = "Навикът е променен"
override val toast_habit_changed_back = "Промяната на навика е отменена."
override val toast_habit_archived = "Навиците са архивирани"
override val toast_habit_unarchived = "Навиците са разархивирани"
override val overview = "Обзор"
override val habit_strength = "Сила на навика"
override val history = "История"
override val clear = "Изчистване"
override val description_hint = "Въпрос (Днес, ... ли?)"
override val repeat = "Повтори"
override val times_every = "пъти в период от"
override val days = "дни"
override val reminder = "Напомняне"
override val discard = "Отказ"
override val save = "Запазване"
override val streaks = "Поредици"
override val no_habits_found = "Нямате активни навици"
override val long_press_to_toggle = "Натиснете и задръжте за да добавите или премахнете отметка"
override val reminder_off = "Изключено"
override val validation_name_should_not_be_blank = "Името не може да бъде празно."
override val validation_number_should_be_positive = "Числото трябва да е положително."
override val validation_at_most_one_rep_per_day = "Позволено е до едно повторение на ден."
override val create_habit = "Създаване на навик"
override val edit_habit = "Редактиране на навик"
override val check = "Поставяне на отметка"
override val snooze = "По-късно"
override val intro_title_1 = "Добре дошли"
override val intro_description_1 = "Loop Следене на навици ви помага да създавате и поддържате добри навици."
override val intro_title_2 = "Създайте нови навици"
override val intro_description_2 = "Всеки ден, след изпълнението на навика, поставете отметка в приложението."
override val intro_title_3 = "Продължавайте да го изпълнявате"
override val intro_description_3 = "Навици изпълнявани редовно за дълго време ще ви спечелят пълна звезда."
override val intro_title_4 = "Следете напредъка си"
override val intro_description_4 = "Подробни диаграми ви показват как вашите навици са се подобрили с времето."
override val interval_15_minutes = "15 минути"
override val interval_30_minutes = "30 минути"
override val interval_1_hour = "1 час"
override val interval_2_hour = "2 часа"
override val interval_4_hour = "4 часа"
override val interval_8_hour = "8 часа"
override val interval_24_hour = "24 часа"
override val pref_toggle_title = "Маркиране с кратко натискане"
override val pref_toggle_description = "Поставяне на отметки с кратко натискане вместо с натискане и задържане. По-удобно, но може да доведе до неволно маркиране."
override val pref_snooze_interval_title = "Интервал на напомняне след отлагане"
override val pref_rate_this_app = "Оценяване на това приложение в Google Play"
override val pref_send_feedback = "Изпращане на отзиви към разработчика"
override val pref_view_source_code = "Преглед на програмния код в GitHub"
override val pref_view_app_introduction = "Преглед на въведение в приложението"
override val links = "Препратки"
override val behavior = "Поведение"
override val name = "Име"
override val settings = "Настройки"
override val snooze_interval = "Интервал на отлагане"
override val hint_title = "Знаете ли че?"
override val hint_drag = "За да пренаредите записите, натиснете и задръжте върху името на навика и го придърпайте до правилното място."
override val hint_landscape = "Може да виждате повече дни като обърнете телефона си в хоризонтално положение."
override val delete_habits = "Изтриване на навици"
override val delete_habits_message = "Навиците ще се изтрият перманентно. Това действие не може да бъде отменено."
override val habit_not_found = "Навикът е изтрит / не е намерен"
override val weekends = "Събота и неделя"
override val any_weekday = "От понеделник до петък"
override val any_day = "Всеки ден от седмицата"
override val select_weekdays = "Избор на дни"
override val export_to_csv = "Експортиране като CSV"
override val done_label = "Готово"
override val clear_label = "Изчистване"
override val select_hours = "Избиране на час"
override val select_minutes = "Избиране на минута"
override val about = "За приложението"
override val translators = "Преводачи"
override val developers = "Разработчици"
override val version_n = "Версия %s"
override val frequency = "Честота"
override val checkmark = "Отметка"
override val strength = "Сила"
override val best_streaks = "Най-добри поредици"
override val current_streaks = "Текуща поредица"
override val number_of_repetitions = "Брой повторения"
override val last_x_days = "Последните %d дни"
override val last_x_weeks = "Последните %d седмици"
override val last_x_months = "Последните %d месеци"
override val last_x_years = "Последните %d години"
override val all_time = "От началото"
override val every_day = "Всеки ден"
override val every_week = "Всяка седмица"
override val two_times_per_week = "2 пъти седмично"
override val five_times_per_week = "5 пъти седмично"
override val custom_frequency = "Друго ..."
override val help = "Помощ & ЧЗВ"
override val could_not_export = "Неуспешно експортиране на данни."
override val could_not_import = "Неуспешно импортиране на данни."
override val file_not_recognized = "Файлът не е разпознат."
override val habits_imported = "Навиците са импортирани успешно."
override val full_backup_success = "Пълно резервно копие е експортирано успешно."
override val import_data = "Импортиране на данни"
override val export_full_backup = "Експортиране на пълно резервно копие"
override val import_data_summary = "Поддържа пълни резервни копия експортирани чрез това приложение, както и файлове генерирани чрез Tickmate, HabitBull или Rewire. Вижте ЧЗВ за повече информация."
override val export_as_csv_summary = "Генерира файлове, които могат да се отварят със софтуер за електронни таблици като Microsoft Excel или OpenOffice Calc. Този файл не може да се импортира обратно."
override val export_full_backup_summary = "Генерира файл, който съдържа всичките ви данни. Този файл може да бъде импортиран обратно."
override val bug_report_failed = "Неуспешно генериране на доклад за грешки."
override val generate_bug_report = "Генериране на доклад за грешки"
override val troubleshooting = "Отстраняване на проблеми"
override val help_translate = "Помагане за превода на това приложение"
override val night_mode = "Нощен режим"
override val use_pure_black = "Използване на чисто черно при нощен режим"
override val pure_black_description = "Заменя сивите фонове с чисто черни при нощен режим. Намаля разхода на батерията при телефони с AMOLED дисплеи."
override val interface_preferences = "Интерфейс"
override val reverse_days = "Обратен ред на дните"
override val reverse_days_description = "Показва дните на основния екран в обратен ред"
override val day = "Ден"
override val week = "Седмица"
override val month = "Месец"
override val quarter = "Тримесечие"
override val year = "Година"
override val total = "Общо"
override val time_every = "път в период от"
override val every_x_days = "На всеки %d дни"
override val every_x_weeks = "На всеки %d седмици"
override val every_x_months = "На всеки %d месеца"
override val score = "Сила"
override val reminder_sound = "Звук за напомняне"
override val none = "Няма"
override val filter = "Филтър"
override val hide_completed = "Скриване на завършените"
override val hide_archived = "Скриване на архивираните"
override val sticky_notifications = "Направи нотификациите постоянни"
override val sticky_notifications_description = "Предотвратява изчистването на нотификацията с плъзване настрани."
override val repair_database = "Поправка на базата данни"
override val database_repaired = "Базата данни е поправена."
override val uncheck = "Премахване на отметка"
override val toggle = "Смяна"
override val action = "Действие"
override val habit = "Навик"
override val sort = "Сортиране"
override val manually = "Ръчно"
override val by_name = "По име"
override val by_color = "По цвят"
override val by_score = "По сила"
override val download = "Изтегляне"
override val export = "Експортиране"
}

@ -1,148 +0,0 @@
// --------------------------------------------------------------------------
// THIS FILE WAS AUTOMATICALLY GENERATED
//
// Please do not submit pull request to modify it. Corrections to translations
// may be submitted at https://translate.loophabits.org/
// --------------------------------------------------------------------------
package org.isoron.uhabits.i18n
class StringsCatalan : Strings() {
override val main_activity_title = "Hàbits"
override val action_settings = "Ajustaments"
override val edit = "Editar"
override val delete = "Esborrar"
override val archive = "Arxivar"
override val unarchive = "Treure de l\'arxiu"
override val add_habit = "Afegir hàbit"
override val color_picker_default_title = "Canviar color"
override val toast_habit_created = "Hàbit creat."
override val toast_habit_deleted = "Hàbits esborrats."
override val toast_habit_restored = "Hàbits restaurats."
override val toast_nothing_to_undo = "Res a desfer."
override val toast_nothing_to_redo = "Res a refer."
override val toast_habit_changed = "Hàbit modificat."
override val toast_habit_changed_back = "Hàbit restaurat."
override val toast_habit_archived = "Hàbits arxivats."
override val toast_habit_unarchived = "Hàbits trets de l\'arxiu."
override val overview = "Visió general"
override val habit_strength = "Fortalesa de l\'hàbit"
override val history = "Història"
override val clear = "Netejar"
override val description_hint = "Pregunta (Avui vas...?)"
override val repeat = "Repetir"
override val times_every = "vegades en"
override val days = "dies"
override val reminder = "Recordatori"
override val discard = "Descartar"
override val save = "Desar"
override val streaks = "Ratxa"
override val no_habits_found = "No tens hàbits actius"
override val long_press_to_toggle = "Prem i manté per a marcar o desmarcar"
override val reminder_off = "Desactivat"
override val validation_name_should_not_be_blank = "El nom no pot estar buit"
override val validation_number_should_be_positive = "El número ha de ser positiu"
override val validation_at_most_one_rep_per_day = "Pots tenir com a màxim una repetició per dia"
override val create_habit = "Crear hàbit"
override val edit_habit = "Editar hàbit"
override val check = "Revisar"
override val snooze = "Més tard"
override val intro_title_1 = "Benvingut"
override val intro_description_1 = "Loop Habit Tracker t\'ajuda a crear i mantenir bons hàbits"
override val intro_title_2 = "Crear alguns hàbits nous"
override val intro_description_2 = "Cada dia, després de complir el teu hàbit, posa una marca amb la app"
override val intro_title_3 = "Continua fent-ho"
override val intro_description_3 = "Els hàbits que facis consistentment durant una llarga temporada obtindran una estrella"
override val intro_title_4 = "Segueix el teu progrès"
override val intro_description_4 = "Els gràfics detallats et mostren com han mirollat els teus hàbits al llarg del temps"
override val interval_15_minutes = "15 minuts"
override val interval_30_minutes = "30 minuts"
override val interval_1_hour = "1 hora"
override val interval_2_hour = "2 hores"
override val interval_4_hour = "4 hores"
override val interval_8_hour = "8 hores"
override val interval_24_hour = "24 hores"
override val pref_toggle_title = "Activar/desactivar repeticions prement curt"
override val pref_toggle_description = "Més adequat, però pot causar activacions accidentals"
override val pref_snooze_interval_title = "Interval d\'endarreriment en recordatoris"
override val pref_rate_this_app = "Valora aquesta app a Google Play"
override val pref_send_feedback = "Enviar resposta al desenvolupador"
override val pref_view_source_code = "Veure codi font a Github"
override val pref_view_app_introduction = "Veure introducció de l\'app"
override val links = "Enllaços"
override val behavior = "Comportament"
override val name = "Nom"
override val settings = "Ajustaments"
override val snooze_interval = "Interval d\'endarreriment"
override val hint_title = "Ho sabies?"
override val hint_drag = "Per a ordenar les entrades, prem i mantè sobre el nom de l\'hàbit, després arrossega\'l al lloc correcte."
override val hint_landscape = "Pots veure més dies posant el teu telèfon en orientació apaisada."
override val delete_habits = "Esborrar hàbits"
override val delete_habits_message = "Els hàbits seran esborrats permanentment. Aquesta acció no es pot desfer."
override val weekends = "Caps de setmana"
override val any_weekday = "Dilluns a divendres"
override val any_day = "Qualsevol dia de la setmana"
override val select_weekdays = "Selecciona els dies"
override val export_to_csv = "Exportar a CSV"
override val done_label = "Fet"
override val clear_label = "Treure"
override val select_hours = "Selecciona les hores"
override val select_minutes = "Selecciona els minuts"
override val about = "En quant a"
override val translators = "Traductors"
override val developers = "Desenvolupadors"
override val version_n = "Versió %s"
override val frequency = "Freqüència"
override val checkmark = "Marca"
override val strength = "Fortalesa"
override val best_streaks = "Millors ratxes"
override val current_streaks = "Ratxa actual"
override val number_of_repetitions = "Nombre de repeticions"
override val last_x_days = "Últims %d dies"
override val last_x_weeks = "Últimes %d setmanes"
override val last_x_months = "Últims %d mesos"
override val last_x_years = "Últims %d anys"
override val all_time = "Tot el temps"
override val every_day = "Cada dia"
override val every_week = "Cada setmana"
override val two_times_per_week = "2 cops per setmana"
override val five_times_per_week = "5 cops per setmana"
override val custom_frequency = "Personalitzar ..."
override val help = "Ajuda i Preguntes Freqüents"
override val could_not_export = "Error exportant dades."
override val could_not_import = "Error important dades."
override val file_not_recognized = "Fitxer no reconegut."
override val habits_imported = "Hàbits importats correctament."
override val full_backup_success = "Còpia de seguretat sencera exportada satisfactòriament."
override val import_data = "Importar dades"
override val export_full_backup = "Exportar còpia de seguretat sencera"
override val import_data_summary = "Suporta còpies de seguretat exportades per aquesta app, també fitxers generats per Tickmate, HabitBull o Rewire. Mira les Preguntes Freqüents per a més informació."
override val export_as_csv_summary = "Genera fitxers que poden ser oberts per programari de fulles de càlcul, com ara Microsoft Excel o OpenOffice Calc. Aquest fitxer no pot tornar-se a importar."
override val export_full_backup_summary = "Genera un fitxer que contè totes les teves dades. Aquest fitxer pot tornar-se a importar."
override val bug_report_failed = "Ha fallat la generació de l\'informe d\'error."
override val generate_bug_report = "Generar informe d\'error"
override val troubleshooting = "Resolució de problemes"
override val help_translate = "Ajuda a traduïr aquesta app"
override val night_mode = "Mode nocturn"
override val use_pure_black = "Utilitzar negre pur en el mode nocturn"
override val pure_black_description = "Reemplaça fons grisos per negre pur en el mode nocturn. Redueix consum de bateria en telèfons amb pantalla AMOLED."
override val interface_preferences = "Interfície"
override val reverse_days = "Ordre invers de dies"
override val reverse_days_description = "Mostra els dies en ordre invers en la pantalla principal"
override val day = "Dia"
override val week = "Setmana"
override val month = "Mes"
override val quarter = "Quatrimestre"
override val year = "Any"
override val time_every = "vegades en"
override val every_x_days = "Cada %d dies"
override val every_x_weeks = "Cada %d setmanes"
override val every_x_months = "Cada %d mesos"
override val score = "Puntuació"
override val reminder_sound = "So de recordatori"
override val none = "Cap"
override val filter = "Filtre"
override val action = "Acció"
override val habit = "Hàbit"
override val export = "Exportar"
}

@ -1,165 +0,0 @@
// --------------------------------------------------------------------------
// THIS FILE WAS AUTOMATICALLY GENERATED
//
// Please do not submit pull request to modify it. Corrections to translations
// may be submitted at https://translate.loophabits.org/
// --------------------------------------------------------------------------
package org.isoron.uhabits.i18n
class StringsChineseCN : Strings() {
override val app_name = "循环习惯记录"
override val main_activity_title = "习惯"
override val action_settings = "设置"
override val edit = "编辑"
override val delete = "删除"
override val archive = "存档"
override val unarchive = "取消存档"
override val add_habit = "添加新习惯"
override val color_picker_default_title = "选择颜色"
override val toast_habit_created = "习惯已创建"
override val toast_habit_deleted = "习惯已删除"
override val toast_habit_restored = "习惯已恢复"
override val toast_nothing_to_undo = "没有可以撤销的习惯."
override val toast_nothing_to_redo = "没有可以恢复的习惯."
override val toast_habit_changed = "习惯已被修改."
override val toast_habit_changed_back = "修改已取消."
override val toast_habit_archived = "习惯存档成功."
override val toast_habit_unarchived = "存档已取消."
override val overview = "总览"
override val habit_strength = "习惯强度"
override val history = "历史"
override val clear = "取消"
override val description_hint = "提醒问题(你今天 xxx 了吗)"
override val repeat = "重复"
override val times_every = "次每"
override val days = ""
override val reminder = "提醒"
override val discard = "放弃"
override val save = "保存"
override val streaks = "连续完成次数"
override val no_habits_found = "你还没有任何习惯"
override val long_press_to_toggle = "长按 标记/取消标记"
override val reminder_off = "关闭"
override val validation_name_should_not_be_blank = "习惯标题不能为空"
override val validation_number_should_be_positive = "数字必须大于零."
override val validation_at_most_one_rep_per_day = "每天最多重复一次"
override val create_habit = "新建习惯"
override val edit_habit = "编辑习惯"
override val check = "标记"
override val snooze = "以后再说"
override val intro_title_1 = "欢迎"
override val intro_description_1 = "循环习惯记录器帮助你建立和维持好习惯."
override val intro_title_2 = "建立一些新习惯"
override val intro_description_2 = "每当你完成一项习惯后,就在应用上做一个标记"
override val intro_title_3 = "保持习惯"
override val intro_description_3 = "当连续完成习惯达到一定时间时,你将可以点亮该习惯的成就之星"
override val intro_title_4 = "记录你的进步"
override val intro_description_4 = "详细图表展示长期以来习惯养成情况"
override val interval_15_minutes = "15分钟"
override val interval_30_minutes = "30分钟"
override val interval_1_hour = "1小时"
override val interval_2_hour = "2小时"
override val interval_4_hour = "4小时"
override val interval_8_hour = "8小时"
override val interval_24_hour = "24 小时"
override val pref_toggle_title = "轻触以启动重复"
override val pref_toggle_description = "更加方便,但有可能造成意外记录"
override val pref_snooze_interval_title = "提醒延迟间隔"
override val pref_rate_this_app = "去Play商店评价这个应用"
override val pref_send_feedback = "发送反馈给开发者"
override val pref_view_source_code = "在Github上查看源代码"
override val pref_view_app_introduction = "阅读应用介绍"
override val links = "链接"
override val behavior = "功能"
override val name = "习惯标题"
override val settings = "设置"
override val snooze_interval = "推迟提醒间隔"
override val hint_title = "你知道吗?"
override val hint_drag = "如果要重新排列习惯,按住习惯的名字拖到想要的位置"
override val hint_landscape = "转至横屏查看更多日期"
override val delete_habits = "删除该习惯"
override val delete_habits_message = "习惯会被永久删除,且该操作不可恢复"
override val habit_not_found = "习惯已删/找不到"
override val weekends = "周末"
override val any_weekday = "工作日"
override val any_day = "每天"
override val select_weekdays = "选择天数"
override val export_to_csv = "导出数据 (CSV)"
override val done_label = "完成"
override val clear_label = "取消"
override val select_hours = "选择小时"
override val select_minutes = "选择分钟"
override val about = "关于应用"
override val translators = "翻译者"
override val developers = "开发者"
override val version_n = "当前版本:%s"
override val frequency = "频率"
override val checkmark = "标记"
override val strength = "强度"
override val best_streaks = "最佳连续完成次数"
override val current_streaks = "当前连续完成次数"
override val number_of_repetitions = "重复次数"
override val last_x_days = "过去 %d 天"
override val last_x_weeks = "过去 %d 周"
override val last_x_months = "过去 %d 月"
override val last_x_years = "过去 %d 年"
override val all_time = "全部"
override val every_day = "每天"
override val every_week = "每周"
override val two_times_per_week = "每周两次"
override val five_times_per_week = "每周5次"
override val custom_frequency = "自定义"
override val help = "帮助 & 常见问题"
override val could_not_export = "导出数据失败"
override val could_not_import = "导入数据失败"
override val file_not_recognized = "无法识别文件"
override val habits_imported = "习惯导入成功"
override val full_backup_success = "习惯备份成功"
override val import_data = "导入数据"
override val export_full_backup = "导出完整备份"
override val import_data_summary = "支持此应用导出的备份文件, 也支持 Tickmate HabitBull 或 Rewire 导出文件,请参阅常见问题以获取更多信息。"
override val export_as_csv_summary = "生成可以通过电子表格软件打开的文件,如 Microsoft Excel 或 OpenOffice Calc。该文件无法重新导入。"
override val export_full_backup_summary = "生成一个包含所有数据的文件。该文件可以重新导入。"
override val bug_report_failed = "错误报告生成失败"
override val generate_bug_report = "生成错误报告"
override val troubleshooting = "故障排除"
override val help_translate = "帮助翻译这个应用"
override val night_mode = "夜间模式"
override val use_pure_black = "在夜间模式中使用纯黑色"
override val pure_black_description = "以纯黑色背景代替夜间模式中的灰色背景。这将帮助减少 AMOLED 屏幕手机的电量使用。"
override val interface_preferences = "界面"
override val reverse_days = "反向顺序的日子"
override val reverse_days_description = "在主界面显示反向顺序的日子"
override val day = ""
override val week = ""
override val month = ""
override val quarter = "季度"
override val year = ""
override val total = "总数"
override val time_every = "次每"
override val every_x_days = "每 %d 天"
override val every_x_weeks = "每 %d 周"
override val every_x_months = "每 %d 月"
override val score = "成绩"
override val reminder_sound = "提醒声音"
override val none = ""
override val filter = "筛选"
override val hide_completed = "隐藏已完成项目"
override val hide_archived = "隐藏已存档"
override val sticky_notifications = "使提醒持久"
override val sticky_notifications_description = "防止提醒被滑掉"
override val repair_database = "修复数据库"
override val database_repaired = "数据库已修复"
override val uncheck = "取消选中"
override val toggle = "切换"
override val action = "操作"
override val habit = "习惯"
override val sort = "排序"
override val manually = "手动"
override val by_name = "根据名称"
override val by_color = "根据颜色"
override val by_score = "根据分数"
override val download = "下载"
override val export = "导出"
}

@ -1,165 +0,0 @@
// --------------------------------------------------------------------------
// THIS FILE WAS AUTOMATICALLY GENERATED
//
// Please do not submit pull request to modify it. Corrections to translations
// may be submitted at https://translate.loophabits.org/
// --------------------------------------------------------------------------
package org.isoron.uhabits.i18n
class StringsChineseTW : Strings() {
override val app_name = "Loop 習以為常"
override val main_activity_title = "習慣"
override val action_settings = "偏好設定"
override val edit = "編輯"
override val delete = "刪除"
override val archive = "封存"
override val unarchive = "取消封存"
override val add_habit = "加入新習慣"
override val color_picker_default_title = "選擇顏色"
override val toast_habit_created = "習慣已增加"
override val toast_habit_deleted = "習慣已刪除"
override val toast_habit_restored = "習慣已恢復"
override val toast_nothing_to_undo = "沒有可以撤銷的習慣"
override val toast_nothing_to_redo = "沒有可以恢復的習慣"
override val toast_habit_changed = "習慣已經被修改"
override val toast_habit_changed_back = "修改已取消"
override val toast_habit_archived = "習慣已封存"
override val toast_habit_unarchived = "習慣已取消封存"
override val overview = "總覽"
override val habit_strength = "習慣強度"
override val history = "歴史紀錄"
override val clear = "清空"
override val description_hint = "問題(你今天&#8230;了嗎?)"
override val repeat = "重複"
override val times_every = "次每"
override val days = ""
override val reminder = "提醒"
override val discard = "取消"
override val save = "保存"
override val streaks = "記錄"
override val no_habits_found = "你還沒有任何習慣"
override val long_press_to_toggle = "長按以標記/取消標記"
override val reminder_off = "關閉"
override val validation_name_should_not_be_blank = "習慣標題不能空白"
override val validation_number_should_be_positive = "數字必需大於零"
override val validation_at_most_one_rep_per_day = "每天最多重複一次"
override val create_habit = "添加習慣"
override val edit_habit = "編輯習慣"
override val check = "標記"
override val snooze = "稍後"
override val intro_title_1 = "歡迎"
override val intro_description_1 = "習以為常幫你創建並保持你的習慣。"
override val intro_title_2 = "建立一些習慣吧"
override val intro_description_2 = "每天在完成你的習慣後進入APP來打個勾吧。"
override val intro_title_3 = "堅持下去!"
override val intro_description_3 = "習以為常幫助你建立並維持好習慣"
override val intro_title_4 = "追蹤你的進步"
override val intro_description_4 = "詳細的圖表將顯示你的進步"
override val interval_15_minutes = "15分鐘"
override val interval_30_minutes = "30分鐘"
override val interval_1_hour = "1小時"
override val interval_2_hour = "2小時"
override val interval_4_hour = "4小時"
override val interval_8_hour = "8小時"
override val interval_24_hour = "24 小時"
override val pref_toggle_title = "短按來記錄習慣"
override val pref_toggle_description = "但有可能造成意外記錄"
override val pref_snooze_interval_title = "提醒延遲間隔"
override val pref_rate_this_app = "在Google Play上評價這個App"
override val pref_send_feedback = "發送改進意見給開發者"
override val pref_view_source_code = "在GitHub上查看原始碼"
override val pref_view_app_introduction = "App簡介"
override val links = "連結"
override val behavior = "功能"
override val name = "習慣標題"
override val settings = "設定"
override val snooze_interval = "延遲時間間隔"
override val hint_title = "你知道嗎?"
override val hint_drag = "如果要重新排列習慣,拖曳習慣到想要的位置"
override val hint_landscape = "把手機橫放可以看到更多天數"
override val delete_habits = "刪除"
override val delete_habits_message = "習慣會被永久刪除,而且該操作不可恢復"
override val habit_not_found = "習慣已刪除/找不到"
override val weekends = "周末"
override val any_weekday = "工作日"
override val any_day = "每天"
override val select_weekdays = "選擇天數"
override val export_to_csv = "匯出數據 (CSV)"
override val done_label = "完成"
override val clear_label = "取消"
override val select_hours = "選擇小時"
override val select_minutes = "選擇分鐘"
override val about = "關於本程式"
override val translators = "翻譯者"
override val developers = "開發者"
override val version_n = "%s 版"
override val frequency = "頻率"
override val checkmark = "標記"
override val strength = "強度"
override val best_streaks = "最長紀錄"
override val current_streaks = "目前紀錄"
override val number_of_repetitions = "重複次數"
override val last_x_days = "過去 %d 天"
override val last_x_weeks = "過去 %d 周"
override val last_x_months = "過去 %d 月"
override val last_x_years = "過去 %d 年"
override val all_time = "全部"
override val every_day = "每天"
override val every_week = "每週"
override val two_times_per_week = "每週兩次"
override val five_times_per_week = "每週五次"
override val custom_frequency = "自訂週期"
override val help = "幫助& 常見問題"
override val could_not_export = "輸出資料失敗"
override val could_not_import = "輸入資料失敗"
override val file_not_recognized = "無法辨識"
override val habits_imported = "習慣輸入成功"
override val full_backup_success = "習慣備份成功"
override val import_data = "匯入資料"
override val export_full_backup = "匯出完整備份"
override val import_data_summary = "支援此程式所匯出的資料, 也支援TickmateHabitBull 或 Rewire 所產生的文件。請參閱常見問題以獲得更多訊息。"
override val export_as_csv_summary = "生成可以利用表格程式打開的文件如Microsoft Excel或OpenOffice Calc。此文件無法重新匯入。"
override val export_full_backup_summary = "生成一個包含所有資料的文件。該文件可以再重新匯入。"
override val bug_report_failed = "錯誤報告:生成失敗"
override val generate_bug_report = "產生錯誤報告"
override val troubleshooting = "問題排除"
override val help_translate = "協助翻譯本程式"
override val night_mode = "夜間模式"
override val use_pure_black = "在夜間模式中使用深色設定"
override val pure_black_description = "在夜間模式中使用黑色背景取代灰色背景。這樣可以減少AMOLED螢幕的手機電量消耗。"
override val interface_preferences = "介面"
override val reverse_days = "反向排序日期"
override val reverse_days_description = "在主畫面上顯示反向排序的結果"
override val day = ""
override val week = ""
override val month = ""
override val quarter = ""
override val year = ""
override val total = "總計"
override val time_every = "次每"
override val every_x_days = "每 %d 天"
override val every_x_weeks = "每 %d 周"
override val every_x_months = "每 %d 月"
override val score = "分數"
override val reminder_sound = "提醒音效"
override val none = ""
override val filter = "篩選"
override val hide_completed = "隱藏已完成的習慣"
override val hide_archived = "隱藏已封存習慣"
override val sticky_notifications = "使提醒保持常駐"
override val sticky_notifications_description = "防止提醒被滑動移除"
override val repair_database = "修復資料庫"
override val database_repaired = "資料庫已修復"
override val uncheck = "取消選取"
override val toggle = "切換"
override val action = "操作"
override val habit = "習慣"
override val sort = "排序"
override val manually = "手動"
override val by_name = "根據名稱"
override val by_color = "根據顏色"
override val by_score = "根據分數"
override val download = "下載"
override val export = "匯出"
}

@ -1,165 +0,0 @@
// --------------------------------------------------------------------------
// THIS FILE WAS AUTOMATICALLY GENERATED
//
// Please do not submit pull request to modify it. Corrections to translations
// may be submitted at https://translate.loophabits.org/
// --------------------------------------------------------------------------
package org.isoron.uhabits.i18n
class StringsCroatian : Strings() {
override val app_name = "Loop Habit Tracker"
override val main_activity_title = "Navike"
override val action_settings = "Postavke"
override val edit = "Uredi"
override val delete = "Izbriši"
override val archive = "Arhiviraj"
override val unarchive = "Dearhiviraj"
override val add_habit = "Dodaj naviku"
override val color_picker_default_title = "Promijeni boju"
override val toast_habit_created = "Navika je stvorena"
override val toast_habit_deleted = "Navike su izbrisane"
override val toast_habit_restored = "Navike su obnovljene"
override val toast_nothing_to_undo = "Nema ništa za poništavanje"
override val toast_nothing_to_redo = "Nema ništa za obnavljanje"
override val toast_habit_changed = "Navika je promijenjena"
override val toast_habit_changed_back = "Navika je vraćena u početno stanje"
override val toast_habit_archived = "Navike su arhivirane"
override val toast_habit_unarchived = "Navike su dearhivirane"
override val overview = "Pregled"
override val habit_strength = "Snaga navike"
override val history = "Povijest"
override val clear = "Očisti"
override val description_hint = "Pitanje (Jesi li danas...?)"
override val repeat = "Ponovi"
override val times_every = "puta u"
override val days = "dani"
override val reminder = "Podsjetnik"
override val discard = "Odbaci"
override val save = "Spremi"
override val streaks = "Niz"
override val no_habits_found = "Nemate aktivnih navika"
override val long_press_to_toggle = "Pritisnite i držite za označavanje ili odznačavanje."
override val reminder_off = "Isključen"
override val validation_name_should_not_be_blank = "Naziv ne može biti prazan."
override val validation_number_should_be_positive = "Broj mora biti pozitivan."
override val validation_at_most_one_rep_per_day = "Možete imati najviše jedno ponavljanje po danu"
override val create_habit = "Stvori naviku"
override val edit_habit = "Uredi naviku"
override val check = "Potvrdi"
override val snooze = "Kasnije"
override val intro_title_1 = "Dobrodošli"
override val intro_description_1 = "Loop Habit Tracker vam pomaže stvoriti i održavati dobre navike."
override val intro_title_2 = "Stvorite neke nove navike"
override val intro_description_2 = "Svaki dan, nakon izvođenja vaše navike, postavite \"kvačicu\" u aplikaciji."
override val intro_title_3 = "Nastavite tako"
override val intro_description_3 = "Navikama koje konstantno izvodite kroz dugo vremena će te zaraditi punu zvjezdicu."
override val intro_title_4 = "Pratite svoj napredak"
override val intro_description_4 = "Detaljni grafovi vam prikazuju kako se vaše navike poboljšavaju kroz vrijeme."
override val interval_15_minutes = "15 minuta"
override val interval_30_minutes = "30 minuta"
override val interval_1_hour = "1 sat"
override val interval_2_hour = "2 sata"
override val interval_4_hour = "4 sata"
override val interval_8_hour = "8 sati"
override val interval_24_hour = "24 sata"
override val pref_toggle_title = "Označi ponavljanja sa kratkim pritisk."
override val pref_toggle_description = "Zgodnije je, no može uzrokovati slučajna označavanja."
override val pref_snooze_interval_title = "Interval odgađanja na podsjetnicima"
override val pref_rate_this_app = "Ocijeni ovu aplikaciju na Google Playu"
override val pref_send_feedback = "Pošalji povratne informacije raz. programeru"
override val pref_view_source_code = "Pogledaj izvorni kod na GitHubu"
override val pref_view_app_introduction = "Prikaži uvod u aplikaciju"
override val links = "Poveznice"
override val behavior = "Ponašanje"
override val name = "Naziv"
override val settings = "Postavke"
override val snooze_interval = "Interval odgađanja"
override val hint_title = "Jeste li znali?"
override val hint_drag = "Za razmještanje unosa, pritisnite i držite naziv navike, pa ih premjestite na točno mjesto."
override val hint_landscape = "Možete vidjeti više dana prebacivanjem uređaja u vodoravnu orijentaciju."
override val delete_habits = "Izbriši Navike"
override val delete_habits_message = "Navike će biti trajno izbrisane. Ova radnja se ne može poništiti."
override val habit_not_found = "Navika je izbrisana / nije pronađena"
override val weekends = "Vikendi"
override val any_weekday = "Ponedjeljak do Petak"
override val any_day = "Bilo koji dan u tjednu"
override val select_weekdays = "Odaberi dane"
override val export_to_csv = "Izvezi kao CSV"
override val done_label = "Dovršeno"
override val clear_label = "Očisti"
override val select_hours = "Odaberi sate"
override val select_minutes = "Odaberite minute"
override val about = "O aplikaciji"
override val translators = "Prevoditelji"
override val developers = "Razvojni programeri"
override val version_n = "Verzija %s"
override val frequency = "Učestalost"
override val checkmark = "Kvačica"
override val strength = "Snaga"
override val best_streaks = "Najbolji nizovi"
override val current_streaks = "Trenutni niz"
override val number_of_repetitions = "Broj ponavljanja"
override val last_x_days = "Zadnjih %d dana"
override val last_x_weeks = "Zadnjih %d tjedana"
override val last_x_months = "Zadnjih %d mjeseca"
override val last_x_years = "Zadnjih %d godina"
override val all_time = "Čitavo vrijeme"
override val every_day = "Svaki dan"
override val every_week = "Svaki tjedan"
override val two_times_per_week = "2 puta tjedno"
override val five_times_per_week = "5 puta tjedno"
override val custom_frequency = "Prilagođeno ..."
override val help = "Pomoć i pitanja"
override val could_not_export = "Izvoz podataka nije uspio."
override val could_not_import = "Uvoz podataka nije uspio."
override val file_not_recognized = "Datoteka nije prepoznata."
override val habits_imported = "Navike su uspješno uvezene."
override val full_backup_success = "Sigurnosna kopija je uspješno izvezena."
override val import_data = "Uvezi podatke"
override val export_full_backup = "Izvezi sigurnosnu kopiju"
override val import_data_summary = "Podržava sigurnosne kopije izvezene iz ove aplikacije, isto kao i datoteke generirane u Tickmate, HabitBull i Rewire. Pogledajte Pomoć i pitanja za više informacija."
override val export_as_csv_summary = "Generira datoteke koje se mogu otvarati programima za tablice kao što su Microsoft Excel ili OpenOffice Calc. Ova datoteka se ne može uvoziti."
override val export_full_backup_summary = "Generira datoteku koja sadrži sve vaše podatke. Ova datoteka se može uvoziti."
override val bug_report_failed = "Generiranje izvješća o pogrešci nije uspjelo."
override val generate_bug_report = "Generiraj izvješće o pogreški"
override val troubleshooting = "Rješavanje problema"
override val help_translate = "Pomozi prevesti ovu aplikaciju"
override val night_mode = "Noćni način"
override val use_pure_black = "Koristi crnu boju za noćni način"
override val pure_black_description = "Zamjenjuje sivu pozadinu sa crnom u noćnom načinu. To smanjuje potrošnju bateriju na uređajima s AMOLED zaslonima."
override val interface_preferences = "Sučelje"
override val reverse_days = "Obrnuti poredak dana"
override val reverse_days_description = "Prikažite dane obrnutim redom na glavnom zaslonu"
override val day = "Dan"
override val week = "Tjedan"
override val month = "Mjesec"
override val quarter = "Četvrtina"
override val year = "Godina"
override val total = "Ukupno"
override val time_every = "put svakih"
override val every_x_days = "Svaka %d dana"
override val every_x_weeks = "Svaka %d tjedna"
override val every_x_months = "Svaka %d mjeseca"
override val score = "Rezultat"
override val reminder_sound = "Zvuk podsjetnika"
override val none = "Nijedan"
override val filter = "Filtar"
override val hide_completed = "Sakrij završeno"
override val hide_archived = "Sakrij arhivirano"
override val sticky_notifications = "Učini obavijesti trajnima"
override val sticky_notifications_description = "Spriječava da se obavijesti zanemare."
override val repair_database = "Popravi bazu podataka"
override val database_repaired = "Baza podataka je popravljena."
override val uncheck = "Odznači"
override val toggle = "Uključi/isključi"
override val action = "Radnja"
override val habit = "Navika"
override val sort = "Sortiraj"
override val manually = "Ručno"
override val by_name = "Po nazivu"
override val by_color = "Po boji"
override val by_score = "Po rezultatu"
override val download = "Preuzmi"
override val export = "Izvezi"
}

@ -1,165 +0,0 @@
// --------------------------------------------------------------------------
// THIS FILE WAS AUTOMATICALLY GENERATED
//
// Please do not submit pull request to modify it. Corrections to translations
// may be submitted at https://translate.loophabits.org/
// --------------------------------------------------------------------------
package org.isoron.uhabits.i18n
class StringsCzech : Strings() {
override val app_name = "Loop Habit Tracker"
override val main_activity_title = "Zvyky"
override val action_settings = "Nastavení"
override val edit = "Upravit"
override val delete = "Smazat"
override val archive = "Archivovat"
override val unarchive = "Obnovit"
override val add_habit = "Přidat zvyk"
override val color_picker_default_title = "Změnit barvu"
override val toast_habit_created = "Zvyk vytvořen."
override val toast_habit_deleted = "Zvyky smazány."
override val toast_habit_restored = "Zvyky obnoveny."
override val toast_nothing_to_undo = "Nelze jít zpět."
override val toast_nothing_to_redo = "Nelze jít vpřed."
override val toast_habit_changed = "Zvyk změněn."
override val toast_habit_changed_back = "Zvyk změněn zpět."
override val toast_habit_archived = "Archivováno."
override val toast_habit_unarchived = "Zvyky obnoveny."
override val overview = "Přehled"
override val habit_strength = "Síla zvyku"
override val history = "Historie"
override val clear = "Smazat"
override val description_hint = "Otázka (Dělal jsi dnes...?)"
override val repeat = "Opakovat"
override val times_every = "krát za"
override val days = "dní"
override val reminder = "Připomenutí"
override val discard = "Zrušit"
override val save = "Uložit"
override val streaks = "Serie"
override val no_habits_found = "Nemáte žádné nedokončené zvyky"
override val long_press_to_toggle = "Stiskni a drž pro označení"
override val reminder_off = "Vyp."
override val validation_name_should_not_be_blank = "Jméno musíte vyplnit."
override val validation_number_should_be_positive = "Číslo musí být kladné."
override val validation_at_most_one_rep_per_day = "Můžete mít maximálně jedno označení denně."
override val create_habit = "Vytvořit zvyk"
override val edit_habit = "Upravit zvyk"
override val check = "Hotovo"
override val snooze = "Odložit"
override val intro_title_1 = "Vítejte"
override val intro_description_1 = "Sledování zvyků ti pomůže vytvořit a dosáhnout dobrých návyků."
override val intro_title_2 = "Vytvoř si nové zvyky"
override val intro_description_2 = "Každý den po splnění zvyku, si ho v aplikaci zaškrtni."
override val intro_title_3 = "Jen tak dál"
override val intro_description_3 = "Zvyky, které vykonáváš pravidelně delší dobu, se označí hvězdou."
override val intro_title_4 = "Sleduj svůj postup"
override val intro_description_4 = "Detailní grafy ti ukážou, jak se tvé zvyky v průběhu času zlepšily."
override val interval_15_minutes = "15 minut"
override val interval_30_minutes = "30 minut"
override val interval_1_hour = "Hodina"
override val interval_2_hour = "2 hodiny"
override val interval_4_hour = "4 hodiny"
override val interval_8_hour = "8 hodin"
override val interval_24_hour = "24 hodin"
override val pref_toggle_title = "Označte opakování krátkým stisknutím"
override val pref_toggle_description = "Praktičtější, ale může způsobit nechtěné označení."
override val pref_snooze_interval_title = "Doba odložení upomínky"
override val pref_rate_this_app = "Ohodnoťte nás v Google Play"
override val pref_send_feedback = "Zpětná vazba vývojáři"
override val pref_view_source_code = "Zobrazit zdroj. kód na GitHub"
override val pref_view_app_introduction = "Představení aplikace"
override val links = "Odkazy"
override val behavior = "Chování"
override val name = "Jméno"
override val settings = "Nastavení"
override val snooze_interval = "Interval odkladu"
override val hint_title = "Věděli jste?"
override val hint_drag = "Přeřazení záznamů proveď stisknutím a podržením názvu zvyku a poté přesunutím na správné místo."
override val hint_landscape = "Můžeš vidět více dnů otočením telefonu na šířku."
override val delete_habits = "Smazat zvyky"
override val delete_habits_message = "Označené zvyky budou navždy odstraněny. Toto nelze vzít zpět."
override val habit_not_found = "Zvyk smazán / nenalezen"
override val weekends = "Víkendy"
override val any_weekday = "Pondělí až pátek"
override val any_day = "Jakýkoliv den v týdnu"
override val select_weekdays = "Vyber dny"
override val export_to_csv = "Exportovat CSV"
override val done_label = "Hotovo"
override val clear_label = "Smazat"
override val select_hours = "Vyber hodiny"
override val select_minutes = "Vyber minuty"
override val about = "O nás"
override val translators = "Překladatelé"
override val developers = "Vývojáři"
override val version_n = "Verze %s"
override val frequency = "Frekvence"
override val checkmark = "Zatržítko"
override val strength = "Síla"
override val best_streaks = "Nejlepší serie"
override val current_streaks = "Aktuální serie"
override val number_of_repetitions = "Počet opakování"
override val last_x_days = "Posledních %d dnů"
override val last_x_weeks = "Posledních %d týdnů"
override val last_x_months = "Posledních %d měsíců"
override val last_x_years = "Posledních %d roků"
override val all_time = "Bez omezení"
override val every_day = "Každý den"
override val every_week = "Každý týden"
override val two_times_per_week = "2 krát týdně"
override val five_times_per_week = "5 krát týdně"
override val custom_frequency = "Vlastní..."
override val help = "Pomoc a FAQ"
override val could_not_export = "Export selhal."
override val could_not_import = "Import selhal."
override val file_not_recognized = "Soubor netozpoznán."
override val habits_imported = "Zvyky úspěšně importovány."
override val full_backup_success = "Kompletní záloha úspěšně exportována."
override val import_data = "Importovat"
override val export_full_backup = "Kompletní export"
override val import_data_summary = "Podpora exportů z této aplikace, ale také souborů vygenerovaných aplikacemi od Tickmate, HabitBull nebo Rewire. Pro více info si prečti FAQ."
override val export_as_csv_summary = "Generuje soubory, které můžeš otevřít v tabulkových editorech, jako jsou Microsoft Excel nebo OpenOffice Calc. Tyto soubory nelze importovat zpět."
override val export_full_backup_summary = "Generuje soubor, který obsahuje všechna tvoje data. Tento soubor můžeš importovat zpět."
override val bug_report_failed = "Generace výpisu chyb selhala."
override val generate_bug_report = "Generovat výpis chyb"
override val troubleshooting = "Řešení problémů"
override val help_translate = "Pomozte s překladem aplikace"
override val night_mode = "Noční téma"
override val use_pure_black = "Zobrazit čistě černou v nočním tématu"
override val pure_black_description = "Nahradí šedé pozadí čistou černou v nočním tématu. Snižuje spotřebu baterie v telefonech s AMOLED displejem."
override val interface_preferences = "Rozhraní"
override val reverse_days = "Otočit pořadí dnů"
override val reverse_days_description = "Zobrazí dny na úvodní stránce v obráceném pořadí"
override val day = "Den"
override val week = "Týden"
override val month = "Měsíc"
override val quarter = "Čtvrtletí"
override val year = "Rok"
override val total = "Celkem"
override val time_every = "krát za"
override val every_x_days = "Každých %d dní"
override val every_x_weeks = "Každých %d týdnů"
override val every_x_months = "Každých %d měsíců"
override val score = "Skóre"
override val reminder_sound = "Zvuk upomínky"
override val none = "Žádný"
override val filter = "Filtr"
override val hide_completed = "Skrýt dokončené"
override val hide_archived = "Skrýt archivované"
override val sticky_notifications = "Připnout notifikaci"
override val sticky_notifications_description = "Zabraňuje notifikaci její odstranění odsunutím."
override val repair_database = "Opravit databázi"
override val database_repaired = "Databáze opravena."
override val uncheck = "Odznačit"
override val toggle = "Přepnout"
override val action = "Akce"
override val habit = "Zvyk"
override val sort = "Řadit"
override val manually = "Ručně"
override val by_name = "Abecedně"
override val by_color = "Podle barvy"
override val by_score = "Podle skóre"
override val download = "Stáhnout"
override val export = "Export"
}

@ -1,141 +0,0 @@
// --------------------------------------------------------------------------
// THIS FILE WAS AUTOMATICALLY GENERATED
//
// Please do not submit pull request to modify it. Corrections to translations
// may be submitted at https://translate.loophabits.org/
// --------------------------------------------------------------------------
package org.isoron.uhabits.i18n
class StringsDanish : Strings() {
override val app_name = "Loop Vane Tracker"
override val main_activity_title = "Vaner"
override val action_settings = "Indstillinger"
override val edit = "Rediger"
override val delete = "Slet"
override val archive = "Arkiver"
override val unarchive = "Fjern fra arkiv"
override val add_habit = "Tilføj vane"
override val color_picker_default_title = "Skift farve"
override val toast_habit_created = "Vanen er skabt."
override val toast_habit_deleted = "Vanen er slettet."
override val toast_habit_restored = "Vanen er genskabt."
override val toast_nothing_to_undo = "Intet at fortryde."
override val toast_nothing_to_redo = "Intet at gengøre."
override val toast_habit_changed = "Vanen er ændret"
override val toast_habit_changed_back = "Vanen er ændret tilbage."
override val toast_habit_archived = "Vanerne er arkiveret."
override val toast_habit_unarchived = "Vanerne er fjernet fra arkivet."
override val overview = "Overblik"
override val habit_strength = "Vanestyrke"
override val history = "Historie"
override val clear = "Rens"
override val description_hint = "Spørgsmål (Fik du &#8230; i dag)"
override val repeat = "Gentag"
override val times_every = "gange på"
override val days = "dage"
override val reminder = "Påmindelse"
override val discard = "Forkast"
override val save = "Gem"
override val streaks = "i træk"
override val no_habits_found = "Du har ingen aktive vaner"
override val long_press_to_toggle = "Tryk og hold nede for at afkrydse"
override val reminder_off = "Slukket"
override val validation_name_should_not_be_blank = "Navn skal udfyldes."
override val validation_number_should_be_positive = "Tallet skal være positivt."
override val validation_at_most_one_rep_per_day = "Du kan højst have én gentagelse per dag"
override val create_habit = "Skab en vane"
override val edit_habit = "Rediger vane"
override val check = "Tjek"
override val snooze = "Senere"
override val intro_title_1 = "Velkommen"
override val intro_description_1 = "Loop Habit Tracker hjælper dig med at holde gode vaner."
override val intro_title_2 = "Skab nogle nye vaner"
override val intro_description_2 = "Hver dag, efter at have udført din vane, skal du sætte et flueben i app\'en."
override val intro_title_3 = "Fortsæt"
override val intro_description_3 = "Vaner fulgt regelmæssigt gennem langtid modtager en stjerne."
override val intro_title_4 = "Følg dine fremskridt"
override val intro_description_4 = "Detaljerede grafer viser dig hvordan dine vaner udvikler sig over tid."
override val interval_15_minutes = "15 minutter"
override val interval_30_minutes = "30 minutter"
override val interval_1_hour = "1 time"
override val interval_2_hour = "2 timer"
override val interval_4_hour = "4 timer"
override val interval_8_hour = "8 timer"
override val pref_toggle_title = "Vælg gentagelser med kort tryk"
override val pref_toggle_description = "Mere bekvemmeligt, men kan forårsage uhensigtede tryk."
override val pref_snooze_interval_title = "Snooze interval på påmindelserne"
override val pref_rate_this_app = "Bedøm denne app på Google Play"
override val pref_send_feedback = "Send feedback til udvikleren"
override val pref_view_source_code = "Se kildekoden på GitHub"
override val pref_view_app_introduction = "Se app introduktion"
override val links = "Henvisninger"
override val behavior = "Opførelse"
override val name = "Navn"
override val settings = "Indstillinger"
override val hint_title = "Vidste du?"
override val hint_drag = "For at omarrangere poster, tryk og hold på navnet på den vane, og træk den til det korrekte sted."
override val hint_landscape = "Du kan se flere dage ved at sætte telefonen i liggende tilstand."
override val delete_habits = "Slet vaner"
override val delete_habits_message = "Vanerne vil blive slettet permanent. Denne handling kan ikke fortrydes."
override val weekends = "Weekender"
override val any_weekday = "Mandag til Fredag"
override val any_day = "En hvilken som helst dag i ugen"
override val select_weekdays = "Vælg dage"
override val export_to_csv = "Eksporter som CSV"
override val done_label = "Færdig"
override val clear_label = "Fjern"
override val select_hours = "Vælg timer"
override val select_minutes = "Vælg minutter"
override val about = "Om"
override val translators = "Oversættere"
override val developers = "Udviklere"
override val frequency = "Hyppighed"
override val checkmark = "Afkrydsning"
override val strength = "Styrke"
override val best_streaks = "Bedste striber"
override val current_streaks = "Aktuel stribe"
override val number_of_repetitions = "Antal gentagelser"
override val last_x_days = "Sidste % dage"
override val last_x_weeks = "Sidste %d uger"
override val last_x_months = "Sidste %d måneder"
override val last_x_years = "Sidste %d år"
override val every_day = "Hver dag"
override val every_week = "Hver uge"
override val two_times_per_week = "2 gange om ugen"
override val five_times_per_week = "5 gange om ugen"
override val custom_frequency = "Brugerdefinerede"
override val help = "Hjælp & FAQ"
override val could_not_export = "Kunne ikke eksportere data"
override val could_not_import = "Kunne ikke importere data"
override val file_not_recognized = "Fil ikke genkendt."
override val habits_imported = "Vaner importeret."
override val full_backup_success = "Fuld backup eksporteret."
override val import_data = "Importer data"
override val export_full_backup = "Eksporter fuld backup."
override val import_data_summary = "Understøtter fuld backup eksporteret af denne app, samt filer genereret af Tickmate, HabitBull eller Rewire. Se FAQ for mere information."
override val export_as_csv_summary = "Opretter filer, der kan åbnes af regneark fra Microsoft Excel eller OpenOffice Calc. Denne fil kan ikke importeres tilbage."
override val export_full_backup_summary = "Opretter en fil, der indeholder alle dine data. Denne fil kan importeres tilbage."
override val bug_report_failed = "Kunne ikke generere fejlrapport."
override val generate_bug_report = "Generer fejlrapport"
override val troubleshooting = "Fejlfinding"
override val help_translate = "Hjælpe med at oversætte denne app"
override val night_mode = "Nat-tilstand"
override val use_pure_black = "Brug ren sort i nat-tilstand"
override val pure_black_description = "Erstatter grå baggrunde med ren sort i nat-tilstand. Reducerer batteriforbruget i telefoner med AMOLED skærm."
override val interface_preferences = "Grænseflade"
override val reverse_days = "Omvendt rækkefølge af dage"
override val reverse_days_description = "Vis dag i omvendt rækkefølge på hovedskærmen"
override val day = "Dag"
override val week = "Uge"
override val month = "Måned"
override val quarter = "Kvartal"
override val year = "År"
override val time_every = "Tid til"
override val every_x_days = "Hver %d dage"
override val every_x_weeks = "Hver %d uger"
override val every_x_months = "Hver %d måneder"
override val score = "Point"
override val reminder_sound = "Påmindelse lyd"
override val none = "Ingen"
}

@ -1,165 +0,0 @@
// --------------------------------------------------------------------------
// THIS FILE WAS AUTOMATICALLY GENERATED
//
// Please do not submit pull request to modify it. Corrections to translations
// may be submitted at https://translate.loophabits.org/
// --------------------------------------------------------------------------
package org.isoron.uhabits.i18n
class StringsDutch : Strings() {
override val app_name = "Loop Gewoonte tracker"
override val main_activity_title = "Gewoontes"
override val action_settings = "Instellingen"
override val edit = "Wijzig"
override val delete = "Verwijder"
override val archive = "Archiveer"
override val unarchive = "Dearchiveren"
override val add_habit = "Nieuwe gewoonte"
override val color_picker_default_title = "Verander kleur"
override val toast_habit_created = "Gewoonte aangemaakt."
override val toast_habit_deleted = "Gewoontes verwijderd"
override val toast_habit_restored = "Gewoontes hersteld"
override val toast_nothing_to_undo = "Niets om ongedaan te maken."
override val toast_nothing_to_redo = "Niets om over te doen."
override val toast_habit_changed = "Gewoonte gewijzigd."
override val toast_habit_changed_back = "Wijziging gewoonte ongedaan gemaakt."
override val toast_habit_archived = "Gewoontes gearchiveerd"
override val toast_habit_unarchived = "Gewoontes hersteld uit archief"
override val overview = "Overzicht"
override val habit_strength = "Gewoonte-sterkte"
override val history = "Geschiedenis"
override val clear = "Wis"
override val description_hint = "Vraag (Heb je vandaag .... ?)"
override val repeat = "Herhaal"
override val times_every = "keer in "
override val days = "dagen"
override val reminder = "Herinnering"
override val discard = "Verwijder"
override val save = "Opslaan"
override val streaks = "Reeksen"
override val no_habits_found = "Je hebt geen actieve gewoontes"
override val long_press_to_toggle = "Houdt ingedrukt om te selecteren of deselecteren"
override val reminder_off = "Uit"
override val validation_name_should_not_be_blank = "Naam kan niet leeg zijn."
override val validation_number_should_be_positive = "Nummer moet positief zijn."
override val validation_at_most_one_rep_per_day = "Je kunt maximaal een repetitie per dag hebben"
override val create_habit = "Maak gewoonte aan"
override val edit_habit = "Wijzig gewoonte"
override val check = "Voltooid"
override val snooze = "Later"
override val intro_title_1 = "Welkom"
override val intro_description_1 = "Loop Habit Tracker helpt je om goede gewoontes te creëren en te onderhouden."
override val intro_title_2 = "Creëer enkele nieuwe gewoontes"
override val intro_description_2 = "Plaats iedere dag, na het uitvoeren van jouw gewoonte, een vinkje in de app."
override val intro_title_3 = "Blijf het doen"
override val intro_description_3 = "Gewoontes die een langere tijd consistent worden uitgevoerd, zullen een volle ster verdienen."
override val intro_title_4 = "Volg jouw voortgang"
override val intro_description_4 = "Gedetailleerde grafieken tonen je hoe jouw gewoontes met de tijd verbeteren."
override val interval_15_minutes = "15 minuten"
override val interval_30_minutes = "30 minuten"
override val interval_1_hour = "1 uur"
override val interval_2_hour = "2 uur"
override val interval_4_hour = "4 uur"
override val interval_8_hour = "8 uur"
override val interval_24_hour = "24 uur"
override val pref_toggle_title = "Wijzig herhalingen door kort indrukken"
override val pref_toggle_description = "Zet vinkjes met een enkel tikje in plaats van ingedrukt houden. Handiger, maar kan onbedoelde wijzigingen veroorzaken."
override val pref_snooze_interval_title = "Snooze interval voor herinneringen"
override val pref_rate_this_app = "Beoordeel deze app in Google Play"
override val pref_send_feedback = "Stuur feedback aan de ontwikkelaar"
override val pref_view_source_code = "Bekijk de broncode op GitHub"
override val pref_view_app_introduction = "Bekijk de app introductie"
override val links = "Links"
override val behavior = "Gedrag"
override val name = "Naam"
override val settings = "Instellingen"
override val snooze_interval = "Snooze interval"
override val hint_title = "Wist je dat?"
override val hint_drag = "Om de rijen te ordenen, houdt de gewoonte ingedrukt en sleep het naar de gewenste plek."
override val hint_landscape = "Je kunt meer dagen zien door de telefoon in horizontale modus te zetten."
override val delete_habits = "Verwijder gewoontes"
override val delete_habits_message = "De gewoontes zullen permanent verwijderd worden. Deze actie kan niet ongedaan gemaakt worden."
override val habit_not_found = "Gewoonte verwijderd / niet gevonden"
override val weekends = "Weekends"
override val any_weekday = "Maandag tot vrijdag"
override val any_day = "Elke dag van de week"
override val select_weekdays = "Selecteer dagen"
override val export_to_csv = "Exporteer als CSV"
override val done_label = "Voltooid"
override val clear_label = "Wis"
override val select_hours = "Selecteer uren"
override val select_minutes = "Selecteer minuten"
override val about = "Over"
override val translators = "Vertalers"
override val developers = "Ontwikkelaars"
override val version_n = "Versie %s"
override val frequency = "Frequentie"
override val checkmark = "Vinkje"
override val strength = "Kracht"
override val best_streaks = "Beste reeksen"
override val current_streaks = "Huidige reeks"
override val number_of_repetitions = "Aantal herhalingen"
override val last_x_days = "Laatste %d dagen"
override val last_x_weeks = "Laatste %d weken"
override val last_x_months = "Laatste %d maanden"
override val last_x_years = "Laatste %d jaren"
override val all_time = "Altijd"
override val every_day = "Iedere dag"
override val every_week = "Iedere week"
override val two_times_per_week = "2 keer per week"
override val five_times_per_week = "5 keer per week"
override val custom_frequency = "Aangepast &#8230;"
override val help = "Hulp en veelgestelde vragen"
override val could_not_export = "Het exporteren van de data is mislukt."
override val could_not_import = "Importeren van data mislukt."
override val file_not_recognized = "Bestand niet herkend."
override val habits_imported = "Gewoontes succesvol geïmporteerd."
override val full_backup_success = "Volledige backup succesvol geëxporteerd."
override val import_data = "Importeer gegevens"
override val export_full_backup = "Exporteer volledige backup"
override val import_data_summary = "Ondersteund volledige backups geexporteerd door deze app. Ondersteund ook bestanden gegenereerd door Tickmate, HabitBull of Rewire. Zie FAQ voor meer informatie"
override val export_as_csv_summary = "Genereert bestanden die geopend kunnen worden door spreadsheet software zoals Microsoft Excel or OpenOffice Calc. Dit bestand kan niet terug geïmporteerd worden."
override val export_full_backup_summary = "Genereert een bestand met al uw gegevens. Dit bestand kan ook terug geïmporteerd worden."
override val bug_report_failed = "Het genereren van het foutenrapport is mislukt."
override val generate_bug_report = "Genereer foutenrapport"
override val troubleshooting = "Probleemoplossing"
override val help_translate = "Help deze app te vertalen"
override val night_mode = "Nachtmodus"
override val use_pure_black = "Gebruik puur zwart in nachtmodus"
override val pure_black_description = "Vervangt grijze achtergronden door puur zwart in nachtmodus. Vermindert batterijgebruik in telefoons met AMOLED scherm."
override val interface_preferences = "Interface"
override val reverse_days = "Omgekeerde volgorde van dagen"
override val reverse_days_description = "Toon dagen in omgekeerde volgorde op het hoofdscherm"
override val day = "Dag"
override val week = "Week"
override val month = "Maand"
override val quarter = "Kwartaal"
override val year = "Jaar"
override val total = "Totaal"
override val time_every = "keer per"
override val every_x_days = "Iedere %d dagen"
override val every_x_weeks = "Iedere %d weken"
override val every_x_months = "Iedere %d maanden"
override val score = "Score"
override val reminder_sound = "Herinneringsgeluid"
override val none = "Stil"
override val filter = "Filteren"
override val hide_completed = "Verberg voltooide"
override val hide_archived = "Verberg gearchiveerde"
override val sticky_notifications = "Maak meldingen persistent"
override val sticky_notifications_description = "Voorkom dat meldingen weggehaald kunnen worden."
override val repair_database = "Database repareren"
override val database_repaired = "Database gerepareerd."
override val uncheck = "Deselecteren"
override val toggle = "Omkeren"
override val action = "Actie"
override val habit = "Gewoonte"
override val sort = "Sorteren"
override val manually = "Handmatig"
override val by_name = "Bij naam"
override val by_color = "Bij kleur"
override val by_score = "Bij score"
override val download = "Downloaden"
override val export = "Exporteren"
}

@ -1,165 +0,0 @@
// --------------------------------------------------------------------------
// THIS FILE WAS AUTOMATICALLY GENERATED
//
// Please do not submit pull request to modify it. Corrections to translations
// may be submitted at https://translate.loophabits.org/
// --------------------------------------------------------------------------
package org.isoron.uhabits.i18n
class StringsEsperanto : Strings() {
override val app_name = "Loop Vaneoversikt"
override val main_activity_title = "Vaner"
override val action_settings = "Innstillinger"
override val edit = "Redigér"
override val delete = "Slett"
override val archive = "Arkivér"
override val unarchive = "Uarkivér"
override val add_habit = "Legg til vane"
override val color_picker_default_title = "Endr farge"
override val toast_habit_created = "Vane laget"
override val toast_habit_deleted = "Vaner slettet"
override val toast_habit_restored = "Vaner gjenopprettet"
override val toast_nothing_to_undo = "Ingenting å angre"
override val toast_nothing_to_redo = "Ingenting å ta tilbake"
override val toast_habit_changed = "Vane endret"
override val toast_habit_changed_back = "Vane tilbakeendret"
override val toast_habit_archived = "Vaner arkivert"
override val toast_habit_unarchived = "Vaner uarkivert"
override val overview = "Oversikt"
override val habit_strength = "Vanestyrke"
override val history = "Logg"
override val clear = "Fjern"
override val description_hint = "Spørsmål (Gjorde du &#8230; i dag?)"
override val repeat = "Gjenta"
override val times_every = "ganger på"
override val days = "dager"
override val reminder = "Påminnelse"
override val discard = "Forkast"
override val save = "Lagr"
override val streaks = "Gjentakelser"
override val no_habits_found = "Du har ingen aktive vaner"
override val long_press_to_toggle = "Trykk og hold for å sjekke eller usjekke"
override val reminder_off = "Av"
override val validation_name_should_not_be_blank = "Navnet kan ikke stå tomt."
override val validation_number_should_be_positive = "Nummeret må være positivt."
override val validation_at_most_one_rep_per_day = "Du kan maks ha én repetisjon om dagen"
override val create_habit = "Lag vane"
override val edit_habit = "Redigér vane"
override val check = "Sjekk"
override val snooze = "Senere"
override val intro_title_1 = "Velkommen"
override val intro_description_1 = "Loop Vaneoversikt hjelper deg med å lage og beholde gode vaner."
override val intro_title_2 = "Lag noen nye vaner"
override val intro_description_2 = "Hver dag, etter du utfører vanen din, sett en hake på appen."
override val intro_title_3 = "Fortsett med å gjøre det"
override val intro_description_3 = "Vaner utført konsekvent over lang tid vil få en hel stjerne."
override val intro_title_4 = "Hold oversikt over fremgangen din"
override val intro_description_4 = "Detaljerte grafer viser deg hvordan vanene dine forbedrer seg over tid."
override val interval_15_minutes = "15 minutter"
override val interval_30_minutes = "30 minutter"
override val interval_1_hour = "1 time"
override val interval_2_hour = "2 timer"
override val interval_4_hour = "4 timer"
override val interval_8_hour = "8 timer"
override val interval_24_hour = "1 døgn"
override val pref_toggle_title = "Veksl med enkelttrykk"
override val pref_toggle_description = "Sett på haker med et enkelttrykk i stedet for å tykke og holde. Mer praktisk, men kan forårsake utilsiktede vekslinger."
override val pref_snooze_interval_title = "Slumreintervall på påminnelser"
override val pref_rate_this_app = "Vurdér denne appen på Google Play"
override val pref_send_feedback = "Send tilbakemelding til utviklerne"
override val pref_view_source_code = "Vis kildekode på GitHub"
override val pref_view_app_introduction = "Se på appintroduksjon"
override val links = "Lenker"
override val behavior = "Oppførsel"
override val name = "Navn"
override val settings = "Innstillinger"
override val snooze_interval = "Slumreintervall"
override val hint_title = "Visste du at?"
override val hint_drag = "For å sortere innleggene, trykk og hold på navnet til vanen, deretter dra den til det korrekte stedet."
override val hint_landscape = "Du kan se flere dager ved å sette telefonen din i landskapsmodus."
override val delete_habits = "Slett vaner"
override val delete_habits_message = "Vanene vil bli slettet permanent. Denne handlingen kan ikke angres."
override val habit_not_found = "Vane slettet / ikke funnet"
override val weekends = "Helger"
override val any_weekday = "Hverdager"
override val any_day = "Hvilken som helst dag i uken"
override val select_weekdays = "Velg dager"
override val export_to_csv = "Eksportér som CSV"
override val done_label = "Ferdig"
override val clear_label = "Fjern"
override val select_hours = "Velg timer"
override val select_minutes = "Velg minutter"
override val about = "Om"
override val translators = "Translatører"
override val developers = "Utviklere"
override val version_n = "Versjon %s"
override val frequency = "Hyppighet"
override val checkmark = "Hake"
override val strength = "Styrke"
override val best_streaks = "Beste gjentakelser"
override val current_streaks = "Nåværende gjentakelse"
override val number_of_repetitions = "Repetisjonsantall"
override val last_x_days = "Siste %d dager"
override val last_x_weeks = "Siste %d uker"
override val last_x_months = "Siste %d måneder"
override val last_x_years = "Siste %d år"
override val all_time = "Alltid"
override val every_day = "Hver dag"
override val every_week = "Hver uke"
override val two_times_per_week = "2 ganger i uken"
override val five_times_per_week = "5 ganger i uken"
override val custom_frequency = "Tilpasset &#8230;"
override val help = "Hjelp og FAQ"
override val could_not_export = "Mislyktes i å eksportere data."
override val could_not_import = "Mislyktes i å importere data."
override val file_not_recognized = "Fil ikke gjenkjent."
override val habits_imported = "Vaner suksessfullt importert."
override val full_backup_success = "Hel sikkerhetskopi suksessfullt eksportert."
override val import_data = "Importér data"
override val export_full_backup = "Eksportér hel sikkerhetskopi"
override val import_data_summary = "Støtter hele sikkerhetskopier eksportert av denne appen, i tillegg til filer generert av Tickmate, HabitBull, og Rewire. Sjekk ut FAQ for mer informasjon."
override val export_as_csv_summary = "Genererer filer som kan bli åpnet av regnearkprogrammer som Microsoft Excel og OpenOffice Calc. Disse filene kan ikke importeres tilbake."
override val export_full_backup_summary = "Genererer en fil som inneholder all dataen din. Denne filen kan ikke importeres tilbake."
override val bug_report_failed = "Mislyktes i å generere feilrapport."
override val generate_bug_report = "Generér feilrapport"
override val troubleshooting = "Feilsøkning"
override val help_translate = "Hjelp med å oversette denne appen"
override val night_mode = "Nattmodus"
override val use_pure_black = "Bruk batterisparing i nattmodus"
override val pure_black_description = "Bytter ut grå bakgunner med helt svarte i nattmodus. Reduserer betteribruk hos telefoner med AMOLED-skjerm."
override val interface_preferences = "Grensesnitt"
override val reverse_days = "Omvendt dagsrekkefølge"
override val reverse_days_description = "Vis dager i omvendt rekkefølge på hovedmenyen"
override val day = "Dag"
override val week = "Uke"
override val month = "Måned"
override val quarter = "Kvarter"
override val year = "År"
override val total = "Totalt"
override val time_every = "gang på"
override val every_x_days = "Hver %d. dag"
override val every_x_weeks = "Hver %d. uke"
override val every_x_months = "Hver %d. måned"
override val score = "Poengsum"
override val reminder_sound = "Påminnelseslyd"
override val none = "Ingen"
override val filter = "Filtrér"
override val hide_completed = "Gjem fullførte"
override val hide_archived = "Gjem arkiverte"
override val sticky_notifications = "Gjør varslinger klebrige"
override val sticky_notifications_description = "Forhindrer varslinger fra å bli sveipet vekk."
override val repair_database = "Reparér database"
override val database_repaired = "Database reparert."
override val uncheck = "Usjekk"
override val toggle = "Veksl"
override val action = "Handling"
override val habit = "Vane"
override val sort = "Sortér"
override val manually = "Manuelt"
override val by_name = "Etter navn"
override val by_color = "Etter farge"
override val by_score = "Etter poengsum"
override val download = "Last ned"
override val export = "Eksportér"
}

@ -1,70 +0,0 @@
// --------------------------------------------------------------------------
// THIS FILE WAS AUTOMATICALLY GENERATED
//
// Please do not submit pull request to modify it. Corrections to translations
// may be submitted at https://translate.loophabits.org/
// --------------------------------------------------------------------------
package org.isoron.uhabits.i18n
class StringsFinnish : Strings() {
override val app_name = "Rutiini - Tracker"
override val main_activity_title = "Rutiinit"
override val action_settings = "Asetukset"
override val edit = "Muokkaa"
override val delete = "Poista"
override val archive = "Arkistoi"
override val add_habit = "Lisää rutiini"
override val color_picker_default_title = "Vaihda väriä"
override val toast_habit_created = "Rutiini luotu"
override val toast_habit_deleted = "Rutiinit poistettu"
override val toast_habit_restored = "Rutiinit palautettu"
override val toast_habit_changed = "Rutiini muutettu"
override val toast_habit_changed_back = "Rutiini muutettu takaisin"
override val overview = "Yleiskatsaus"
override val history = "Historia"
override val clear = "Tyhjennä"
override val description_hint = "Kysymys (Teitkö... tänään?)"
override val repeat = "Toista"
override val times_every = "kertaa"
override val days = "päivässä"
override val reminder = "Muistutus"
override val discard = "Hylkää"
override val save = "Tallenna"
override val streaks = "Pisimmät toistot"
override val no_habits_found = "Ei aktiivisia rutiineja"
override val long_press_to_toggle = "Paina pitkään merkitäksesi suoritetuksi tai postaaksesi suorituksen"
override val reminder_off = "Pois päältä"
override val validation_name_should_not_be_blank = "Nimi ei voi olla tyhjä."
override val validation_number_should_be_positive = "Luvun on oltava positiivinen."
override val create_habit = "Luo rutiini"
override val edit_habit = "Muokkaa rutiinia"
override val check = "Tehty"
override val snooze = "Lykkää"
override val intro_title_1 = "Tervetuloa"
override val intro_title_2 = "Merkitse uusia rutiineja"
override val intro_description_2 = "Joka päivä, suoritettuasi rutiinin, merkitse se sovellukseen."
override val links = "Linkit"
override val behavior = "Käyttäytyminen"
override val name = "Nimi"
override val settings = "Asetukset"
override val hint_title = "Tiesitkö?"
override val done_label = "Valmis"
override val clear_label = "Tyhjennä"
override val translators = "Kääntäjät"
override val developers = "Kehittäjät"
override val version_n = "Versio %s"
override val every_day = "Joka päivä"
override val every_week = "Joka viikko"
override val two_times_per_week = "2 kertaa viikossa"
override val five_times_per_week = "5 kertaa viikossa"
override val custom_frequency = "Mukautettu&#8230;"
override val night_mode = "Yötila"
override val use_pure_black = "Käytä puhdasta mustaa yötilassa"
override val day = "Päivä"
override val week = "Viikko"
override val month = "Kuukausi"
override val quarter = "Kvartaali"
override val year = "Vuosi"
override val total = "Yhteensä"
}

@ -1,165 +0,0 @@
// --------------------------------------------------------------------------
// THIS FILE WAS AUTOMATICALLY GENERATED
//
// Please do not submit pull request to modify it. Corrections to translations
// may be submitted at https://translate.loophabits.org/
// --------------------------------------------------------------------------
package org.isoron.uhabits.i18n
class StringsFrench : Strings() {
override val app_name = "Loop - Suivi d\'habitudes"
override val main_activity_title = "Habitudes"
override val action_settings = "Paramètres"
override val edit = "Modifier"
override val delete = "Supprimer"
override val archive = "Archiver"
override val unarchive = "Désarchiver"
override val add_habit = "Ajouter une habitude"
override val color_picker_default_title = "Changer la couleur"
override val toast_habit_created = "Habitude créée"
override val toast_habit_deleted = "Habitudes supprimées"
override val toast_habit_restored = "Habitudes rétablies"
override val toast_nothing_to_undo = "Rien à annuler"
override val toast_nothing_to_redo = "Rien à refaire"
override val toast_habit_changed = "Habitude changée"
override val toast_habit_changed_back = "Habitude restaurée"
override val toast_habit_archived = "Habitudes archivées"
override val toast_habit_unarchived = "Habitudes désarchivées"
override val overview = "Vue d\'ensemble"
override val habit_strength = "Force de l\'habitude"
override val history = "Historique"
override val clear = "Supprimer"
override val description_hint = "Question (As-tu ... aujourd\'hui ?)"
override val repeat = "Répéter"
override val times_every = "fois en"
override val days = "jours"
override val reminder = "Rappel"
override val discard = "Annuler"
override val save = "Sauvegarder"
override val streaks = "Séries"
override val no_habits_found = "Vous n\'avez pas d\'habitudes actives"
override val long_press_to_toggle = "Appuyez longtemps pour cocher ou décocher"
override val reminder_off = "Aucun"
override val validation_name_should_not_be_blank = "Le nom ne peut être vide."
override val validation_number_should_be_positive = "Le nombre doit être positif."
override val validation_at_most_one_rep_per_day = "Vous pouvez avoir au plus une répétition par jour"
override val create_habit = "Créer une habitude"
override val edit_habit = "Modifier l\'habitude"
override val check = "Cocher"
override val snooze = "Plus tard"
override val intro_title_1 = "Bienvenue"
override val intro_description_1 = "Loop - Suivi d\'habitudes vous aide à créer et maintenir de bonnes habitudes."
override val intro_title_2 = "Créez de nouvelles habitudes"
override val intro_description_2 = "Chaque jour, après avoir réalisé votre habitude, cochez-la sur l\'application."
override val intro_title_3 = "Continuez à le faire"
override val intro_description_3 = "Les habitudes régulières pendant une période de temps étendue gagneront une étoile complète."
override val intro_title_4 = "Suivez votre progrès"
override val intro_description_4 = "Des graphiques détaillés vous montrent comment vos habitudes évoluent au fil du temps."
override val interval_15_minutes = "15 minutes"
override val interval_30_minutes = "30 minutes"
override val interval_1_hour = "1 heure"
override val interval_2_hour = "2 heures"
override val interval_4_hour = "4 heures"
override val interval_8_hour = "8 heures"
override val interval_24_hour = "24 heures"
override val pref_toggle_title = "Valider l\'habitude avec un appui court"
override val pref_toggle_description = "Valide l\'habitude avec un appui court plutôt qu\'un appuie long. Plus pratique, mais peut causer des activations accidentelles."
override val pref_snooze_interval_title = "Intervalle de report des rappels"
override val pref_rate_this_app = "Notez cette app sur le Google Play Store"
override val pref_send_feedback = "Envoyez un avis au développeur"
override val pref_view_source_code = "Voir le code source sur GitHub"
override val pref_view_app_introduction = "Voir l\'introduction de l\'app"
override val links = "Liens"
override val behavior = "Comportement"
override val name = "Nom"
override val settings = "Paramètres"
override val snooze_interval = "Intervalle de report"
override val hint_title = "Le saviez-vous ?"
override val hint_drag = "Pour réordonner les habitudes, faites un appui long sur le nom de l\'habitude et placez-la à la bonne place."
override val hint_landscape = "Vous pouvez voir plus de jours en mettant votre téléphone en mode paysage."
override val delete_habits = "Supprimer des habitudes"
override val delete_habits_message = "Les habitudes seront supprimées définitivement. Cette action est irréversible."
override val habit_not_found = "Habitude supprimée / introuvable"
override val weekends = "Weekends"
override val any_weekday = "Du lundi au vendredi"
override val any_day = "N\'importe quel jour"
override val select_weekdays = "Sélectionner des jours"
override val export_to_csv = "Exporter les données dans un fichier CSV"
override val done_label = "Fait"
override val clear_label = "Supprimer"
override val select_hours = "Sélectionner les heures"
override val select_minutes = "Sélectionner les minutes"
override val about = "À propos"
override val translators = "Traducteurs"
override val developers = "Développeurs"
override val version_n = "Version %s"
override val frequency = "Fréquence"
override val checkmark = "Case à cocher"
override val strength = "Force"
override val best_streaks = "Meilleures séries"
override val current_streaks = "Série actuelle"
override val number_of_repetitions = "Nombre de répétitions"
override val last_x_days = "%d derniers jours"
override val last_x_weeks = "%d dernières semaines"
override val last_x_months = "%d derniers mois"
override val last_x_years = "%d dernières années"
override val all_time = "Depuis le début"
override val every_day = "Tous les jours"
override val every_week = "Toutes les semaines"
override val two_times_per_week = "2 fois par semaine"
override val five_times_per_week = "5 fois par semaine"
override val custom_frequency = "Personnalisée ..."
override val help = "Aide & FAQ"
override val could_not_export = "Export des données échoué."
override val could_not_import = "Import des données échoué."
override val file_not_recognized = "Fichier non reconnu"
override val habits_imported = "Habitudes importées avec succès"
override val full_backup_success = "Sauvegarde complète exportée avec succès"
override val import_data = "Importer des données"
override val export_full_backup = "Exporter une sauvegarde complète"
override val import_data_summary = "Supporte les sauvegardes complètes générées par cette application, ainsi que les fichiers Tickmate, HabitBull et Rewire. Voir la FAQ pour plus d\'informations."
override val export_as_csv_summary = "Génère des fichiers pouvant être ouverts par des tableurs comme Microsoft Excel ou LibreOffice Calc. Ce fichier ne peut pas être réimporté."
override val export_full_backup_summary = "Génère un fichier contenant toutes vos données. Ce fichier peut être réimporté."
override val bug_report_failed = "La génération du rapport de bug a échouée."
override val generate_bug_report = "Générer un rapport de bug."
override val troubleshooting = "Résolution de problèmes"
override val help_translate = "Aider à traduire cette application"
override val night_mode = "Mode Nuit"
override val use_pure_black = "Utiliser un noir pur dans le mode nuit"
override val pure_black_description = "Remplacer le fond gris par un noir pur dans le mode nuit ; ça réduit lusage de la batterie des appareils ayant un écran AMOLED."
override val interface_preferences = "Interface"
override val reverse_days = "Inverser l\'ordre des jours"
override val reverse_days_description = "Montrer les jours dans l\'ordre inversé sur l\'écran principal"
override val day = "Jour"
override val week = "Semaine"
override val month = "Mois"
override val quarter = "Trimestre"
override val year = "Année"
override val total = "Total"
override val time_every = "fois tous les"
override val every_x_days = "Tous les %d jours"
override val every_x_weeks = "Toutes les %d semaines"
override val every_x_months = "Tous les %d mois"
override val score = "Score"
override val reminder_sound = "Son de rappel"
override val none = "Aucun"
override val filter = "Filtre"
override val hide_completed = "Cacher les habitudes complétées"
override val hide_archived = "Cacher les habitudes archivées"
override val sticky_notifications = "Rendre les notifications persistantes"
override val sticky_notifications_description = "Évite que les notifications ne soient enlevées."
override val repair_database = "Réparer la base de données"
override val database_repaired = "Base de données réparée."
override val uncheck = "Décocher"
override val toggle = "Basculer"
override val action = "Action"
override val habit = "Habitude"
override val sort = "Trier"
override val manually = "Manuellement"
override val by_name = "Par nom"
override val by_color = "Par couleur"
override val by_score = "Par score"
override val download = "Télécharger"
override val export = "Exporter"
}

@ -1,165 +0,0 @@
// --------------------------------------------------------------------------
// THIS FILE WAS AUTOMATICALLY GENERATED
//
// Please do not submit pull request to modify it. Corrections to translations
// may be submitted at https://translate.loophabits.org/
// --------------------------------------------------------------------------
package org.isoron.uhabits.i18n
class StringsGerman : Strings() {
override val app_name = "Loop \"Gewohnheiten Tracking\""
override val main_activity_title = "Gewohnheiten"
override val action_settings = "Einstellungen"
override val edit = "Bearbeiten"
override val delete = "Löschen"
override val archive = "Archivieren"
override val unarchive = "Dearchivieren"
override val add_habit = "Gewohnheit hinzufügen"
override val color_picker_default_title = "Farbe ändern"
override val toast_habit_created = "Gewohnheit erstellt"
override val toast_habit_deleted = "Gewohnheiten gelöscht"
override val toast_habit_restored = "Gewohnheiten wiederhergestellt"
override val toast_nothing_to_undo = "Nichts zum Rückgängig machen"
override val toast_nothing_to_redo = "Nichts zum Wiederherstellen"
override val toast_habit_changed = "Gewohnheit geändert"
override val toast_habit_changed_back = "Gewohnheit zurückgeändert"
override val toast_habit_archived = "Gewohnheiten archiviert"
override val toast_habit_unarchived = "Gewohnheiten dearchiviert"
override val overview = "Übersicht"
override val habit_strength = "Stärke"
override val history = "Verlauf"
override val clear = "Löschen"
override val description_hint = "Frage (Hast du heute ...?)"
override val repeat = "Wiederhole"
override val times_every = "Mal in"
override val days = "Tagen"
override val reminder = "Erinnerung"
override val discard = "Verwerfen"
override val save = "Speichern"
override val streaks = "Serien"
override val no_habits_found = "Du hast keine aktiven Gewohnheiten"
override val long_press_to_toggle = "Tippe und halte um aus- bzw. abzuwählen"
override val reminder_off = "Aus"
override val validation_name_should_not_be_blank = "Name darf nicht leer sein."
override val validation_number_should_be_positive = "Zahl muss positiv sein."
override val validation_at_most_one_rep_per_day = "Du kannst höchstens eine Wiederholung pro Tag haben"
override val create_habit = "Gewohnheit erstellen"
override val edit_habit = "Gewohnheit bearbeiten"
override val check = "Markieren"
override val snooze = "Später"
override val intro_title_1 = "Willkommen"
override val intro_description_1 = "Loop Habit Tracker hilft dir dabei, gute Gewohnheiten anzunehmen."
override val intro_title_2 = "Erstelle neue Gewohnheiten"
override val intro_description_2 = "Hake die Gewohnheit jeden Tag in der App ab, nachdem du sie erledigt hast."
override val intro_title_3 = "Bleib dran"
override val intro_description_3 = "Gewohnheiten, die über einen längeren Zeitraum absolviert werden, bekommen einen ganzen Stern."
override val intro_title_4 = "Verfolge deinen Fortschritt"
override val intro_description_4 = "Detaillierte Diagramme zeigen dir an, wie sich deine Gewohnheiten entwickelt haben."
override val interval_15_minutes = "15 Minuten"
override val interval_30_minutes = "30 Minuten"
override val interval_1_hour = "1 Stunde"
override val interval_2_hour = "2 Stunden"
override val interval_4_hour = "4 Stunden"
override val interval_8_hour = "8 Stunden"
override val interval_24_hour = "24 Stunden"
override val pref_toggle_title = "Markierung durch kurzes Drücken ändern"
override val pref_toggle_description = "Markierungen durch einfaches Tippen setzen anstatt durch Tippen und Halten. Bequemer, kann aber versehentlich eine Markierung ändern."
override val pref_snooze_interval_title = "\"Später erinnern\"-Intervall bei Erinnerungen"
override val pref_rate_this_app = "Bewerte diese App auf Google Play"
override val pref_send_feedback = "Sende dem Entwickler Feedback"
override val pref_view_source_code = "Zeige den Quellcode auf GitHub"
override val pref_view_app_introduction = "Zeige die App-Einführung"
override val links = "Links"
override val behavior = "Verhalten"
override val name = "Name"
override val settings = "Einstellungen"
override val snooze_interval = "\"Später erinnern\"-Intervall"
override val hint_title = "Wusstest du?"
override val hint_drag = "Um Einträge umzusortieren, tippe, halte und ziehe sie an die richtige Stelle."
override val hint_landscape = "Du kannst mehr Tage sehen, wenn du dein Smartphone quer hältst."
override val delete_habits = "Lösche Gewohnheiten"
override val delete_habits_message = "Die Gewohnheit wird für immer gelöscht. Dies kann nicht rückgängig gemacht werden."
override val habit_not_found = "Gewohnheit gelöscht / nicht gefunden"
override val weekends = "An Wochenenden"
override val any_weekday = "Montag bis Freitag"
override val any_day = "Jeden Tag"
override val select_weekdays = "Wähle Tage aus"
override val export_to_csv = "Exportiere als CSV"
override val done_label = "Fertig"
override val clear_label = "Löschen"
override val select_hours = "Wähle Stunden"
override val select_minutes = "Wähle Minuten"
override val about = "Über"
override val translators = "Übersetzer"
override val developers = "Entwickler"
override val version_n = "Version %s"
override val frequency = "Häufigkeit"
override val checkmark = "Häkchen"
override val strength = "Stärke"
override val best_streaks = "Beste Serien"
override val current_streaks = "Derzeitige Serie"
override val number_of_repetitions = "Anzahl der Wiederholungen"
override val last_x_days = "Letzten %d Tage"
override val last_x_weeks = "Letzten %d Wochen"
override val last_x_months = "Letzten %d Monate"
override val last_x_years = "Letzten %d Jahre"
override val all_time = "Allzeit"
override val every_day = "Jeden Tag"
override val every_week = "Jede Woche"
override val two_times_per_week = "2 Mal pro Woche"
override val five_times_per_week = "5 Mal pro Woche"
override val custom_frequency = "Benutzerdefiniert"
override val help = "Hilfe & FAQ"
override val could_not_export = "Fehler beim Exportieren der Daten."
override val could_not_import = "Fehler beim Importieren der Daten."
override val file_not_recognized = "Datei nicht erkannt."
override val habits_imported = "Gewohnheiten erfolgreich importiert."
override val full_backup_success = "Vollständige Sicherung erfolgreich exportiert."
override val import_data = "Importiere Daten"
override val export_full_backup = "Exportiere vollständige Sicherung"
override val import_data_summary = "Unterstützt vollständige Sicherungen dieser App sowie Sicherungen von Tickmate, HabitBull und Rewire. Siehe FAQ für weitere Informationen."
override val export_as_csv_summary = "Erstellt Dateien, die von Tabellenkalkulationsprogrammen wie Microsoft Excel oder LibreOffice Calc geöffnet werden können. Diese Dateien können nicht wieder importiert werden."
override val export_full_backup_summary = "Erstellt eine Datei, die alle deine Daten enthält. Diese Datei kann wieder importiert werden."
override val bug_report_failed = "Fehler beim Erstellen eines Fehlerberichts."
override val generate_bug_report = "Erstelle einen Fehlerbericht"
override val troubleshooting = "Fehlerbehebung"
override val help_translate = "Hilf mit, diese App zu übersetzen"
override val night_mode = "Nachtmodus"
override val use_pure_black = "Verwende reines Schwarz im Nachtmodus"
override val pure_black_description = "Ersetzt im Nachtmodus das Grau im Hintergrund durch ein reines Schwarz. Reduziert den Stromverbrauch von Smartphones mit einem AMOLED Display."
override val interface_preferences = "Oberfläche"
override val reverse_days = "Kehre die Tagesreihenfolge um"
override val reverse_days_description = "Zeigt die Tage im Hauptfenster in umgekehrter Reihenfolge an"
override val day = "Tag"
override val week = "Woche"
override val month = "Monat"
override val quarter = "Quartal"
override val year = "Jahr"
override val total = "Gesamt"
override val time_every = "Mal in"
override val every_x_days = "Alle %d Tage"
override val every_x_weeks = "Alle %d Wochen"
override val every_x_months = "Alle %d Monate"
override val score = "Wertung"
override val reminder_sound = "Erinnerungston"
override val none = "Keiner"
override val filter = "Filter"
override val hide_completed = "Abgeschlossene verbergen"
override val hide_archived = "Archivierte verbergen"
override val sticky_notifications = "Fixiere Benachrichtigungen"
override val sticky_notifications_description = "Verhindert das Wegwischen von Benachrichtigungen."
override val repair_database = "Repariere Datenbank"
override val database_repaired = "Datenbank repariert."
override val uncheck = "Abwählen"
override val toggle = "Umschalten"
override val action = "Aktion"
override val habit = "Gewohnheit"
override val sort = "Sortiere"
override val manually = "Manuell"
override val by_name = "Nach Name"
override val by_color = "Nach Farbe"
override val by_score = "Nach Wertung"
override val download = "Runterladen"
override val export = "Exportieren"
}

@ -1,144 +0,0 @@
// --------------------------------------------------------------------------
// THIS FILE WAS AUTOMATICALLY GENERATED
//
// Please do not submit pull request to modify it. Corrections to translations
// may be submitted at https://translate.loophabits.org/
// --------------------------------------------------------------------------
package org.isoron.uhabits.i18n
class StringsGreek : Strings() {
override val app_name = "Loop - Καταγραφή Συνηθειών"
override val main_activity_title = "Συνήθειες"
override val action_settings = "Ρυθμίσεις"
override val edit = "Επεξεργασία"
override val delete = "Διαγραφή"
override val archive = "Αρχειοθέτηση"
override val unarchive = "Κατάργηση αρχειοθέτησης"
override val add_habit = "Νέα συνήθεια"
override val color_picker_default_title = "Αλλαγή χρώματος"
override val toast_habit_created = "Δημιουργήθηκε συνήθεια."
override val toast_habit_deleted = "Συνήθεια διαγράφτηκε."
override val toast_habit_restored = "Η συνήθεια επαναφέρθηκε."
override val toast_nothing_to_undo = "Τίποτα για αναίρεση"
override val toast_nothing_to_redo = "Τίποτα προς επανάληψη."
override val toast_habit_changed = "Η συνήθεια άλλαξε"
override val toast_habit_changed_back = "Δεν έγινε αλλαγή."
override val toast_habit_archived = "Η συνήθεια αρχειοθετήθηκε."
override val toast_habit_unarchived = "Έγινε αφαίρεση αρχειοθέτησης."
override val overview = "Επισκόπηση"
override val habit_strength = "Δύναμη συνήθειας"
override val history = "Ιστορικό"
override val clear = "Εκκαθάριση"
override val description_hint = "Ερώτηση (Κάνατε...σήμερα;)"
override val repeat = "Επανέλαβε"
override val times_every = "φορές την"
override val days = "ημέρες"
override val reminder = "Υπενθύμιση"
override val discard = "Απόρριψη"
override val save = "Αποθήκευση"
override val streaks = "Σερί"
override val no_habits_found = "Δεν έχετε ενεργές συνήθειες"
override val long_press_to_toggle = "Πατήστε παρατεταμένα για επιλογή η αποεπιλογή"
override val reminder_off = "Χωρίς"
override val validation_name_should_not_be_blank = "Το όνομα δεν μπορεί να είναι κενό"
override val validation_number_should_be_positive = "Πρεπει να είναι θετικό"
override val validation_at_most_one_rep_per_day = "Μπορείτε να κάνετε μονάχα μία επανάληψη ανά ημέρα"
override val create_habit = "Δημιουργία συνήθειας"
override val edit_habit = "Επεξεργασία συνήθειας"
override val check = "Επιλογή"
override val snooze = "Αργότερα"
override val intro_title_1 = "Καλώς ορίσατε"
override val intro_description_1 = "Το Loop - Καταγραφή Συνηθειών σας βοηθάει να δημιουργήσετε και να διατηρήσετε καλές συνήθειες."
override val intro_title_2 = "Δημιουργήστε μερικές νέες συνήθειες"
override val intro_description_2 = "Κάθε μέρα, με το πέρας της συνήθειας, βάλτε ένα τικ στην εφαρμογή."
override val intro_title_3 = "Συνεχίστε να το κάνετε"
override val intro_description_3 = "Συνήθειες που εκτελούνται με συνέπεια για πολύ καιρό"
override val intro_title_4 = "Κατέγραψε την πρόοδο σου"
override val intro_description_4 = "Λεπτομερή διαγράμματα σας δείχνουν την πρόοδο των συνηθειών."
override val interval_15_minutes = "15 λεπτά"
override val interval_30_minutes = "30 λεπτά"
override val interval_1_hour = "1 ώρα"
override val interval_2_hour = "2 ώρες"
override val interval_4_hour = "4 ώρες"
override val interval_8_hour = "8 ώρες"
override val pref_toggle_title = "Κάντε εναλλαγή των επαναλήψεων με σύντομο πάτημα"
override val pref_toggle_description = "Βολικότερο, αλλά ίσως προκαλέσει ακούσιες εναλλαγές."
override val pref_snooze_interval_title = "Διάστημα αναβολής υπενθυμίσεων"
override val pref_rate_this_app = "Βαθμολογήστε αυτή την εφαρμογή στο Google Play"
override val pref_send_feedback = "Στείλετε σχόλια"
override val pref_view_source_code = "Δείτε τον πηγαίο κώδικα στο GitHub"
override val pref_view_app_introduction = "Δείτε την εισαγωγή"
override val links = "Σύνδεσμοι"
override val behavior = "Συμπεριφορά"
override val name = "Όνομα"
override val settings = "Ρυθμίσεις"
override val snooze_interval = "Διάστημα αναβολής"
override val hint_title = "Γνωρίζατε;"
override val hint_drag = "Αναδιατάξετε τις συνήθειες πατώντας παρατεταμένα στο όνομα και σύροντας στην σωστή θέση."
override val hint_landscape = "Μπορείτε να δείτε περισσότερες ημέρες στην οριζόντια προβολή."
override val delete_habits = "Διαγραφή συνηθειών"
override val delete_habits_message = "Οι συνήθειες θα διαγραφτούν οριστικά. Αυτό δεν μπορεί να αναιρεθεί."
override val weekends = "Σαββατοκύριακα"
override val any_weekday = "Δευτέρα μέχρι Παρασκευή"
override val any_day = "Οποιαδήποτε μέρα της εβδομάδας"
override val select_weekdays = "Επιλογή ημερών"
override val export_to_csv = "Εξαγωγή σαν CSV"
override val done_label = "Έγινε"
override val clear_label = "Εκκαθάριση"
override val select_hours = "Επιλογή ωρών"
override val select_minutes = "Επιλογή λεπτών"
override val about = "Σχετικά με"
override val translators = "Μεταφραστές"
override val developers = "Προγραμματιστές"
override val version_n = "Έκδοση %s"
override val frequency = "Συχνότητα"
override val checkmark = "Σημάδι επιλογής"
override val strength = "Δύναμη"
override val best_streaks = "Καλύτερα σερί"
override val current_streaks = "Τρέχον σερί"
override val number_of_repetitions = "Αριθμός επαναλήψεων"
override val last_x_days = "Τελευταίες %d ημέρες"
override val last_x_weeks = "Τελευταίες %d εβδομάδες"
override val last_x_months = "Τελευταίους %d μήνες"
override val last_x_years = "Τελευταία %d χρόνια"
override val all_time = "Όλα"
override val every_day = "Κάθε μέρα"
override val every_week = "Κάθε εβδομάδα"
override val two_times_per_week = "2 φορές την εβδομάδα"
override val five_times_per_week = "5 φορές την εβδομάδα"
override val custom_frequency = "Προσαρμογή"
override val help = "Βοήθεια & FAQ"
override val could_not_export = "Αποτυχία εξαγωγής."
override val could_not_import = "Αποτυχία εισαγωγής."
override val file_not_recognized = "Άγνωστο αρχείο."
override val habits_imported = "Οι συνήθειες εισάχθηκαν επιτυχώς."
override val full_backup_success = "Το πλήρες αντίγραφο εξάχθηκε επιτυχώς."
override val import_data = "Εισαγωγή δεδομένων"
override val export_full_backup = "Εξαγωγή πλήρους αντιγ. ασφαλείας"
override val import_data_summary = "Υποστηρίζει πλήρως αντίγραφα ασφαλείας που έχουν εξαχθεί από την ίδια την εφαρμογή καθώς και από τα Tickmate, HabitBull και Rewire. Δείτε τις FAQ για περισσότερες πληροφορίες."
override val export_as_csv_summary = "Παράγει αρχεία τα οποία μπορούν να ανοιχτούν από προγράμματα υπολογιστικών φύλλων όπως το Microsoft Edge ή το OpenOffice Calc. Δεν γίνεται επανεισαγωγή του αρχείου."
override val export_full_backup_summary = "Παράγει ένα αρχείο το οποίο περιέχει όλα τα δεδομένα σας. Είναι δυνατή η επανεισαγωγή του αρχείου."
override val bug_report_failed = "Απέτυχε ή παραγωγή αναφοράς bug."
override val generate_bug_report = "Παραγωγή αναφοράς bug."
override val troubleshooting = "Αντιμετ.Προβλημάτων"
override val help_translate = "Βοηθήστε στην μετάφραση"
override val night_mode = "Νυχτ.Λειτ."
override val use_pure_black = "Χρήση απόλυτου μαύρου στη νυχτ.λειτουργία"
override val pure_black_description = "Αντικαθιστά τα γκρί υπόβαθρα με απόλυτα μαύρα σε νυχτ.λειτουργία. Μειώνει την κατανάλωση μπαταρίας σε συσκευές με οθόνη AMOLED."
override val interface_preferences = "Διεπιφάνεια"
override val reverse_days = "Αναστροφή σειράς των ημερών."
override val reverse_days_description = "Προβολή των ημερών σε αντίστροφη σειρά στην κυρία οθόνη."
override val day = "Ημέρα"
override val week = "Εβδομάδα"
override val month = "Μήνας"
override val quarter = "Τρίμηνο"
override val year = "Χρόνος"
override val time_every = "φορά σε"
override val every_x_days = "Κάθε %d ημέρες"
override val every_x_weeks = "Κάθε %d εβδομάδες"
override val every_x_months = "Κάθε %d μήνες"
override val score = "Σκόρ"
override val reminder_sound = "Ήχος υπενθύμισης"
override val none = "Σιωπηλό"
}

@ -1,165 +0,0 @@
// --------------------------------------------------------------------------
// THIS FILE WAS AUTOMATICALLY GENERATED
//
// Please do not submit pull request to modify it. Corrections to translations
// may be submitted at https://translate.loophabits.org/
// --------------------------------------------------------------------------
package org.isoron.uhabits.i18n
class StringsHebrew : Strings() {
override val app_name = "Loop Habit Tracker"
override val main_activity_title = "הרגלים"
override val action_settings = "הגדרות"
override val edit = "עריכה"
override val delete = "מחיקה"
override val archive = "ארכיון"
override val unarchive = "הוצא מארכיון"
override val add_habit = "הרגל חדש"
override val color_picker_default_title = "שינוי צבע"
override val toast_habit_created = "הרגל נוצר"
override val toast_habit_deleted = "הרגלים נמחקו"
override val toast_habit_restored = "הרגלים שוחזרו"
override val toast_nothing_to_undo = "אין מה לבטל"
override val toast_nothing_to_redo = "אין מה לבצע שוב"
override val toast_habit_changed = "הרגל השתנה"
override val toast_habit_changed_back = "הרגל השתנה בחזרה"
override val toast_habit_archived = "הרגלים הועברו לארכיון"
override val toast_habit_unarchived = "הרגלים הוצאו מארכיון"
override val overview = "מבט על"
override val habit_strength = "חוזק ההרגל"
override val history = "היסטוריה"
override val clear = "נקה"
override val description_hint = "שאלה (האם ... היום?)"
override val repeat = "חזור"
override val times_every = "פעמים ב-"
override val days = "ימים"
override val reminder = "תזכורת"
override val discard = "ביטול"
override val save = "שמירה"
override val streaks = "רצפים"
override val no_habits_found = "אין לך הרגלים פעילים"
override val long_press_to_toggle = "לחץ והחזק לסימון או ביטול הסימון"
override val reminder_off = "כבוי"
override val validation_name_should_not_be_blank = "השם אינו יכול להישאר ריק."
override val validation_number_should_be_positive = "מספר חייב להיות חיובי."
override val validation_at_most_one_rep_per_day = "לא ניתן להגדיר יותר מחזרה אחת ביום"
override val create_habit = "צור הרגל"
override val edit_habit = "ערוך הרגל"
override val check = "בוצע"
override val snooze = "מאוחר יותר"
override val intro_title_1 = "ברוכים הבאים"
override val intro_description_1 = "Loop Habit Tracker מסייע ליצור ולשמר הרגלים טובים."
override val intro_title_2 = "צרו הרגלים חדשים"
override val intro_description_2 = "כל יום, אחרי ביצוע ההרגל סמנו זאת באפליקציה."
override val intro_title_3 = "המשיכו לעשות זאת"
override val intro_description_3 = "הרגלים שיבוצעו בעקביות לאורך זמן רב יזכו בכוכב מלא."
override val intro_title_4 = "מעקב התקדמות"
override val intro_description_4 = "גרפים מפורטים מציגים כיצד ההרגלים שלך משתפרים לאורך זמן."
override val interval_15_minutes = "15 דקות"
override val interval_30_minutes = "30 דקות"
override val interval_1_hour = "1 שעה"
override val interval_2_hour = "2 שעות"
override val interval_4_hour = "4 שעות"
override val interval_8_hour = "8 שעות"
override val interval_24_hour = "24 שעות"
override val pref_toggle_title = "סימון הרגלים בלחיצה קצרה"
override val pref_toggle_description = "סמנו יעדים בהקשה קצרה במקום לחיצה ממושכת. נוח יותר, אך יכול להוביל ללחיצות לא מכוונות."
override val pref_snooze_interval_title = "מרווח נדנוד לתזכורות"
override val pref_rate_this_app = "דרג/י אותנו ב- Google Play"
override val pref_send_feedback = "שליחת משוב למפתחים"
override val pref_view_source_code = "צפייה בקוד המקור ב-GitHub"
override val pref_view_app_introduction = "צפייה בפרטים אודות האפליקציה"
override val links = "קישורים"
override val behavior = "התנהגות"
override val name = "שם"
override val settings = "הגדרות"
override val snooze_interval = "זמן בין נדנודים"
override val hint_title = "הידעת?"
override val hint_drag = "לשינוי סדר הההרגלים, לחצו לחיצה ארוכה על ההרגל וגררו אותו למקום הרצוי."
override val hint_landscape = "ניתן לראות ימים נוספים ע\"י סיבוב המסך לתצוגה רוחבית."
override val delete_habits = "מחיקת הרגלים"
override val delete_habits_message = "ההרגלים יימחקו לצמיתות. פעולה זו אינה ניתנת לביטול."
override val habit_not_found = "הרגל נמחק / לא נמצא"
override val weekends = "סופי שבוע"
override val any_weekday = "ימי חול"
override val any_day = "כל יום בשבוע"
override val select_weekdays = "בחירת ימים"
override val export_to_csv = "ייצוא כקובץ CSV"
override val done_label = "בוצע"
override val clear_label = "נקה"
override val select_hours = "בחר שעות"
override val select_minutes = "בחר דקות"
override val about = "אודות"
override val translators = "מתרגמים"
override val developers = "מפתחים"
override val version_n = "גרסה %s"
override val frequency = "תדירות"
override val checkmark = "סימון הרגל"
override val strength = "חוזק"
override val best_streaks = "רצף שיא"
override val current_streaks = "רצף נוכחי"
override val number_of_repetitions = "מספר חזרות"
override val last_x_days = "%d הימים האחרונים"
override val last_x_weeks = "%d השבועות האחרונים"
override val last_x_months = "%d החודשים האחרונים"
override val last_x_years = "%d השנים האחרונות"
override val all_time = "בכל הזמנים"
override val every_day = "כל יום"
override val every_week = "כל שבוע"
override val two_times_per_week = "פעמיים בשבוע"
override val five_times_per_week = "5 פעמים בשבוע"
override val custom_frequency = "מותאם אישית&#8230;"
override val help = "עזרה ושאלות נפוצות"
override val could_not_export = "ייצוא נתונים נכשל."
override val could_not_import = "ייבוא נתונים נכשל."
override val file_not_recognized = "קובץ לא מזוהה."
override val habits_imported = "הרגלים יובאו בהצלחה."
override val full_backup_success = "גיבוי מלא יוצאה בהצלחה."
override val import_data = "ייבוא נתונים"
override val export_full_backup = "ייצוא גיבוי מלא"
override val import_data_summary = "תומך בכל הגיבויים שיוצאו ע\"י האפליקציה. כמו גם קבצים שנוצרו ע\"י Tickmate, HabitBull או Rewire. לפרטים נוספים ראו שאלות נפוצות."
override val export_as_csv_summary = "יוצר קבצים שניתן לפתוח על-ידי תוכנות גיליון אלקטרוני כגון Microsoft Excel או OpenOffice. אין אפשרות לייבא את הקובץ בחזרה."
override val export_full_backup_summary = "יוצר קובץ המכיל את כל הנתונים שלך. קובץ זה ניתן לייבא בחזרה."
override val bug_report_failed = "הפקת דוח שגיאות נכשלה."
override val generate_bug_report = "הפקת דוח שגיאות"
override val troubleshooting = "פתרון תקלות"
override val help_translate = "עזרו לנו לתרגם את האפליקציה"
override val night_mode = "מצב לילה"
override val use_pure_black = "רקע שחור למצב לילה"
override val pure_black_description = "החלפת הרקע האפור במצב לילה לשחור מוחלט. מפחית בזבוז סוללה במכשירים עם תצוגת AMOLED."
override val interface_preferences = "ממשק"
override val reverse_days = "הפיכת סדר הימים"
override val reverse_days_description = "מציג ימים בסדר הפוך במסך הראשי"
override val day = "יום"
override val week = "שבוע"
override val month = "חודש"
override val quarter = "רבעון"
override val year = "שנה"
override val total = "סה\"כ"
override val time_every = "פעמים ב-"
override val every_x_days = "כל %d ימים"
override val every_x_weeks = "כל %d שבועות"
override val every_x_months = "כל %d חודשים"
override val score = "ציון"
override val reminder_sound = "צליל תזכורת"
override val none = "ללא"
override val filter = "סינון"
override val hide_completed = "הסתר יעדים שהושלמו"
override val hide_archived = "הסתר ארכיון"
override val sticky_notifications = "צור תזכורות \"דביקות\""
override val sticky_notifications_description = "מונע החלקת וביטול תזכורות."
override val repair_database = "תיקון מסד נתונים"
override val database_repaired = "מאגר נתונים תוקן."
override val uncheck = "ביטול סימון"
override val toggle = "הפעלה כיבוי"
override val action = "פעולה"
override val habit = "הרגל"
override val sort = "מיון"
override val manually = "באופן ידני"
override val by_name = "לפי שם"
override val by_color = "לפי צבע"
override val by_score = "לפי ציון"
override val download = "הורדה"
override val export = "ייצוא"
}

@ -1,156 +0,0 @@
// --------------------------------------------------------------------------
// THIS FILE WAS AUTOMATICALLY GENERATED
//
// Please do not submit pull request to modify it. Corrections to translations
// may be submitted at https://translate.loophabits.org/
// --------------------------------------------------------------------------
package org.isoron.uhabits.i18n
class StringsHindi : Strings() {
override val app_name = "Loop आदत पर नजर"
override val main_activity_title = "आदतें"
override val action_settings = "सेटिंग्स"
override val edit = "संपादन"
override val delete = "मिटा देना"
override val archive = "संग्रह "
override val unarchive = "असंगृहीत करें"
override val add_habit = "आदत जोड़े"
override val color_picker_default_title = "रंग बदलें"
override val toast_habit_created = "आदत बनाए गए"
override val toast_habit_deleted = "आदत हटाया गया"
override val toast_habit_restored = "आदत फिर से चालू किया गया"
override val toast_nothing_to_undo = "कुछ भी नहीं पूर्ववत करने के लिए"
override val toast_nothing_to_redo = "कुछ भी नही फिर से करने के लिए"
override val toast_habit_changed = "आदत मे बदलाव"
override val toast_habit_changed_back = "आदत बहाल"
override val toast_habit_archived = "आदत संग्रहीत"
override val toast_habit_unarchived = "आदत को संग्रह से निकाला गया"
override val overview = "अवलोकन"
override val habit_strength = "आदत की ताक़त"
override val history = "इतिहास"
override val clear = "साफ़"
override val description_hint = "सवाल (क्या आज .......किया?)"
override val repeat = "दोहराए"
override val times_every = "बार"
override val days = "दिन"
override val reminder = "अनुस्मारक"
override val discard = "हटाना"
override val save = "सुरक्षित "
override val streaks = "लहर"
override val no_habits_found = "आपकी कोई सक्रिय आदत नही है"
override val long_press_to_toggle = "चेक या अनचेक करने के लिए दबाएँ व दबाएँ रखें "
override val reminder_off = "बंद"
override val validation_name_should_not_be_blank = "नाम को खाली नही छोड़ सकते"
override val validation_number_should_be_positive = "नंबर सकारात्मक डालें"
override val validation_at_most_one_rep_per_day = "आप एक दिन मे अधिक से अधिक एक पुनरावृत्ति हो सकती है"
override val create_habit = "आदत उत्पन्न करें"
override val edit_habit = "आदत संपादित करें"
override val check = "चेक"
override val snooze = "बाद में"
override val intro_title_1 = "स्वागत हे"
override val intro_description_1 = "लूप हैबिट ट्रैकर नई और अच्छी आदतों को बनाए रखने मे लिए मदद करता है ।"
override val intro_title_2 = "कुछ नई अच्छी आदतें बनाएँ"
override val intro_description_2 = "हर दिन, अपनी आदत के प्रदर्शन के बाद , अप्प पर एक सही का निशान डालें"
override val intro_title_3 = "इसे करते रहें"
override val intro_description_3 = "एक लंबे समय के लिए लगातार प्रदर्शन की आदतों से पूर्ण स्टार अर्जित करेंगे।"
override val intro_title_4 = "अपनी प्रगति को ट्रैक करें"
override val intro_description_4 = "विस्तृत रेखांकन आपको बताएंगे कि कैसे अपनी आदतों में समय के साथ सुधार करें"
override val interval_15_minutes = "15 मिनिट"
override val interval_30_minutes = "30 मिनिट"
override val interval_1_hour = "1 घंटा"
override val interval_2_hour = "2 घंटा"
override val interval_4_hour = "4 घंटा"
override val interval_8_hour = "8 घंटा"
override val interval_24_hour = "24 घंटे"
override val pref_toggle_title = "टॉगल पुनरावृत्ति हल्का दबाने से"
override val pref_toggle_description = "अधिक सुविधाजनक है, लेकिन आकस्मिक टॉगल हो सकता है ।"
override val pref_snooze_interval_title = "रिमाइंडर मे स्नूज़ अंतराल"
override val pref_rate_this_app = "गूगले प्ले पर इस ऐप्लिकेशन को रेट करें"
override val pref_send_feedback = "डेवेलपर को प्रतिक्रिया भेजें "
override val pref_view_source_code = "Github मे सोर्स कोड देखें"
override val pref_view_app_introduction = "अप्प्प का परिचय देखें"
override val links = "लिंक"
override val behavior = "व्यवहार"
override val name = "नाम"
override val settings = "सेटिंग्स"
override val snooze_interval = "झपकी का अंतराल"
override val hint_title = "क्या आप जानते .?"
override val hint_drag = "प्रविष्टियों को पुनर्व्यवस्थित करने के लिए, आदत के नाम पर प्रेस करें और सही जगह पर खींचें।"
override val hint_landscape = " अपने फोन को लांडसकपे मोड मे रख कर आप अधिक दिनों से देख सकते हैं"
override val delete_habits = "आदत हटाएँ"
override val delete_habits_message = "आदतों को स्थायी रूप से हटा दिया जाएगा। इस क्रिया को पूर्ववत नहीं किया जा सकता है।"
override val weekends = "सप्ताहांत"
override val any_weekday = "सोमवार से शुक्रवार"
override val any_day = "सप्ताह का कोई भी दिन"
override val select_weekdays = "दिन चुनें"
override val export_to_csv = "CSV में निर्यात करें"
override val done_label = "पूर्ण"
override val clear_label = "साफ़"
override val select_hours = "घंटे चुनें"
override val select_minutes = "मिनट चुनें"
override val about = "बारे में"
override val translators = "अनुवादक"
override val developers = "डिवेलपर"
override val version_n = "वर्ज़न %s"
override val frequency = "आवृत्ति"
override val checkmark = "सही का चिह्न"
override val strength = "ताक़त"
override val best_streaks = "बेस्ट स्ट्रीक्स"
override val current_streaks = "वर्तमान स्ट्रीक्स"
override val number_of_repetitions = "repetitions की संख्या"
override val last_x_days = "अंतिम %d दिवस"
override val last_x_weeks = "पिछले %d सप्ताह"
override val last_x_months = "पिछले %d माह"
override val last_x_years = "पिछले %d साल"
override val all_time = "पूरा समय"
override val every_day = "हर दिन"
override val every_week = "प्रति सप्ताह"
override val two_times_per_week = "प्रति सप्ताह 2 बार"
override val five_times_per_week = "प्रति सप्ताह 5 बार"
override val custom_frequency = "अन्य"
override val help = "मदद और बार-बार सवाल पूछने वाले सवाल"
override val could_not_export = "डेटा निर्यात करने में विफल"
override val could_not_import = "डेटा आयात करने में विफल रहा है"
override val file_not_recognized = "फाइल की पहचान नही "
override val habits_imported = "आदतों को सफलतापूर्वक आयात"
override val full_backup_success = "पूर्ण बैकअप सफलतापूर्वक निर्यात किया।"
override val import_data = "डेटा आयात"
override val export_full_backup = "निर्यात पूर्ण बैकअप"
override val import_data_summary = "इस एप्लिकेशन के द्वारा निर्यात पूर्ण बैकअप को सपोर्ट करता है , साथ ही फाइलों टिक्कमते , हबिठबुल्ल या रिवाइयर द्वारा उत्पन्न फाइल्स को सपोर्ट करता है। अधिक जानकारी के लिए सामान्य प्रश्न देखें।"
override val export_as_csv_summary = "ऐसी फाइल्स उत्पन्न करता है जो स्प्रेडशीट सॉफ़्टवरेस जैसे Microsoft Excel, OpenOffice Calc मे खुल सकती है. इस फ़ाइल में वापस आयात नहीं किया जा सकता है।"
override val export_full_backup_summary = "ऐसी फाइल्स उत्पन्न करता है जिसमे आपका सारा डेटा रहता है इस फ़ाइल को वापस आयात किया जा सकता है।"
override val bug_report_failed = "बग रिपोर्ट जनरेट करने मे असफल"
override val generate_bug_report = "बग रिपोर्ट जनरेट करें"
override val troubleshooting = "समस्या निवारण"
override val help_translate = "इस एप्लिकेशन का अनुवाद करने में मदद करें"
override val night_mode = "नाइट मोड"
override val use_pure_black = "नाइट मोड मे पूरा काला यूज़ करें"
override val pure_black_description = "रात मोड में शुद्ध काले रंग के साथ ग्रे पृष्ठभूमि में बदलें. अमोलेड प्रदर्शन के साथ फोन में बैटरी उपयोग कम कर देता है ।"
override val interface_preferences = "इंटरफेस"
override val reverse_days = "दिनों की रिवर्स आदेश"
override val reverse_days_description = "दिनों को रिवर्स क्रम में मुख्य स्क्रीन पर दिखाएँ"
override val day = "दिन "
override val week = "हफ्ते"
override val month = "माह"
override val quarter = "तिमाही"
override val year = "साल"
override val time_every = "समय में"
override val every_x_days = "हर %d दिन"
override val every_x_weeks = "हर %d हफ्ते"
override val every_x_months = "हर %d महीने"
override val score = "स्कोर"
override val reminder_sound = "अनुस्मारक ध्वनि"
override val none = "कोई आवाज नहीं"
override val filter = "फिल्टर"
override val repair_database = "डेटाबेस को रिपेयर करें"
override val database_repaired = "डेटाबेस रिपेयर सफल"
override val habit = "आदत"
override val sort = "सॉर्ट करें"
override val manually = "मैन्यूअली"
override val by_name = "नाम द्वारा"
override val by_color = "रंग द्वारा"
override val by_score = "स्कोर से"
override val download = "डाउनलोड"
override val export = "एक्सपोर्ट करे"
}

@ -1,165 +0,0 @@
// --------------------------------------------------------------------------
// THIS FILE WAS AUTOMATICALLY GENERATED
//
// Please do not submit pull request to modify it. Corrections to translations
// may be submitted at https://translate.loophabits.org/
// --------------------------------------------------------------------------
package org.isoron.uhabits.i18n
class StringsHungarian : Strings() {
override val app_name = "Loop Szokásrögzítő"
override val main_activity_title = "Szokások"
override val action_settings = "Beállítások"
override val edit = "Szerkesztés"
override val delete = "Törlés"
override val archive = "Archiválás"
override val unarchive = "Újraaktiválás"
override val add_habit = "Új szokás"
override val color_picker_default_title = "Szín módosítása"
override val toast_habit_created = "Szokás létrehozva"
override val toast_habit_deleted = "Szokás törölve"
override val toast_habit_restored = "Szokás visszaállítva"
override val toast_nothing_to_undo = "Nincs mit visszavonni"
override val toast_nothing_to_redo = "Nincs mit újraalkalmazni"
override val toast_habit_changed = "Szokás módosítva"
override val toast_habit_changed_back = "Szokás visszaállítva"
override val toast_habit_archived = "Szokás archiválva"
override val toast_habit_unarchived = "Szokás újraaktiválva"
override val overview = "Áttekintés"
override val habit_strength = "Szokás erőssége"
override val history = "Napló"
override val clear = "Törlés"
override val description_hint = "Kérdés (Sikerült ma&#8230;?)"
override val repeat = "Ismétlődés"
override val times_every = "alk. /"
override val days = "nap"
override val reminder = "Emlékeztető"
override val discard = "Elvetés"
override val save = "Mentés"
override val streaks = "Szériák"
override val no_habits_found = "Nincs aktív szokásod"
override val long_press_to_toggle = "Tartsd lenyomva a bejelöléshez, vagy a jelölés törléséhez"
override val reminder_off = "Kikapcsolva"
override val validation_name_should_not_be_blank = "A megnevezés nem maradhat üresen."
override val validation_number_should_be_positive = "A számnak pozitívnak kell lennie."
override val validation_at_most_one_rep_per_day = "Maximum napi 1 ismétlés lehetséges"
override val create_habit = "Szokás rögzítése"
override val edit_habit = "Szokás szerkesztése"
override val check = "Kipipálva"
override val snooze = "Később"
override val intro_title_1 = "Üdv!"
override val intro_description_1 = "A Loop Habit Tracker segít a jó szokások kialakításában és azok fenntartásában"
override val intro_title_2 = "Hozz létre néhány új szokást"
override val intro_description_2 = "Minden nap jelöld pipával az alkalmazásban, ahogy elvégeztél egy jó szokást."
override val intro_title_3 = "Ne hagyd abba"
override val intro_description_3 = "A hosszú időn keresztül folyamatosan fenntartott jó szokásokért teljes csillag jár."
override val intro_title_4 = "Kövesd a fejlődésed"
override val intro_description_4 = "A szokások fejlődésének időbeni alakulását részletes grafikonok mutatják."
override val interval_15_minutes = "15 perc"
override val interval_30_minutes = "30 perc"
override val interval_1_hour = "1 óra"
override val interval_2_hour = "2 óra"
override val interval_4_hour = "4 óra"
override val interval_8_hour = "8 óra"
override val interval_24_hour = "24 óra"
override val pref_toggle_title = "Bejelölés rövid koppintással"
override val pref_toggle_description = "Bejelölés koppintással nyomva tartás helyett. Kényelmesebb, de véletlen bejelöléseket okozhat."
override val pref_snooze_interval_title = "Szundi időtartama emlékeztetőnél"
override val pref_rate_this_app = "Értékeld az alkalmazást a Google Play-en"
override val pref_send_feedback = "Visszajelzés küldése a fejlesztőnek"
override val pref_view_source_code = "Forráskód megtekintése a GitHub-on"
override val pref_view_app_introduction = "Bemutató megtekintése"
override val links = "Linkek"
override val behavior = "Szokás"
override val name = "Megnevezés"
override val settings = "Beállítások"
override val snooze_interval = "Szundi időtartama"
override val hint_title = "Tudtad?"
override val hint_drag = "Az elemek újrarendezéséhez a koppints a szokás nevére, majd húzd a megfelelő helyre."
override val hint_landscape = "Több nap válik láthatóvá, ha fekvő módba állítod a telefonod kijelzőjét."
override val delete_habits = "Szokások törlése"
override val delete_habits_message = "A szokások véglegesen törölve lesznek. A műveletet nem lehet visszavonni."
override val habit_not_found = "Szokás törölve / nem található"
override val weekends = "Hétvégente"
override val any_weekday = "Hétfőtől péntekig"
override val any_day = "A hét bármely napján"
override val select_weekdays = "Napok kiválasztása"
override val export_to_csv = "Exportálás CSV-ként"
override val done_label = "Kész"
override val clear_label = "Törlés"
override val select_hours = "Óra kiválasztása"
override val select_minutes = "Perc kiválasztása"
override val about = "Névjegy"
override val translators = "Fordítók"
override val developers = "Fejlesztők"
override val version_n = "Verzió %s"
override val frequency = "Gyakoriság"
override val checkmark = "Pipa"
override val strength = "Erősség"
override val best_streaks = "Legjobb széria"
override val current_streaks = "Jelenlegi széria"
override val number_of_repetitions = "Ismétlődések száma"
override val last_x_days = "Utolsó %d nap"
override val last_x_weeks = "Utolsó %d hét"
override val last_x_months = "Utolsó %d hónap"
override val last_x_years = "Utolsó %d év"
override val all_time = "Mindig"
override val every_day = "Minden nap"
override val every_week = "Minden héten"
override val two_times_per_week = "Heti 2-szer"
override val five_times_per_week = "Hetente 5-ször"
override val custom_frequency = "Egyéni&#8230;"
override val help = "Súgó és GYIK"
override val could_not_export = "Nem sikerült az adatok exportálása."
override val could_not_import = "Nem sikerült az adatok importálása"
override val file_not_recognized = "A fájlt nem sikerült felismerni."
override val habits_imported = "A szokások importálása sikerült."
override val full_backup_success = "A teljes mentés sikeresen exportálva lett."
override val import_data = "Adat importálása"
override val export_full_backup = "Teljes mentés exportálása"
override val import_data_summary = "Támogatja a Loop Habit Tracker alkalmazás teljes mentéseit, illetve a Tickmate, HabitBull és Rewire alkalmazások formátumait is. További információt a GYIK-ben találsz."
override val export_as_csv_summary = "Olyan fájlokat generál, amit táblázatkezelőkkel lehet megnyitni (pl. Microsoft Excel-lel vagy OpenOffice Calc-kal). Ezt a fájlt nem lehet visszaimportálni."
override val export_full_backup_summary = "Olyan fájlt generál, amely tartalmazza minden adatodat. Ezt a fájlt vissza lehet importálni."
override val bug_report_failed = "Nem sikerült a hibajelentés generálása"
override val generate_bug_report = "Hibabejelentés generálása"
override val troubleshooting = "Hibaelhárítás"
override val help_translate = "Segíts lefordítani ezt az alkalmazást"
override val night_mode = "Éjszakai mód"
override val use_pure_black = "Fekete használata éjszakai módban"
override val pure_black_description = "A szürke hátteret tiszta feketére cseréli éjszakai módban. Csökkenti az energiafelhasználást AMOLED kijelzős telefonokon."
override val interface_preferences = "Kezelőfelület"
override val reverse_days = "Napok sorrendjének megfordítása"
override val reverse_days_description = "A főképernyőn fordított sorrendben mutatja a napokat"
override val day = "Nap"
override val week = "Hét"
override val month = "Hónap"
override val quarter = "Negyedév"
override val year = "Év"
override val total = "Összesen"
override val time_every = "alk. /"
override val every_x_days = "%d naponta"
override val every_x_weeks = "%d hetente"
override val every_x_months = "%d havonta"
override val score = "Pont"
override val reminder_sound = "Emlékeztető dallama"
override val none = "Nem ismétlődik"
override val filter = "Szűrő"
override val hide_completed = "Elvégzettek elrejtése"
override val hide_archived = "Archiváltak elrejtése"
override val sticky_notifications = "Az értesítések legyenek ragadósak"
override val sticky_notifications_description = "Megakadályozza az értesítések eltávolítását"
override val repair_database = "Adatbázis javítása"
override val database_repaired = "Adatbázis javítása kész."
override val uncheck = "Pipa kivétele"
override val toggle = "Ki/bekapcsolás"
override val action = "Művelet"
override val habit = "Szokás"
override val sort = "Rendezés"
override val manually = "Manuálisan"
override val by_name = "Megnevezés szerint"
override val by_color = "Színek szerint"
override val by_score = "Pont szerint"
override val download = "Letöltés"
override val export = "Exportálás"
}

@ -1,165 +0,0 @@
// --------------------------------------------------------------------------
// THIS FILE WAS AUTOMATICALLY GENERATED
//
// Please do not submit pull request to modify it. Corrections to translations
// may be submitted at https://translate.loophabits.org/
// --------------------------------------------------------------------------
package org.isoron.uhabits.i18n
class StringsIndonesian : Strings() {
override val app_name = "Loop Habit Tracker"
override val main_activity_title = "Kebiasaan"
override val action_settings = "Pengaturan"
override val edit = "Sunting"
override val delete = "Hapus"
override val archive = "Arsip"
override val unarchive = "Keluarkan dari arsip"
override val add_habit = "Tambah Kebiasaan"
override val color_picker_default_title = "Ganti warna"
override val toast_habit_created = "Kebiasaan ditambahkan."
override val toast_habit_deleted = "Kebiasaan dihapus."
override val toast_habit_restored = "Kebiasaan dipulihkan"
override val toast_nothing_to_undo = "Tidak ada aksi sebelumnya."
override val toast_nothing_to_redo = "Tidak ada aksi sesudahnya."
override val toast_habit_changed = "Kebiasaan diubah."
override val toast_habit_changed_back = "Kebiasaan telah dikembalikan."
override val toast_habit_archived = "Kebiasaan diarsipkan."
override val toast_habit_unarchived = "Kebiasaan dikeluarkan dari arsip."
override val overview = "Ikhtisar"
override val habit_strength = "Kekuatan Kebiasaan"
override val history = "Riwayat"
override val clear = "Bersihkan"
override val description_hint = "Pertanyaan (Sudahkah Anda ... hari ini?)"
override val repeat = "Ulangi"
override val times_every = "kali dalam"
override val days = "hari"
override val reminder = "Pengingat"
override val discard = "Batalkan"
override val save = "Simpan"
override val streaks = "Rentetan"
override val no_habits_found = "Anda tidak memiliki Kebiasaan yang aktif"
override val long_press_to_toggle = "Tekan dan tahan untuk menambah atau menghapus centang"
override val reminder_off = "Mati"
override val validation_name_should_not_be_blank = "Nama tidak boleh kosong."
override val validation_number_should_be_positive = "Angka harus positif."
override val validation_at_most_one_rep_per_day = "Maksimal satu kali pengulangan dalam satu hari"
override val create_habit = "Buat Kebiasaan"
override val edit_habit = "Sunting Kebiasaan"
override val check = "Tanda cek"
override val snooze = "Tunda"
override val intro_title_1 = "Selamat datang"
override val intro_description_1 = "Loop Habit Tracker membantu mencatat dan mengelola Kebiasaan baik Anda."
override val intro_title_2 = "Buat beberapa Kebiasaan baru"
override val intro_description_2 = "Berikan tanda cek setiap kali Anda selesai melakukannya."
override val intro_title_3 = "Terus lakukan"
override val intro_description_3 = "Kebiasaan yang dilakukan secara konsisten dalam jangka waktu panjang akan mendapatkan tanda bintang penuh."
override val intro_title_4 = "Lacak perkembangan Anda"
override val intro_description_4 = "Grafik terperinci menampilkan perkembangan Kebiasaanmu dari waktu ke waktu."
override val interval_15_minutes = "15 menit"
override val interval_30_minutes = "30 menit"
override val interval_1_hour = "1 jam"
override val interval_2_hour = "2 jam"
override val interval_4_hour = "4 jam"
override val interval_8_hour = "8 jam"
override val interval_24_hour = "24 jam"
override val pref_toggle_title = "Tandai dengan cepat."
override val pref_toggle_description = "Beri tanda cek dengan sekali ketuk bukan tekan-dan-tahan. Lebih nyaman namun memungkinkan kesalahan."
override val pref_snooze_interval_title = "Durasi tunda sejenak pada pengingat"
override val pref_rate_this_app = "Berikan rating aplikasi ini di Google Play"
override val pref_send_feedback = "Kirimkan umpan balik kepada Developer"
override val pref_view_source_code = "Lihat kode aplikasi di GitHub"
override val pref_view_app_introduction = "Tampilkan perkenalan aplikasi"
override val links = "Tautan"
override val behavior = "Kebiasaan"
override val name = "Nama"
override val settings = "Pengaturan"
override val snooze_interval = "Durasi tunda sejenak"
override val hint_title = "Sudahkah Anda tahu?"
override val hint_drag = "Untuk mengatur urutan, tekan dan tahan judul Kebiasaan lalu tempatkan pada posisi yang Anda inginkan."
override val hint_landscape = "Anda dapat melihat tampilan hari dengan merubah posisi menjadi mode landscape."
override val delete_habits = "Hapus Kebiasaan"
override val delete_habits_message = "Kebiasaan ini akan dihapus secara permanen. Tindakan ini tidak dapat dibatalkan."
override val habit_not_found = "Kebiasaan telah dihapus / tidak ditemukan"
override val weekends = "Akhir pekan"
override val any_weekday = "Senin - Jumat"
override val any_day = "Seluruh hari dalam satu minggu"
override val select_weekdays = "Pilih hari"
override val export_to_csv = "Ekspor (CSV)"
override val done_label = "Selesai"
override val clear_label = "Hapus"
override val select_hours = "Pilih jam"
override val select_minutes = "Pilih menit"
override val about = "Tentang"
override val translators = "Penerjemah"
override val developers = "Developer"
override val version_n = "Versi %s"
override val frequency = "Frekuensi"
override val checkmark = "Cek"
override val strength = "Kekuatan"
override val best_streaks = "Rentetan terbaik"
override val current_streaks = "Rentetan saat ini"
override val number_of_repetitions = "Jumlah pengulangan"
override val last_x_days = "%d hari terakhir"
override val last_x_weeks = "%d minggu terakhir"
override val last_x_months = "%d bulan terakhir"
override val last_x_years = "%d tahun terakhir"
override val all_time = "Seluruh waktu"
override val every_day = "Setiap hari"
override val every_week = "Setiap minggu"
override val two_times_per_week = "2 kali per minggu"
override val five_times_per_week = "5 kali per minggu"
override val custom_frequency = "Sesuaikan &#8230;"
override val help = "Bantuan & FAQ"
override val could_not_export = "Gagal mengekspor data."
override val could_not_import = "Gagal mengimpor data."
override val file_not_recognized = "File tidak dikenali."
override val habits_imported = "Impor data berhasil."
override val full_backup_success = "Seluruh data berhasil di-ekpor."
override val import_data = "Impor data"
override val export_full_backup = "Ekspor keseluruhan data"
override val import_data_summary = "Mendukung ekspor data dan berkas dari aplikasi Tickmate, HabitBull atau Rewire. Lihat FAQ untuk informasi lebih lanjut."
override val export_as_csv_summary = "Menghasilkan lembar kerja yang dapat dibuka menggunakan aplikasi seperti Microsoft Excel atau OpenOffice Calc. Berkas ini tidak dapat di-impor kembali."
override val export_full_backup_summary = "Menghasilkan berkas yang berisikan seluruh data. Berkas ini dapat di-impor kembali."
override val bug_report_failed = "Gagal membuat laporan masalah."
override val generate_bug_report = "Membuat laporan masalah"
override val troubleshooting = "Penyelesaian masalah"
override val help_translate = "Bantu menerjemahkan aplikasi ini"
override val night_mode = "Mode malam"
override val use_pure_black = "Gunakan warna hitam pada mode malam"
override val pure_black_description = "Ganti warna latar abu-abu dengan warna hitam pada mode malam. Mengurangi penggunaan baterai pada layar AMOLED."
override val interface_preferences = "Antar muka"
override val reverse_days = "Ubah urutan hari"
override val reverse_days_description = "Tampilkan hari dalam urutan terbalik pada layar utama"
override val day = "Hari"
override val week = "Minggu"
override val month = "Bulan"
override val quarter = "Kuartal"
override val year = "Tahun"
override val total = "Total"
override val time_every = "kali dalam"
override val every_x_days = "Setiap %d hari"
override val every_x_weeks = "Setiap %d minggu"
override val every_x_months = "Setiap %d bulan"
override val score = "Skor"
override val reminder_sound = "Suara pengingat"
override val none = "Hening"
override val filter = "Saring"
override val hide_completed = "Sembunyikan yang selesai"
override val hide_archived = "Sembunyikan arsip"
override val sticky_notifications = "Jadikan notifikasi lengket"
override val sticky_notifications_description = "Cegah pemberitahuan dari sapuan."
override val repair_database = "Perbaiki Basis Data"
override val database_repaired = "Basis Data diperbaiki."
override val uncheck = "Hapus centang"
override val toggle = "Alih"
override val action = "Tindakan"
override val habit = "Kebiasaan"
override val sort = "Urutkan"
override val manually = "Secara manual"
override val by_name = "Berdasarkan nama"
override val by_color = "Berdasarkan Warna"
override val by_score = "Berdasarkan Skor"
override val download = "Unduh"
override val export = "Ekspor"
}

@ -1,165 +0,0 @@
// --------------------------------------------------------------------------
// THIS FILE WAS AUTOMATICALLY GENERATED
//
// Please do not submit pull request to modify it. Corrections to translations
// may be submitted at https://translate.loophabits.org/
// --------------------------------------------------------------------------
package org.isoron.uhabits.i18n
class StringsItalian : Strings() {
override val app_name = "Loop"
override val main_activity_title = "Abitudini"
override val action_settings = "Impostazioni"
override val edit = "Modifica"
override val delete = "Elimina"
override val archive = "Archivia"
override val unarchive = "Ripristina"
override val add_habit = "Aggiungi abitudine"
override val color_picker_default_title = "Cambia colore"
override val toast_habit_created = "Abitudine creata"
override val toast_habit_deleted = "Abitudine rimossa"
override val toast_habit_restored = "Abitudine ripristinata"
override val toast_nothing_to_undo = "Niente da annullare"
override val toast_nothing_to_redo = "Niente da ripetere"
override val toast_habit_changed = "Abitudine modificata"
override val toast_habit_changed_back = "Abitudine ripristinata"
override val toast_habit_archived = "Abitudine archiviata"
override val toast_habit_unarchived = "Abitudine ripristinata"
override val overview = "Panoramica"
override val habit_strength = "Forza dell\'abitudine"
override val history = "Cronologia"
override val clear = "Annulla"
override val description_hint = "Domanda (Hai ... oggi?)"
override val repeat = "Ripetizione"
override val times_every = "volte in"
override val days = "giorni"
override val reminder = "Promemoria"
override val discard = "Annulla"
override val save = "Salva"
override val streaks = "Serie"
override val no_habits_found = "Non hai abitudini attive"
override val long_press_to_toggle = "Premi e mantieni premuto per completare o annullare"
override val reminder_off = "Disabilitato"
override val validation_name_should_not_be_blank = "Il nome non può essere vuoto."
override val validation_number_should_be_positive = "I numeri devono essere positivi."
override val validation_at_most_one_rep_per_day = "Puoi avere al massimo una ripetizione al giorno"
override val create_habit = "Crea abitudine"
override val edit_habit = "Modifica abitudine"
override val check = "Completa"
override val snooze = "Più tardi"
override val intro_title_1 = "Benvenuto"
override val intro_description_1 = "Loop Habit Tracker ti aiuta a creare e mantenere delle buone abitudini."
override val intro_title_2 = "Aggiungi qualche nuova abitudine"
override val intro_description_2 = "Ogni giorno, dopo aver portato a termine la tua abitudine, spuntala nell\'app."
override val intro_title_3 = "Continua così"
override val intro_description_3 = "Le abitudini portate a termine regoalrmente per un lungo periodo riceveranno una stella piena."
override val intro_title_4 = "Segui i tuoi progressi"
override val intro_description_4 = "Grafici dettagliati ti mostrano come le tue abitudini sono migliorate nel corso del tempo."
override val interval_15_minutes = "15 minuti"
override val interval_30_minutes = "30 minuti"
override val interval_1_hour = "1 ora"
override val interval_2_hour = "2 ore"
override val interval_4_hour = "4 ore"
override val interval_8_hour = "8 ore"
override val interval_24_hour = "24 ore"
override val pref_toggle_title = "Spunta le ripetizioni velocemente"
override val pref_toggle_description = "Metti le spunte con un tocco singolo invece che tenendo premuto. Più comodo, ma potrebbe causare delle spunte accidentali."
override val pref_snooze_interval_title = "Intervallo di ritardo dei promemoria"
override val pref_rate_this_app = "Valuta quest\'app su Google Play"
override val pref_send_feedback = "Manda un feedback allo sviluppatore"
override val pref_view_source_code = "Vedi il codice sorgente su GitHub"
override val pref_view_app_introduction = "Visualizza l\'introduzione dell\'app"
override val links = "Links"
override val behavior = "Comportamento"
override val name = "Nome"
override val settings = "Impostazioni"
override val snooze_interval = "Snooze"
override val hint_title = "Lo sapevi?"
override val hint_drag = "Per riordinare le voci, tieni premuto sul nome dell\'abitudine, poi spostala nella posizione corretta."
override val hint_landscape = "Puoi vedere più giorni mettendo il tuo telefono orizzontale."
override val delete_habits = "Elimina abitudine"
override val delete_habits_message = "L\'abitudine verrà cancellata definitivamente. Non sarà possibile annullare."
override val habit_not_found = "Abitudine cancellata / non trovata"
override val weekends = "Weekend"
override val any_weekday = "Giorni feriali"
override val any_day = "Ogni giorno della settimana"
override val select_weekdays = "Giorni selezionati"
override val export_to_csv = "Esporta i dati come CSV"
override val done_label = "Fatto"
override val clear_label = "Annulla"
override val select_hours = "Ore selezionate"
override val select_minutes = "Minuti selezionati"
override val about = "Su Loop"
override val translators = "Traduttori"
override val developers = "Sviluppatori"
override val version_n = "Versione %s"
override val frequency = "Frequenza"
override val checkmark = "Spunta"
override val strength = "Forza"
override val best_streaks = "Serie migliori"
override val current_streaks = "Serie corrente"
override val number_of_repetitions = "Numero di ripetizioni"
override val last_x_days = "Ultimi %d giorni"
override val last_x_weeks = "Ultime %d settimane"
override val last_x_months = "Ultimi %d mesi"
override val last_x_years = "Ultimi %d anni"
override val all_time = "Sempre"
override val every_day = "Ogni giorno"
override val every_week = "Ogni settimana"
override val two_times_per_week = "2 volte a settimana"
override val five_times_per_week = "5 volte a settimana"
override val custom_frequency = "Personalizzato ..."
override val help = "Aiuto & FAQ"
override val could_not_export = "Esportazione non riuscita."
override val could_not_import = "Importazione non riuscita."
override val file_not_recognized = "File non riconosciuto."
override val habits_imported = "Abitudini importate con successo."
override val full_backup_success = "Backup completo esportato con successo."
override val import_data = "Importa dati"
override val export_full_backup = "Esporta il backup completo"
override val import_data_summary = "Pieno supporto ai backup esportati da questa app, oltre a quelli generati da Tickmate, HabitBull o Rewire. Vedi le FAQ per maggiori informazioni."
override val export_as_csv_summary = "Genera un file che potrà essere aperto da programmi come Microsoft Excel o OpenOffice Calc. Non potrà essere importato."
override val export_full_backup_summary = "Genera un file contenente tutti i tuoi dati. Potrà essere importato successivamente."
override val bug_report_failed = "Generazione del bug report fallita"
override val generate_bug_report = "Genera bug report"
override val troubleshooting = "Risoluzione dei problemi"
override val help_translate = "Aiuta a tradurre questa app"
override val night_mode = "Modalità notte"
override val use_pure_black = "Usa nero puro nella modalità notte"
override val pure_black_description = "Sostituisce gli sfondi grigi con sfondi neri nella modalità notte. Riduce il consumo di batteria nei dispositivi con schermo AMOLED."
override val interface_preferences = "Interfaccia"
override val reverse_days = "Inverti ordine giorni"
override val reverse_days_description = "Mostra i giorni in ordine inverso nella schermata principale"
override val day = "Giorno"
override val week = "Settimana"
override val month = "Mese"
override val quarter = "Quadrimestre"
override val year = "Anno"
override val total = "Totale"
override val time_every = "volta in"
override val every_x_days = "Ogni %d giorni"
override val every_x_weeks = "Ogni %d settimane"
override val every_x_months = "Ogni %d mesi"
override val score = "Punteggio"
override val reminder_sound = "Suono notifica"
override val none = "Nessuno"
override val filter = "Filtra"
override val hide_completed = "Nascondi completati"
override val hide_archived = "Nascondi archiviati"
override val sticky_notifications = "Notifiche non rimuovibili"
override val sticky_notifications_description = "Impedisce di poter rimuovere le notifiche."
override val repair_database = "Ripara database"
override val database_repaired = "Database recuperato."
override val uncheck = "Deseleziona"
override val toggle = "Attiva/disattiva"
override val action = "Azione"
override val habit = "Abitudine"
override val sort = "Ordina"
override val manually = "Manualmente"
override val by_name = "Per nome"
override val by_color = "Per colore"
override val by_score = "Per punteggio"
override val download = "Download"
override val export = "Esporta"
}

@ -1,149 +0,0 @@
// --------------------------------------------------------------------------
// THIS FILE WAS AUTOMATICALLY GENERATED
//
// Please do not submit pull request to modify it. Corrections to translations
// may be submitted at https://translate.loophabits.org/
// --------------------------------------------------------------------------
package org.isoron.uhabits.i18n
class StringsJapanese : Strings() {
override val app_name = "ループ習慣トラッカー"
override val main_activity_title = "習慣"
override val action_settings = "設定"
override val edit = "編集"
override val delete = "削除"
override val archive = "アーカイブ"
override val unarchive = "アーカイブを戻す"
override val add_habit = "習慣を追加"
override val color_picker_default_title = "色の変更"
override val toast_habit_created = "習慣を作成しました。"
override val toast_habit_deleted = "習慣を削除しました。"
override val toast_habit_restored = "習慣を復元しました。"
override val toast_nothing_to_undo = "元に戻すことはできません。"
override val toast_nothing_to_redo = "繰り返しはできません。"
override val toast_habit_changed = "習慣を変更しました。"
override val toast_habit_changed_back = "習慣を元に戻しました。"
override val toast_habit_archived = "習慣をアーカイブしました。"
override val toast_habit_unarchived = "習慣のアーカイブを戻しました。"
override val overview = "概要"
override val habit_strength = "習慣の強さ"
override val history = "履歴"
override val clear = "クリア"
override val description_hint = "質問 (今日 &#8230; しましたか?)"
override val repeat = "繰り返し"
override val times_every = ""
override val days = ""
override val reminder = "リマインダー"
override val discard = "破棄"
override val save = "保存"
override val streaks = "連続記録"
override val no_habits_found = "アクティブな習慣はありません"
override val long_press_to_toggle = "長押しするとチェックを付けたり外したりします"
override val reminder_off = "オフ"
override val validation_name_should_not_be_blank = "名前は空にできません。"
override val validation_number_should_be_positive = "正の数値にする必要があります。"
override val validation_at_most_one_rep_per_day = "多くとも 1 日 1 回にすることができます。"
override val create_habit = "習慣を作成"
override val edit_habit = "習慣を編集"
override val check = "チェック"
override val snooze = "後で"
override val intro_title_1 = "ようこそ"
override val intro_description_1 = "ループ習慣トラッカーは、良い習慣を作って、維持するのに役立ちます。"
override val intro_title_2 = "新しい習慣を作成します"
override val intro_description_2 = "毎日、習慣を実行した後、アプリでチェックマークを付けます。"
override val intro_title_3 = "これを続けます"
override val intro_description_3 = "長い期間習慣を継続すると、スターを全て獲得できます。"
override val intro_title_4 = "進捗状況を追跡します"
override val intro_description_4 = "詳細グラフは、あなたの習慣が時間をかけて改善された様子を示します。"
override val interval_15_minutes = "15 分"
override val interval_30_minutes = "30 分"
override val interval_1_hour = "1 時間"
override val interval_2_hour = "2 時間"
override val interval_4_hour = "4 時間"
override val interval_8_hour = "8 時間"
override val interval_24_hour = "24時間"
override val pref_toggle_title = "クリックで繰り返しを切り替え"
override val pref_toggle_description = "便利になりますが、間違って切り替えが起こる可能性があります。"
override val pref_snooze_interval_title = "リマインダーのスヌーズ間隔"
override val pref_rate_this_app = "Google Play でこのアプリを評価"
override val pref_send_feedback = "開発者にフィードバックを送信"
override val pref_view_source_code = "GitHub でソースコードを参照"
override val pref_view_app_introduction = "アプリの紹介を表示"
override val links = "リンク"
override val behavior = "動作"
override val name = "名前"
override val settings = "設定"
override val snooze_interval = "スヌーズ間隔"
override val hint_title = "ご存知ですか?"
override val hint_drag = "エントリーを並べ替えるには、習慣の名前を長押しして、正しい場所にドラッグしてください。"
override val hint_landscape = "お使いの携帯電話を横置きモードにすることで、参照する日数を多くすることができます。"
override val delete_habits = "習慣を削除"
override val delete_habits_message = "習慣は完全に削除されます。この操作を元に戻すことはできません。"
override val weekends = "週末"
override val any_weekday = "月曜日から金曜日"
override val any_day = "週の任意の日"
override val select_weekdays = "日の選択"
override val export_to_csv = "CSV としてエクスポート"
override val done_label = "完了"
override val clear_label = "クリア"
override val select_hours = "時間の選択"
override val select_minutes = "分の選択"
override val about = "アプリについて"
override val translators = "翻訳者"
override val developers = "開発者"
override val version_n = "バージョン %s"
override val frequency = "周波数"
override val checkmark = "チェック"
override val strength = "強さ"
override val best_streaks = "最高の連続記録"
override val current_streaks = "現在の連続記録"
override val number_of_repetitions = "繰り返し数"
override val last_x_days = "最近 %d 日"
override val last_x_weeks = "最近 %d 週間"
override val last_x_months = "最近 %d ヶ月"
override val last_x_years = "最近 %d 年"
override val all_time = "いつも"
override val every_day = "毎日"
override val every_week = "毎週"
override val two_times_per_week = "1 週間に 2 回"
override val five_times_per_week = "1 週間に 5 回"
override val custom_frequency = "カスタム &#8230;"
override val help = "ヘルプ & FAQ"
override val could_not_export = "データのエクスポートに失敗しました。"
override val could_not_import = "データのインポートに失敗しました。"
override val file_not_recognized = "ファイルを認識できません。"
override val habits_imported = "習慣を正常にインポートしました。"
override val full_backup_success = "フルバックアップを正常にエクスポートしました。"
override val import_data = "データのインポート"
override val export_full_backup = "フルバックアップのエクスポート"
override val import_data_summary = "このアプリでエクスポートしたフルバックアップだけではなく、Tickmate、HabitBull、Rewire で生成したファイルも同様にサポートしています。詳細については FAQ を参照してください。"
override val export_as_csv_summary = "Microsoft Excel や OpenOffice Calc などの表計算ソフトで開くことができるファイルを生成します。このファイルはインポートで戻すことはできません。"
override val export_full_backup_summary = "すべてのデータが含まれるファイルを生成します。このファイルはインポートして戻すことができます。"
override val bug_report_failed = "バグ報告の生成に失敗しました。"
override val generate_bug_report = "バグ報告の生成"
override val troubleshooting = "トラブルシューティング"
override val help_translate = "このアプリの翻訳を支援する"
override val night_mode = "夜間モード"
override val use_pure_black = "夜間モードで真黒を使用する"
override val pure_black_description = "夜間モードで灰色の背景を黒で置き換えます。AMOLED ディスプレイの電話でバッテリー使用量を抑えます。"
override val interface_preferences = "インターフェース"
override val reverse_days = "日の順序を逆転する"
override val reverse_days_description = "メイン画面で日を逆順に表示します"
override val day = ""
override val week = ""
override val month = ""
override val quarter = "四半期"
override val year = ""
override val total = "合計"
override val time_every = "回 /"
override val every_x_days = "%d 日ごと"
override val every_x_weeks = "%d 週ごと"
override val every_x_months = "%d ヶ月ごと"
override val score = "スコア"
override val reminder_sound = "リマインダー サウンド"
override val none = "なし"
override val filter = "フィルター"
override val download = "ダウンロード"
override val export = "エクスポート"
}

@ -1,165 +0,0 @@
// --------------------------------------------------------------------------
// THIS FILE WAS AUTOMATICALLY GENERATED
//
// Please do not submit pull request to modify it. Corrections to translations
// may be submitted at https://translate.loophabits.org/
// --------------------------------------------------------------------------
package org.isoron.uhabits.i18n
class StringsKorean : Strings() {
override val app_name = "Loop 습관제조기"
override val main_activity_title = "습관"
override val action_settings = "설정"
override val edit = "수정"
override val delete = "삭제"
override val archive = "보관"
override val unarchive = "보관 해제"
override val add_habit = "습관 추가하기"
override val color_picker_default_title = "색상 변경"
override val toast_habit_created = "습관이 생성되었습니다."
override val toast_habit_deleted = "습관이 삭제되었습니다."
override val toast_habit_restored = "습관이 복원되었습니다."
override val toast_nothing_to_undo = "취소할 것이 없습니다."
override val toast_nothing_to_redo = "복원할 것이 없습니다."
override val toast_habit_changed = "습관이 수정되었습니다."
override val toast_habit_changed_back = "습관이 복원되었습니다."
override val toast_habit_archived = "습관이 보관되었습니다."
override val toast_habit_unarchived = "습관 보관이 해제되었습니다."
override val overview = "개요"
override val habit_strength = "습관 강도"
override val history = "이력"
override val clear = "지우기"
override val description_hint = "질문 (오늘 ... 했나요?)"
override val repeat = "반복"
override val times_every = ""
override val days = "일 동안"
override val reminder = "알림"
override val discard = "취소"
override val save = "저장"
override val streaks = "연속"
override val no_habits_found = "활성화된 습관이 없습니다."
override val long_press_to_toggle = "체크하거나 해제하려면 길게 누르세요."
override val reminder_off = ""
override val validation_name_should_not_be_blank = "제목을 적어주세요."
override val validation_number_should_be_positive = "숫자는 0보다 커야합니다."
override val validation_at_most_one_rep_per_day = "하루에 한 번만 반복 가능합니다."
override val create_habit = "습관 만들기"
override val edit_habit = "습관 수정하기"
override val check = "완료"
override val snooze = "나중에"
override val intro_title_1 = "환영합니다"
override val intro_description_1 = "Loop은 당신이 좋은 습관을 만들고 유지하도록 도와줍니다."
override val intro_title_2 = "새로운 습관을 만들어 보세요."
override val intro_description_2 = "매일 습관을 수행하고 앱에 기록하세요."
override val intro_title_3 = "계속 반복하세요"
override val intro_description_3 = "오랫동안 지속적으로 유지한 습관은 별표를 얻습니다."
override val intro_title_4 = "습관을 관리하세요"
override val intro_description_4 = "자세한 그래프로 시간에 따라 당신의 습관이 어떻게 향상되었는지 보여줍니다."
override val interval_15_minutes = "15분"
override val interval_30_minutes = "30분"
override val interval_1_hour = "1시간"
override val interval_2_hour = "2시간"
override val interval_4_hour = "4시간"
override val interval_8_hour = "8시간"
override val interval_24_hour = "24시간"
override val pref_toggle_title = "짧게 눌러서 전환하기"
override val pref_toggle_description = "길게 누르고 있는 대신에 짧은 탭 한 번으로 체크합니다. 더 편리하지만, 실수로 전환될 수도 있습니다."
override val pref_snooze_interval_title = "알림 스누즈 간격"
override val pref_rate_this_app = "Google Play에서 평가"
override val pref_send_feedback = "개발자에게 피드백 보내기"
override val pref_view_source_code = "Github에서 소스보기"
override val pref_view_app_introduction = "앱 안내메시지 보기"
override val links = "링크"
override val behavior = "행동"
override val name = "제목"
override val settings = "설정"
override val snooze_interval = "스누즈 간격"
override val hint_title = "아시나요?"
override val hint_drag = "목록의 순서를 재배치하려면, 습관의 제목을 길게 누르고 다른 위치로 드래그하면 됩니다."
override val hint_landscape = "가로 모드에서는 더 많은 날짜를 볼 수 있습니다."
override val delete_habits = "습관 삭제"
override val delete_habits_message = "습관을 영구적으로 삭제합니다. 이 작업은 취소할 수 없습니다."
override val habit_not_found = "습관 삭제 / 찾을 수 없음"
override val weekends = "주말"
override val any_weekday = "주중"
override val any_day = "매일"
override val select_weekdays = "요일 선택"
override val export_to_csv = "CSV로 내보내기"
override val done_label = "완료"
override val clear_label = "지우기"
override val select_hours = "시간 선택"
override val select_minutes = "분 선택"
override val about = "정보"
override val translators = "번역자"
override val developers = "개발자"
override val version_n = "버전 %s"
override val frequency = "빈도"
override val checkmark = "체크"
override val strength = "강도"
override val best_streaks = "최고 연속 기록"
override val current_streaks = "현재 기록"
override val number_of_repetitions = "반복한 횟수"
override val last_x_days = "이전 %d일 동안"
override val last_x_weeks = "이전 %d주 동안"
override val last_x_months = "이전 %d달 동안"
override val last_x_years = "이전 %d년 동안"
override val all_time = "모두"
override val every_day = "매일"
override val every_week = "매주"
override val two_times_per_week = "일주일에 2번"
override val five_times_per_week = "일주일에 5번"
override val custom_frequency = "직접 정하기"
override val help = "도움 & FAQ"
override val could_not_export = "데이터 내보내기에 실패했습니다."
override val could_not_import = "데이터 가져오기에 실패했습니다."
override val file_not_recognized = "파일을 인식할 수 없습니다."
override val habits_imported = "습관 가져오기에 성공했습니다."
override val full_backup_success = "전체 백업 내보내기에 성공했습니다."
override val import_data = "데이터 가져오기"
override val export_full_backup = "백업 내보내기"
override val import_data_summary = "Tickmate, HabitBull, Rewire에서 생성된 파일도 지원합니다. 더 자세한 설명은 FAQ에 있습니다."
override val export_as_csv_summary = "Microsoft Excel나 OpenOffice Calc 같은 스프레드시트 소프트웨어로 열 수 있는 파일을 생성합니다. 이 파일은 다시 가져올 수 없습니다."
override val export_full_backup_summary = "모든 데이터를 포함한 파일을 생성합니다. 이 파일은 다시 가져올 수 있습니다."
override val bug_report_failed = "오류보고서 작성에 실패했습니다."
override val generate_bug_report = "오류보고서 작성하기"
override val troubleshooting = "문제 해결"
override val help_translate = "이 앱의 번역을 도와주세요"
override val night_mode = "야간 모드"
override val use_pure_black = "야간 모드에서 검정색 사용하기"
override val pure_black_description = "야간 모드의 회색 배경을 검정색으로 대체합니다. AMOLED 디스플레이를 사용하는 기기에서 배터리 사용량을 감소시킵니다."
override val interface_preferences = "인터페이스"
override val reverse_days = "날짜 순서 뒤집기"
override val reverse_days_description = "메인 화면의 날짜를 역순으로 보여줍니다."
override val day = ""
override val week = ""
override val month = ""
override val quarter = "분기"
override val year = ""
override val total = "전체"
override val time_every = ""
override val every_x_days = "%d일 마다"
override val every_x_weeks = "%d주 마다"
override val every_x_months = "%d개월 마다"
override val score = "점수"
override val reminder_sound = "알림음"
override val none = "무음"
override val filter = "필터"
override val hide_completed = "완료된 항목 숨기기"
override val hide_archived = "보관된 항목 숨기기"
override val sticky_notifications = "알림 고정하기"
override val sticky_notifications_description = "알림을 스와이프해서 제거하는 것을 방지합니다."
override val repair_database = "데이터베이스 복구"
override val database_repaired = "데이터베이스가 복구되었습니다."
override val uncheck = "선택 해제"
override val toggle = "전환"
override val action = "동작"
override val habit = "습관"
override val sort = "정렬"
override val manually = "수동으로"
override val by_name = "이름 순으로"
override val by_color = "색상 순으로"
override val by_score = "점수 순으로"
override val download = "다운로드"
override val export = "내보내기"
}

@ -1,81 +0,0 @@
// --------------------------------------------------------------------------
// THIS FILE WAS AUTOMATICALLY GENERATED
//
// Please do not submit pull request to modify it. Corrections to translations
// may be submitted at https://translate.loophabits.org/
// --------------------------------------------------------------------------
package org.isoron.uhabits.i18n
class StringsNorwegian : Strings() {
override val main_activity_title = "Kutimoj"
override val action_settings = "Agordoj"
override val edit = "Redakti"
override val delete = "Forigi"
override val archive = "Arĥivo"
override val unarchive = "Elarĥivigi"
override val add_habit = "Aldonu kutimon"
override val color_picker_default_title = "Ŝanĝi koloron"
override val toast_habit_changed = "Kutimo ŝanĝita"
override val toast_habit_archived = "Kutimo arĥivita"
override val habit_strength = "Kutimo forteco"
override val days = "tagoj"
override val reminder = "Memorigaĵoj"
override val discard = "Nuligi"
override val save = "Konservi"
override val streaks = "Strioj"
override val reminder_off = "Neaktiva"
override val snooze = "Poste"
override val intro_title_1 = "Bonvenon"
override val interval_15_minutes = "15 minutoj"
override val interval_30_minutes = "30 minutoj"
override val settings = "Agordoj"
override val delete_habits = "Forigi kutimojn"
override val weekends = "Semajnfinoj"
override val any_weekday = "Lundo al vendredo"
override val any_day = "Io semajntago"
override val select_weekdays = "Elekti tagojn"
override val export_to_csv = "Eksporti kiel CSV"
override val done_label = "Farite"
override val select_hours = "Elekti horojn"
override val select_minutes = "Elekti minutojn"
override val about = "Pri programo"
override val translators = "Tradukantoj"
override val developers = "Evoluigantoj"
override val version_n = "Versio %s"
override val frequency = "Frekvenco"
override val strength = "Forteco"
override val number_of_repetitions = "Nombro de ripetoj"
override val last_x_days = "Lastaj %d tagoj"
override val last_x_weeks = "Lastaj %d semajnoj"
override val last_x_months = "Lastaj %d monatoj"
override val last_x_years = "Lastaj %d jaroj"
override val all_time = "Ĉiuj tempoj"
override val every_day = "Ĉiu tago"
override val every_week = "Ĉiu semajno"
override val two_times_per_week = "Dufoje en semajno"
override val five_times_per_week = "Kvinfoje en semajno"
override val help = "Helpo & Ofte Demandite"
override val file_not_recognized = "Dosiero ne rekonita."
override val full_backup_success = "Plena savkopio sukcese eksportita."
override val troubleshooting = "Problemserĉado"
override val night_mode = "Nokta reĝimo"
override val day = "Tago"
override val week = "Semajno"
override val month = "Monato"
override val quarter = "Jarkvarono"
override val year = "Jaro"
override val none = "Nenio"
override val filter = "Filtrilo"
override val hide_completed = "Kaŝi kompletajn"
override val hide_archived = "Kaŝi arĥivitajn"
override val repair_database = "Ripari datumbazon"
override val database_repaired = "Datumbazon riparita."
override val action = "Ago"
override val habit = "Kutimo"
override val sort = "Enkursigi"
override val by_name = "Laŭ nomo"
override val by_color = "Laŭ koloro"
override val download = "Elŝuti"
override val export = "Eksporti"
}

@ -1,165 +0,0 @@
// --------------------------------------------------------------------------
// THIS FILE WAS AUTOMATICALLY GENERATED
//
// Please do not submit pull request to modify it. Corrections to translations
// may be submitted at https://translate.loophabits.org/
// --------------------------------------------------------------------------
package org.isoron.uhabits.i18n
class StringsPersian : Strings() {
override val app_name = "Loop Habit Tracker"
override val main_activity_title = "عادت‌ها"
override val action_settings = "تنظیمات"
override val edit = "ویرایش"
override val delete = "حذف"
override val archive = "بایگانی کن"
override val unarchive = "خارج کردن از بایگانی"
override val add_habit = "افزودن عادت"
override val color_picker_default_title = "تغییر رنگ"
override val toast_habit_created = "عادت ایجاد شد"
override val toast_habit_deleted = "عادت حذف شد"
override val toast_habit_restored = "عادت بازگردانده شد"
override val toast_nothing_to_undo = "چیزی برای بازگرداندن به حالت قبلی وجود ندارد"
override val toast_nothing_to_redo = "چیزی برای انجام مجدد وجود ندارد"
override val toast_habit_changed = "عادت تغییر کرد."
override val toast_habit_changed_back = "عادت به حالت قبل برگشت"
override val toast_habit_archived = "عادت‌ها بایگانی شدند"
override val toast_habit_unarchived = "عادت‌ها از بایگانی خارج شدند"
override val overview = "مرور"
override val habit_strength = "قدرت عادت"
override val history = "تاریخچه"
override val clear = "بی‌خیال"
override val description_hint = "سوال (آیا امروز شما&#8230;؟)"
override val repeat = "تکرار"
override val times_every = "بار در هر"
override val days = "روز"
override val reminder = "یادآور"
override val discard = "بی‌خیال"
override val save = "ذخیره"
override val streaks = "روزهای پیوسته"
override val no_habits_found = "شما هیچ عادت فعالی ندارید"
override val long_press_to_toggle = "برای تیک زدن یا برداشتن، ضربه بزنید و نگه دارید"
override val reminder_off = "خاموش"
override val validation_name_should_not_be_blank = "جای اسم نمی‌تواند خالی باشد."
override val validation_number_should_be_positive = "عدد بایستی مثبت باشد."
override val validation_at_most_one_rep_per_day = "شما در نهایت می‌توانید یک تکرار در یک روز داشته باشید."
override val create_habit = "درج عادت جدید"
override val edit_habit = "ویرایش عادت"
override val check = "تیک زدن"
override val snooze = "بعداً"
override val intro_title_1 = "خوش آمدید"
override val intro_description_1 = "رهگیر عادت لوپ به شما کمک می‌کند تا برای خودتان عادت‌های خوبی بسازید."
override val intro_title_2 = "ساخت چند عادت جدید"
override val intro_description_2 = "هر روز، بعد از انجام عادت، آن را در برنامه تیک بزنید."
override val intro_title_3 = "ادامه دهید"
override val intro_description_3 = "عادت‌هایی که به صورت پیوسته برای مدت طولانی انجام شده‌اند یک ستاره‌ی کامل دریافت می‌کنند."
override val intro_title_4 = "پیشرفت خود را رهگیری کنید"
override val intro_description_4 = "نمودار جزئیات به شما نشان می‌دهد که چطور عادت‌هایتان با گذشت زمان بهبود پیدا کرده‌اند."
override val interval_15_minutes = "۱۵ دقیقه"
override val interval_30_minutes = "۳۰ دقیقه"
override val interval_1_hour = "۱ ساعت"
override val interval_2_hour = "۲ ساعت"
override val interval_4_hour = "۴ ساعت"
override val interval_8_hour = "۸ ساعت"
override val interval_24_hour = "۲۴ ساعت"
override val pref_toggle_title = "با اشاره‌ی کوتاه‌مدت وضعیت عادت را تغییر بده"
override val pref_toggle_description = "تیک زدن با تک‌ضربه در مقابل ضربه‌زدن و نگه‌داشتن راحت‌تر است ولی ممکن است باعث شود اشتباهی عادتی را تیک بزنید."
override val pref_snooze_interval_title = "بازه به تعویق انداختن یادآورها"
override val pref_rate_this_app = "به این برنامه در گوگل‌پلی امتیاز بدهید"
override val pref_send_feedback = "ارسال بازخورد به توسعه‌دهنده"
override val pref_view_source_code = "دیدن منبع برنامه در گیت‌هاب"
override val pref_view_app_introduction = "مشاهده معرفی برنامه"
override val links = "لینک‌ها"
override val behavior = "رفتار"
override val name = "نام"
override val settings = "تنظیمات"
override val snooze_interval = "بازه به تعویق انداختن"
override val hint_title = "آیا می دانستید؟"
override val hint_drag = "برای جابجایی عناوین، انگشتتان را روی نام عادت مورد نظر بگذارید و نگه دارید، سپس آن را به محل صحیح بکشید."
override val hint_landscape = "با قرار دادن گوشی در حالت افقی می‌توانید روزهای بیشتری را ببینید."
override val delete_habits = "حذف عادت‌ها"
override val delete_habits_message = "عادت‌ها برای همیشه حذف خواهد شد. این عمل قابل بازگشت نیست."
override val habit_not_found = "عادت حذف شده/ پیدا نشد"
override val weekends = "آخر هفته‌ها"
override val any_weekday = "دوشنبه تا جمعه"
override val any_day = "هر روز هفته"
override val select_weekdays = "انتخاب روزها"
override val export_to_csv = "صدور فایل CSV"
override val done_label = "انجام شد"
override val clear_label = "بی‌خیال"
override val select_hours = "انتخاب ساعت"
override val select_minutes = "انتخاب دقیقه"
override val about = "درباره"
override val translators = "مترجمان"
override val developers = "توسعه‌دهندگان"
override val version_n = "نسخه %s"
override val frequency = "تناوب"
override val checkmark = "علامت"
override val strength = "قدرت"
override val best_streaks = "بهترین استمرار"
override val current_streaks = "استمرار فعلی"
override val number_of_repetitions = "تعداد تکرارها"
override val last_x_days = "%d روز اخیر"
override val last_x_weeks = "%d هفته اخیر"
override val last_x_months = "%d ماه اخیر"
override val last_x_years = "%d سال اخیر"
override val all_time = "همیشه"
override val every_day = "هر روز"
override val every_week = "هر هفته"
override val two_times_per_week = "۲ بار در هفته"
override val five_times_per_week = "۵ بار در هفته"
override val custom_frequency = "سفارشی‌سازی ..."
override val help = "راهنما و سوالات متداول"
override val could_not_export = "خطا در صدور اطلاعات."
override val could_not_import = "خطا در وارد کردن اطلاعات."
override val file_not_recognized = "پرونده شناخته شده نیست."
override val habits_imported = "عادت‌ها با موفقیت وارد شدند."
override val full_backup_success = "پرونده پشتیبان کامل، با موفقیت صادر شد."
override val import_data = "ورود اطلاعات"
override val export_full_backup = "پشتیبان گیری کامل"
override val import_data_summary = "علاوه بر پشتیبان کامل تهیه شده توسط این برنامه، از پرونده‌های تولید شده توسط Tickmate، HabitbBull و یا Rewire هم پشتیبانی می‌شود. برای اطلاعات بیشتر سوالات متداول را ببینید."
override val export_as_csv_summary = "پرونده‌ای تولید می‌کند که می‌توان توسط برنامه‌های صفحه گسترده مانند Microsoft Excel و یا OpenOffice Calc بازشان کرد. این پرونده قابلیت وارد کردن مجدد به این برنامه را ندارد."
override val export_full_backup_summary = "پرونده‌ای تولید می‌کند که شامل تمام اطلاعات شما است. این پرونده قابل بازیابی توسط این برنامه می‌باشد."
override val bug_report_failed = "خطایی در تولید گزارش مشکلات بوجود آمد."
override val generate_bug_report = "ایجاد گزارش مشکلات"
override val troubleshooting = "ایرادیابی"
override val help_translate = "کمک برای ترجمه این برنامه"
override val night_mode = "حالت شب"
override val use_pure_black = "استفاده از رنگ سیاه خالص در حالت شبانه"
override val pure_black_description = "جایگزینی پس زمینه خاکستری با سیاه خالص در حالت شب. استفاده از باتری در گوشی‌های با صفحه نمایش AMOLED را کاهش می‌دهد."
override val interface_preferences = "رابط کاربری"
override val reverse_days = "معکوس کردن ترتیب روزها"
override val reverse_days_description = "روزها را در صفحه اصلی با ترتیب معکوس نمایش می‌دهد"
override val day = "روز"
override val week = "هفته"
override val month = "ماه"
override val quarter = "فصل"
override val year = "سال"
override val total = "مجموع"
override val time_every = "بار در هر"
override val every_x_days = "هر %d روز یک‌بار"
override val every_x_weeks = "هر %d هفته یک‌بار"
override val every_x_months = "هر %d ماه یک‌بار"
override val score = "امتیاز"
override val reminder_sound = "صدای یادآور"
override val none = "هیچ‌کدام"
override val filter = "فیلتر"
override val hide_completed = "مخفی کردن کامل شده‌ها"
override val hide_archived = "مخفی کردن بایگانی شده‌ها"
override val sticky_notifications = "چسبناک کردن اعلان‌ها"
override val sticky_notifications_description = "از رد کردن اعلان با کشیدن جلوگیری می‌کند."
override val repair_database = "تعمیر پایگاه داده"
override val database_repaired = "پایگاه داده تعمیر شد."
override val uncheck = "برداشتن تیک"
override val toggle = "تغییر وضعیت"
override val action = "اقدام"
override val habit = "عادت"
override val sort = "مرتب‌سازی"
override val manually = "دستی"
override val by_name = "بر اساس نام"
override val by_color = "بر اساس رنگ"
override val by_score = "بر اساس امتیاز"
override val download = "بارگيری"
override val export = "صدور"
}

@ -1,165 +0,0 @@
// --------------------------------------------------------------------------
// THIS FILE WAS AUTOMATICALLY GENERATED
//
// Please do not submit pull request to modify it. Corrections to translations
// may be submitted at https://translate.loophabits.org/
// --------------------------------------------------------------------------
package org.isoron.uhabits.i18n
class StringsPolish : Strings() {
override val app_name = "Śledzenie Nawyków Loop"
override val main_activity_title = "Nawyki"
override val action_settings = "Ustawienia"
override val edit = "Edytuj"
override val delete = "Usuń"
override val archive = "Archiwizuj"
override val unarchive = "Odarchiwizuj"
override val add_habit = "Dodaj nawyk"
override val color_picker_default_title = "Zmień kolor"
override val toast_habit_created = "Utworzono nawyk"
override val toast_habit_deleted = "Usunięto nawyki"
override val toast_habit_restored = "Przywrócono nawyki"
override val toast_nothing_to_undo = "Nic do cofnięcia"
override val toast_nothing_to_redo = "Nic do powtórzenia"
override val toast_habit_changed = "Zmieniono nawyk"
override val toast_habit_changed_back = "Zmieniono nawyk z powrotem"
override val toast_habit_archived = "Nawyki zarchiwizowane"
override val toast_habit_unarchived = "Nawyki odarchiwizowane"
override val overview = "Przegląd"
override val habit_strength = "Siła nawyku"
override val history = "Historia"
override val clear = "Wyczyść"
override val description_hint = "Pytanie (Czy zrobiłeś ... dzisiaj?)"
override val repeat = "Powtórz"
override val times_every = "razy w"
override val days = "dni"
override val reminder = "Przypomnienie"
override val discard = "Odrzuć"
override val save = "Zapisz"
override val streaks = "Serie"
override val no_habits_found = "Nie masz aktywnych nawyków"
override val long_press_to_toggle = "Naciśnij i przytrzymaj aby zaznaczyć lub odznaczyć"
override val reminder_off = "Wyłączone"
override val validation_name_should_not_be_blank = "Nazwa nie może być pusta."
override val validation_number_should_be_positive = "Liczba musi być dodatnia."
override val validation_at_most_one_rep_per_day = "Możesz mieć maksymalnie jedno powtórzenie dziennie."
override val create_habit = "Utwórz nawyk"
override val edit_habit = "Edytuj nawyk"
override val check = "Zaznacz"
override val snooze = "Później"
override val intro_title_1 = "Witaj"
override val intro_description_1 = "Śledzenie nawyków Loop pozwala Ci na utworzenie i prowadzenie dobrych nawyków."
override val intro_title_2 = "Utwórz nowe nawyki"
override val intro_description_2 = "Codziennie, po wykonaniu swojego nawyku, postaw znaczek w aplikacji."
override val intro_title_3 = "Kontynuuj swoje nawyki"
override val intro_description_3 = "Nawyki wykonywane przez dłuższy czas otrzymają pełną gwiazdkę."
override val intro_title_4 = "Śledź swój postęp"
override val intro_description_4 = "Szczegółowe grafiki pokazują jak Twoje nawyki polepszyły się z biegiem czasu."
override val interval_15_minutes = "15 minut"
override val interval_30_minutes = "30 minut"
override val interval_1_hour = "1 godzina"
override val interval_2_hour = "2 godziny"
override val interval_4_hour = "4 godziny"
override val interval_8_hour = "8 godzin"
override val interval_24_hour = "24 godziny"
override val pref_toggle_title = "Przełącz powtarzanie krótkim naciśnięciem"
override val pref_toggle_description = "Wygodniejsze, ale może spowodować przypadkowe przełączenia."
override val pref_snooze_interval_title = "Czas drzemki między przypomnieniami"
override val pref_rate_this_app = "Oceń tę aplikację w Google Play"
override val pref_send_feedback = "Prześlij uwagi do programisty"
override val pref_view_source_code = "Zobacz kod źródłowy na GitHub\'ie"
override val pref_view_app_introduction = "Zobacz wprowadzenie do aplikacji"
override val links = "Linki"
override val behavior = "Zachowanie"
override val name = "Nazwa"
override val settings = "Ustawienia"
override val snooze_interval = "Czas drzemki"
override val hint_title = "Czy wiesz że?"
override val hint_drag = "Aby zmienić kolejność naciśnij i przytrzymaj na nazwie nawyku i przesuń go na odpowiednie miejsce."
override val hint_landscape = "Możesz zobaczyć więcej dni trzymając telefon poziomo."
override val delete_habits = "Usuń nawyki"
override val delete_habits_message = "Nawyki zostaną trwale usunięte. Tej operacji nie można cofnąć."
override val habit_not_found = "Nawyk usunięty/nie znaleziony"
override val weekends = "Weekendy"
override val any_weekday = "Dni robocze"
override val any_day = "Każdy dzień"
override val select_weekdays = "Wybierz dni"
override val export_to_csv = "Eksportuj dane (CSV)"
override val done_label = "Gotowe"
override val clear_label = "Wyczyść"
override val select_hours = "Wybierz godziny"
override val select_minutes = "Wybierz minuty"
override val about = "O aplikacji"
override val translators = "Tłumacze"
override val developers = "Programiści"
override val version_n = "Wersja %s"
override val frequency = "Częstotliwość"
override val checkmark = "Znacznik"
override val strength = "Siła"
override val best_streaks = "Najlepsze serie"
override val current_streaks = "Aktualna seria"
override val number_of_repetitions = "Liczba powtórzeń"
override val last_x_days = "Ostatnie %d dni"
override val last_x_weeks = "Ostatnie %d tygodni"
override val last_x_months = "Ostatnie %d miesięcy"
override val last_x_years = "Ostatnie %d lat"
override val all_time = "Od początku"
override val every_day = "Codziennie"
override val every_week = "Co tydzień"
override val two_times_per_week = "2 razy na tydzień"
override val five_times_per_week = "5 razy na tydzień"
override val custom_frequency = "Niestandardowo..."
override val help = "Pomoc & FAQ"
override val could_not_export = "Eksportowanie danych nie powiodło się."
override val could_not_import = "Importowanie danych nie powiodło się."
override val file_not_recognized = "Plik nierozpoznany."
override val habits_imported = "Nawyki zaimportowane pomyślnie."
override val full_backup_success = "Pełna kopia zapasowa pomyślnie wyeksportowana."
override val import_data = "Importuj dane"
override val export_full_backup = "Eksportuj pełną kopię zapasową"
override val import_data_summary = "Wspiera pełne kopie zapasowe wyeksportowane przez tą aplikację zarówno jak i pliki wygenerowane przez Tickmate, Habitbull oraz Rewire. Zobacz FAQ po więcej informacji."
override val export_as_csv_summary = "Generuje pliki, które mogą być otwierane przez arkusze kalkulacyjne takie jak Microsoft Excel czy OpenOffice Calc. Taki plik nie może być importowany."
override val export_full_backup_summary = "Generuje plik, który zawiera wszystkie Twoje dane. Taki plik może być importowany."
override val bug_report_failed = "Nie udało się wygenerować raportu o błędach."
override val generate_bug_report = "Wygeneruj raport o błędach"
override val troubleshooting = "Rozwiązywanie problemów"
override val help_translate = "Pomóż w tłumaczeniu tej aplikacji"
override val night_mode = "Tryb nocny"
override val use_pure_black = "Używaj pełnej czerni w trybie nocnym"
override val pure_black_description = "Zamienia szare tła na pełną czerń w trybie nocnym. Zmniejsza zużycie baterii w telefonach z ekranem AMOLED."
override val interface_preferences = "Interfejs"
override val reverse_days = "Odwróć kolejność dni"
override val reverse_days_description = "Pokaż dni w odwrotnej kolejności na głównym ekranie"
override val day = "Dzień"
override val week = "Tydzień"
override val month = "Miesiąc"
override val quarter = "Kwartał"
override val year = "Rok"
override val total = "Łącznie"
override val time_every = "raz w"
override val every_x_days = "Co %d dni"
override val every_x_weeks = "Co %d tygodni"
override val every_x_months = "Co %d miesięcy"
override val score = "Wynik"
override val reminder_sound = "Dźwięk przypomnienia"
override val none = "Brak"
override val filter = "Filtruj"
override val hide_completed = "Ukryj zakończone"
override val hide_archived = "Ukryj archiwizowane"
override val sticky_notifications = "Przypinaj powiadomienia"
override val sticky_notifications_description = "Zapobiega usunięciu powiadomień."
override val repair_database = "Napraw bazę danych"
override val database_repaired = "Baza danych została naprawiona."
override val uncheck = "Odznacz"
override val toggle = "Przełącz"
override val action = "Akcja"
override val habit = "Nawyk"
override val sort = "Sortuj"
override val manually = "Ręcznie"
override val by_name = "Według nazwy"
override val by_color = "Według koloru"
override val by_score = "Według wyniku"
override val download = "Pobierz"
override val export = "Eksportuj"
}

@ -1,165 +0,0 @@
// --------------------------------------------------------------------------
// THIS FILE WAS AUTOMATICALLY GENERATED
//
// Please do not submit pull request to modify it. Corrections to translations
// may be submitted at https://translate.loophabits.org/
// --------------------------------------------------------------------------
package org.isoron.uhabits.i18n
class StringsPortugueseBR : Strings() {
override val app_name = "Loop - Acompanhador de Hábitos"
override val main_activity_title = "Hábitos"
override val action_settings = "Configurações"
override val edit = "Editar"
override val delete = "Deletar"
override val archive = "Arquivar"
override val unarchive = "Desarquivar"
override val add_habit = "Adicionar hábito"
override val color_picker_default_title = "Mudar cor"
override val toast_habit_created = "Hábito criado."
override val toast_habit_deleted = "Hábito deletado."
override val toast_habit_restored = "Hábitos restaurados."
override val toast_nothing_to_undo = "Nada para desfazer."
override val toast_nothing_to_redo = "Nada para refazer."
override val toast_habit_changed = "Hábito modificado."
override val toast_habit_changed_back = "Hábito restaurado."
override val toast_habit_archived = "Hábitos arquivados."
override val toast_habit_unarchived = "Hábitos restaurados."
override val overview = "Visão geral"
override val habit_strength = "Estabilidade"
override val history = "Histórico"
override val clear = "Limpar"
override val description_hint = "Pergunta (por ex., \"você meditou hoje?\")"
override val repeat = "Repetir"
override val times_every = "vezes em"
override val days = "dias"
override val reminder = "Lembrete"
override val discard = "Cancelar"
override val save = "Salvar"
override val streaks = "Correntes"
override val no_habits_found = "Você não tem nenhum hábito ativo"
override val long_press_to_toggle = "Sustente por um segundo para marcar ou desmarcar"
override val reminder_off = "Desligado"
override val validation_name_should_not_be_blank = "Nome não pode ficar em branco."
override val validation_number_should_be_positive = "Número precisa ser positivo."
override val validation_at_most_one_rep_per_day = "Você pode ter no máximo uma repetição por dia."
override val create_habit = "Criar hábito"
override val edit_habit = "Editar hábito"
override val check = "Marcar"
override val snooze = "Mais tarde"
override val intro_title_1 = "Bem vindo"
override val intro_description_1 = "Loop é um aplicativo que te ajuda a criar e manter bons hábitos."
override val intro_title_2 = "Adicione alguns hábitos"
override val intro_description_2 = "Todo dia, depois de praticar o seu hábito, marque no aplicativo."
override val intro_title_3 = "Continue praticando"
override val intro_description_3 = "Hábitos praticados regularmente por um longo período recebem uma estrela."
override val intro_title_4 = "Acompanhe o seu progresso"
override val intro_description_4 = "Veja como seus hábitos estão progredindo através de diagramas."
override val interval_15_minutes = "15 minutos"
override val interval_30_minutes = "30 minutos"
override val interval_1_hour = "1 hora"
override val interval_2_hour = "2 horas"
override val interval_4_hour = "4 horas"
override val interval_8_hour = "8 horas"
override val interval_24_hour = "24 horas"
override val pref_toggle_title = "Marcar repetições com um toque curto"
override val pref_toggle_description = "Mais conveniente, mas pode causar marcações acidentais"
override val pref_snooze_interval_title = "Duração do \"mais tarde\" nos lembretes"
override val pref_rate_this_app = "Avaliar esse app no Google Play"
override val pref_send_feedback = "Mandar sugestões para o desenvolvedor"
override val pref_view_source_code = "Ver código-fonte no GitHub"
override val pref_view_app_introduction = "Assistir introdução ao aplicativo"
override val links = "Links"
override val behavior = "Interação"
override val name = "Nome"
override val settings = "Configurações"
override val snooze_interval = "Duração do \"mais tarde\""
override val hint_title = "Dica"
override val hint_drag = "Para mudar a ordem dos hábitos, aperte no nome do hábito, sustente e arraste."
override val hint_landscape = "Para ver mais dias, coloque seu aparelho em modo paisagem."
override val delete_habits = "Deletar hábitos"
override val delete_habits_message = "Os hábitos escolhidos serão deletados permanentemente. Esta ação não pode ser desfeita."
override val habit_not_found = "Hábito deletado / não encontrado"
override val weekends = "Fim de semana"
override val any_weekday = "Segunda a sexta"
override val any_day = "Qualquer dia da semana"
override val select_weekdays = "Selecionar dias"
override val export_to_csv = "Exportar em formato CSV"
override val done_label = "Pronto"
override val clear_label = "Limpar"
override val select_hours = "Selecionar horas"
override val select_minutes = "Selecionar minutos"
override val about = "Sobre"
override val translators = "Tradutores"
override val developers = "Desenvolvedores"
override val version_n = "Versão %s"
override val frequency = "Frequência"
override val checkmark = "Marcações"
override val strength = "Estabilidade"
override val best_streaks = "Correntes mais longas"
override val current_streaks = "Corrente atual"
override val number_of_repetitions = "Número de repetições"
override val last_x_days = "Últimos %d dias"
override val last_x_weeks = "Últimas %d semanas"
override val last_x_months = "Últimos %d meses"
override val last_x_years = "Últimos %d anos"
override val all_time = "Desde o início"
override val every_day = "Todo dia"
override val every_week = "Toda semana"
override val two_times_per_week = "2 vezes por semana"
override val five_times_per_week = "5 vezes por semana"
override val custom_frequency = "Personalizar ..."
override val help = "Ajuda & FAQ"
override val could_not_export = "Erro ao exportar dados."
override val could_not_import = "Erro ao importar dados."
override val file_not_recognized = "Arquivo não reconhecido."
override val habits_imported = "Hábitos importados com sucesso."
override val full_backup_success = "Backup completo exportado com sucesso."
override val import_data = "Importar dados"
override val export_full_backup = "Exportar backup completo"
override val import_data_summary = "Aceita backups completos exportados por este app, além de arquivos gerados por Tickmate, HabitBull ou Rewire. Veja \"Ajuda\" para mais informações."
override val export_as_csv_summary = "Gera arquivos que podem ser abertos em editores de planilha, como Microsoft Excel ou Openoffice Calc. Estes arquivos não podem ser importados de volta."
override val export_full_backup_summary = "Gera um arquivo que contém todos os dados. Este arquivo pode ser importado de volta."
override val bug_report_failed = "Erro ao gerar relatório de erros."
override val generate_bug_report = "Gerar relatório de erros."
override val troubleshooting = "Solução de problemas"
override val help_translate = "Ajude a traduzir este app"
override val night_mode = "Modo noturno"
override val use_pure_black = "Usar preto em modo noturno"
override val pure_black_description = "Substitui os tons de cinza por preto puro em modo noturno. Economiza bateria em telefones com tela AMOLED."
override val interface_preferences = "Interface"
override val reverse_days = "Inverter a ordem dos dias"
override val reverse_days_description = "Mostra os dias em ordem inversa na tela principal"
override val day = "Dia"
override val week = "Semana"
override val month = "Mês"
override val quarter = "Trimestre"
override val year = "Ano"
override val total = "Total"
override val time_every = "vez em"
override val every_x_days = "A cada %d dias"
override val every_x_weeks = "A cada %d semanas"
override val every_x_months = "A cada %d meses"
override val score = "Estabilidade"
override val reminder_sound = "Toque dos lembretes"
override val none = "Nenhum"
override val filter = "Filtro"
override val hide_completed = "Ocultar concluído"
override val hide_archived = "Ocultar arquivado"
override val sticky_notifications = "Tornar notificações persistentes"
override val sticky_notifications_description = "Impede que as notificações sejam dispensadas."
override val repair_database = "Reparar banco de dados"
override val database_repaired = "Banco de dados reparado."
override val uncheck = "Desmarcar"
override val toggle = "Alternar"
override val action = "Ação"
override val habit = "Hábito"
override val sort = "Ordenar"
override val manually = "Manualmente"
override val by_name = "Por nome"
override val by_color = "Por cor"
override val by_score = "Por score"
override val download = "Download"
override val export = "Exportar"
}

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save