Compare commits

..

66 Commits

Author SHA1 Message Date
5e00d07b73 Merge branch 'hotfix/1.7.2' 2017-05-28 00:41:37 -04:00
28b6ae7014 Apply dark theme on dialogs
Fixes #291
2017-05-28 00:31:48 -04:00
2a1bf5fc2e Update CHANGELOG 2017-05-27 23:38:58 -04:00
ef7483f9dc Make SQLiteHabitList.toList synchronized 2017-05-27 23:37:24 -04:00
bbb9ed8f99 Update translations 2017-05-27 23:30:45 -04:00
c49d576871 Fix crash at startup 2017-05-27 23:29:35 -04:00
bc66ae4f7a Bump version to 1.7.2 2017-05-27 23:28:16 -04:00
fa416adbb9 Merge branch 'hotfix/1.7.1' 2017-05-21 10:20:48 -04:00
8b835b9918 Update CHANGELOG 2017-05-21 10:10:30 -04:00
471c5d341f Update translations 2017-05-21 10:03:13 -04:00
57296745b3 Improve performance of CheckmarkButtonView 2017-04-19 14:33:59 -04:00
140ab34a76 Verify database version before importing 2017-04-11 22:03:16 -04:00
0d6ad26505 Ignore exception when habit is not found 2017-04-11 21:19:03 -04:00
65cc99dbf7 Switch from View.BaseSavedState to Support Library's AbsSavedState
See https://code.google.com/p/android/issues/detail?id=196430
2017-04-11 17:49:55 -04:00
6855ef9d5e Update translations 2017-04-11 17:26:06 -04:00
4c58b084c6 Fix missing dialog title 2017-04-11 17:19:18 -04:00
5c8e522646 Fix header labels for RTL languages such as Arabic 2017-04-11 17:14:25 -04:00
55da0759d4 Bump version 2017-04-11 16:58:35 -04:00
692fe3218f Merge branch 'release/1.7.0' 2017-04-09 18:13:52 -04:00
387930c08d Fix icon size, remove unused icons 2017-04-09 17:37:14 -04:00
6bd31f9607 Add Basque, Catalan, Persian and Romanian languages 2017-04-09 17:16:08 -04:00
9aafe7160c Update translation links 2017-04-09 16:56:04 -04:00
5cc4aac67a Update translations 2017-04-09 16:41:32 -04:00
831421bc98 Ignore CrowdIn configuration files 2017-04-09 16:03:00 -04:00
161d8f2517 Update changelog 2017-03-31 09:12:53 -04:00
bfe4b822b3 Bump version 2017-03-31 08:15:04 -04:00
19e79a8559 Fix failing test 2017-03-20 22:32:53 -04:00
876d4f0ac7 Merge branch 'feature/scroll-header' into dev
Fixes #155
2017-03-20 20:05:26 -04:00
f4f7faf3a4 Fix a few issues with header scrolling 2017-03-20 20:00:10 -04:00
56f2ae57fe Persist scrolling after configuration change 2017-03-20 18:53:48 -04:00
3fe09efe9b Scroll checkmarks 2017-03-19 20:36:16 -04:00
f0de29fbfe Make HeaderView scrollable 2017-03-19 18:31:43 -04:00
324facfffd Re-enable haptic feedback on CheckmarkButtonView 2017-03-19 16:35:57 -04:00
03e58f9ef2 Preserve position of ScrollableChart on configuration changes
Fixes #240
2017-03-18 23:57:54 -04:00
e6c9f7f0c9 Preserve ScrollView position after configuration change
Fixes #239
2017-03-18 22:41:32 -04:00
42bdedb86a Update dependencies 2017-03-18 22:40:38 -04:00
ab0c510fda Rename export action and move to overflow menu 2017-03-18 22:22:07 -04:00
e46fd58664 Fix ImportTest on Nougat 2017-03-17 22:49:52 -04:00
8532bd402e Update APK filename 2017-03-17 22:11:48 -04:00
2c599b18ef Fix ambiguous reference to R 2017-03-17 21:52:51 -04:00
0d78ba4ba9 Update gradle 2017-03-17 21:52:13 -04:00
Janet Do
611dfa00a5 Export data from the statistics screen
Closes #27
2017-02-02 21:31:37 -05:00
Anirudha Agashe
54a195243d Fixed failing build
Replaced static method to obtain context with appropriate dependency
2017-01-18 12:58:56 -06:00
Anirudha Agashe
4fc30fae53 Remove use of static context from HabitsApplication class (#224)
Remove static context from application class. Replace static method to obtain context with appropriate dependency. Remove context from controller. Add auto factory to export db task.
2017-01-09 23:09:05 -05:00
b3fe9c65d2 Refresh data at midnight
Fixes #221
2016-12-31 18:24:26 -05:00
09f1ae8765 Update circle.yml 2016-12-31 12:30:10 -05:00
0a8b763ece Make TimePicker slightly smaller
Fixes #219
2016-12-30 12:58:37 -05:00
edd5f25529 Update circle.yml 2016-12-25 23:56:34 -05:00
d81fdb41dc Remove temp file after importing 2016-12-25 23:50:38 -05:00
02c8810e46 Bump targetSdkVersion to 25 2016-12-25 23:05:47 -05:00
6adf8061d3 Use FileProvider instead of File URIs 2016-12-25 23:05:17 -05:00
d19d57e5df Use Storage Access Framework when importing files 2016-12-25 11:54:08 -05:00
fd82e6c24b Remember last used order 2016-11-24 06:00:02 -05:00
56263efa39 Sort by score 2016-11-24 05:45:08 -05:00
d5eacba303 Disable drag-and-drop when automatically sorting 2016-11-24 05:27:26 -05:00
222261c674 Add order menu 2016-11-23 06:35:07 -05:00
b1a06df7f8 Implement automatic sorting for SQLHabitList 2016-11-23 05:58:46 -05:00
a1fc7dd0d1 Implement automatic sorting for MemoryHabitList 2016-11-04 05:59:34 -04:00
Justin Inácio
10131d5124 Allow intervals larger than 99 days (#202) 2016-11-02 06:13:31 -04:00
aa94959ad2 Merge tag 'v1.6.2' into dev
v1.6.2
2016-10-13 07:09:19 -04:00
967dc2586b Merge branch 'hotfix/1.6.2' 2016-10-13 07:09:11 -04:00
908fd1d6ae Fix NoSuchMethodError on Android 4.1 2016-10-11 06:34:22 -04:00
45fd8a29e1 Merge tag 'v1.6.1' into dev
v1.6.1
2016-10-10 12:10:23 -04:00
4624acd477 Merge branch 'hotfix/1.6.1' 2016-10-10 12:10:14 -04:00
c8cd4fa389 Delete old database cache 2016-10-10 11:39:18 -04:00
8c4fab28aa Merge tag 'v1.6.0' into dev
v1.6.0
2016-10-10 09:54:29 -04:00
146 changed files with 7120 additions and 4916 deletions

1
.gitignore vendored
View File

@@ -20,3 +20,4 @@ captures/
docs/
gen/
local.properties
crowdin.yaml

View File

@@ -1,5 +1,32 @@
# Changelog
### 1.7.2 (May 27, 2017)
* Fix crash at startup
### 1.7.1 (May 21, 2017)
* Fix crash (BadParcelableException)
* Fix layout for RTL languages such as Arabic
* Automatically detect and reject invalid database files
* Add Hebrew translation
### 1.7.0 (Mar 31, 2017)
* Sort habits automatically
* Allow swiping the header to see previous days
* Import backups directly from Google Drive or Dropbox
* Refresh data automatically at midnight
* Other minor bug fixes and enhancements
### 1.6.2 (Oct 13, 2016)
* Fix crash on Android 4.1
### 1.6.1 (Oct 10, 2016)
* Fix a crash at startup when database is corrupted
### 1.6.0 (Oct 10, 2016)
* Add option to make notifications sticky

View File

@@ -4,15 +4,15 @@ apply plugin: 'me.tatarka.retrolambda'
apply plugin: 'jacoco'
android {
compileSdkVersion 23
buildToolsVersion "23.0.3"
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig {
applicationId "org.isoron.uhabits"
minSdkVersion 15
targetSdkVersion 23
targetSdkVersion 25
buildConfigField "Integer", "databaseVersion", "14"
buildConfigField "Integer", "databaseVersion", "15"
buildConfigField "String", "databaseFilename", "\"uhabits.db\""
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
@@ -25,7 +25,7 @@ android {
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
debug {
testCoverageEnabled = true
testCoverageEnabled = false
}
}
@@ -53,7 +53,7 @@ dependencies {
androidTestApt 'com.google.dagger:dagger-compiler:2.2'
androidTestCompile 'com.android.support:support-annotations:23.3.0'
androidTestCompile 'com.android.support:support-annotations:25.3.0'
androidTestCompile 'com.android.support.test:rules:0.5'
androidTestCompile 'com.android.support.test:runner:0.5'
androidTestCompile 'com.google.auto.factory:auto-factory:1.0-beta3'
@@ -64,10 +64,10 @@ dependencies {
apt 'com.google.dagger:dagger-compiler:2.2'
apt 'com.jakewharton:butterknife-compiler:8.0.1'
compile 'com.android.support:appcompat-v7:23.3.0'
compile 'com.android.support:design:23.3.0'
compile 'com.android.support:preference-v14:23.3.0'
compile 'com.android.support:support-v4:23.3.0'
compile 'com.android.support:appcompat-v7:25.3.0'
compile 'com.android.support:design:25.3.0'
compile 'com.android.support:preference-v14:25.3.0'
compile 'com.android.support:support-v4:25.3.0'
compile 'com.getpebble:pebblekit:3.0.0'
compile 'com.github.paolorotolo:appintro:3.4.0'
compile 'com.google.auto.factory:auto-factory:1.0-beta3'

View File

@@ -63,6 +63,8 @@ public class BaseAndroidTest
protected AndroidTestComponent component;
protected ModelFactory modelFactory;
@Before
public void setUp()
{
@@ -89,7 +91,7 @@ public class BaseAndroidTest
taskRunner = component.getTaskRunner();
logger = component.getHabitsLogger();
ModelFactory modelFactory = component.getModelFactory();
modelFactory = component.getModelFactory();
fixtures = new HabitFixtures(modelFactory, habitList);
latch = new CountDownLatch(1);

View File

@@ -225,7 +225,7 @@ public class BaseViewTest extends BaseAndroidTest
throws IOException
{
File dir = FileUtils.getSDCardDir("test-screenshots");
if (dir == null) dir = FileUtils.getFilesDir("test-screenshots");
if (dir == null) dir = FileUtils.getFilesDir(targetContext,"test-screenshots");
if (dir == null) throw new RuntimeException(
"Could not find suitable dir for screenshots");

View File

@@ -39,12 +39,18 @@ public class HabitFixtures
}
public Habit createEmptyHabit()
{
return createEmptyHabit(null);
}
public Habit createEmptyHabit(Long id)
{
Habit habit = modelFactory.buildHabit();
habit.setName("Meditate");
habit.setDescription("Did you meditate this morning?");
habit.setColor(3);
habit.setFrequency(Frequency.DAILY);
habit.setId(id);
habitList.add(habit);
return habit;
}

View File

@@ -46,12 +46,12 @@ public class CheckmarkButtonViewTest extends BaseViewTest
public void setUp()
{
super.setUp();
setSimilarityCutoff(0.03f);
setSimilarityCutoff(0.015f);
latch = new CountDownLatch(1);
view = new CheckmarkButtonView(targetContext);
view.setValue(Checkmark.UNCHECKED);
view.setColor(ColorUtils.getAndroidTestColor(7));
view.setColor(ColorUtils.getAndroidTestColor(5));
measureView(view, dpToPixels(40), dpToPixels(40));
}

View File

@@ -60,6 +60,7 @@ public class CheckmarkPanelViewTest extends BaseViewTest
view = new CheckmarkPanelView(targetContext);
view.setHabit(habit);
view.setCheckmarkValues(checkmarks);
view.setButtonCount(4);
view.setColor(ColorUtils.getAndroidTestColor(7));
measureView(view, dpToPixels(200), dpToPixels(200));

View File

@@ -40,8 +40,6 @@ import static org.junit.Assert.*;
@MediumTest
public class ImportTest extends BaseAndroidTest
{
private File baseDir;
private Context context;
@Override
@@ -50,11 +48,8 @@ public class ImportTest extends BaseAndroidTest
{
super.setUp();
DateUtils.setFixedLocalTime(null);
fixtures.purgeHabits(habitList);
context = InstrumentationRegistry.getInstrumentation().getContext();
baseDir = FileUtils.getFilesDir("Backups");
if (baseDir == null) fail("baseDir should not be null");
}
@Test
@@ -149,8 +144,7 @@ public class ImportTest extends BaseAndroidTest
private void importFromFile(String assetFilename) throws IOException
{
File file =
new File(String.format("%s/%s", baseDir.getPath(), assetFilename));
File file = File.createTempFile("asset", "");
copyAssetToFile(assetFilename, file);
assertTrue(file.exists());
assertTrue(file.canRead());
@@ -159,5 +153,7 @@ public class ImportTest extends BaseAndroidTest
assertThat(importer.canHandle(file), is(true));
importer.importHabitsFromFile(file);
file.delete();
}
}

View File

@@ -0,0 +1,240 @@
/*
* 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.models;
import android.support.test.runner.*;
import android.test.suitebuilder.annotation.*;
import org.hamcrest.*;
import org.isoron.uhabits.*;
import org.junit.*;
import org.junit.runner.*;
import java.io.*;
import java.util.*;
import static junit.framework.Assert.*;
import static org.hamcrest.CoreMatchers.*;
import static org.hamcrest.MatcherAssert.*;
import static org.hamcrest.core.IsEqual.equalTo;
import static org.isoron.uhabits.models.HabitList.Order.*;
@SuppressWarnings("JavaDoc")
@RunWith(AndroidJUnit4.class)
@MediumTest
public class HabitListTest extends BaseAndroidTest
{
private ArrayList<Habit> habitsArray;
private HabitList activeHabits;
private HabitList reminderHabits;
@Override
public void setUp()
{
super.setUp();
habitList.removeAll();
habitsArray = new ArrayList<>();
for (int i = 0; i < 10; i++)
{
Habit habit = fixtures.createEmptyHabit((long) i);
habitsArray.add(habit);
if (i % 3 == 0)
habit.setReminder(new Reminder(8, 30, WeekdayList.EVERY_DAY));
habitList.update(habit);
}
habitsArray.get(0).setArchived(true);
habitsArray.get(1).setArchived(true);
habitsArray.get(4).setArchived(true);
habitsArray.get(7).setArchived(true);
activeHabits = habitList.getFiltered(new HabitMatcherBuilder().build());
reminderHabits = habitList.getFiltered(new HabitMatcherBuilder()
.setArchivedAllowed(true)
.setReminderRequired(true)
.build());
}
@Test
public void test_size()
{
assertThat(habitList.size(), equalTo(10));
}
@Test
public void test_countActive()
{
assertThat(activeHabits.size(), equalTo(6));
}
@Test
public void test_getByPosition()
{
assertThat(habitList.getByPosition(0), equalTo(habitsArray.get(0)));
assertThat(habitList.getByPosition(3), equalTo(habitsArray.get(3)));
assertThat(habitList.getByPosition(9), equalTo(habitsArray.get(9)));
assertThat(activeHabits.getByPosition(0), equalTo(habitsArray.get(2)));
}
@Test
public void test_getHabitsWithReminder()
{
assertThat(reminderHabits.size(), equalTo(4));
assertThat(reminderHabits.getByPosition(1),
equalTo(habitsArray.get(3)));
}
@Test
public void test_get_withInvalidId()
{
assertThat(habitList.getById(100L), is(nullValue()));
}
@Test
public void test_get_withValidId()
{
Habit habit1 = habitsArray.get(0);
Habit habit2 = habitList.getById(habit1.getId());
assertThat(habit1, equalTo(habit2));
}
@Test
public void test_reorder()
{
int operations[][] = {
{ 5, 2 }, { 3, 7 }, { 4, 4 }, { 3, 2 }
};
int expectedPosition[][] = {
{ 0, 1, 3, 4, 5, 2, 6, 7, 8, 9 },
{ 0, 1, 7, 3, 4, 2, 5, 6, 8, 9 },
{ 0, 1, 7, 3, 4, 2, 5, 6, 8, 9 },
{ 0, 1, 7, 2, 4, 3, 5, 6, 8, 9 },
};
for (int i = 0; i < operations.length; i++)
{
int from = operations[i][0];
int to = operations[i][1];
Habit fromHabit = habitList.getByPosition(from);
Habit toHabit = habitList.getByPosition(to);
habitList.reorder(fromHabit, toHabit);
int actualPositions[] = new int[10];
for (int j = 0; j < 10; j++)
{
Habit h = habitList.getById(j);
assertNotNull(h);
actualPositions[j] = habitList.indexOf(h);
}
assertThat(actualPositions, equalTo(expectedPosition[i]));
}
}
@Test
public void test_writeCSV() throws IOException
{
habitList.removeAll();
Habit h1 = fixtures.createEmptyHabit();
h1.setName("Meditate");
h1.setDescription("Did you meditate this morning?");
h1.setFrequency(Frequency.DAILY);
h1.setColor(3);
Habit h2 = fixtures.createEmptyHabit();
h2.setName("Wake up early");
h2.setDescription("Did you wake up before 6am?");
h2.setFrequency(new Frequency(2, 3));
h2.setColor(5);
habitList.update(h1);
habitList.update(h2);
String expectedCSV =
"Position,Name,Description,NumRepetitions,Interval,Color\n" +
"001,Meditate,Did you meditate this morning?,1,1,#AFB42B\n" +
"002,Wake up early,Did you wake up before 6am?,2,3,#00897B\n";
StringWriter writer = new StringWriter();
habitList.writeCSV(writer);
MatcherAssert.assertThat(writer.toString(), equalTo(expectedCSV));
}
@Test
public void test_ordering()
{
habitList.removeAll();
Habit h3 = fixtures.createEmptyHabit();
h3.setName("C Habit");
h3.setColor(0);
habitList.update(h3);
Habit h1 = fixtures.createEmptyHabit();
h1.setName("A Habit");
h1.setColor(2);
habitList.update(h1);
Habit h4 = fixtures.createEmptyHabit();
h4.setName("D Habit");
h4.setColor(1);
habitList.update(h4);
Habit h2 = fixtures.createEmptyHabit();
h2.setName("B Habit");
h2.setColor(2);
habitList.update(h2);
habitList.setOrder(BY_POSITION);
assertThat(habitList.getByPosition(0), equalTo(h3));
assertThat(habitList.getByPosition(1), equalTo(h1));
assertThat(habitList.getByPosition(2), equalTo(h4));
assertThat(habitList.getByPosition(3), equalTo(h2));
habitList.setOrder(BY_NAME);
assertThat(habitList.getByPosition(0), equalTo(h1));
assertThat(habitList.getByPosition(1), equalTo(h2));
assertThat(habitList.getByPosition(2), equalTo(h3));
assertThat(habitList.getByPosition(3), equalTo(h4));
habitList.remove(h1);
habitList.add(h1);
assertThat(habitList.getByPosition(0), equalTo(h1));
habitList.setOrder(BY_COLOR);
assertThat(habitList.getByPosition(0), equalTo(h3));
assertThat(habitList.getByPosition(1), equalTo(h4));
assertThat(habitList.getByPosition(2), equalTo(h1));
assertThat(habitList.getByPosition(3), equalTo(h2));
}
}

View File

@@ -125,17 +125,6 @@ public class SQLiteHabitListTest extends BaseAndroidTest
assertThat(habits.get(3).getName(), equalTo("habit 3"));
}
// @Test
// public void testGetAll_withoutArchived()
// {
// List<Habit> habits = habitList.toList();
// assertThat(habits.size(), equalTo(5));
// assertThat(habits.get(3).getName(), equalTo("habit 7"));
//
// List<Habit> another = habitList.toList();
// assertThat(habits, equalTo(another));
// }
@Test
public void testGetById()
{
@@ -178,45 +167,6 @@ public class SQLiteHabitListTest extends BaseAndroidTest
assertThat(habitList.indexOf(h2), equalTo(-1));
}
@Test
public void test_reorder()
{
// Same as HabitListTest.java
// TODO: remove duplication
int operations[][] = {
{5, 2}, {3, 7}, {4, 4}, {3, 2}
};
int expectedPosition[][] = {
{0, 1, 3, 4, 5, 2, 6, 7, 8, 9},
{0, 1, 7, 3, 4, 2, 5, 6, 8, 9},
{0, 1, 7, 3, 4, 2, 5, 6, 8, 9},
{0, 1, 7, 2, 4, 3, 5, 6, 8, 9},
};
for (int i = 0; i < operations.length; i++)
{
int from = operations[i][0];
int to = operations[i][1];
Habit fromHabit = habitList.getByPosition(from);
Habit toHabit = habitList.getByPosition(to);
habitList.reorder(fromHabit, toHabit);
int actualPositions[] = new int[10];
for (int j = 0; j < 10; j++)
{
Habit h = habitList.getById(j);
assertNotNull(h);
actualPositions[j] = habitList.indexOf(h);
}
assertThat(actualPositions, equalTo(expectedPosition[i]));
}
}
private HabitRecord getRecord(long id)
{
return new Select()

View File

@@ -56,7 +56,7 @@ public class ExportCSVTaskTest extends BaseAndroidTest
for (Habit h : habitList) selected.add(h);
taskRunner.execute(
new ExportCSVTask(habitList, selected, archiveFilename -> {
new ExportCSVTask(targetContext,habitList, selected, archiveFilename -> {
assertThat(archiveFilename, is(not(nullValue())));
File f = new File(archiveFilename);
assertTrue(f.exists());

View File

@@ -46,7 +46,7 @@ public class ExportDBTaskTest extends BaseAndroidTest
@Test
public void testExportCSV() throws Throwable
{
ExportDBTask task = new ExportDBTask(filename -> {
ExportDBTask task = new ExportDBTask(targetContext, filename -> {
assertThat(filename, is(not(nullValue())));
File f = new File(filename);

View File

@@ -21,8 +21,8 @@
<manifest
package="org.isoron.uhabits"
xmlns:android="http://schemas.android.com/apk/res/android"
android:versionCode="23"
android:versionName="1.6.0">
android:versionCode="29"
android:versionName="1.7.2">
<uses-permission android:name="android.permission.VIBRATE"/>
@@ -223,5 +223,15 @@
</intent-filter>
</receiver>
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="org.isoron.uhabits"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
</application>
</manifest>

View File

@@ -0,0 +1,3 @@
delete from Score;
delete from Streak;
delete from Checkmarks;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 40 KiB

View File

@@ -21,10 +21,10 @@ package org.isoron.uhabits;
import android.app.*;
import android.content.*;
import android.support.annotation.*;
import com.activeandroid.*;
import org.isoron.uhabits.models.sqlite.*;
import org.isoron.uhabits.notifications.*;
import org.isoron.uhabits.preferences.*;
import org.isoron.uhabits.tasks.*;
@@ -38,7 +38,7 @@ import java.io.*;
*/
public class HabitsApplication extends Application
{
private static Context context;
private Context context;
private static AppComponent component;
@@ -58,26 +58,14 @@ public class HabitsApplication extends Application
HabitsApplication.component = component;
}
@NonNull
@Deprecated
public static Context getContext()
{
if (context == null) throw new RuntimeException("context is null");
return context;
}
public static boolean isTestMode()
{
try
{
if (context != null)
{
String testClass = "org.isoron.uhabits.BaseAndroidTest";
context.getClassLoader().loadClass(testClass);
}
Class.forName ("org.isoron.uhabits.BaseAndroidTest");
return true;
}
catch (final Exception e)
catch (final ClassNotFoundException e)
{
return false;
}
@@ -87,7 +75,7 @@ public class HabitsApplication extends Application
public void onCreate()
{
super.onCreate();
HabitsApplication.context = this;
context = this;
component = DaggerAppComponent
.builder()
@@ -96,11 +84,20 @@ public class HabitsApplication extends Application
if (isTestMode())
{
File db = DatabaseUtils.getDatabaseFile();
File db = DatabaseUtils.getDatabaseFile(context);
if (db.exists()) db.delete();
}
DatabaseUtils.initializeActiveAndroid();
try
{
DatabaseUtils.initializeActiveAndroid(context);
}
catch (InvalidDatabaseVersionException e)
{
File db = DatabaseUtils.getDatabaseFile(context);
db.renameTo(new File(db.getAbsolutePath() + ".invalid"));
DatabaseUtils.initializeActiveAndroid(context);
}
widgetUpdater = component.getWidgetUpdater();
widgetUpdater.startListening();
@@ -125,7 +122,7 @@ public class HabitsApplication extends Application
@Override
public void onTerminate()
{
HabitsApplication.context = null;
context = null;
ActiveAndroid.dispose();
reminderScheduler.stopListening();

View File

@@ -40,6 +40,7 @@ import java.io.*;
import static android.os.Build.VERSION.*;
import static android.os.Build.VERSION_CODES.*;
import static android.support.v4.content.FileProvider.*;
/**
* Base class for all screens in the application.
@@ -50,6 +51,8 @@ import static android.os.Build.VERSION_CODES.*;
*/
public class BaseScreen
{
public static final int REQUEST_CREATE_DOCUMENT = 1;
protected BaseActivity activity;
@Nullable
@@ -230,11 +233,14 @@ public class BaseScreen
public void showSendFileScreen(@NonNull String archiveFilename)
{
File file = new File(archiveFilename);
Uri fileUri = getUriForFile(activity, "org.isoron.uhabits", file);
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.setType("application/zip");
intent.putExtra(Intent.EXTRA_STREAM,
Uri.fromFile(new File(archiveFilename)));
intent.putExtra(Intent.EXTRA_STREAM, fileUri);
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
activity.startActivity(intent);
}

View File

@@ -70,7 +70,7 @@ public class BaseSystem
if (context == null) throw new RuntimeException(
"application context should not be null");
File dir = FileUtils.getFilesDir("Logs");
File dir = FileUtils.getFilesDir(context, "Logs");
if (dir == null) throw new IOException("log dir should not be null");
File logFile =

View File

@@ -25,7 +25,7 @@ import android.support.v7.widget.Toolbar;
import android.widget.*;
import org.isoron.uhabits.BuildConfig;
import org.isoron.uhabits.*;
import org.isoron.uhabits.R;
import org.isoron.uhabits.activities.*;
import org.isoron.uhabits.intents.*;
import org.isoron.uhabits.utils.*;
@@ -94,6 +94,13 @@ public class AboutRootView extends BaseRootView
getContext().startActivity(intent);
}
@OnClick(R.id.tvTranslate)
public void onClickTranslate()
{
Intent intent = intents.helpTranslate(getContext());
getContext().startActivity(intent);
}
@OnClick(R.id.tvRate)
public void onClickRate()
{

View File

@@ -24,7 +24,7 @@ import android.support.v7.app.*;
import com.google.auto.factory.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.R;
import org.isoron.uhabits.activities.*;
import butterknife.*;

View File

@@ -78,6 +78,8 @@ public class HistoryEditorDialog extends AppCompatDialogFragment
{
long id = savedInstanceState.getLong("habit", -1);
if (id > 0) this.habit = habitList.getById(id);
historyChart.onRestoreInstanceState(
savedInstanceState.getParcelable("historyChart"));
}
int padding =
@@ -129,6 +131,7 @@ public class HistoryEditorDialog extends AppCompatDialogFragment
public void onSaveInstanceState(Bundle outState)
{
outState.putLong("habit", habit.getId());
outState.putParcelable("historyChart", historyChart.onSaveInstanceState());
}
public void setController(@NonNull Controller controller)

View File

@@ -0,0 +1,62 @@
/*
* 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.activities.common.views;
import android.os.*;
public class BundleSavedState extends android.support.v4.view.AbsSavedState
{
public static final Parcelable.Creator<BundleSavedState> CREATOR =
new Parcelable.Creator<BundleSavedState>()
{
@Override
public BundleSavedState createFromParcel(Parcel source)
{
return new BundleSavedState(source, getClass().getClassLoader());
}
@Override
public BundleSavedState[] newArray(int size)
{
return new BundleSavedState[size];
}
};
public final Bundle bundle;
public BundleSavedState(Parcelable superState, Bundle bundle)
{
super(superState);
this.bundle = bundle;
}
public BundleSavedState(Parcel source, ClassLoader loader)
{
super(source, loader);
this.bundle = source.readBundle(getClass().getClassLoader());
}
@Override
public void writeToParcel(Parcel out, int flags)
{
super.writeToParcel(out, flags);
out.writeBundle(bundle);
}
}

View File

@@ -21,6 +21,7 @@ package org.isoron.uhabits.activities.common.views;
import android.animation.*;
import android.content.*;
import android.os.*;
import android.util.*;
import android.view.*;
import android.widget.*;
@@ -32,7 +33,9 @@ public abstract class ScrollableChart extends View
private int dataOffset;
private int scrollerBucketSize;
private int scrollerBucketSize = 1;
private int direction = 1;
private GestureDetector detector;
@@ -40,6 +43,10 @@ public abstract class ScrollableChart extends View
private ValueAnimator scrollAnimator;
private ScrollController scrollController;
private int maxDataOffset = 10000;
public ScrollableChart(Context context)
{
super(context);
@@ -63,8 +70,7 @@ public abstract class ScrollableChart extends View
if (!scroller.isFinished())
{
scroller.computeScrollOffset();
dataOffset = Math.max(0, scroller.getCurrX() / scrollerBucketSize);
postInvalidate();
updateDataOffset();
}
else
{
@@ -85,19 +91,44 @@ public abstract class ScrollableChart extends View
float velocityY)
{
scroller.fling(scroller.getCurrX(), scroller.getCurrY(),
(int) velocityX / 2, 0, 0, 100000, 0, 0);
direction * ((int) velocityX) / 2, 0, 0, getMaxX(), 0, 0);
invalidate();
scrollAnimator.setDuration(scroller.getDuration());
scrollAnimator.start();
return false;
}
@Override
public void onLongPress(MotionEvent e)
private int getMaxX()
{
return maxDataOffset * scrollerBucketSize;
}
@Override
public void onRestoreInstanceState(Parcelable state)
{
BundleSavedState bss = (BundleSavedState) state;
int x = bss.bundle.getInt("x");
int y = bss.bundle.getInt("y");
direction = bss.bundle.getInt("direction");
dataOffset = bss.bundle.getInt("dataOffset");
maxDataOffset = bss.bundle.getInt("maxDataOffset");
scroller.startScroll(0, 0, x, y, 0);
scroller.computeScrollOffset();
super.onRestoreInstanceState(bss.getSuperState());
}
@Override
public Parcelable onSaveInstanceState()
{
Parcelable superState = super.onSaveInstanceState();
Bundle bundle = new Bundle();
bundle.putInt("x", scroller.getCurrX());
bundle.putInt("y", scroller.getCurrY());
bundle.putInt("dataOffset", dataOffset);
bundle.putInt("direction", direction);
bundle.putInt("maxDataOffset", maxDataOffset);
return new BundleSavedState(superState, bundle);
}
@Override
@@ -111,12 +142,14 @@ public abstract class ScrollableChart extends View
if (parent != null) parent.requestDisallowInterceptTouchEvent(true);
}
scroller.startScroll(scroller.getCurrX(), scroller.getCurrY(),
(int) -dx, (int) dy, 0);
scroller.computeScrollOffset();
dataOffset = Math.max(0, scroller.getCurrX() / scrollerBucketSize);
postInvalidate();
dx = - direction * dx;
dx = Math.min(dx, getMaxX() - scroller.getCurrX());
scroller.startScroll(scroller.getCurrX(), scroller.getCurrY(), (int) dx,
(int) dy, 0);
scroller.computeScrollOffset();
updateDataOffset();
return true;
}
@@ -138,6 +171,32 @@ public abstract class ScrollableChart extends View
return detector.onTouchEvent(event);
}
public void setDirection(int direction)
{
if (direction != 1 && direction != -1)
throw new IllegalArgumentException();
this.direction = direction;
}
@Override
public void onLongPress(MotionEvent e)
{
}
public void setMaxDataOffset(int maxDataOffset)
{
this.maxDataOffset = maxDataOffset;
this.dataOffset = Math.min(dataOffset, maxDataOffset);
scrollController.onDataOffsetChanged(this.dataOffset);
postInvalidate();
}
public void setScrollController(ScrollController scrollController)
{
this.scrollController = scrollController;
}
public void setScrollerBucketSize(int scrollerBucketSize)
{
this.scrollerBucketSize = scrollerBucketSize;
@@ -149,5 +208,25 @@ public abstract class ScrollableChart extends View
scroller = new Scroller(context, null, true);
scrollAnimator = ValueAnimator.ofFloat(0, 1);
scrollAnimator.addUpdateListener(this);
scrollController = new ScrollController() {};
}
private void updateDataOffset()
{
int newDataOffset = scroller.getCurrX() / scrollerBucketSize;
newDataOffset = Math.max(0, newDataOffset);
newDataOffset = Math.min(maxDataOffset, newDataOffset);
if (newDataOffset != dataOffset)
{
dataOffset = newDataOffset;
scrollController.onDataOffsetChanged(dataOffset);
postInvalidate();
}
}
public interface ScrollController
{
default void onDataOffsetChanged(int newDataOffset) {}
}
}

View File

@@ -28,6 +28,7 @@ import android.view.*;
import com.android.datetimepicker.time.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.R;
import org.isoron.uhabits.activities.*;
import org.isoron.uhabits.activities.common.dialogs.*;
import org.isoron.uhabits.commands.*;
@@ -38,6 +39,8 @@ import java.util.*;
import butterknife.*;
import static org.isoron.uhabits.activities.ThemeSwitcher.*;
public abstract class BaseDialog extends AppCompatDialogFragment
{
@Nullable
@@ -61,6 +64,18 @@ public abstract class BaseDialog extends AppCompatDialogFragment
private ColorPickerDialogFactory colorPickerDialogFactory;
@Override
public int getTheme()
{
AppComponent component =
((HabitsApplication) getContext().getApplicationContext()).getComponent();
if(component.getPreferences().getTheme() == THEME_LIGHT)
return R.style.DialogWithTitle;
else
return R.style.DarkDialogWithTitle;
}
@Override
public void onActivityCreated(Bundle savedInstanceState)
{

View File

@@ -24,7 +24,7 @@ import android.support.v4.app.*;
import android.view.*;
import android.widget.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.R;
import org.isoron.uhabits.models.*;
import org.isoron.uhabits.utils.*;

View File

@@ -25,6 +25,7 @@ import org.isoron.uhabits.*;
import org.isoron.uhabits.activities.*;
import org.isoron.uhabits.activities.habits.list.model.*;
import org.isoron.uhabits.preferences.*;
import org.isoron.uhabits.utils.*;
/**
* Activity that allows the user to see and modify the list of habits.
@@ -43,6 +44,8 @@ public class ListHabitsActivity extends BaseActivity
private Preferences prefs;
private MidnightTimer midnightTimer;
public ListHabitsComponent getListHabitsComponent()
{
return component;
@@ -77,6 +80,8 @@ public class ListHabitsActivity extends BaseActivity
screen.setSelectionMenu(selectionMenu);
rootView.setController(controller, selectionMenu);
midnightTimer = component.getMidnightTimer();
setScreen(screen);
controller.onStartup();
}
@@ -84,6 +89,7 @@ public class ListHabitsActivity extends BaseActivity
@Override
protected void onPause()
{
midnightTimer.onPause();
screen.onDettached();
adapter.cancelRefresh();
super.onPause();
@@ -95,6 +101,7 @@ public class ListHabitsActivity extends BaseActivity
adapter.refresh();
screen.onAttached();
rootView.postInvalidate();
midnightTimer.onResume();
if (prefs.getTheme() == ThemeSwitcher.THEME_DARK &&
prefs.isPureBlackEnabled() != pureBlack)

View File

@@ -23,13 +23,14 @@ import org.isoron.uhabits.*;
import org.isoron.uhabits.activities.*;
import org.isoron.uhabits.activities.habits.list.controllers.*;
import org.isoron.uhabits.activities.habits.list.model.*;
import org.isoron.uhabits.utils.*;
import dagger.*;
@ActivityScope
@Component(modules = { ActivityModule.class },
dependencies = { AppComponent.class })
public interface ListHabitsComponent extends ActivityComponent
public interface ListHabitsComponent
{
CheckmarkButtonControllerFactory getCheckmarkButtonControllerFactory();
@@ -44,4 +45,6 @@ public interface ListHabitsComponent extends ActivityComponent
ListHabitsScreen getScreen();
ListHabitsSelectionMenu getSelectionMenu();
MidnightTimer getMidnightTimer();
}

View File

@@ -41,6 +41,7 @@ import javax.inject.*;
public class ListHabitsController
implements HabitCardListController.HabitListener
{
@NonNull
private final ListHabitsScreen screen;
@@ -70,6 +71,8 @@ public class ListHabitsController
private ExportCSVTaskFactory exportCSVFactory;
private ExportDBTaskFactory exportDBFactory;
@Inject
public ListHabitsController(@NonNull BaseSystem system,
@NonNull CommandRunner commandRunner,
@@ -82,7 +85,8 @@ public class ListHabitsController
@NonNull WidgetUpdater widgetUpdater,
@NonNull
ImportDataTaskFactory importTaskFactory,
@NonNull ExportCSVTaskFactory exportCSVFactory)
@NonNull ExportCSVTaskFactory exportCSVFactory,
@NonNull ExportDBTaskFactory exportDBFactory)
{
this.adapter = adapter;
this.commandRunner = commandRunner;
@@ -95,6 +99,7 @@ public class ListHabitsController
this.widgetUpdater = widgetUpdater;
this.importTaskFactory = importTaskFactory;
this.exportCSVFactory = exportCSVFactory;
this.exportDBFactory = exportDBFactory;
}
public void onExportCSV()
@@ -110,7 +115,7 @@ public class ListHabitsController
public void onExportDB()
{
taskRunner.execute(new ExportDBTask(filename -> {
taskRunner.execute(exportDBFactory.create(filename -> {
if (filename != null) screen.showSendFileScreen(filename);
else screen.showMessage(R.string.could_not_export);
}));
@@ -128,7 +133,8 @@ public class ListHabitsController
taskRunner.execute(() -> habitList.reorder(from, to));
}
public void onImportData(@NonNull File file)
public void onImportData(@NonNull File file,
@NonNull OnFinishedListener finishedListener)
{
taskRunner.execute(importTaskFactory.create(file, result -> {
switch (result)
@@ -146,6 +152,8 @@ public class ListHabitsController
screen.showMessage(R.string.could_not_import);
break;
}
finishedListener.onFinish();
}));
}
@@ -208,4 +216,9 @@ public class ListHabitsController
prefs.updateLastHint(-1, DateUtils.getStartOfToday());
screen.showIntroScreen();
}
public interface OnFinishedListener
{
void onFinish();
}
}

View File

@@ -112,6 +112,22 @@ public class ListHabitsMenu extends BaseMenu
invalidate();
return true;
case R.id.actionSortColor:
adapter.setOrder(HabitList.Order.BY_COLOR);
return true;
case R.id.actionSortManual:
adapter.setOrder(HabitList.Order.BY_POSITION);
return true;
case R.id.actionSortName:
adapter.setOrder(HabitList.Order.BY_NAME);
return true;
case R.id.actionSortScore:
adapter.setOrder(HabitList.Order.BY_SCORE);
return true;
default:
return false;
}

View File

@@ -26,8 +26,9 @@ import android.support.v7.widget.Toolbar;
import android.view.*;
import android.widget.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.R;
import org.isoron.uhabits.activities.*;
import org.isoron.uhabits.activities.common.views.*;
import org.isoron.uhabits.activities.habits.list.controllers.*;
import org.isoron.uhabits.activities.habits.list.model.*;
import org.isoron.uhabits.activities.habits.list.views.*;
@@ -43,7 +44,7 @@ import butterknife.*;
public class ListHabitsRootView extends BaseRootView
implements ModelObservable.Listener, TaskRunner.Listener
{
public static final int MAX_CHECKMARK_COUNT = 21;
public static final int MAX_CHECKMARK_COUNT = 60;
@BindView(R.id.listView)
HabitCardListView listView;
@@ -132,6 +133,13 @@ public class ListHabitsRootView extends BaseRootView
listController.setSelectionListener(menu);
listView.setController(listController);
menu.setListController(listController);
header.setScrollController(new ScrollableChart.ScrollController() {
@Override
public void onDataOffsetChanged(int newDataOffset)
{
listView.setDataOffset(newDataOffset);
}
});
}
@Override
@@ -156,6 +164,7 @@ public class ListHabitsRootView extends BaseRootView
{
int count = getCheckmarkCount();
header.setButtonCount(count);
header.setMaxDataOffset(Math.max(MAX_CHECKMARK_COUNT - count, 0));
listView.setCheckmarkCount(count);
super.onSizeChanged(w, h, oldw, oldh);
}

View File

@@ -19,7 +19,9 @@
package org.isoron.uhabits.activities.habits.list;
import android.app.*;
import android.content.*;
import android.net.*;
import android.support.annotation.*;
import org.isoron.uhabits.*;
@@ -31,24 +33,32 @@ import org.isoron.uhabits.commands.*;
import org.isoron.uhabits.intents.*;
import org.isoron.uhabits.io.*;
import org.isoron.uhabits.models.*;
import org.isoron.uhabits.utils.*;
import java.io.*;
import javax.inject.*;
import static android.os.Build.VERSION.*;
import static android.os.Build.VERSION_CODES.*;
@ActivityScope
public class ListHabitsScreen extends BaseScreen
implements CommandRunner.Listener
{
public static final int RESULT_BUG_REPORT = 4;
public static final int RESULT_IMPORT_DATA = 1;
public static final int RESULT_EXPORT_CSV = 2;
public static final int RESULT_EXPORT_DB = 3;
public static final int RESULT_BUG_REPORT = 4;
public static final int RESULT_REPAIR_DB = 5;
public static final int RESULT_IMPORT_DATA = 1;
public static final int REQUEST_OPEN_DOCUMENT = 6;
public static final int REQUEST_SETTINGS = 7;
@Nullable
private ListHabitsController controller;
@@ -125,6 +135,15 @@ public class ListHabitsScreen extends BaseScreen
@Override
public void onResult(int requestCode, int resultCode, Intent data)
{
if (requestCode == REQUEST_OPEN_DOCUMENT)
onOpenDocumentResult(resultCode, data);
if (requestCode == REQUEST_SETTINGS)
onSettingsResult(resultCode);
}
private void onSettingsResult(int resultCode)
{
if (controller == null) return;
@@ -152,6 +171,30 @@ public class ListHabitsScreen extends BaseScreen
}
}
private void onOpenDocumentResult(int resultCode, Intent data)
{
if (controller == null) return;
if (resultCode != Activity.RESULT_OK) return;
try
{
Uri uri = data.getData();
ContentResolver cr = activity.getContentResolver();
InputStream is = cr.openInputStream(uri);
File cacheDir = activity.getExternalCacheDir();
File tempFile = File.createTempFile("import", "", cacheDir);
FileUtils.copy(is, tempFile);
controller.onImportData(tempFile, () -> tempFile.delete());
}
catch (IOException e)
{
showMessage(R.string.could_not_import);
e.printStackTrace();
}
}
public void setController(@Nullable ListHabitsController controller)
{
this.controller = controller;
@@ -208,6 +251,21 @@ public class ListHabitsScreen extends BaseScreen
}
public void showImportScreen()
{
if (SDK_INT < KITKAT)
{
showImportScreenPreKitKat();
return;
}
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
activity.startActivityForResult(intent, REQUEST_OPEN_DOCUMENT);
}
public void showImportScreenPreKitKat()
{
File dir = dirFinder.findStorageDir(null);
@@ -220,7 +278,8 @@ public class ListHabitsScreen extends BaseScreen
FilePickerDialog picker = filePickerDialogFactory.create(dir);
if (controller != null)
picker.setListener(file -> controller.onImportData(file));
picker.setListener(file -> controller.onImportData(file, () -> {}));
activity.showDialog(picker.getDialog());
}
@@ -233,7 +292,7 @@ public class ListHabitsScreen extends BaseScreen
public void showSettingsScreen()
{
Intent intent = intentFactory.startSettingsActivity(activity);
activity.startActivityForResult(intent, 0);
activity.startActivityForResult(intent, REQUEST_SETTINGS);
}
public void toggleNightMode()

View File

@@ -27,6 +27,8 @@ import org.isoron.uhabits.activities.*;
import org.isoron.uhabits.activities.habits.list.*;
import org.isoron.uhabits.activities.habits.list.views.*;
import org.isoron.uhabits.models.*;
import org.isoron.uhabits.preferences.*;
import org.isoron.uhabits.utils.*;
import java.util.*;
@@ -41,7 +43,7 @@ import javax.inject.*;
@ActivityScope
public class HabitCardListAdapter
extends RecyclerView.Adapter<HabitCardViewHolder>
implements HabitCardListCache.Listener
implements HabitCardListCache.Listener, MidnightTimer.MidnightListener
{
@NonNull
private ModelObservable observable;
@@ -55,19 +57,36 @@ public class HabitCardListAdapter
@NonNull
private final HabitCardListCache cache;
@NonNull
private Preferences preferences;
private final MidnightTimer midnightTimer;
@Inject
public HabitCardListAdapter(@NonNull HabitCardListCache cache)
public HabitCardListAdapter(@NonNull HabitCardListCache cache,
@NonNull Preferences preferences,
@NonNull MidnightTimer midnightTimer)
{
this.preferences = preferences;
this.selected = new LinkedList<>();
this.observable = new ModelObservable();
this.cache = cache;
this.midnightTimer = midnightTimer;
cache.setListener(this);
cache.setCheckmarkCount(ListHabitsRootView.MAX_CHECKMARK_COUNT);
cache.setOrder(preferences.getDefaultOrder());
setHasStableIds(true);
}
@Override
public void atMidnight()
{
cache.refreshAllHabits();
}
public void cancelRefresh()
{
cache.cancelTasks();
@@ -130,12 +149,18 @@ public class HabitCardListAdapter
return selected.isEmpty();
}
public boolean isSortable()
{
return cache.getOrder() == HabitList.Order.BY_POSITION;
}
/**
* Notify the adapter that it has been attached to a ListView.
*/
public void onAttached()
{
cache.onAttached();
midnightTimer.addListener(this);
}
@Override
@@ -153,6 +178,20 @@ public class HabitCardListAdapter
listView.bindCardView(holder, habit, score, checkmarks, selected);
}
@Override
public void onViewAttachedToWindow(@Nullable HabitCardViewHolder holder)
{
if (listView == null) return;
listView.attachCardView(holder);
}
@Override
public void onViewDetachedFromWindow(@Nullable HabitCardViewHolder holder)
{
if (listView == null) return;
listView.detachCardView(holder);
}
@Override
public HabitCardViewHolder onCreateViewHolder(ViewGroup parent,
int viewType)
@@ -168,6 +207,7 @@ public class HabitCardListAdapter
public void onDetached()
{
cache.onDetached();
midnightTimer.removeListener(this);
}
@Override
@@ -260,6 +300,12 @@ public class HabitCardListAdapter
this.listView = listView;
}
public void setOrder(HabitList.Order order)
{
cache.setOrder(order);
preferences.setDefaultOrder(order);
}
/**
* Selects or deselects the item at a given position.
*

View File

@@ -107,6 +107,11 @@ public class HabitCardListCache implements CommandRunner.Listener
return data.habits.size();
}
public HabitList.Order getOrder()
{
return filteredHabits.getOrder();
}
public int getScore(long habitId)
{
return data.scores.get(habitId);
@@ -180,6 +185,13 @@ public class HabitCardListCache implements CommandRunner.Listener
this.listener = listener;
}
public void setOrder(HabitList.Order order)
{
allHabits.setOrder(order);
filteredHabits.setOrder(order);
refreshAllHabits();
}
/**
* Interface definition for a callback to be invoked when the data on the
* cache has been modified.

View File

@@ -20,21 +20,34 @@
package org.isoron.uhabits.activities.habits.list.views;
import android.content.*;
import android.content.res.*;
import android.graphics.*;
import android.support.annotation.*;
import android.text.*;
import android.util.*;
import android.view.*;
import android.widget.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.activities.habits.list.controllers.*;
import org.isoron.uhabits.models.*;
import org.isoron.uhabits.utils.*;
public class CheckmarkButtonView extends TextView
import static android.view.View.MeasureSpec.*;
import static org.isoron.uhabits.models.Checkmark.*;
import static org.isoron.uhabits.utils.AttributeSetUtils.*;
public class CheckmarkButtonView extends View
{
private int color;
private int value;
private StyledResources res;
private StyledResources styledRes;
private TextPaint paint;
private int lowContrastColor;
private RectF rect;
public CheckmarkButtonView(Context context)
{
@@ -42,6 +55,21 @@ public class CheckmarkButtonView extends TextView
init();
}
public CheckmarkButtonView(@Nullable Context ctx, @Nullable AttributeSet attrs)
{
super(ctx, attrs);
init();
if(ctx == null) throw new IllegalStateException();
if(attrs == null) throw new IllegalStateException();
int paletteColor = getIntAttribute(ctx, attrs, "color", 0);
setColor(ColorUtils.getAndroidTestColor(paletteColor));
int value = getIntAttribute(ctx, attrs, "value", 0);
setValue(value);
}
public void setColor(int color)
{
this.color = color;
@@ -57,55 +85,60 @@ public class CheckmarkButtonView extends TextView
public void setValue(int value)
{
this.value = value;
updateText();
postInvalidate();
}
public void toggle()
{
value = (value == Checkmark.CHECKED_EXPLICITLY ? Checkmark.UNCHECKED :
Checkmark.CHECKED_EXPLICITLY);
value = (value == CHECKED_EXPLICITLY ? UNCHECKED : CHECKED_EXPLICITLY);
performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);
updateText();
postInvalidate();
}
@Override
protected void onDraw(Canvas canvas)
{
super.onDraw(canvas);
Resources resources = getResources();
paint.setColor(value == CHECKED_EXPLICITLY ? color : lowContrastColor);
int id = (value == UNCHECKED ? R.string.fa_times : R.string.fa_check);
String label = resources.getString(id);
float em = paint.measureText("m");
rect.set(0, 0, getWidth(), getHeight());
rect.offset(0, 0.4f * em);
canvas.drawText(label, rect.centerX(), rect.centerY(), paint);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
Resources res = getResources();
int height = res.getDimensionPixelSize(R.dimen.checkmarkHeight);
int width = res.getDimensionPixelSize(R.dimen.checkmarkWidth);
widthMeasureSpec = makeMeasureSpec(width, EXACTLY);
heightMeasureSpec = makeMeasureSpec(height, EXACTLY);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
private void init()
{
res = new StyledResources(getContext());
setWillNotDraw(false);
setHapticFeedbackEnabled(false);
setMinHeight(
getResources().getDimensionPixelSize(R.dimen.checkmarkHeight));
setMinWidth(
getResources().getDimensionPixelSize(R.dimen.checkmarkWidth));
setFocusable(false);
setGravity(Gravity.CENTER);
setTypeface(InterfaceUtils.getFontAwesome(getContext()));
}
private void updateText()
{
int lowContrastColor = res.getColor(R.attr.lowContrastTextColor);
Resources res = getResources();
styledRes = new StyledResources(getContext());
if (value == Checkmark.CHECKED_EXPLICITLY)
{
setText(R.string.fa_check);
setTextColor(color);
}
paint = new TextPaint();
paint.setTypeface(InterfaceUtils.getFontAwesome(getContext()));
paint.setAntiAlias(true);
paint.setTextAlign(Paint.Align.CENTER);
paint.setTextSize(res.getDimension(R.dimen.regularTextSize));
if (value == Checkmark.CHECKED_IMPLICITLY)
{
setText(R.string.fa_check);
setTextColor(lowContrastColor);
}
if (value == Checkmark.UNCHECKED)
{
setText(R.string.fa_times);
setTextColor(lowContrastColor);
}
rect = new RectF();
color = ColorUtils.getAndroidTestColor(0);
lowContrastColor = styledRes.getColor(R.attr.lowContrastTextColor);
}
}

View File

@@ -53,6 +53,8 @@ public class CheckmarkPanelView extends LinearLayout implements Preferences.List
@NonNull
private Habit habit;
private int dataOffset;
public CheckmarkPanelView(Context context)
{
super(context);
@@ -75,19 +77,23 @@ public class CheckmarkPanelView extends LinearLayout implements Preferences.List
return (CheckmarkButtonView) getChildAt(position);
}
public void setCheckmarkValues(int[] checkmarkValues)
public void setButtonCount(int newButtonCount)
{
this.checkmarkValues = checkmarkValues;
if (this.nButtons != checkmarkValues.length)
if(nButtons != newButtonCount)
{
this.nButtons = checkmarkValues.length;
nButtons = newButtonCount;
addCheckmarkButtons();
}
setupCheckmarkButtons();
}
public void setCheckmarkValues(int[] checkmarkValues)
{
this.checkmarkValues = checkmarkValues;
setupCheckmarkButtons();
}
public void setColor(int color)
{
this.color = color;
@@ -100,6 +106,12 @@ public class CheckmarkPanelView extends LinearLayout implements Preferences.List
setupCheckmarkButtons();
}
public void setDataOffset(int dataOffset)
{
this.dataOffset = dataOffset;
setupCheckmarkButtons();
}
public void setHabit(@NonNull Habit habit)
{
this.habit = habit;
@@ -170,11 +182,13 @@ public class CheckmarkPanelView extends LinearLayout implements Preferences.List
{
long timestamp = DateUtils.getStartOfToday();
long day = DateUtils.millisecondsInOneDay;
timestamp -= day * dataOffset;
for (int i = 0; i < nButtons; i++)
{
CheckmarkButtonView buttonView = indexToButton(i);
buttonView.setValue(checkmarkValues[i]);
if(i + dataOffset >= checkmarkValues.length) break;
buttonView.setValue(checkmarkValues[i + dataOffset]);
buttonView.setColor(color);
setupButtonControllers(timestamp, buttonView);
timestamp -= day;

View File

@@ -20,15 +20,17 @@
package org.isoron.uhabits.activities.habits.list.views;
import android.content.*;
import android.os.*;
import android.support.annotation.*;
import android.support.v7.widget.*;
import android.support.v7.widget.helper.*;
import android.util.*;
import android.view.*;
import org.isoron.uhabits.models.*;
import org.isoron.uhabits.activities.common.views.*;
import org.isoron.uhabits.activities.habits.list.controllers.*;
import org.isoron.uhabits.activities.habits.list.model.*;
import org.isoron.uhabits.models.*;
import java.util.*;
@@ -44,6 +46,10 @@ public class HabitCardListView extends RecyclerView
private int checkmarkCount;
private int dataOffset;
private LinkedList<HabitCardViewHolder> attachedHolders;
public HabitCardListView(Context context, AttributeSet attrs)
{
super(context, attrs);
@@ -54,6 +60,13 @@ public class HabitCardListView extends RecyclerView
TouchHelperCallback callback = new TouchHelperCallback();
touchHelper = new ItemTouchHelper(callback);
touchHelper.attachToRecyclerView(this);
attachedHolders = new LinkedList<>();
}
public void attachCardView(HabitCardViewHolder holder)
{
attachedHolders.add(holder);
}
/**
@@ -75,13 +88,12 @@ public class HabitCardListView extends RecyclerView
int[] checkmarks,
boolean selected)
{
int visibleCheckmarks[] =
Arrays.copyOfRange(checkmarks, 0, checkmarkCount);
HabitCardView cardView = (HabitCardView) holder.itemView;
cardView.setHabit(habit);
cardView.setSelected(selected);
cardView.setCheckmarkValues(visibleCheckmarks);
cardView.setCheckmarkValues(checkmarks);
cardView.setCheckmarkCount(checkmarkCount);
cardView.setDataOffset(dataOffset);
cardView.setScore(score);
if (controller != null) setupCardViewController(holder);
return cardView;
@@ -92,6 +104,11 @@ public class HabitCardListView extends RecyclerView
return new HabitCardView(getContext());
}
public void detachCardView(HabitCardViewHolder holder)
{
attachedHolders.remove(holder);
}
@Override
public void setAdapter(RecyclerView.Adapter adapter)
{
@@ -109,6 +126,16 @@ public class HabitCardListView extends RecyclerView
this.controller = controller;
}
public void setDataOffset(int dataOffset)
{
this.dataOffset = dataOffset;
for (HabitCardViewHolder holder : attachedHolders)
{
HabitCardView cardView = (HabitCardView) holder.itemView;
cardView.setDataOffset(dataOffset);
}
}
@Override
protected void onAttachedToWindow()
{
@@ -123,6 +150,23 @@ public class HabitCardListView extends RecyclerView
super.onDetachedFromWindow();
}
@Override
protected void onRestoreInstanceState(Parcelable state)
{
BundleSavedState bss = (BundleSavedState) state;
dataOffset = bss.bundle.getInt("dataOffset");
super.onRestoreInstanceState(bss.getSuperState());
}
@Override
protected Parcelable onSaveInstanceState()
{
Parcelable superState = super.onSaveInstanceState();
Bundle bundle = new Bundle();
bundle.putInt("dataOffset", dataOffset);
return new BundleSavedState(superState, bundle);
}
protected void setupCardViewController(@NonNull HabitCardViewHolder holder)
{
HabitCardView cardView = (HabitCardView) holder.itemView;
@@ -168,7 +212,7 @@ public class HabitCardListView extends RecyclerView
{
int position = holder.getAdapterPosition();
if (controller != null) controller.onItemLongClick(position);
touchHelper.startDrag(holder);
if (adapter.isSortable()) touchHelper.startDrag(holder);
}
@Override

View File

@@ -27,7 +27,7 @@ import android.support.annotation.*;
import android.util.*;
import android.widget.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.R;
import org.isoron.uhabits.activities.common.views.*;
import org.isoron.uhabits.models.*;
import org.isoron.uhabits.utils.*;
@@ -72,6 +72,8 @@ public class HabitCardView extends FrameLayout
@Nullable
private Habit habit;
private int dataOffset;
public HabitCardView(Context context)
{
super(context);
@@ -90,6 +92,11 @@ public class HabitCardView extends FrameLayout
new Handler(Looper.getMainLooper()).post(() -> refresh());
}
public void setCheckmarkCount(int checkmarkCount)
{
checkmarkPanel.setButtonCount(checkmarkCount);
}
public void setCheckmarkValues(int checkmarks[])
{
checkmarkPanel.setCheckmarkValues(checkmarks);
@@ -103,6 +110,12 @@ public class HabitCardView extends FrameLayout
checkmarkPanel.setController(controller);
}
public void setDataOffset(int dataOffset)
{
this.dataOffset = dataOffset;
checkmarkPanel.setDataOffset(dataOffset);
}
public void setHabit(@NonNull Habit habit)
{
if (this.habit != null) detachFromHabit();
@@ -134,7 +147,7 @@ public class HabitCardView extends FrameLayout
{
long today = DateUtils.getStartOfToday();
long day = DateUtils.millisecondsInOneDay;
int offset = (int) ((today - timestamp) / day);
int offset = (int) ((today - timestamp) / day) - dataOffset;
CheckmarkButtonView button = checkmarkPanel.indexToButton(offset);
float y = button.getHeight() / 2.0f;
@@ -201,6 +214,7 @@ public class HabitCardView extends FrameLayout
scoreRing.setPercentage(rand.nextFloat());
checkmarkPanel.setColor(color);
checkmarkPanel.setCheckmarkValues(values);
checkmarkPanel.setButtonCount(5);
}
private void refresh()

View File

@@ -20,30 +20,39 @@
package org.isoron.uhabits.activities.habits.list.views;
import android.content.*;
import android.content.res.*;
import android.graphics.*;
import android.support.annotation.*;
import android.text.*;
import android.util.*;
import android.view.*;
import android.widget.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.activities.common.views.*;
import org.isoron.uhabits.activities.habits.list.*;
import org.isoron.uhabits.preferences.*;
import org.isoron.uhabits.utils.*;
import java.util.*;
public class HeaderView extends LinearLayout implements Preferences.Listener
public class HeaderView extends ScrollableChart
implements Preferences.Listener, MidnightTimer.MidnightListener
{
private final Context context;
private int buttonCount;
@Nullable
private Preferences prefs;
@Nullable
private MidnightTimer midnightTimer;
private final TextPaint paint;
private RectF rect;
public HeaderView(Context context, AttributeSet attrs)
{
super(context, attrs);
this.context = context;
if (isInEditMode())
{
@@ -56,51 +65,116 @@ public class HeaderView extends LinearLayout implements Preferences.Listener
HabitsApplication app = (HabitsApplication) appContext;
prefs = app.getComponent().getPreferences();
}
if (context instanceof ListHabitsActivity)
{
ListHabitsActivity activity = (ListHabitsActivity) context;
midnightTimer = activity.getListHabitsComponent().getMidnightTimer();
}
Resources res = context.getResources();
setScrollerBucketSize((int) res.getDimension(R.dimen.checkmarkWidth));
StyledResources sr = new StyledResources(context);
paint = new TextPaint();
paint.setColor(Color.BLACK);
paint.setAntiAlias(true);
paint.setTextSize(getResources().getDimension(R.dimen.tinyTextSize));
paint.setTextAlign(Paint.Align.CENTER);
paint.setTypeface(Typeface.DEFAULT_BOLD);
paint.setColor(sr.getColor(R.attr.mediumContrastTextColor));
rect = new RectF();
}
@Override
public void atMidnight()
{
post(() -> invalidate());
}
@Override
public void onCheckmarkOrderChanged()
{
createButtons();
updateDirection();
postInvalidate();
}
public void setButtonCount(int buttonCount)
{
this.buttonCount = buttonCount;
createButtons();
postInvalidate();
}
@Override
protected void onAttachedToWindow()
{
updateDirection();
super.onAttachedToWindow();
if (prefs != null) prefs.addListener(this);
if (midnightTimer != null) midnightTimer.addListener(this);
}
private void updateDirection()
{
int direction = -1;
if (shouldReverseCheckmarks()) direction *= -1;
if (InterfaceUtils.isLayoutRtl(this)) direction *= -1;
setDirection(direction);
}
@Override
protected void onDetachedFromWindow()
{
if (midnightTimer != null) midnightTimer.removeListener(this);
if (prefs != null) prefs.removeListener(this);
super.onDetachedFromWindow();
}
private void createButtons()
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
removeAllViews();
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = (int) getContext()
.getResources()
.getDimension(R.dimen.checkmarkHeight);
setMeasuredDimension(width, height);
}
@Override
protected void onDraw(Canvas canvas)
{
super.onDraw(canvas);
GregorianCalendar day = DateUtils.getStartOfTodayCalendar();
Resources res = getContext().getResources();
float width = res.getDimension(R.dimen.checkmarkWidth);
float height = res.getDimension(R.dimen.checkmarkHeight);
boolean reverse = shouldReverseCheckmarks();
boolean isRtl = InterfaceUtils.isLayoutRtl(this);
day.add(GregorianCalendar.DAY_OF_MONTH, -getDataOffset());
float em = paint.measureText("m");
for (int i = 0; i < buttonCount; i++)
addView(
inflate(context, R.layout.list_habits_header_checkmark, null));
for (int i = 0; i < getChildCount(); i++)
{
int position = i;
if (shouldReverseCheckmarks()) position = getChildCount() - i - 1;
rect.set(0, 0, width, height);
rect.offset(canvas.getWidth(), 0);
View button = getChildAt(position);
TextView label = (TextView) button.findViewById(R.id.tvCheck);
label.setText(DateUtils.formatHeaderDate(day));
if(reverse) rect.offset(- (i + 1) * width, 0);
else rect.offset((i - buttonCount) * width, 0);
if (isRtl) rect.set(canvas.getWidth() - rect.right, rect.top,
canvas.getWidth() - rect.left, rect.bottom);
String text = DateUtils.formatHeaderDate(day).toUpperCase();
String[] lines = text.split("\n");
int y1 = (int)(rect.centerY() - 0.25 * em);
int y2 = (int)(rect.centerY() + 1.25 * em);
canvas.drawText(lines[0], rect.centerX(), y1, paint);
canvas.drawText(lines[1], rect.centerX(), y2, paint);
day.add(GregorianCalendar.DAY_OF_MONTH, -1);
}
}

View File

@@ -24,7 +24,7 @@ import android.os.*;
import android.support.annotation.*;
import android.support.v7.widget.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.R;
import org.isoron.uhabits.activities.*;
import org.isoron.uhabits.activities.habits.show.views.*;
import org.isoron.uhabits.models.*;

View File

@@ -24,6 +24,10 @@ import android.view.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.activities.*;
import org.isoron.uhabits.models.*;
import org.isoron.uhabits.tasks.*;
import java.util.*;
import javax.inject.*;
@@ -33,12 +37,38 @@ public class ShowHabitsMenu extends BaseMenu
@NonNull
private final ShowHabitScreen screen;
@NonNull
private final Habit habit;
@NonNull
private final TaskRunner taskRunner;
@NonNull
private ExportCSVTaskFactory exportCSVFactory;
@Inject
public ShowHabitsMenu(@NonNull BaseActivity activity,
@NonNull ShowHabitScreen screen)
@NonNull ShowHabitScreen screen,
@NonNull Habit habit,
@NonNull ExportCSVTaskFactory exportCSVFactory,
@NonNull TaskRunner taskRunner)
{
super(activity);
this.screen = screen;
this.habit = habit;
this.taskRunner = taskRunner;
this.exportCSVFactory = exportCSVFactory;
}
public void exportHabit()
{
List<Habit> selected = new LinkedList<>();
selected.add(habit);
ExportCSVTask task = exportCSVFactory.create(selected, filename -> {
if (filename != null) screen.showSendFileScreen(filename);
else screen.showMessage(R.string.could_not_export);
});
taskRunner.execute(task);
}
@Override
@@ -50,6 +80,10 @@ public class ShowHabitsMenu extends BaseMenu
screen.showEditHabitDialog();
return true;
case R.id.export:
this.exportHabit();
return true;
default:
return false;
}

View File

@@ -25,6 +25,7 @@ import android.util.*;
import android.widget.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.R;
import org.isoron.uhabits.activities.common.views.*;
import org.isoron.uhabits.models.*;
import org.isoron.uhabits.tasks.*;

View File

@@ -25,6 +25,7 @@ import android.util.*;
import android.widget.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.R;
import org.isoron.uhabits.activities.common.views.*;
import org.isoron.uhabits.models.*;
import org.isoron.uhabits.tasks.*;

View File

@@ -25,6 +25,7 @@ import android.util.*;
import android.widget.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.R;
import org.isoron.uhabits.activities.common.views.*;
import org.isoron.uhabits.models.*;
import org.isoron.uhabits.tasks.*;

View File

@@ -25,6 +25,7 @@ import android.util.*;
import android.widget.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.R;
import org.isoron.uhabits.activities.common.views.*;
import org.isoron.uhabits.models.*;
import org.isoron.uhabits.preferences.*;

View File

@@ -25,6 +25,7 @@ import android.util.*;
import android.widget.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.R;
import org.isoron.uhabits.activities.common.views.*;
import org.isoron.uhabits.models.*;
import org.isoron.uhabits.tasks.*;

View File

@@ -25,7 +25,7 @@ import android.content.res.*;
import android.util.*;
import android.widget.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.R;
import org.isoron.uhabits.models.*;
import org.isoron.uhabits.utils.*;

View File

@@ -61,9 +61,6 @@ public class SettingsFragment extends PreferenceFragmentCompat
setResultOnPreferenceClick("bugReport", ListHabitsScreen.RESULT_BUG_REPORT);
updateRingtoneDescription();
if (InterfaceUtils.isLocaleFullyTranslated())
removePreference("translate", "linksCategory");
}
@Override
@@ -110,14 +107,6 @@ public class SettingsFragment extends PreferenceFragmentCompat
BackupManager.dataChanged("org.isoron.uhabits");
}
private void removePreference(String preferenceKey, String categoryKey)
{
PreferenceCategory cat =
(PreferenceCategory) findPreference(categoryKey);
Preference pref = findPreference(preferenceKey);
cat.removePreference(pref);
}
private void setResultOnPreferenceClick(String key, final int result)
{
Preference pref = findPreference(key);

View File

@@ -25,7 +25,7 @@ import android.support.v7.widget.*;
import android.support.v7.widget.Toolbar;
import android.widget.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.R;
import org.isoron.uhabits.activities.*;
import org.isoron.uhabits.models.*;
import org.isoron.uhabits.utils.*;

View File

@@ -39,6 +39,12 @@ public class IntentFactory
{
}
public Intent helpTranslate(Context context)
{
String url = context.getString(R.string.translateURL);
return buildViewIntent(url);
}
public Intent rateApp(Context context)
{
String url = context.getString(R.string.playStoreURL);

View File

@@ -19,18 +19,20 @@
package org.isoron.uhabits.io;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.annotation.NonNull;
import android.content.*;
import android.database.*;
import android.database.sqlite.*;
import android.support.annotation.*;
import android.util.*;
import com.activeandroid.ActiveAndroid;
import com.activeandroid.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.models.*;
import org.isoron.uhabits.utils.DatabaseUtils;
import org.isoron.uhabits.utils.FileUtils;
import org.isoron.uhabits.utils.*;
import java.io.File;
import java.io.IOException;
import java.io.*;
import javax.inject.*;
@@ -39,10 +41,15 @@ import javax.inject.*;
*/
public class LoopDBImporter extends AbstractImporter
{
@NonNull
private Context context;
@Inject
public LoopDBImporter(@NonNull HabitList habits)
public LoopDBImporter(@NonNull @AppContext Context context,
@NonNull HabitList habits)
{
super(habits);
this.context = context;
}
@Override
@@ -53,23 +60,37 @@ public class LoopDBImporter extends AbstractImporter
SQLiteDatabase db = SQLiteDatabase.openDatabase(file.getPath(), null,
SQLiteDatabase.OPEN_READONLY);
boolean canHandle = true;
Cursor c = db.rawQuery(
"select count(*) from SQLITE_MASTER where name=? or name=?",
new String[]{"Checkmarks", "Repetitions"});
new String[]{ "Checkmarks", "Repetitions" });
boolean result = (c.moveToFirst() && c.getInt(0) == 2);
if (!c.moveToFirst() || c.getInt(0) != 2)
{
Log.w("LoopDBImporter", "Cannot handle file: tables not found");
canHandle = false;
}
if (db.getVersion() > BuildConfig.databaseVersion)
{
Log.w("LoopDBImporter", String.format(
"Cannot handle file: incompatible version: %d > %d",
db.getVersion(), BuildConfig.databaseVersion));
canHandle = false;
}
c.close();
db.close();
return result;
return canHandle;
}
@Override
public void importHabitsFromFile(@NonNull File file) throws IOException
{
ActiveAndroid.dispose();
File originalDB = DatabaseUtils.getDatabaseFile();
File originalDB = DatabaseUtils.getDatabaseFile(context);
FileUtils.copy(file, originalDB);
DatabaseUtils.initializeActiveAndroid();
DatabaseUtils.initializeActiveAndroid(context);
}
}

View File

@@ -48,9 +48,7 @@ public abstract class HabitList implements Iterable<Habit>
public HabitList()
{
observable = new ModelObservable();
filter = new HabitMatcherBuilder()
.setArchivedAllowed(true)
.build();
filter = new HabitMatcherBuilder().setArchivedAllowed(true).build();
}
protected HabitList(@NonNull HabitMatcher filter)
@@ -106,6 +104,15 @@ public abstract class HabitList implements Iterable<Habit>
return observable;
}
public abstract Order getOrder();
/**
* Changes the order of the elements on the list.
*
* @param order the new order criterea
*/
public abstract void setOrder(@NonNull Order order);
/**
* Returns the index of the given habit in the list, or -1 if the list does
* not contain the habit.
@@ -149,7 +156,7 @@ public abstract class HabitList implements Iterable<Habit>
public void repair()
{
for(Habit h : this)
for (Habit h : this)
{
h.getCheckmarks().invalidateNewerThan(0);
h.getStreaks().invalidateNewerThan(0);
@@ -228,4 +235,12 @@ public abstract class HabitList implements Iterable<Habit>
csv.close();
}
public enum Order
{
BY_NAME,
BY_COLOR,
BY_SCORE,
BY_POSITION
}
}

View File

@@ -25,6 +25,8 @@ import org.isoron.uhabits.models.*;
import java.util.*;
import static org.isoron.uhabits.models.HabitList.Order.*;
/**
* In-memory implementation of {@link HabitList}.
*/
@@ -33,16 +35,23 @@ public class MemoryHabitList extends HabitList
@NonNull
private LinkedList<Habit> list;
private Comparator<Habit> comparator = null;
@NonNull
private Order order;
public MemoryHabitList()
{
super();
list = new LinkedList<>();
order = Order.BY_POSITION;
}
protected MemoryHabitList(@NonNull HabitMatcher matcher)
{
super(matcher);
list = new LinkedList<>();
order = Order.BY_POSITION;
}
@Override
@@ -57,6 +66,7 @@ public class MemoryHabitList extends HabitList
if (id == null) habit.setId((long) list.size());
list.addLast(habit);
resort();
}
@Override
@@ -82,10 +92,17 @@ public class MemoryHabitList extends HabitList
public HabitList getFiltered(HabitMatcher matcher)
{
MemoryHabitList habits = new MemoryHabitList(matcher);
for(Habit h : this) if (matcher.matches(h)) habits.add(h);
habits.comparator = comparator;
for (Habit h : this) if (matcher.matches(h)) habits.add(h);
return habits;
}
@Override
public Order getOrder()
{
return order;
}
@Override
public int indexOf(@NonNull Habit h)
{
@@ -112,6 +129,14 @@ public class MemoryHabitList extends HabitList
list.add(toPos, from);
}
@Override
public void setOrder(@NonNull Order order)
{
this.order = order;
this.comparator = getComparatorByOrder(order);
resort();
}
@Override
public int size()
{
@@ -123,4 +148,34 @@ public class MemoryHabitList extends HabitList
{
// NOP
}
private Comparator<Habit> getComparatorByOrder(Order order)
{
Comparator<Habit> nameComparator =
(h1, h2) -> h1.getName().compareTo(h2.getName());
Comparator<Habit> colorComparator = (h1, h2) -> {
Integer c1 = h1.getColor();
Integer c2 = h2.getColor();
if (c1.equals(c2)) return nameComparator.compare(h1, h2);
else return c1.compareTo(c2);
};
Comparator<Habit> scoreComparator = (h1, h2) -> {
int s1 = h1.getScores().getTodayValue();
int s2 = h2.getScores().getTodayValue();
return Integer.compare(s2, s1);
};
if (order == BY_POSITION) return null;
if (order == BY_NAME) return nameComparator;
if (order == BY_COLOR) return colorComparator;
if (order == BY_SCORE) return scoreComparator;
throw new IllegalStateException();
}
private void resort()
{
if (comparator != null) Collections.sort(list, comparator);
}
}

View File

@@ -0,0 +1,24 @@
/*
* 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.models.sqlite;
public class InvalidDatabaseVersionException extends RuntimeException
{
}

View File

@@ -39,10 +39,15 @@ public class SQLiteHabitList extends HabitList
private static SQLiteHabitList instance;
@NonNull
private final SQLiteUtils<HabitRecord> sqlite;
@NonNull
private final ModelFactory modelFactory;
@NonNull
private Order order;
public SQLiteHabitList(@NonNull ModelFactory modelFactory)
{
super();
@@ -50,16 +55,19 @@ public class SQLiteHabitList extends HabitList
if (cache == null) cache = new HashMap<>();
sqlite = new SQLiteUtils<>(HabitRecord.class);
order = Order.BY_POSITION;
}
protected SQLiteHabitList(@NonNull ModelFactory modelFactory,
@NonNull HabitMatcher filter)
@NonNull HabitMatcher filter,
@NonNull Order order)
{
super(filter);
this.modelFactory = modelFactory;
if (cache == null) cache = new HashMap<>();
sqlite = new SQLiteUtils<>(HabitRecord.class);
this.order = order;
}
public static SQLiteHabitList getInstance(
@@ -118,7 +126,20 @@ public class SQLiteHabitList extends HabitList
@Override
public HabitList getFiltered(HabitMatcher filter)
{
return new SQLiteHabitList(modelFactory, filter);
return new SQLiteHabitList(modelFactory, filter, order);
}
@Override
@NonNull
public Order getOrder()
{
return order;
}
@Override
public void setOrder(@NonNull Order order)
{
this.order = order;
}
@Override
@@ -214,6 +235,13 @@ public class SQLiteHabitList extends HabitList
getObservable().notifyListeners();
}
@Override
public void repair()
{
super.repair();
rebuildOrder();
}
@Override
public int size()
{
@@ -233,7 +261,7 @@ public class SQLiteHabitList extends HabitList
}
}
protected List<Habit> toList()
protected synchronized List<Habit> toList()
{
String query = buildSelectQuery();
List<HabitRecord> recordList = sqlite.query(query, null);
@@ -249,12 +277,38 @@ public class SQLiteHabitList extends HabitList
habits.add(habit);
}
if(order == Order.BY_SCORE)
{
Collections.sort(habits, (lhs, rhs) -> {
int s1 = lhs.getScores().getTodayValue();
int s2 = rhs.getScores().getTodayValue();
return Integer.compare(s2, s1);
});
}
return habits;
}
private void appendOrderBy(StringBuilder query)
{
query.append("order by position ");
switch (order)
{
case BY_POSITION:
query.append("order by position ");
break;
case BY_NAME:
case BY_SCORE:
query.append("order by name ");
break;
case BY_COLOR:
query.append("order by color, name ");
break;
default:
throw new IllegalStateException();
}
}
private void appendSelect(StringBuilder query)
@@ -282,11 +336,4 @@ public class SQLiteHabitList extends HabitList
appendOrderBy(query);
return query.toString();
}
@Override
public void repair()
{
super.repair();
rebuildOrder();
}
}

View File

@@ -22,6 +22,8 @@ package org.isoron.uhabits.models.sqlite.records;
import android.annotation.*;
import android.database.*;
import android.support.annotation.*;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import com.activeandroid.*;
import com.activeandroid.annotation.*;

View File

@@ -24,6 +24,7 @@ import android.preference.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.activities.*;
import org.isoron.uhabits.models.*;
import java.util.*;
@@ -61,6 +62,21 @@ public class Preferences
return prefs.getInt("pref_default_habit_palette_color", fallbackColor);
}
public HabitList.Order getDefaultOrder()
{
String name = prefs.getString("pref_default_order", "BY_POSITION");
try
{
return HabitList.Order.valueOf(name);
}
catch (IllegalArgumentException e)
{
setDefaultOrder(HabitList.Order.BY_POSITION);
return HabitList.Order.BY_POSITION;
}
}
public int getDefaultScoreSpinnerPosition()
{
int defaultScoreInterval = prefs.getInt("pref_score_view_interval", 1);
@@ -69,6 +85,11 @@ public class Preferences
return defaultScoreInterval;
}
public void setDefaultOrder(HabitList.Order order)
{
prefs.edit().putString("pref_default_order", order.name()).apply();
}
public void setDefaultScoreSpinnerPosition(int position)
{
prefs.edit().putInt("pref_score_view_interval", position).apply();

View File

@@ -23,6 +23,7 @@ import android.content.*;
import android.preference.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.models.*;
import javax.inject.*;
@@ -48,7 +49,7 @@ public class WidgetPreferences
public long getHabitIdFromWidgetId(int widgetId)
{
Long habitId = prefs.getLong(getHabitIdKey(widgetId), -1);
if (habitId < 0) throw new RuntimeException("widget not found");
if (habitId < 0) throw new HabitNotFoundException();
return habitId;
}

View File

@@ -40,6 +40,9 @@ public class PebbleReceiver extends PebbleDataReceiver
public static final UUID WATCHAPP_UUID =
UUID.fromString("82629d99-8ea6-4631-a022-9ca77a12a058");
@NonNull
private Context context;
private HabitList allHabits;
private CommandRunner commandRunner;
@@ -61,6 +64,8 @@ public class PebbleReceiver extends PebbleDataReceiver
if (context == null) throw new RuntimeException("context is null");
if (data == null) throw new RuntimeException("data is null");
this.context = context;
HabitsApplication app =
(HabitsApplication) context.getApplicationContext();
@@ -136,7 +141,7 @@ public class PebbleReceiver extends PebbleDataReceiver
private void sendDict(@NonNull PebbleDictionary dict)
{
PebbleKit.sendDataToPebble(HabitsApplication.getContext(),
PebbleKit.sendDataToPebble(context,
PebbleReceiver.WATCHAPP_UUID, dict);
}

View File

@@ -19,10 +19,13 @@
package org.isoron.uhabits.tasks;
import android.content.Context;
import android.support.annotation.*;
import com.google.auto.factory.*;
import org.isoron.uhabits.AppContext;
import org.isoron.uhabits.activities.ActivityContext;
import org.isoron.uhabits.io.*;
import org.isoron.uhabits.models.*;
import org.isoron.uhabits.utils.*;
@@ -35,6 +38,9 @@ public class ExportCSVTask implements Task
{
private String archiveFilename;
@NonNull
private final Context context;
@NonNull
private final List<Habit> selectedHabits;
@@ -44,10 +50,12 @@ public class ExportCSVTask implements Task
@NonNull
private final HabitList habitList;
public ExportCSVTask(@Provided @NonNull HabitList habitList,
public ExportCSVTask(@Provided @AppContext @NonNull Context context,
@Provided @NonNull HabitList habitList,
@NonNull List<Habit> selectedHabits,
@NonNull Listener listener)
{
this.context = context;
this.listener = listener;
this.habitList = habitList;
this.selectedHabits = selectedHabits;
@@ -58,7 +66,7 @@ public class ExportCSVTask implements Task
{
try
{
File dir = FileUtils.getFilesDir("CSV");
File dir = FileUtils.getFilesDir(context, "CSV");
if (dir == null) return;
HabitsCSVExporter exporter;

View File

@@ -19,22 +19,33 @@
package org.isoron.uhabits.tasks;
import android.content.Context;
import android.support.annotation.*;
import com.google.auto.factory.AutoFactory;
import com.google.auto.factory.Provided;
import org.isoron.uhabits.AppContext;
import org.isoron.uhabits.activities.ActivityContext;
import org.isoron.uhabits.utils.*;
import java.io.*;
@AutoFactory(allowSubclasses = true)
public class ExportDBTask implements Task
{
private String filename;
@NonNull
private Context context;
@NonNull
private final Listener listener;
public ExportDBTask(@NonNull Listener listener)
public ExportDBTask(@Provided @AppContext @NonNull Context context, @NonNull Listener listener)
{
this.listener = listener;
this.context = context;
}
@Override
@@ -44,10 +55,10 @@ public class ExportDBTask implements Task
try
{
File dir = FileUtils.getFilesDir("Backups");
File dir = FileUtils.getFilesDir(context, "Backups");
if (dir == null) return;
filename = DatabaseUtils.saveDatabaseCopy(dir);
filename = DatabaseUtils.saveDatabaseCopy(context, dir);
}
catch (IOException e)
{

View File

@@ -74,4 +74,14 @@ public class AttributeSetUtils
if (number != null) return Float.parseFloat(number);
else return defaultValue;
}
public static int getIntAttribute(@NonNull Context context,
@NonNull AttributeSet attrs,
@NonNull String name,
int defaultValue)
{
String number = getAttribute(context, attrs, name, null);
if (number != null) return Integer.parseInt(number);
else return defaultValue;
}
}

View File

@@ -25,6 +25,7 @@ import android.support.annotation.*;
import com.activeandroid.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.models.sqlite.*;
import org.isoron.uhabits.models.sqlite.records.*;
import java.io.*;
@@ -47,9 +48,8 @@ public abstract class DatabaseUtils
}
@NonNull
public static File getDatabaseFile()
public static File getDatabaseFile(Context context)
{
Context context = HabitsApplication.getContext();
String databaseFilename = getDatabaseFilename();
String root = context.getFilesDir().getPath();
@@ -68,9 +68,8 @@ public abstract class DatabaseUtils
}
@SuppressWarnings("unchecked")
public static void initializeActiveAndroid()
public static void initializeActiveAndroid(Context context)
{
Context context = HabitsApplication.getContext();
Configuration dbConfig = new Configuration.Builder(context)
.setDatabaseName(getDatabaseFilename())
.setDatabaseVersion(BuildConfig.databaseVersion)
@@ -78,18 +77,27 @@ public abstract class DatabaseUtils
RepetitionRecord.class, ScoreRecord.class, StreakRecord.class)
.create();
ActiveAndroid.initialize(dbConfig);
try
{
ActiveAndroid.initialize(dbConfig);
}
catch (RuntimeException e)
{
if(e.getMessage().contains("downgrade"))
throw new InvalidDatabaseVersionException();
else throw e;
}
}
@SuppressWarnings("ResultOfMethodCallIgnored")
public static String saveDatabaseCopy(File dir) throws IOException
public static String saveDatabaseCopy(Context context, File dir) throws IOException
{
SimpleDateFormat dateFormat = DateFormats.getBackupDateFormat();
String date = dateFormat.format(DateUtils.getLocalTime());
String format = "%s/Loop Habits Backup %s.db";
String filename = String.format(format, dir.getAbsolutePath(), date);
File db = getDatabaseFile();
File db = getDatabaseFile(context);
File dbCopy = new File(filename);
FileUtils.copy(db, dbCopy);

View File

@@ -44,7 +44,7 @@ public class DateFormats
{
Locale locale = Locale.getDefault();
if (SDK_INT >= JELLY_BEAN)
if (SDK_INT >= JELLY_BEAN_MR2)
skeleton = getBestDateTimePattern(locale, skeleton);
return fromSkeleton(skeleton, locale);

View File

@@ -187,6 +187,11 @@ public abstract class DateUtils
return getStartOfDay(DateUtils.getLocalTime());
}
public static long millisecondsUntilTomorrow()
{
return getStartOfToday() + millisecondsInOneDay - getLocalTime();
}
public static GregorianCalendar getStartOfTodayCalendar()
{
return getCalendar(getStartOfToday());

View File

@@ -87,9 +87,8 @@ public abstract class FileUtils
}
@Nullable
public static File getFilesDir(@Nullable String relativePath)
public static File getFilesDir(@NonNull Context context, @Nullable String relativePath)
{
Context context = HabitsApplication.getContext();
File externalFilesDirs[] =
ContextCompat.getExternalFilesDirs(context, null);

View File

@@ -22,19 +22,12 @@ package org.isoron.uhabits.utils;
import android.content.*;
import android.content.res.*;
import android.graphics.*;
import android.support.v4.view.*;
import android.util.*;
import java.util.*;
import android.view.*;
public abstract class InterfaceUtils
{
// TODO: Move this to another place, or detect automatically
private static String fullyTranslatedLanguages[] = {
"ca", "zh", "en", "de", "in", "it", "ko", "pl", "pt", "es", "tk", "uk",
"ja", "fr", "hr", "sl"
};
private static Typeface fontAwesome;
public static Typeface getFontAwesome(Context context)
@@ -59,14 +52,9 @@ public abstract class InterfaceUtils
return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp, metrics);
}
public static boolean isLocaleFullyTranslated()
public static boolean isLayoutRtl(View view)
{
final String currentLanguage = Locale.getDefault().getLanguage();
for(String lang : fullyTranslatedLanguages)
if(currentLanguage.equals(lang)) return true;
return false;
return ViewCompat.getLayoutDirection(view) ==
ViewCompat.LAYOUT_DIRECTION_RTL;
}
}

View File

@@ -0,0 +1,77 @@
/*
* 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.utils;
import org.isoron.uhabits.activities.*;
import java.util.*;
import java.util.concurrent.*;
import javax.inject.*;
/**
* A class that emits events when a new day starts.
*/
@ActivityScope
public class MidnightTimer
{
private final List<MidnightListener> listeners;
private ScheduledExecutorService executor;
@Inject
public MidnightTimer()
{
this.listeners = new LinkedList<>();
}
public synchronized void addListener(MidnightListener listener)
{
this.listeners.add(listener);
}
public synchronized void onPause()
{
executor.shutdownNow();
}
public synchronized void onResume()
{
executor = Executors.newSingleThreadScheduledExecutor();
executor.scheduleAtFixedRate(() -> notifyListeners(),
DateUtils.millisecondsUntilTomorrow() + 1000,
DateUtils.millisecondsInOneDay, TimeUnit.MILLISECONDS);
}
public synchronized void removeListener(MidnightListener listener)
{
this.listeners.remove(listener);
}
private synchronized void notifyListeners()
{
for (MidnightListener l : listeners) l.atMidnight();
}
public interface MidnightListener
{
void atMidnight();
}
}

View File

@@ -25,6 +25,8 @@ import android.os.*;
import android.support.annotation.*;
import android.widget.*;
import com.activeandroid.util.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.models.*;
import org.isoron.uhabits.preferences.*;
@@ -76,8 +78,15 @@ public abstract class BaseWidgetProvider extends AppWidgetProvider
for (int id : ids)
{
BaseWidget widget = getWidgetFromId(context, id);
widget.delete();
try
{
BaseWidget widget = getWidgetFromId(context, id);
widget.delete();
}
catch (HabitNotFoundException e)
{
Log.e("BaseWidgetProvider", e);
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 249 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 280 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 236 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 279 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 319 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 366 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 397 B

View File

@@ -31,6 +31,7 @@
style="@style/Toolbar"/>
<ScrollView
android:id="@+id/scrollView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/toolbar">
@@ -86,6 +87,11 @@
style="@style/About.Item.Clickable"
android:text="@string/pref_send_feedback"/>
<TextView
android:id="@+id/tvTranslate"
style="@style/About.Item.Clickable"
android:text="@string/help_translate"/>
<TextView
android:id="@+id/tvSource"
style="@style/About.Item.Clickable"
@@ -117,6 +123,9 @@
<TextView
style="@style/About.Item"
android:text="Nikhil (regularcoder)"/>
<TextView
style="@style/About.Item"
android:text="JanetQC"/>
</LinearLayout>
@@ -129,17 +138,33 @@
android:text="@string/translators"
android:textColor="?aboutScreenColor"/>
<TextView
style="@style/About.Item"
android:text="Mihail Stefanov (Bǎlgarski)"/>
<TextView
style="@style/About.Item"
android:text="Angga Rifandi (Bahasa Indonesia)"/>
<TextView
style="@style/About.Item"
android:text="David Nos (Català)"/>
<TextView
style="@style/About.Item"
android:text="Tomáš Borovec (Čeština)"/>
<TextView
style="@style/About.Item"
android:text="David Nos (Català)"/>
android:text="Rancher (Cрпски)"/>
<TextView
style="@style/About.Item"
android:text="Yussuf (Dansk)"/>
<TextView
style="@style/About.Item"
android:text="Sølv Ræven (Dansk)"/>
<TextView
style="@style/About.Item"
@@ -157,6 +182,22 @@
style="@style/About.Item"
android:text="Ander Raso Vazquez (Español)"/>
<TextView
style="@style/About.Item"
android:text="Beriain (Euskara)"/>
<TextView
style="@style/About.Item"
android:text="Andreas Michelakis (Ελληνικά)"/>
<TextView
style="@style/About.Item"
android:text="Eman (Fārsi)"/>
<TextView
style="@style/About.Item"
android:text="Saeed Esmaili (Fārsi)"/>
<TextView
style="@style/About.Item"
android:text="François Mahé (Français)"/>
@@ -205,6 +246,10 @@
style="@style/About.Item"
android:text="Dmitriy Bogdanov (Русский)"/>
<TextView
style="@style/About.Item"
android:text="Andrei Pleș (Română)"/>
<TextView
style="@style/About.Item"
android:text="Dušan Strgar (Slovenščina)"/>
@@ -275,7 +320,12 @@
<TextView
style="@style/About.Item"
android:text="Andreas Michelakis (Ελληνικά)"/>
android:text="Niraj Yadav (हिन्दी)"/>
<TextView
style="@style/About.Item"
android:text="Yoav Argov (עברית‎)"/>
</LinearLayout>
</LinearLayout>
</ScrollView>

View File

@@ -79,7 +79,7 @@
<EditText
android:id="@+id/tvFreqNum"
style="@style/dialogFormInputSmallNumber"/>
style="@style/dialogFormInputLargeNumber"/>
<TextView
android:id="@+id/textView3"
@@ -89,7 +89,7 @@
<EditText
android:id="@+id/tvFreqDen"
style="@style/dialogFormInputSmallNumber"/>
style="@style/dialogFormInputLargeNumber"/>
<TextView
android:id="@+id/textView5"

View File

@@ -21,6 +21,7 @@
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/scrollView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@id/toolbar"

View File

@@ -45,6 +45,26 @@
android:checkable="true"
android:enabled="true"
android:title="@string/hide_completed"/>
<item android:title="@string/sort">
<menu>
<item
android:id="@+id/actionSortManual"
android:title="@string/manually"/>
<item
android:id="@+id/actionSortName"
android:title="@string/by_name"/>
<item
android:id="@+id/actionSortColor"
android:title="@string/by_color"/>
<item
android:id="@+id/actionSortScore"
android:title="@string/by_score"/>
</menu>
</item>
</menu>
</item>
@@ -73,5 +93,4 @@
android:orderInCategory="100"
android:title="@string/about"
app:showAsAction="never"/>
</menu>

View File

@@ -21,6 +21,11 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/export"
android:title="@string/export"
app:showAsAction="never"/>
<item
android:id="@+id/action_edit_habit"
android:icon="?iconEdit"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.5 KiB

View File

@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com-->
<!--
~ 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/>.
-->
<resources>
<!-- App introduction -->
<!-- Middle part of the sentence '1 time in xx days' -->
</resources>

View File

@@ -1,190 +1,162 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com-->
<!--
~ 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/>.
-->
<resources>
<!-- There is no letter P in arabic so the name is unfortunately translated to "Loob" -->
<string name="app_name">"لوب ملاحق العادة "</string>
<string name="main_activity_title">"عادات"</string>
<string name="action_settings">"إعدادات"</string>
<string name="edit">"تعديل"</string>
<string name="delete">"حذف"</string>
<string name="archive">"أرشيف"</string>
<string name="unarchive">"إزالة من الأرشيف"</string>
<string name="add_habit">"إضافة العادة"</string>
<string name="color_picker_default_title">"غير اللون"</string>
<string name="toast_habit_created">"تم صنع عادة "</string>
<string name="toast_habit_deleted">"تم حذف عادة "</string>
<string name="toast_habit_restored">"تم ترجيع عادة"</string>
<string name="toast_nothing_to_undo">"لا شيء للتراجع"</string>
<string name="toast_nothing_to_redo">"لا شيء لتكرار"</string>
<string name="toast_habit_changed">"تم تغييرعادة"</string>
<!-- This appears when the user edits a habit, and then undoes the action. The habit is "changed back" to what is was before. Alternatively, "Habit restored". -->
<string name="toast_habit_changed_back">"تم ترجيع العادة إلى أصلها"</string>
<string name="toast_habit_archived">"تم أرشيف العادات"</string>
<string name="toast_habit_unarchived">"تم إزالة العادة من الأرشيف "</string>
<string name="overview">"نظرة عامة"</string>
<string name="habit_strength">"قوة العادة"</string>
<string name="history">"التاريخ"</string>
<string name="clear">"مسح"</string>
<string name="description_hint">"السؤال (هل ... اليوم؟)"</string>
<!-- This and the next two terms form the sentence "Repeat 3 times in 7 days" that you see when you create a habit. Let me know if you have trouble adapting this into your language. -->
<string name="repeat">"كرر"</string>
<string name="times_every">"مرات في"</string>
<string name="days">"أيام"</string>
<string name="reminder">"تذكير"</string>
<string name="discard">"حذف"</string>
<string name="save">"حفظ"</string>
<!-- Streak as in "winning streak". That is, the number of times a user has performed a habit consecutively. Similar terms are "chains" or "series". -->
<string name="streaks">"تقدم متتالية"</string>
<string name="no_habits_found">" لا يوجد لديك عادات مفعله"</string>
<string name="long_press_to_toggle">"أضغط و إستمر لتحقق أو ازل"</string>
<string name="reminder_off">"أوقف"</string>
<string name="validation_name_should_not_be_blank">"لا يمكن أن يكون الإسم فارغ"</string>
<string name="validation_number_should_be_positive">"يجب أن يكون الرقم إيجابي"</string>
<string name="validation_at_most_one_rep_per_day">"يمكن أن يكون التكرار واحدة فقط كل يوم "</string>
<string name="create_habit">"اخلق عادة"</string>
<string name="edit_habit">"تعديل العادة"</string>
<string name="check">"حقق"</string>
<string name="snooze">"لاحقا"</string>
<!-- App introduction -->
<string name="intro_title_1">"أهلا بك"</string>
<string name="intro_description_1">"لوب يساعدك على خلق والحفاظ على العادات الجيدة."</string>
<string name="intro_title_2">"إنشاء بعض عادات جديدة"</string>
<string name="intro_description_2">"كل يوم، بعد أداء عادتك، وضع علامة على التطبيق."</string>
<string name="intro_title_3">"حافظ على القيام بذلك"</string>
<string name="intro_description_3">"العادة المستمرة لفترات طويلة تكسب نجمة كامله"</string>
<string name="intro_title_4">"تتبع تقدمك"</string>
<string name="intro_description_4">"رسوم بيانية مفصلة تبين لكم كيف تحسن عاداتك مع مرور الوقت."</string>
<string name="interval_15_minutes">"15 دقيقة"</string>
<string name="interval_30_minutes">"30 دقيقة"</string>
<string name="interval_1_hour">"ساعة واحدة"</string>
<string name="interval_2_hour">"ساعتين"</string>
<string name="interval_4_hour">"أربع ساعات"</string>
<string name="interval_8_hour">"ثماني ساعات"</string>
<string name="pref_toggle_title">"تبديل بكبسه"</string>
<string name="pref_toggle_description">"أكثر سهولة، لكنه ممكن يسبب كبسات غير مقصوده"</string>
<string name="pref_snooze_interval_title">"فترتي الغفوى على التذكير"</string>
<string name="pref_rate_this_app">"تقييم هذا التطبيق على جوجل بلاي"</string>
<string name="pref_send_feedback">"أرسل الملاحظات إلى المطور"</string>
<string name="pref_view_source_code">"إفحص التعليمات البرمجية على GitHub"</string>
<string name="pref_view_app_introduction">"عرض المقدمه"</string>
<string name="links">"روابط"</string>
<string name="behavior">"سلوك"</string>
<string name="name">"اسم"</string>
<string name="show_archived">"عرض أرشفة"</string>
<string name="settings">"إعدادات"</string>
<string name="snooze_interval">"فترتي الغفوه"</string>
<string name="hint_title">"هل كنت تعلم؟"</string>
<string name="hint_drag">"لإعادة ترتيب القوائم، أضغط اسم من هذه العادة، ثم اسحبه إلى المكان الصحيح."</string>
<string name="hint_landscape">"يمكنك ان ترى المزيد أيام عن طريق وضع الهاتف في وضع أفقي."</string>
<string name="delete_habits">"حذف عادات"</string>
<string name="delete_habits_message">"سيتم حذف عادات بشكل دائم. هذا العمل لا يمكن التراجع عنه."</string>
<string name="weekends">"عطلة نهاية الأسبوع"</string>
<!-- Fuzzy -->
<string name="any_weekday">"أيام الأسبوع"</string>
<!-- Fuzzy -->
<string name="any_day">"أي يوم"</string>
<!-- This is a bit unclear to me. It is like a prompt asking the user to select specific days, or is it more like an alarm mode where it will only activate on select days? -->
<string name="select_weekdays">"إختار أيام "</string>
<!-- Fuzzy -->
<string name="export_to_csv">"تصدير البيانات (CSV)"</string>
<string name="done_label">"منجز"</string>
<string name="clear_label">"نظف"</string>
<string name="select_hours">"تحديد ساعات"</string>
<string name="select_minutes">"تحديد دقائق "</string>
<!-- Short description used on the Google Play store. There is an 80-character limit. -->
<string name="store_short_description">"خلق عادات جيدة وتتبع تقدمك على مر الزمن"</string>
<string name="store_description_1">"لب يساعدك على خلق والحفاظ على العادات الجيدة، مما يسمح لك لتحقيق أهدافكة. الرسوم البيانية والإحصاءات التفصيلية تبين لكم كيف تحسن عاداتك مع مرور الوقت. هو تماما خالية من الاعلانات ومفتوحة المصدر."</string>
<string name="store_feature_interface">"&lt;b&gt;واجهة بسيطة، جميلة وحديثة &lt;/b&gt;
لوب يحتوي على واجهة بسيطة وهي سهلة الاستخدام و تتابع نظام تصميم الماتريل دسيجن."</string>
<string name="store_feature_score">"&lt;b&gt;نتيجة العادات&lt;/b&gt;
بالإضافة إلى عرض التقدم الحالي، لوب ديه خوارزمية متقدمة لحساب قوة عاداتك. كل التكرار يجعل هذه العادة أقوى، وفي كل يوم غاب يجعلها أضعف. مع ذلك غيب أيام قليلة بعد تقدم طويلة ، لن تدمر تماما تقدمك ."</string>
<string name="store_feature_statistics">"&lt;b&gt;الرسوم البيانية والإحصاءات المفصلة&lt;/b&gt;
نرى بوضوح كيف كنت قد تحسنت عاداتك بمرور الوقت مع الرسوم البيانية الجميله ومفصلة. انتقل إلى الوراء لنرى التاريخ الكامل لعاداتك."</string>
<string name="store_feature_schedules">"&lt;b&gt;جداول مرنة&lt;/b&gt;
تؤيد كل من العادات اليومية والعادات مع جداول أكثر تعقيدا، مثل 3 مرات كل أسبوع، مرة واحدة كل أسبوعين، أو مرة كل يومين."</string>
<string name="store_feature_reminders">"&lt;b&gt;تذكير&lt;/b&gt;
إنشاء تذكير لكل فرد من عاداتك، في ساعة اختيار من اليوم. تحقق بسهولة، رفض أو غفوة عادتك مباشرة من الإخطار، دون الحاجة إلى فتح التطبيق."</string>
<string name="store_feature_opensource">"&lt;b&gt;خالية تماما من الإعلانات و المصدر المفتوح&lt;/b&gt;
لا توجد على الاطلاق الإعلانات والشعارات المزعجة أو أذونات إضافية في هذا التطبيق، و سوف يكون هناك أبدا."</string>
<string name="store_feature_wear">"&lt;b&gt;الأمثل للساعات الذكية&lt;/b&gt;
يمكن التحقق من رسائل التذكير، رفض أو غفوة عادتك مباشرة من ساعتك الاندرويد وير. "</string>
<string name="about">"معلومات حول"</string>
<string name="translators">"المترجمين"</string>
<string name="developers">"المطورين"</string>
<!-- %s will get replaced by the version number. For example, "Versão %d" will become "Versão 1.2.0". -->
<string name="version_n">"الإصدار %s"</string>
<string name="frequency">"تردد"</string>
<string name="checkmark">"علامة الاختيار"</string>
<!-- This is a shorter version of "Habit Strength" -->
<string name="strength">"القوة"</string>
<string name="best_streaks">"أكثر تقدم"</string>
<string name="current_streaks">"تقدم الحالي"</string>
<string name="number_of_repetitions">"عدد من حالات التكرار"</string>
<string name="last_x_days">"آخر %d أيام"</string>
<string name="last_x_weeks">"آخر %d أسابيع"</string>
<string name="last_x_months">"آخر %d أشهر"</string>
<string name="last_x_years">"آخر %d سنين"</string>
<!-- "All time" number of repetitions. Or number of repetitions "since the beginning". -->
<string name="all_time">"كل الوقت"</string>
<string name="every_day">"كل يوم"</string>
<string name="every_week">"كل اسبوع"</string>
<string name="two_times_per_week">"مرتين في الأسبوع"</string>
<string name="five_times_per_week">"خمس مرات في الأسبوع"</string>
<string name="custom_frequency">"مخصص..."</string>
<string name="help">"مساعدة والأسئلة المتداولة"</string>
<string name="could_not_export">"فشل في تصدير البيانات."</string>
<string name="could_not_import">"فشل في استيراد البيانات."</string>
<!-- Appears when the user tries to import a file which we do not support or recognize. -->
<string name="file_not_recognized">"الملف غير المعترف."</string>
<string name="habits_imported">"نجح إستيراد العادات."</string>
<string name="full_backup_success">"نجح تصدير النسخ الاحتياطي الكامل."</string>
<string name="import_data">"استيراد بيانات."</string>
<string name="export_full_backup">"صدر نسخة احتياطية كاملة."</string>
<string name="import_data_summary">"تدعم النسخ الاحتياطي الكامل المصدرة من هذا التطبيق، فضلا عن الملفات التي تم إنشاؤها من Tickmate, HabitBull و Rewire. انظر التعليمات لمزيد من المعلومات."</string>
<string name="export_as_csv_summary">"صدر ملف التي يمكن فتحها ببرنامج جداول البيانات مثل إكسل أو وبينوفيس. لا يمكن إستيراد هذا الملف."</string>
<string name="export_full_backup_summary">"إنشاء ملف يحتوي على كافة البيانات. يمكن استيراد هذا الملف نفسه."</string>
<string name="bug_report_failed">"فشل في توليد تقرير الاعطال"</string>
<string name="generate_bug_report">"توليد تقرير الاعطال"</string>
<string name="troubleshooting">"استكشاف الأخطاء وإصلاحها"</string>
<string name="help_translate">"المساعدة في ترجمة هذا البرنامج"</string>
<string name="night_mode">"الوضع الليلي"</string>
<string name="use_pure_black">"استخدام أسود نقي في الوضع الليلي"</string>
<string name="pure_black_description">"يستبدل خلفيات رمادية مع أسود نقي في الوضع الليلي. يقلل من استهلاك البطارية في الهواتف مع شاشة AMOLED."</string>
<string name="interface_preferences">"السطح البيني"</string>
<string name="reverse_days">"ترتيب عكسي أيام"</string>
<string name="reverse_days_description">"عرض أيام في ترتيب عكسي على الشاشة الرئيسية"</string>
<string name="day">"يوم"</string>
<string name="week">"أسبوع"</string>
<string name="month">"شهر"</string>
<!-- Three-month period -->
<string name="quarter">"ربع سنه"</string>
<string name="year">"عام"</string>
<!-- Middle part of the sentence '1 time in xx days' -->
<!-- Middle part of the sentence '1 time in xx days' -->
<string name="time_every">"مرات في"</string>
<string name="every_x_days">"كل %d أيام"</string>
<string name="every_x_weeks">"كل %d أسابيع"</string>
<string name="every_x_months">"كل %d أشهر"</string>
<!-- The old "habit strength" has been replaced by "score". Feel free to translate "score" as "strength" or "stability" if it sounds more natural in your language. -->
<string name="score">"النقاط"</string>
<string name="reminder_sound">"صوت تذكير"</string>
<!-- Appears when the user disables the reminder sound. Could also be "no sound", "mute" or "silent". -->
<string name="none">"صامت"</string>
</resources>
<string name="app_name">لوب ملاحق العادة </string>
<string name="main_activity_title">عادات</string>
<string name="action_settings">إعدادات</string>
<string name="edit">تعديل</string>
<string name="delete">حذف</string>
<string name="archive">أرشيف</string>
<string name="unarchive">إزالة من الأرشيف</string>
<string name="add_habit">إضافة العادة</string>
<string name="color_picker_default_title">غير اللون</string>
<string name="toast_habit_created">تم صنع عادة </string>
<string name="toast_habit_deleted">تم حذف عادة </string>
<string name="toast_habit_restored">تم ترجيع عادة</string>
<string name="toast_nothing_to_undo">لا شيء للتراجع</string>
<string name="toast_nothing_to_redo">لا شيء لتكرار</string>
<string name="toast_habit_changed">تم تغييرعادة</string>
<string name="toast_habit_changed_back">تم ترجيع العادة إلى أصلها</string>
<string name="toast_habit_archived">تم أرشيف العادات</string>
<string name="toast_habit_unarchived">تم إزالة العادة من الأرشيف </string>
<string name="overview">نظرة عامة</string>
<string name="habit_strength">قوة العادة</string>
<string name="history">التاريخ</string>
<string name="clear">مسح</string>
<string name="description_hint">السؤال (هل ... اليوم؟)</string>
<string name="repeat">كرر</string>
<string name="times_every">مرات في</string>
<string name="days">أيام</string>
<string name="reminder">تذكير</string>
<string name="discard">حذف</string>
<string name="save">حفظ</string>
<string name="streaks">تقدم متتالية</string>
<string name="no_habits_found"> لا يوجد لديك عادات مفعله</string>
<string name="long_press_to_toggle">أضغط و إستمر لتحقق أو ازل</string>
<string name="reminder_off">أوقف</string>
<string name="validation_name_should_not_be_blank">لا يمكن أن يكون الإسم فارغ</string>
<string name="validation_number_should_be_positive">يجب أن يكون الرقم إيجابي</string>
<string name="validation_at_most_one_rep_per_day">يمكن أن يكون التكرار واحدة فقط كل يوم </string>
<string name="create_habit">اخلق عادة</string>
<string name="edit_habit">تعديل العادة</string>
<string name="check">حقق</string>
<string name="snooze">لاحقا</string>
<!-- App introduction -->
<string name="intro_title_1">أهلا بك</string>
<string name="intro_description_1">لوب يساعدك على خلق والحفاظ على العادات الجيدة.</string>
<string name="intro_title_2">إنشاء بعض عادات جديدة</string>
<string name="intro_description_2">كل يوم، بعد أداء عادتك، وضع علامة على التطبيق.</string>
<string name="intro_title_3">حافظ على القيام بذلك</string>
<string name="intro_description_3">العادة المستمرة لفترات طويلة تكسب نجمة كامله</string>
<string name="intro_title_4">تتبع تقدمك</string>
<string name="intro_description_4">رسوم بيانية مفصلة تبين لكم كيف تحسن عاداتك مع مرور الوقت.</string>
<string name="interval_15_minutes">15 دقيقة</string>
<string name="interval_30_minutes">30 دقيقة</string>
<string name="interval_1_hour">ساعة واحدة</string>
<string name="interval_2_hour">ساعتين</string>
<string name="interval_4_hour">أربع ساعات</string>
<string name="interval_8_hour">ثماني ساعات</string>
<string name="interval_24_hour">24 ساعة</string>
<string name="pref_toggle_title">تبديل بكبسه</string>
<string name="pref_toggle_description">أكثر سهولة، لكنه ممكن يسبب كبسات غير مقصوده</string>
<string name="pref_snooze_interval_title">فترتي الغفوى على التذكير</string>
<string name="pref_rate_this_app">تقييم هذا التطبيق على جوجل بلاي</string>
<string name="pref_send_feedback">أرسل الملاحظات إلى المطور</string>
<string name="pref_view_source_code">إفحص التعليمات البرمجية على GitHub</string>
<string name="pref_view_app_introduction">عرض المقدمه</string>
<string name="links">روابط</string>
<string name="behavior">سلوك</string>
<string name="name">اسم</string>
<string name="settings">إعدادات</string>
<string name="snooze_interval">فترتي الغفوه</string>
<string name="hint_title">هل كنت تعلم؟</string>
<string name="hint_drag">لإعادة ترتيب القوائم، أضغط اسم من هذه العادة، ثم اسحبه إلى المكان الصحيح.</string>
<string name="hint_landscape">يمكنك ان ترى المزيد أيام عن طريق وضع الهاتف في وضع أفقي.</string>
<string name="delete_habits">حذف عادات</string>
<string name="delete_habits_message">سيتم حذف عادات بشكل دائم. هذا العمل لا يمكن التراجع عنه.</string>
<string name="weekends">عطلة نهاية الأسبوع</string>
<string name="any_weekday">أيام الأسبوع</string>
<string name="any_day">أي يوم</string>
<string name="select_weekdays">إختار أيام </string>
<string name="export_to_csv">تصدير البيانات (CSV)</string>
<string name="done_label">منجز</string>
<string name="clear_label">نظف</string>
<string name="select_hours">تحديد ساعات</string>
<string name="select_minutes">تحديد دقائق </string>
<string name="about">معلومات حول</string>
<string name="translators">المترجمين</string>
<string name="developers">المطورين</string>
<string name="version_n">الإصدار %s</string>
<string name="frequency">تردد</string>
<string name="checkmark">علامة الاختيار</string>
<string name="strength">القوة</string>
<string name="best_streaks">أكثر تقدم</string>
<string name="current_streaks">تقدم الحالي</string>
<string name="number_of_repetitions">عدد من حالات التكرار</string>
<string name="last_x_days">آخر %d أيام</string>
<string name="last_x_weeks">آخر %d أسابيع</string>
<string name="last_x_months">آخر %d أشهر</string>
<string name="last_x_years">آخر %d سنين</string>
<string name="all_time">كل الوقت</string>
<string name="every_day">كل يوم</string>
<string name="every_week">كل اسبوع</string>
<string name="two_times_per_week">مرتين في الأسبوع</string>
<string name="five_times_per_week">خمس مرات في الأسبوع</string>
<string name="custom_frequency">مخصص...</string>
<string name="help">مساعدة والأسئلة المتداولة</string>
<string name="could_not_export">فشل في تصدير البيانات.</string>
<string name="could_not_import">فشل في استيراد البيانات.</string>
<string name="file_not_recognized">الملف غير المعترف.</string>
<string name="habits_imported">نجح إستيراد العادات.</string>
<string name="full_backup_success">نجح تصدير النسخ الاحتياطي الكامل.</string>
<string name="import_data">استيراد بيانات.</string>
<string name="export_full_backup">صدر نسخة احتياطية كاملة.</string>
<string name="import_data_summary">تدعم النسخ الاحتياطي الكامل المصدرة من هذا التطبيق، فضلا عن الملفات التي تم إنشاؤها من Tickmate, HabitBull و Rewire. انظر التعليمات لمزيد من المعلومات.</string>
<string name="export_as_csv_summary">صدر ملف التي يمكن فتحها ببرنامج جداول البيانات مثل إكسل أو وبينوفيس. لا يمكن إستيراد هذا الملف.</string>
<string name="export_full_backup_summary">إنشاء ملف يحتوي على كافة البيانات. يمكن استيراد هذا الملف نفسه.</string>
<string name="bug_report_failed">فشل في توليد تقرير الاعطال</string>
<string name="generate_bug_report">توليد تقرير الاعطال</string>
<string name="troubleshooting">استكشاف الأخطاء وإصلاحها</string>
<string name="help_translate">المساعدة في ترجمة هذا البرنامج</string>
<string name="night_mode">الوضع الليلي</string>
<string name="use_pure_black">استخدام أسود نقي في الوضع الليلي</string>
<string name="pure_black_description">يستبدل خلفيات رمادية مع أسود نقي في الوضع الليلي. يقلل من استهلاك البطارية في الهواتف مع شاشة AMOLED.</string>
<string name="interface_preferences">السطح البيني</string>
<string name="reverse_days">ترتيب عكسي أيام</string>
<string name="reverse_days_description">عرض أيام في ترتيب عكسي على الشاشة الرئيسية</string>
<string name="day">يوم</string>
<string name="week">أسبوع</string>
<string name="month">شهر</string>
<string name="quarter">ربع سنه</string>
<string name="year">عام</string>
<string name="total">المجموع</string>
<!-- Middle part of the sentence '1 time in xx days' -->
<string name="time_every">مرات في</string>
<string name="every_x_days">كل %d أيام</string>
<string name="every_x_weeks">كل %d أسابيع</string>
<string name="every_x_months">كل %d أشهر</string>
<string name="score">النقاط</string>
<string name="reminder_sound">صوت تذكير</string>
<string name="none">صامت</string>
<string name="action">عمل</string>
<string name="download">تحميل</string>
<string name="export">استخراج</string>
</resources>

View File

@@ -0,0 +1,178 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com-->
<!--
~ 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/>.
-->
<resources>
<string name="app_name">Loop Следене на навици</string>
<string name="main_activity_title">Навици</string>
<string name="action_settings">Настройки</string>
<string name="edit">Редактиране</string>
<string name="delete">Изтриване</string>
<string name="archive">Архивиране</string>
<string name="unarchive">Разархивиране</string>
<string name="add_habit">Добавяне на навик</string>
<string name="color_picker_default_title">Промяна на цвят</string>
<string name="toast_habit_created">Навикът е създаден</string>
<string name="toast_habit_deleted">Навиците са изтрити</string>
<string name="toast_habit_restored">Навиците са възстановени</string>
<string name="toast_nothing_to_undo">Нищо за отмяна</string>
<string name="toast_nothing_to_redo">Нищо за възстановяване</string>
<string name="toast_habit_changed">Навикът е променен</string>
<string name="toast_habit_changed_back">Промяната на навика е отменена.</string>
<string name="toast_habit_archived">Навиците са архивирани</string>
<string name="toast_habit_unarchived">Навиците са разархивирани</string>
<string name="overview">Обобщение</string>
<string name="habit_strength">Сила на навика</string>
<string name="history">История</string>
<string name="clear">Изчистване</string>
<string name="description_hint">Въпрос (Днес, ... ли?)</string>
<string name="repeat">Повтори</string>
<string name="times_every">пъти в период от</string>
<string name="days">дни</string>
<string name="reminder">Напомняне</string>
<string name="discard">Отказ</string>
<string name="save">Запазване</string>
<string name="streaks">Поредици</string>
<string name="no_habits_found">Нямате активни навици</string>
<string name="long_press_to_toggle">Натиснете и задръжте за да добавите или премахнете отметка</string>
<string name="reminder_off">Изключено</string>
<string name="validation_name_should_not_be_blank">Името не може да бъде празно.</string>
<string name="validation_number_should_be_positive">Числото трябва да е положително.</string>
<string name="validation_at_most_one_rep_per_day">Позволено е до едно повторение на ден.</string>
<string name="create_habit">Създаване на навик</string>
<string name="edit_habit">Редактиране на навик</string>
<string name="check">Поставяне на отметка</string>
<string name="snooze">По-късно</string>
<!-- App introduction -->
<string name="intro_title_1">Добре дошли</string>
<string name="intro_description_1">Loop Следене на навици ви помага да създавате и поддържате добри навици.</string>
<string name="intro_title_2">Създайте нови навици</string>
<string name="intro_description_2">Всеки ден, след изпълнението на навика, поставете отметка в приложението.</string>
<string name="intro_title_3">Продължавайте да го изпълнявате</string>
<string name="intro_description_3">Навици изпълнявани редовно за дълго време ще получат пълна звезда.</string>
<string name="intro_title_4">Следете прогреса си</string>
<string name="intro_description_4">Подробни диаграми ви показват как вашите навици са се подобрили с времето.</string>
<string name="interval_15_minutes">15 минути</string>
<string name="interval_30_minutes">30 минути</string>
<string name="interval_1_hour">1 час</string>
<string name="interval_2_hour">2 часа</string>
<string name="interval_4_hour">4 часа</string>
<string name="interval_8_hour">8 часа</string>
<string name="interval_24_hour">24 часа</string>
<string name="pref_toggle_title">Маркиране с кратко натискане</string>
<string name="pref_toggle_description">Поставяне на отметки с кратко натискане вместо с натискане и задържане. По-удобно, но може да доведе до неволно маркиране.</string>
<string name="pref_snooze_interval_title">Интервал на напомняне след отлагане</string>
<string name="pref_rate_this_app">Оценяване на това приложение в Google Play</string>
<string name="pref_send_feedback">Изпращане на отзиви към разработчика</string>
<string name="pref_view_source_code">Преглед на програмния код в GitHub</string>
<string name="pref_view_app_introduction">Преглед на въведение в приложението</string>
<string name="links">Препратки</string>
<string name="behavior">Поведение</string>
<string name="name">Име</string>
<string name="settings">Настройки</string>
<string name="snooze_interval">Интервал на отлагане</string>
<string name="hint_title">Знаете ли че?</string>
<string name="hint_drag">За да пренаредите записите, натиснете и задръжте върху името на навика и го придърпайте до правилното място.</string>
<string name="hint_landscape">Може да виждате повече дни като обърнете телефона си в хоризонтално положение.</string>
<string name="delete_habits">Изтриване на навици</string>
<string name="delete_habits_message">Навиците ще се изтрият перманентно. Това действие не може да бъде отменено.</string>
<string name="habit_not_found">Навикът е изтрит / не е намерен</string>
<string name="weekends">Събота и неделя</string>
<string name="any_weekday">От понеделник до петък</string>
<string name="any_day">Всеки ден от седмицата</string>
<string name="select_weekdays">Избор на дни</string>
<string name="export_to_csv">Експортиране като CSV</string>
<string name="done_label">Готово</string>
<string name="clear_label">Изчистване</string>
<string name="select_hours">Избиране на час</string>
<string name="select_minutes">Избиране на минута</string>
<string name="about">За приложението</string>
<string name="translators">Преводачи</string>
<string name="developers">Разработчици</string>
<string name="version_n">Версия %s</string>
<string name="frequency">Честота</string>
<string name="checkmark">Отметка</string>
<string name="strength">Сила</string>
<string name="best_streaks">Най-добри поредици</string>
<string name="current_streaks">Текуща поредица</string>
<string name="number_of_repetitions">Брой повторения</string>
<string name="last_x_days">Последните %d дни</string>
<string name="last_x_weeks">Последните %d седмици</string>
<string name="last_x_months">Последните %d месеци</string>
<string name="last_x_years">Последните %d години</string>
<string name="all_time">От началото</string>
<string name="every_day">Всеки ден</string>
<string name="every_week">Всяка седмица</string>
<string name="two_times_per_week">2 пъти седмично</string>
<string name="five_times_per_week">5 пъти седмично</string>
<string name="custom_frequency">Друго ...</string>
<string name="help">Помощ &amp; ЧЗВ</string>
<string name="could_not_export">Неуспешно експортиране на данни.</string>
<string name="could_not_import">Неуспешно импортиране на данни.</string>
<string name="file_not_recognized">Файлът не е разпознат.</string>
<string name="habits_imported">Навиците са импортирани успешно.</string>
<string name="full_backup_success">Пълно резервно копие е експортирано успешно.</string>
<string name="import_data">Импортиране на данни</string>
<string name="export_full_backup">Експортиране на пълно резервно копие</string>
<string name="import_data_summary">Поддържа пълни резервни копия експортирани чрез това приложение, както и файлове генерирани чрез Tickmate, HabitBull или Rewire. Вижте ЧЗВ за повече информация.</string>
<string name="export_as_csv_summary">Генерира файлове, които могат да се отварят със софтуер за електронни таблици като Microsoft Excel или OpenOffice Calc. Този файл не може да се импортира обратно.</string>
<string name="export_full_backup_summary">Генерира файл, който съдържа всичките ви данни. Този файл може да бъде импортиран обратно.</string>
<string name="bug_report_failed">Неуспешно генериране на доклад за грешки.</string>
<string name="generate_bug_report">Генериране на доклад за грешки</string>
<string name="troubleshooting">Отстраняване на проблеми</string>
<string name="help_translate">Помагане за превода на това приложение</string>
<string name="night_mode">Нощен режим</string>
<string name="use_pure_black">Използване на чисто черно при нощен режим</string>
<string name="pure_black_description">Заменя сивите фонове с чисто черни при нощен режим. Намаля разхода на батерията при телефони с AMOLED дисплеи.</string>
<string name="interface_preferences">Интерфейс</string>
<string name="reverse_days">Обратен ред на дните</string>
<string name="reverse_days_description">Показва дните на основния екран в обратен ред</string>
<string name="day">Ден</string>
<string name="week">Седмица</string>
<string name="month">Месец</string>
<string name="quarter">Тримесечие</string>
<string name="year">Година</string>
<string name="total">Общо</string>
<!-- Middle part of the sentence '1 time in xx days' -->
<string name="time_every">път в период от</string>
<string name="every_x_days">На всеки %d дни</string>
<string name="every_x_weeks">На всеки %d седмици</string>
<string name="every_x_months">На всеки %d месеца</string>
<string name="score">Сила</string>
<string name="reminder_sound">Звук за напомняне</string>
<string name="none">Няма</string>
<string name="filter">Филтър</string>
<string name="hide_completed">Скриване на завършените</string>
<string name="hide_archived">Скриване на архивираните</string>
<string name="sticky_notifications">Направи нотификациите постоянни</string>
<string name="sticky_notifications_description">Предотвратява изчистването на нотификацията с плъзване настрани.</string>
<string name="repair_database">Поправка на базата данни</string>
<string name="database_repaired">Базата данни е поправена.</string>
<string name="uncheck">Премахване на отметка</string>
<string name="toggle">Смяна</string>
<string name="action">Действие</string>
<string name="habit">Навик</string>
<string name="sort">Сортиране</string>
<string name="manually">Ръчно</string>
<string name="by_name">По име</string>
<string name="by_color">По цвят</string>
<string name="by_score">По сила</string>
<string name="download">Изтегляне</string>
<string name="export">Експортиране</string>
</resources>

View File

@@ -1,180 +1,161 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com-->
<!--
~ 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/>.
-->
<resources>
<string name="app_name">"Loop Habit Tracker"</string>
<string name="main_activity_title">"Hàbits"</string>
<string name="action_settings">"Ajustaments"</string>
<string name="edit">"Editar"</string>
<string name="delete">"Esborrar"</string>
<string name="archive">"Arxivar"</string>
<string name="unarchive">"Treure de l'arxiu"</string>
<string name="add_habit">"Afegir hàbit"</string>
<string name="color_picker_default_title">"Canviar color"</string>
<string name="toast_habit_created">"Hàbit creat."</string>
<string name="toast_habit_deleted">"Hàbits esborrats."</string>
<string name="toast_habit_restored">"Hàbits restaurats."</string>
<string name="toast_nothing_to_undo">"Res a desfer."</string>
<string name="toast_nothing_to_redo">"Res a refer."</string>
<string name="toast_habit_changed">"Hàbit modificat."</string>
<!-- This appears when the user edits a habit, and then undoes the action. The habit is "changed back" to what is was before. Alternatively, "Habit restored". -->
<string name="toast_habit_changed_back">"Hàbit restaurat."</string>
<string name="toast_habit_archived">"Hàbits arxivats."</string>
<string name="toast_habit_unarchived">"Hàbits trets de l'arxiu."</string>
<string name="overview">"Visió general"</string>
<string name="habit_strength">"Fortalesa de l'hàbit"</string>
<string name="history">"Història"</string>
<string name="clear">"Netejar"</string>
<string name="description_hint">"Pregunta (Avui vas...?)"</string>
<!-- This and the next two terms form the sentence "Repeat 3 times in 7 days" that you see when you create a habit. Let me know if you have trouble adapting this into your language. -->
<string name="repeat">"Repetir"</string>
<string name="times_every">"vegades en"</string>
<string name="days">"dies"</string>
<string name="reminder">"Recordatori"</string>
<string name="discard">"Descartar"</string>
<string name="save">"Desar"</string>
<!-- Streak as in "winning streak". That is, the number of times a user has performed a habit consecutively. Similar terms are "chains" or "series". -->
<string name="streaks">"Ratxa"</string>
<string name="no_habits_found">"No tens hàbits actius"</string>
<string name="long_press_to_toggle">"Prem i manté per a marcar o desmarcar"</string>
<string name="reminder_off">"Desactivat"</string>
<string name="validation_name_should_not_be_blank">"El nom no pot estar buit"</string>
<string name="validation_number_should_be_positive">"El número ha de ser positiu"</string>
<string name="validation_at_most_one_rep_per_day">"Pots tenir com a màxim una repetició per dia"</string>
<string name="create_habit">"Crear hàbit"</string>
<string name="edit_habit">"Editar hàbit"</string>
<string name="check">"Revisar"</string>
<string name="snooze">"Més tard"</string>
<!-- App introduction -->
<string name="intro_title_1">"Benvingut"</string>
<string name="intro_description_1">"Loop Habit Tracker t'ajuda a crear i mantenir bons hàbits"</string>
<string name="intro_title_2">"Crear alguns hàbits nous"</string>
<string name="intro_description_2">"Cada dia, després de complir el teu hàbit, posa una marca amb la app"</string>
<string name="intro_title_3">"Continua fent-ho"</string>
<string name="intro_description_3">"Els hàbits que facis consistentment durant una llarga temporada obtindran una estrella"</string>
<string name="intro_title_4">"Segueix el teu progrès"</string>
<string name="intro_description_4">"Els gràfics detallats et mostren com han mirollat els teus hàbits al llarg del temps"</string>
<string name="interval_15_minutes">"15 minuts"</string>
<string name="interval_30_minutes">"30 minuts"</string>
<string name="interval_1_hour">"1 hora"</string>
<string name="interval_2_hour">"2 hores"</string>
<string name="interval_4_hour">"4 hores"</string>
<string name="interval_8_hour">"8 hores"</string>
<string name="pref_toggle_title">"Activar/desactivar repeticions prement curt"</string>
<string name="pref_toggle_description">"Més adequat, però pot causar activacions accidentals"</string>
<string name="pref_snooze_interval_title">"Interval d'endarreriment en recordatoris"</string>
<string name="pref_rate_this_app">"Valora aquesta app a Google Play"</string>
<string name="pref_send_feedback">"Enviar resposta al desenvolupador"</string>
<string name="pref_view_source_code">"Veure codi font a Github"</string>
<string name="pref_view_app_introduction">"Veure introducció de l'app"</string>
<string name="links">"Enllaços"</string>
<string name="behavior">"Comportament"</string>
<string name="name">"Nom"</string>
<string name="show_archived">"Mostrar arxivats"</string>
<string name="settings">"Ajustaments"</string>
<string name="snooze_interval">"Interval d'endarreriment"</string>
<string name="hint_title">"Ho sabies?"</string>
<string name="hint_drag">"Per a ordenar les entrades, prem i mantè sobre el nom de l'hàbit, després arrossega'l al lloc correcte."</string>
<string name="hint_landscape">"Pots veure més dies posant el teu telèfon en orientació apaisada."</string>
<string name="delete_habits">"Esborrar hàbits"</string>
<string name="delete_habits_message">"Els hàbits seran esborrats permanentment. Aquesta acció no es pot desfer."</string>
<string name="weekends">"Caps de setmana"</string>
<string name="any_weekday">"Dilluns a divendres"</string>
<string name="any_day">"Qualsevol dia de la setmana"</string>
<string name="select_weekdays">"Selecciona els dies"</string>
<string name="export_to_csv">"Exportar a CSV"</string>
<string name="done_label">"Fet"</string>
<string name="clear_label">"Treure"</string>
<string name="select_hours">"Selecciona les hores"</string>
<string name="select_minutes">"Selecciona els minuts"</string>
<!-- Short description used on the Google Play store. There is an 80-character limit. -->
<string name="store_short_description">"Crea bons hàbits i segueix el seu progrés al llarg del temps (sense publicitat)"</string>
<string name="store_description_1">"Loop t'ajuda a crear i mantenir bons hàbits, permetent-te aconseguir els teus objectius a llarg termini. Els gràfics i estadístiques detallades et mostren com han millorat els teus hàbits al llarg del temps. És completament de codi obert i lliure de publicitat."</string>
<string name="store_feature_interface">"&lt;b&gt;Senzilla, bonica i moderna interfície&lt;/b&gt;
Loop té una interfície minimalista que és fàcil d'utilitzar i segueix les guies de \"material design\"."</string>
<string name="store_feature_score">"&lt;b&gt;Puntuació d'hàbit&lt;/b&gt;
A més de mostrar la teva ratxa actual, Loop té un algoritme avançat per a calcular la fortalesa dels teus hàbits. Cada repetició fa el teu hàbit més fort, i cada dia que fallis el farà més dèbil. Tot i això uns quants dies que fallis després d'una llarga ratxa no malmetrà completament el teu progrès."</string>
<string name="store_feature_statistics">"&lt;b&gt;Gràfics i estadístiques detallades&lt;/b&gt;
Permet veure de forma clara com han millorat els teus hàbits al llarg del temps amb gràfics bonics i detallats. Pots anar enrera i veure també l'històric complet dels teus hàbits."</string>
<string name="store_feature_schedules">"&lt;b&gt;Planificació flexible&lt;/b&gt;
Suporta tant hàbits diaris com hàbits amb planificacions més complexes, com per exemple 3 vegades per setmana; un cop setmana si setmana no; o un dia si i altre no."</string>
<string name="store_feature_reminders">"&lt;b&gt;Recordatoris&lt;/b&gt;
Crea un recordatori individual per a cada hàbit, a l'hora escollida del dia. Revisa fàcilment, endarrereix o anul·la el teu hàbit directament des de la notificació, sense obrir l'app."</string>
<string name="store_feature_opensource">"&lt;b&gt;Completament de codi obert i lliure de publicitat&lt;/b&gt;
No hi ha cap tipus de publicitat, notificacions molestes o permisos intrusius en aquesta app, i mai n'hi haurà. El codi font complet està disponible sota la llicència GPLv3."</string>
<string name="store_feature_wear">"&lt;b&gt;Optimitzat per a rellotges intel·ligents&lt;/b&gt;
Els recordatoris poden ser revisats, endarrerits o anul·lats directament des del teu rellotge Android Wear."</string>
<string name="about">"En quant a"</string>
<string name="translators">"Traductors"</string>
<string name="developers">"Desenvolupadors"</string>
<!-- %s will get replaced by the version number. For example, "Versão %d" will become "Versão 1.2.0". -->
<string name="version_n">"Versió %s"</string>
<string name="frequency">"Freqüència"</string>
<string name="checkmark">"Marca"</string>
<!-- This is a shorter version of "Habit Strength" -->
<string name="strength">"Fortalesa"</string>
<string name="best_streaks">"Millors ratxes"</string>
<string name="current_streaks">"Ratxa actual"</string>
<string name="number_of_repetitions">"Nombre de repeticions"</string>
<string name="last_x_days">"Últims %d dies"</string>
<string name="last_x_weeks">"Últimes %d setmanes"</string>
<string name="last_x_months">"Últims %d mesos"</string>
<string name="last_x_years">"Últims %d anys"</string>
<!-- "All time" number of repetitions. Or number of repetitions "since the beginning". -->
<string name="all_time">"Tot el temps"</string>
<string name="every_day">"Cada dia"</string>
<string name="every_week">"Cada setmana"</string>
<string name="two_times_per_week">"2 cops per setmana"</string>
<string name="five_times_per_week">"5 cops per setmana"</string>
<string name="custom_frequency">"Personalitzar ..."</string>
<string name="help">"Ajuda i Preguntes Freqüents"</string>
<string name="could_not_export">"Error exportant dades."</string>
<string name="could_not_import">"Error important dades."</string>
<!-- Appears when the user tries to import a file which we do not support or recognize. -->
<string name="file_not_recognized">"Fitxer no reconegut."</string>
<string name="habits_imported">"Hàbits importats correctament."</string>
<string name="full_backup_success">"Còpia de seguretat sencera exportada satisfactòriament."</string>
<string name="import_data">"Importar dades"</string>
<string name="export_full_backup">"Exportar còpia de seguretat sencera"</string>
<string name="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ó."</string>
<string name="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."</string>
<string name="export_full_backup_summary">"Genera un fitxer que contè totes les teves dades. Aquest fitxer pot tornar-se a importar."</string>
<string name="bug_report_failed">"Ha fallat la generació de l'informe d'error."</string>
<string name="generate_bug_report">"Generar informe d'error"</string>
<string name="troubleshooting">"Resolució de problemes"</string>
<string name="help_translate">"Ajuda a traduïr aquesta app"</string>
<string name="night_mode">"Mode nocturn"</string>
<string name="use_pure_black">"Utilitzar negre pur en el mode nocturn"</string>
<string name="pure_black_description">"Reemplaça fons grisos per negre pur en el mode nocturn. Redueix consum de bateria en telèfons amb pantalla AMOLED."</string>
<string name="interface_preferences">"Interfície"</string>
<string name="reverse_days">"Ordre invers de dies"</string>
<string name="reverse_days_description">"Mostra els dies en ordre invers en la pantalla principal"</string>
<string name="day">"Dia"</string>
<string name="week">"Setmana"</string>
<string name="month">"Mes"</string>
<!-- Three-month period -->
<string name="quarter">"Quatrimestre"</string>
<string name="year">"Any"</string>
<!-- Middle part of the sentence '1 time in xx days' -->
<!-- Middle part of the sentence '1 time in xx days' -->
<string name="time_every">"vegades en"</string>
<string name="every_x_days">"Cada %d dies"</string>
<string name="every_x_weeks">"Cada %d setmanes"</string>
<string name="every_x_months">"Cada %d mesos"</string>
<!-- The old "habit strength" has been replaced by "score". Feel free to translate "score" as "strength" or "stability" if it sounds more natural in your language. -->
<string name="score">"Puntuació"</string>
<string name="reminder_sound">"So de recordatori"</string>
<!-- Appears when the user disables the reminder sound. Could also be "no sound", "mute" or "silent". -->
<string name="none">"Cap"</string>
</resources>
<string name="main_activity_title">Hàbits</string>
<string name="action_settings">Ajustaments</string>
<string name="edit">Editar</string>
<string name="delete">Esborrar</string>
<string name="archive">Arxivar</string>
<string name="unarchive">Treure de l\'arxiu</string>
<string name="add_habit">Afegir hàbit</string>
<string name="color_picker_default_title">Canviar color</string>
<string name="toast_habit_created">Hàbit creat.</string>
<string name="toast_habit_deleted">Hàbits esborrats.</string>
<string name="toast_habit_restored">Hàbits restaurats.</string>
<string name="toast_nothing_to_undo">Res a desfer.</string>
<string name="toast_nothing_to_redo">Res a refer.</string>
<string name="toast_habit_changed">Hàbit modificat.</string>
<string name="toast_habit_changed_back">Hàbit restaurat.</string>
<string name="toast_habit_archived">Hàbits arxivats.</string>
<string name="toast_habit_unarchived">Hàbits trets de l\'arxiu.</string>
<string name="overview">Visió general</string>
<string name="habit_strength">Fortalesa de l\'hàbit</string>
<string name="history">Història</string>
<string name="clear">Netejar</string>
<string name="description_hint">Pregunta (Avui vas...?)</string>
<string name="repeat">Repetir</string>
<string name="times_every">vegades en</string>
<string name="days">dies</string>
<string name="reminder">Recordatori</string>
<string name="discard">Descartar</string>
<string name="save">Desar</string>
<string name="streaks">Ratxa</string>
<string name="no_habits_found">No tens hàbits actius</string>
<string name="long_press_to_toggle">Prem i manté per a marcar o desmarcar</string>
<string name="reminder_off">Desactivat</string>
<string name="validation_name_should_not_be_blank">El nom no pot estar buit</string>
<string name="validation_number_should_be_positive">El número ha de ser positiu</string>
<string name="validation_at_most_one_rep_per_day">Pots tenir com a màxim una repetició per dia</string>
<string name="create_habit">Crear hàbit</string>
<string name="edit_habit">Editar hàbit</string>
<string name="check">Revisar</string>
<string name="snooze">Més tard</string>
<!-- App introduction -->
<string name="intro_title_1">Benvingut</string>
<string name="intro_description_1">Loop Habit Tracker t\'ajuda a crear i mantenir bons hàbits</string>
<string name="intro_title_2">Crear alguns hàbits nous</string>
<string name="intro_description_2">Cada dia, després de complir el teu hàbit, posa una marca amb la app</string>
<string name="intro_title_3">Continua fent-ho</string>
<string name="intro_description_3">Els hàbits que facis consistentment durant una llarga temporada obtindran una estrella</string>
<string name="intro_title_4">Segueix el teu progrès</string>
<string name="intro_description_4">Els gràfics detallats et mostren com han mirollat els teus hàbits al llarg del temps</string>
<string name="interval_15_minutes">15 minuts</string>
<string name="interval_30_minutes">30 minuts</string>
<string name="interval_1_hour">1 hora</string>
<string name="interval_2_hour">2 hores</string>
<string name="interval_4_hour">4 hores</string>
<string name="interval_8_hour">8 hores</string>
<string name="interval_24_hour">24 hores</string>
<string name="pref_toggle_title">Activar/desactivar repeticions prement curt</string>
<string name="pref_toggle_description">Més adequat, però pot causar activacions accidentals</string>
<string name="pref_snooze_interval_title">Interval d\'endarreriment en recordatoris</string>
<string name="pref_rate_this_app">Valora aquesta app a Google Play</string>
<string name="pref_send_feedback">Enviar resposta al desenvolupador</string>
<string name="pref_view_source_code">Veure codi font a Github</string>
<string name="pref_view_app_introduction">Veure introducció de l\'app</string>
<string name="links">Enllaços</string>
<string name="behavior">Comportament</string>
<string name="name">Nom</string>
<string name="settings">Ajustaments</string>
<string name="snooze_interval">Interval d\'endarreriment</string>
<string name="hint_title">Ho sabies?</string>
<string name="hint_drag">Per a ordenar les entrades, prem i mantè sobre el nom de l\'hàbit, després arrossega\'l al lloc correcte.</string>
<string name="hint_landscape">Pots veure més dies posant el teu telèfon en orientació apaisada.</string>
<string name="delete_habits">Esborrar hàbits</string>
<string name="delete_habits_message">Els hàbits seran esborrats permanentment. Aquesta acció no es pot desfer.</string>
<string name="weekends">Caps de setmana</string>
<string name="any_weekday">Dilluns a divendres</string>
<string name="any_day">Qualsevol dia de la setmana</string>
<string name="select_weekdays">Selecciona els dies</string>
<string name="export_to_csv">Exportar a CSV</string>
<string name="done_label">Fet</string>
<string name="clear_label">Treure</string>
<string name="select_hours">Selecciona les hores</string>
<string name="select_minutes">Selecciona els minuts</string>
<string name="about">En quant a</string>
<string name="translators">Traductors</string>
<string name="developers">Desenvolupadors</string>
<string name="version_n">Versió %s</string>
<string name="frequency">Freqüència</string>
<string name="checkmark">Marca</string>
<string name="strength">Fortalesa</string>
<string name="best_streaks">Millors ratxes</string>
<string name="current_streaks">Ratxa actual</string>
<string name="number_of_repetitions">Nombre de repeticions</string>
<string name="last_x_days">Últims %d dies</string>
<string name="last_x_weeks">Últimes %d setmanes</string>
<string name="last_x_months">Últims %d mesos</string>
<string name="last_x_years">Últims %d anys</string>
<string name="all_time">Tot el temps</string>
<string name="every_day">Cada dia</string>
<string name="every_week">Cada setmana</string>
<string name="two_times_per_week">2 cops per setmana</string>
<string name="five_times_per_week">5 cops per setmana</string>
<string name="custom_frequency">Personalitzar ...</string>
<string name="help">Ajuda i Preguntes Freqüents</string>
<string name="could_not_export">Error exportant dades.</string>
<string name="could_not_import">Error important dades.</string>
<string name="file_not_recognized">Fitxer no reconegut.</string>
<string name="habits_imported">Hàbits importats correctament.</string>
<string name="full_backup_success">Còpia de seguretat sencera exportada satisfactòriament.</string>
<string name="import_data">Importar dades</string>
<string name="export_full_backup">Exportar còpia de seguretat sencera</string>
<string name="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ó.</string>
<string name="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.</string>
<string name="export_full_backup_summary">Genera un fitxer que contè totes les teves dades. Aquest fitxer pot tornar-se a importar.</string>
<string name="bug_report_failed">Ha fallat la generació de l\'informe d\'error.</string>
<string name="generate_bug_report">Generar informe d\'error</string>
<string name="troubleshooting">Resolució de problemes</string>
<string name="help_translate">Ajuda a traduïr aquesta app</string>
<string name="night_mode">Mode nocturn</string>
<string name="use_pure_black">Utilitzar negre pur en el mode nocturn</string>
<string name="pure_black_description">Reemplaça fons grisos per negre pur en el mode nocturn. Redueix consum de bateria en telèfons amb pantalla AMOLED.</string>
<string name="interface_preferences">Interfície</string>
<string name="reverse_days">Ordre invers de dies</string>
<string name="reverse_days_description">Mostra els dies en ordre invers en la pantalla principal</string>
<string name="day">Dia</string>
<string name="week">Setmana</string>
<string name="month">Mes</string>
<string name="quarter">Quatrimestre</string>
<string name="year">Any</string>
<!-- Middle part of the sentence '1 time in xx days' -->
<string name="time_every">vegades en</string>
<string name="every_x_days">Cada %d dies</string>
<string name="every_x_weeks">Cada %d setmanes</string>
<string name="every_x_months">Cada %d mesos</string>
<string name="score">Puntuació</string>
<string name="reminder_sound">So de recordatori</string>
<string name="none">Cap</string>
<string name="filter">Filtre</string>
<string name="action">Acció</string>
<string name="habit">Hàbit</string>
<string name="export">Exportar</string>
</resources>

View File

@@ -1,183 +1,178 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com-->
<!--
~ 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/>.
-->
<resources>
<!-- Fuzzy -->
<string name="app_name">"Loop Habit Tracker"</string>
<string name="main_activity_title">"Zvyky"</string>
<string name="action_settings">"Nastavení"</string>
<string name="edit">"Upravit"</string>
<string name="delete">"Smazat"</string>
<string name="archive">"Archivovat"</string>
<string name="unarchive">"Obnovit"</string>
<string name="add_habit">"Přidat zvyk"</string>
<string name="color_picker_default_title">"Změnit barvu"</string>
<string name="toast_habit_created">"Zvyk vytvořen."</string>
<string name="toast_habit_deleted">"Zvyky smazány."</string>
<string name="toast_habit_restored">"Zvyky obnoveny."</string>
<string name="toast_nothing_to_undo">"Nelze jít zpět."</string>
<string name="toast_nothing_to_redo">"Nelze jít vpřed."</string>
<string name="toast_habit_changed">"Zvyk změněn."</string>
<!-- This appears when the user edits a habit, and then undoes the action. The habit is "changed back" to what is was before. Alternatively, "Habit restored". -->
<string name="toast_habit_changed_back">"Zvyk změněn zpět."</string>
<string name="toast_habit_archived">"Archivováno."</string>
<string name="toast_habit_unarchived">"Zvyky obnoveny."</string>
<string name="overview">"Přehled"</string>
<string name="habit_strength">"Síla zvyku"</string>
<string name="history">"Historie"</string>
<string name="clear">"Smazat"</string>
<string name="description_hint">"Otázka (Dělal jsi dnes...?)"</string>
<!-- This and the next two terms form the sentence "Repeat 3 times in 7 days" that you see when you create a habit. Let me know if you have trouble adapting this into your language. -->
<string name="repeat">"Opakovat"</string>
<string name="times_every">"krát za"</string>
<string name="days">"d"</string>
<string name="reminder">"Připomenout"</string>
<string name="discard">"Zrušit"</string>
<string name="save">"Uložit"</string>
<!-- I need some synonyms or context, thx -->
<!-- Streak as in "winning streak". That is, the number of times a user has performed a habit consecutively. Similar terms are "chains" or "series". -->
<string name="streaks">"Serie"</string>
<string name="no_habits_found">"Nemáš žádné aktivní zvyky"</string>
<string name="long_press_to_toggle">"Stiskni a drž pro označení"</string>
<string name="reminder_off">"Off"</string>
<string name="validation_name_should_not_be_blank">"Jméno musíte vyplnit."</string>
<string name="validation_number_should_be_positive">"Číslo musí být kladné."</string>
<string name="validation_at_most_one_rep_per_day">"Můžete mít maximálně jedno označení denně."</string>
<string name="create_habit">"Vytvořit zvyk"</string>
<string name="edit_habit">"Upravit zvyk"</string>
<string name="check">"Označeno"</string>
<string name="snooze">"Odložit"</string>
<!-- App introduction -->
<string name="intro_title_1">"Vítejte"</string>
<string name="intro_description_1">"Sledování zvyků ti pomůže vytvořit a dosáhnout dobrých návyků."</string>
<string name="intro_title_2">"Vytvoř si nové zvyky"</string>
<string name="intro_description_2">"Každý den po splnění zvyku, si ho v aplikaci zaškrtni."</string>
<string name="intro_title_3">"Jen tak dál"</string>
<string name="intro_description_3">"Zvyky, které vykonáváš pravidelně delší dobu, se označí hvězdou."</string>
<string name="intro_title_4">"Sleduj svůj postup"</string>
<string name="intro_description_4">"Detailní grafy ti ukážou, jak se tvé zvyky v průběhu času zlepšily."</string>
<string name="interval_15_minutes">"15 minut"</string>
<string name="interval_30_minutes">"30 minut"</string>
<string name="interval_1_hour">"Hodina"</string>
<string name="interval_2_hour">"2 hodiny"</string>
<string name="interval_4_hour">"4 hodiny"</string>
<string name="interval_8_hour">"8 hodin"</string>
<string name="pref_toggle_title">"Označte opakování krátkým stisknutím"</string>
<string name="pref_toggle_description">"Praktičtější, ale může způsobit nechtěné označení."</string>
<string name="pref_snooze_interval_title">"Doba odložení upomínky"</string>
<string name="pref_rate_this_app">"Ohodnoťte nás v Google Play"</string>
<string name="pref_send_feedback">"Zpětná vazba vývojáři"</string>
<string name="pref_view_source_code">"Zobrazit zdroj. kód na GitHub"</string>
<string name="pref_view_app_introduction">"Představení aplikace"</string>
<string name="links">"Odkazy"</string>
<string name="behavior">"Chování"</string>
<string name="name">"Jméno"</string>
<string name="show_archived">"Zobrazit archiv"</string>
<string name="settings">"Nastavení"</string>
<string name="snooze_interval">"Interval odkladu"</string>
<string name="hint_title">"Věděli jste?"</string>
<string name="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."</string>
<string name="hint_landscape">"Můžeš vidět více dnů otočením telefonu na šířku."</string>
<string name="delete_habits">"Smazat zvyky"</string>
<string name="delete_habits_message">"Zvyky budou navždy odstraněny. Toto nelze vzít zpět."</string>
<string name="weekends">"Víkendy"</string>
<string name="any_weekday">"Pondělí až pátek"</string>
<string name="any_day">"Jakýkoliv den v týdnu"</string>
<string name="select_weekdays">"Vyber dny"</string>
<string name="export_to_csv">"Exportuj CSV"</string>
<string name="done_label">"Hotovo"</string>
<string name="clear_label">"Smazat"</string>
<string name="select_hours">"Vyber hodiny"</string>
<string name="select_minutes">"Vyber minuty"</string>
<!-- Short description used on the Google Play store. There is an 80-character limit. -->
<string name="store_short_description">"Vytvoř si prospěšné návyky a sleduj jejich vývoj v průběhu času (bez reklam)"</string>
<string name="store_description_1">"Aplikace ti pomůže vytvořit a udržovat si prospěšné návyky a dosáhnout tak tvých dlouhodobých cílů. Detailní grafy a statistiky ti ukáží, jak se tvoje zvyky postupem času zlepšují. Vše je kompletně bez reklam a open source."</string>
<string name="store_feature_interface">"&lt;b&gt;Jednoduché, krásné a moderní prostředí&lt;/b&gt;
Aplikace má minimalistický design s jednoduchým použitím. Dodržuje pravidla material designu."</string>
<string name="store_feature_score">"&lt;b&gt;Síla zvyku&lt;/b&gt;
Pro zobrazení aktuální úspěšné serie aplikace využívá pokročilý algoritmus, aby vypočítala sílu tvých zvyků. Každé opakování dělá tvůj zvyk silnějším a každé nedodržení ho oslabuje. Ale pár vynechaných dní po dlouhé řadě kompletně nezničí celý tvůj postup."</string>
<string name="store_feature_statistics">"&lt;b&gt;Detailní grafy a statistika&lt;/b&gt;
Přehledně vidíš na krásných grafech, jak moc se tvoje zvyky zlepšují v průběhu času. Jeď zpět, abys viděl kompletní historii."</string>
<string name="store_feature_schedules">"&lt;b&gt;Flexibilní časový plán&lt;/b&gt;
Podpora jak denních návyků, tak návyků s komplexnějším rozvrhem. Jako jsou 3 krát týdně, jednou za dva týdny, nebo obden."</string>
<string name="store_feature_reminders">"&lt;b&gt;Upomínky&lt;/b&gt;
Vytvoř si individuální upomínku pro každý zvyk ve zvolený čas. Jednoduše potvrď, přeskoč nebo odlož notifikace bez nutnosti otevření aplikace."</string>
<string name="store_feature_opensource">"&lt;b&gt;Kompletně bez reklam a open source&lt;/b&gt;
Nejsou tu naprosto žádné reklamy, otravné notifikace nebo dotěrná povolení aplikace. A nikdy nebudou. Kompletní zdrojový kód je dostupný pod GPLv3."</string>
<string name="store_feature_wear">"&lt;b&gt;Optimalizované pro chytré hodinky&lt;/b&gt;
Upomínky mohou být potvrzen, odloženy nebo smazány přímo z tvého zařízení s Android Wear."</string>
<string name="about">"O nás"</string>
<string name="translators">"Překladatelé"</string>
<string name="developers">"Vývojáři"</string>
<!-- %s will get replaced by the version number. For example, "Versão %d" will become "Versão 1.2.0". -->
<string name="version_n">"Verze %s"</string>
<string name="frequency">"Frekvence"</string>
<string name="checkmark">"Zatržítko"</string>
<!-- This is a shorter version of "Habit Strength" -->
<string name="strength">"Síla"</string>
<string name="best_streaks">"Nejlepší serie"</string>
<string name="current_streaks">"Aktuální serie"</string>
<string name="number_of_repetitions">"Počet opakování"</string>
<string name="last_x_days">"Posledních %d dnů"</string>
<string name="last_x_weeks">"Posledních %d týdnů"</string>
<string name="last_x_months">"Posledních %d měsíců"</string>
<string name="last_x_years">"Posledních %d roků"</string>
<!-- "All time" number of repetitions. Or number of repetitions "since the beginning". -->
<string name="all_time">"Bez omezení"</string>
<string name="every_day">"Každý den"</string>
<string name="every_week">"Každý týden"</string>
<string name="two_times_per_week">"2 krát týdně"</string>
<string name="five_times_per_week">"5 krát týdně"</string>
<string name="custom_frequency">"Vlastní..."</string>
<string name="help">"Pomoc a FAQ"</string>
<string name="could_not_export">"Export selhal."</string>
<string name="could_not_import">"Import selhal."</string>
<!-- Appears when the user tries to import a file which we do not support or recognize. -->
<string name="file_not_recognized">"Soubor netozpoznán."</string>
<string name="habits_imported">"Zvyky úspěšně importovány."</string>
<string name="full_backup_success">"Kompletní záloha úspěšně exportována."</string>
<string name="import_data">"Importovat"</string>
<string name="export_full_backup">"Kompletní export"</string>
<string name="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."</string>
<string name="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."</string>
<string name="export_full_backup_summary">"Generuje soubor, který obsahuje všechna tvoje data. Tento soubor můžeš importovat zpět."</string>
<string name="bug_report_failed">"Generace výpisu chyb selhala."</string>
<string name="generate_bug_report">"Generovat výpis chyb"</string>
<string name="troubleshooting">"Řešení problémů"</string>
<string name="help_translate">"Pomozte s překladem aplikace"</string>
<string name="night_mode">"Noční téma"</string>
<string name="use_pure_black">"Zobrazit čistě černou v nočním tématu"</string>
<string name="pure_black_description">"Nahradí šedé pozadí čistou černou v nočním tématu. Snižuje spotřebu baterie v telefonech s AMOLED displejem."</string>
<string name="interface_preferences">"Rozhraní"</string>
<string name="reverse_days">"Otočit pořadí dnů"</string>
<string name="reverse_days_description">"Zobrazí dny na úvodní stránce v obráceném pořadí"</string>
<string name="day">"Den"</string>
<string name="week">"Týden"</string>
<string name="month">"Měsíc"</string>
<!-- Three-month period -->
<string name="quarter">"Čtvrtletí"</string>
<string name="year">"Rok"</string>
<!-- Middle part of the sentence '1 time in xx days' -->
<!-- Middle part of the sentence '1 time in xx days' -->
<string name="time_every">"krát za"</string>
<string name="every_x_days">"Každých %d dní"</string>
<string name="every_x_weeks">"Každých %d týdnů"</string>
<string name="every_x_months">"Každých %d měsíců"</string>
<!-- The old "habit strength" has been replaced by "score". Feel free to translate "score" as "strength" or "stability" if it sounds more natural in your language. -->
<string name="score">"Skóre"</string>
<string name="reminder_sound">"Zvuk upomínky"</string>
<!-- Appears when the user disables the reminder sound. Could also be "no sound", "mute" or "silent". -->
<string name="none">"Žádný"</string>
</resources>
<string name="app_name">Loop Habit Tracker</string>
<string name="main_activity_title">Zvyky</string>
<string name="action_settings">Nastavení</string>
<string name="edit">Upravit</string>
<string name="delete">Smazat</string>
<string name="archive">Archivovat</string>
<string name="unarchive">Obnovit</string>
<string name="add_habit">Přidat zvyk</string>
<string name="color_picker_default_title">Změnit barvu</string>
<string name="toast_habit_created">Zvyk vytvořen.</string>
<string name="toast_habit_deleted">Zvyky smazány.</string>
<string name="toast_habit_restored">Zvyky obnoveny.</string>
<string name="toast_nothing_to_undo">Nelze jít zpět.</string>
<string name="toast_nothing_to_redo">Nelze jít vpřed.</string>
<string name="toast_habit_changed">Zvyk změněn.</string>
<string name="toast_habit_changed_back">Zvyk změněn zpět.</string>
<string name="toast_habit_archived">Archivováno.</string>
<string name="toast_habit_unarchived">Zvyky obnoveny.</string>
<string name="overview">Přehled</string>
<string name="habit_strength">Síla zvyku</string>
<string name="history">Historie</string>
<string name="clear">Smazat</string>
<string name="description_hint">Otázka (Dělal jsi dnes...?)</string>
<string name="repeat">Opakovat</string>
<string name="times_every">krát za</string>
<string name="days">dní</string>
<string name="reminder">Připomenutí</string>
<string name="discard">Zrušit</string>
<string name="save">Uložit</string>
<string name="streaks">Serie</string>
<string name="no_habits_found">Nemáte žádné nedokončené zvyky</string>
<string name="long_press_to_toggle">Stiskni a drž pro označe</string>
<string name="reminder_off">Vyp.</string>
<string name="validation_name_should_not_be_blank">Jméno musíte vyplnit.</string>
<string name="validation_number_should_be_positive">Číslo musí být kladné.</string>
<string name="validation_at_most_one_rep_per_day">Můžete mít maximálně jedno označení denně.</string>
<string name="create_habit">Vytvořit zvyk</string>
<string name="edit_habit">Upravit zvyk</string>
<string name="check">Označeno</string>
<string name="snooze">Odložit</string>
<!-- App introduction -->
<string name="intro_title_1">Vítejte</string>
<string name="intro_description_1">Sledování zvyků ti pomůže vytvořit a dosáhnout dobrých návyků.</string>
<string name="intro_title_2">Vytvoř si nové zvyky</string>
<string name="intro_description_2">Každý den po splnění zvyku, si ho v aplikaci zaškrtni.</string>
<string name="intro_title_3">Jen tak dál</string>
<string name="intro_description_3">Zvyky, které vykonáváš pravidelně delší dobu, se označí hvězdou.</string>
<string name="intro_title_4">Sleduj svůj postup</string>
<string name="intro_description_4">Detailní grafy ti ukážou, jak se tvé zvyky v průběhu času zlepšily.</string>
<string name="interval_15_minutes">15 minut</string>
<string name="interval_30_minutes">30 minut</string>
<string name="interval_1_hour">Hodina</string>
<string name="interval_2_hour">2 hodiny</string>
<string name="interval_4_hour">4 hodiny</string>
<string name="interval_8_hour">8 hodin</string>
<string name="interval_24_hour">24 hodin</string>
<string name="pref_toggle_title">Označte opakování krátkým stisknutím</string>
<string name="pref_toggle_description">Praktičtější, ale může způsobit nechtěné označení.</string>
<string name="pref_snooze_interval_title">Doba odložení upomínky</string>
<string name="pref_rate_this_app">Ohodnoťte nás v Google Play</string>
<string name="pref_send_feedback">Zpětná vazba vývojáři</string>
<string name="pref_view_source_code">Zobrazit zdroj. kód na GitHub</string>
<string name="pref_view_app_introduction">Představení aplikace</string>
<string name="links">Odkazy</string>
<string name="behavior">Chování</string>
<string name="name">Jméno</string>
<string name="settings">Nastavení</string>
<string name="snooze_interval">Interval odkladu</string>
<string name="hint_title">Věděli jste?</string>
<string name="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.</string>
<string name="hint_landscape">Můžeš vidět více dnů otočením telefonu na šířku.</string>
<string name="delete_habits">Smazat zvyky</string>
<string name="delete_habits_message">Označené zvyky budou navždy odstraněny. Toto nelze vzít zpět.</string>
<string name="habit_not_found">Zvyk smazán / nenalezen</string>
<string name="weekends">Víkendy</string>
<string name="any_weekday">Pondělí až pátek</string>
<string name="any_day">Jakýkoliv den v týdnu</string>
<string name="select_weekdays">Vyber dny</string>
<string name="export_to_csv">Exportovat CSV</string>
<string name="done_label">Hotovo</string>
<string name="clear_label">Smazat</string>
<string name="select_hours">Vyber hodiny</string>
<string name="select_minutes">Vyber minuty</string>
<string name="about">O nás</string>
<string name="translators">Překladatelé</string>
<string name="developers">Vývojáři</string>
<string name="version_n">Verze %s</string>
<string name="frequency">Frekvence</string>
<string name="checkmark">Zatržítko</string>
<string name="strength">Síla</string>
<string name="best_streaks">Nejlepší serie</string>
<string name="current_streaks">Aktuální serie</string>
<string name="number_of_repetitions">Počet opakování</string>
<string name="last_x_days">Posledních %d dnů</string>
<string name="last_x_weeks">Posledních %d týdnů</string>
<string name="last_x_months">Posledních %d měsíců</string>
<string name="last_x_years">Posledních %d roků</string>
<string name="all_time">Bez omezení</string>
<string name="every_day">Každý den</string>
<string name="every_week">Každý týden</string>
<string name="two_times_per_week">2 krát týdně</string>
<string name="five_times_per_week">5 krát týdně</string>
<string name="custom_frequency">Vlastní...</string>
<string name="help">Pomoc a FAQ</string>
<string name="could_not_export">Export selhal.</string>
<string name="could_not_import">Import selhal.</string>
<string name="file_not_recognized">Soubor netozpoznán.</string>
<string name="habits_imported">Zvyky úspěšně importovány.</string>
<string name="full_backup_success">Kompletní záloha úspěšně exportována.</string>
<string name="import_data">Importovat</string>
<string name="export_full_backup">Kompletní export</string>
<string name="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.</string>
<string name="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.</string>
<string name="export_full_backup_summary">Generuje soubor, který obsahuje všechna tvoje data. Tento soubor můžeš importovat zpět.</string>
<string name="bug_report_failed">Generace výpisu chyb selhala.</string>
<string name="generate_bug_report">Generovat výpis chyb</string>
<string name="troubleshooting">Řešení problémů</string>
<string name="help_translate">Pomozte s překladem aplikace</string>
<string name="night_mode">Noční téma</string>
<string name="use_pure_black">Zobrazit čistě černou v nočním tématu</string>
<string name="pure_black_description">Nahradí šedé pozadí čistou černou v nočním tématu. Snižuje spotřebu baterie v telefonech s AMOLED displejem.</string>
<string name="interface_preferences">Rozhraní</string>
<string name="reverse_days">Otočit pořadí dnů</string>
<string name="reverse_days_description">Zobrazí dny na úvodní stránce v obráceném pořadí</string>
<string name="day">Den</string>
<string name="week">Týden</string>
<string name="month">Měsíc</string>
<string name="quarter">Čtvrtletí</string>
<string name="year">Rok</string>
<string name="total">Celkem</string>
<!-- Middle part of the sentence '1 time in xx days' -->
<string name="time_every">krát za</string>
<string name="every_x_days">Každých %d dní</string>
<string name="every_x_weeks">Každých %d týdnů</string>
<string name="every_x_months">Každých %d měsíců</string>
<string name="score">Skóre</string>
<string name="reminder_sound">Zvuk upomínky</string>
<string name="none">Žádný</string>
<string name="filter">Filtr</string>
<string name="hide_completed">Skrýt dokončené</string>
<string name="hide_archived">Skrýt archivované</string>
<string name="sticky_notifications">Připnout notifikaci</string>
<string name="sticky_notifications_description">Zabraňuje notifikaci její odstranění odsunutím.</string>
<string name="repair_database">Opravit databázi</string>
<string name="database_repaired">Databáze opravena.</string>
<string name="uncheck">Odznačit</string>
<string name="toggle">Přepnout</string>
<string name="action">Akce</string>
<string name="habit">Zvyk</string>
<string name="sort">Řadit</string>
<string name="manually">Ručně</string>
<string name="by_name">Abecedně</string>
<string name="by_color">Podle barvy</string>
<string name="by_score">Podle skóre</string>
<string name="download">Stáhnout</string>
<string name="export">Export</string>
</resources>

View File

@@ -1,180 +1,154 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com-->
<!--
~ 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/>.
-->
<resources>
<string name="app_name">"Loop Vane Tracker"</string>
<string name="main_activity_title">"Vaner"</string>
<string name="action_settings">"Indstillinger"</string>
<string name="edit">"Rediger"</string>
<string name="delete">"Slet"</string>
<string name="archive">"Arkiver"</string>
<string name="unarchive">"Fjern fra arkiv"</string>
<string name="add_habit">"Tilføj vane"</string>
<string name="color_picker_default_title">"Skift farve"</string>
<string name="toast_habit_created">"Vanen er skabt."</string>
<string name="toast_habit_deleted">"Vanen er slettet."</string>
<string name="toast_habit_restored">"Vanen er genskabt."</string>
<string name="toast_nothing_to_undo">"Intet at fortryde."</string>
<string name="toast_nothing_to_redo">"Intet at gengøre."</string>
<string name="toast_habit_changed">"Vanen er ændret"</string>
<!-- This appears when the user edits a habit, and then undoes the action. The habit is "changed back" to what is was before. Alternatively, "Habit restored". -->
<string name="toast_habit_changed_back">"Vanen er ændret tilbage."</string>
<string name="toast_habit_archived">"Vanerne er arkiveret."</string>
<string name="toast_habit_unarchived">"Vanerne er fjernet fra arkivet."</string>
<string name="overview">"Overblik"</string>
<string name="habit_strength">"Vanestyrke"</string>
<string name="history">"Historie"</string>
<string name="clear">"Rens"</string>
<string name="description_hint">"Spørgsmål (Fik du … i dag)"</string>
<!-- This and the next two terms form the sentence "Repeat 3 times in 7 days" that you see when you create a habit. Let me know if you have trouble adapting this into your language. -->
<string name="repeat">"Gentag"</string>
<string name="times_every">"gange på"</string>
<string name="days">"dage"</string>
<string name="reminder">"Påmindelse"</string>
<string name="discard">"Forkast"</string>
<string name="save">"Gem"</string>
<!-- Streak as in "winning streak". That is, the number of times a user has performed a habit consecutively. Similar terms are "chains" or "series". -->
<string name="streaks">"i træk"</string>
<string name="no_habits_found">"Du har ingen aktive vaner"</string>
<string name="long_press_to_toggle">"Tryk og hold nede for at afkrydse"</string>
<string name="reminder_off">"Slukket"</string>
<string name="validation_name_should_not_be_blank">"Navn skal udfyldes."</string>
<string name="validation_number_should_be_positive">"Tallet skal være positivt."</string>
<string name="validation_at_most_one_rep_per_day">"Du kan højst have én gentagelse per dag"</string>
<string name="create_habit">"Skab en vane"</string>
<string name="edit_habit">"Rediger vane"</string>
<string name="check">"Tjek"</string>
<string name="snooze">"Senere"</string>
<!-- App introduction -->
<string name="intro_title_1">"Velkommen"</string>
<string name="intro_description_1">"Loop Habit Tracker hjælper dig med at holde gode vaner."</string>
<string name="intro_title_2">"Skab nogle nye vaner"</string>
<string name="intro_description_2">"Hver dag, efter at have udført din vane, skal du sætte et flueben i app'en."</string>
<string name="intro_title_3">"Fortsæt"</string>
<string name="intro_description_3">"Vaner fulgt regelmæssigt gennem langtid modtager en stjerne."</string>
<string name="intro_title_4">"Følg dine fremskridt"</string>
<string name="intro_description_4">"Detaljerede grafer viser dig hvordan dine vaner udvikler sig over tid."</string>
<string name="interval_15_minutes">"15 minutter"</string>
<string name="interval_30_minutes">"30 minutter"</string>
<string name="interval_1_hour">"1 time"</string>
<string name="interval_2_hour">"2 timer"</string>
<string name="interval_4_hour">"4 timer"</string>
<string name="interval_8_hour">"8 timer"</string>
<string name="pref_toggle_title">"Vælg gentagelser med kort tryk"</string>
<string name="pref_toggle_description">"Mere bekvemmeligt, men kan forårsage uhensigtede tryk."</string>
<string name="pref_snooze_interval_title">"Snooze interval på påmindelserne"</string>
<string name="pref_rate_this_app">"Bedøm denne app på Google Play"</string>
<string name="pref_send_feedback">"Send feedback til udvikleren"</string>
<string name="pref_view_source_code">"Se kildekoden på GitHub"</string>
<string name="pref_view_app_introduction">"Se app introduktion"</string>
<string name="links">"Henvisninger"</string>
<string name="behavior">"Opførelse"</string>
<string name="name">"Navn"</string>
<string name="show_archived">"Vis arkiverede"</string>
<string name="settings">"Indstillinger"</string>
<string name="snooze_interval">"Snooze interval"</string>
<string name="hint_title">"Vidste du?"</string>
<string name="hint_drag">"For at omarrangere poster, tryk og hold på navnet på den vane, og træk den til det korrekte sted."</string>
<string name="hint_landscape">"Du kan se flere dage ved at sætte telefonen i liggende tilstand."</string>
<string name="delete_habits">"Slet vaner"</string>
<string name="delete_habits_message">"Vanerne vil blive slettet permanent. Denne handling kan ikke fortrydes."</string>
<string name="weekends">"Weekender"</string>
<string name="any_weekday">"Mandag til Fredag"</string>
<string name="any_day">"En hvilken som helst dag i ugen"</string>
<string name="select_weekdays">"Vælg dage"</string>
<string name="export_to_csv">"Eksporter som CSV"</string>
<string name="done_label">"Færdig"</string>
<string name="clear_label">"Fjern"</string>
<string name="select_hours">"Vælg timer"</string>
<string name="select_minutes">"Vælg minutter"</string>
<!-- Short description used on the Google Play store. There is an 80-character limit. -->
<string name="store_short_description">"Opret gode vaner og spore deres fremskridt over tid (reklamefri)"</string>
<string name="store_description_1">"Loop hjælper dig med at oprette og vedligeholde gode vaner, så du kan nå dine langsigtede mål. Detaljerede grafer og statistikker viser dig, hvordan dine vaner har forbedret over tid. Det er helt reklamefri og open source."</string>
<string name="store_feature_interface">"&lt;B&gt; Enkel, smuk og moderne grænseflade &lt;/ b&gt;
Loop har en minimalistisk brugerflade, der er nem at bruge og følger Google's retningslinjer for materielle design."</string>
<string name="store_feature_score">"&lt;B&gt; Habit score &lt;/ b&gt;
Ud over at vise din nuværende stribe, har Loop en avanceret algoritme til at beregne styrken af dine vaner. Hver gentagelse gør din vane stærkere, og hver misset dag gør det svagere. Et par misset dage efter en lang stribe, vil dog ikke helt ødelægge hele din fremgang."</string>
<string name="store_feature_statistics">"&lt;B&gt; Detaljerede grafer og statistikker &lt;/ b&gt;
Se, hvordan dine vaner har forbedret over tid med smukke og detaljerede grafer. Rul tilbage for at se den komplette oversigt over dine vaner."</string>
<string name="store_feature_schedules">"&lt;B&gt; Fleksible skemaer &lt;/ b&gt;
Understøtter både daglige vaner og vaner med mere komplekse skemaer, såsom 3 gange hver uge; én gang hver anden uge; eller hver anden dag."</string>
<string name="store_feature_reminders">"&lt;B&gt; Påmindelser &lt;/ b&gt;
Opret en individuel påmindelse for hver vane, på et valgt tidspunkt af dagen. Nemt kontrollere, afskedige eller udsætte din vane direkte fra notifikationen, uden at åbne applikationen."</string>
<string name="store_feature_opensource">"&lt;B&gt; Helt reklamefri og open source &lt;/ b&gt;
Der er absolut ingen reklamer, irriterende meddelelser eller indgribende tilladelser i denne app, og det vil der aldrig være. Den komplette kildekode er tilgængelig under GPLv3."</string>
<string name="store_feature_wear">"&lt;B&gt; Optimeret til smartwatches &lt;/ b&gt;
Påmindelser kan kontrolleres, udsæt eller afvise direkte fra din Android Wear ur."</string>
<string name="about">"Om"</string>
<string name="translators">"Oversættere"</string>
<string name="developers">"Udviklere"</string>
<!-- %s will get replaced by the version number. For example, "Versão %d" will become "Versão 1.2.0". -->
<string name="version_n">"Version %s"</string>
<string name="frequency">"Hyppighed"</string>
<string name="checkmark">"Afkrydsning"</string>
<!-- This is a shorter version of "Habit Strength" -->
<string name="strength">"Styrke"</string>
<string name="best_streaks">"Bedste striber"</string>
<string name="current_streaks">"Aktuel stribe"</string>
<string name="number_of_repetitions">"Antal gentagelser"</string>
<string name="last_x_days">"Sidste % dage"</string>
<string name="last_x_weeks">"Sidste %d uger"</string>
<string name="last_x_months">"Sidste %d måneder"</string>
<string name="last_x_years">"Sidste %d år"</string>
<!-- "All time" number of repetitions. Or number of repetitions "since the beginning". -->
<string name="all_time">"All time"</string>
<string name="every_day">"Hver dag"</string>
<string name="every_week">"Hver uge"</string>
<string name="two_times_per_week">"2 gange om ugen"</string>
<string name="five_times_per_week">"5 gange om ugen"</string>
<string name="custom_frequency">"Brugerdefinerede"</string>
<string name="help">"Hjælp &amp; FAQ"</string>
<string name="could_not_export">"Kunne ikke eksportere data"</string>
<string name="could_not_import">"Kunne ikke importere data"</string>
<!-- Appears when the user tries to import a file which we do not support or recognize. -->
<string name="file_not_recognized">"Fil ikke genkendt."</string>
<string name="habits_imported">"Vaner importeret."</string>
<string name="full_backup_success">"Fuld backup eksporteret."</string>
<string name="import_data">"Importer data"</string>
<string name="export_full_backup">"Eksporter fuld backup."</string>
<string name="import_data_summary">"Understøtter fuld backup eksporteret af denne app, samt filer genereret af Tickmate, HabitBull eller Rewire. Se FAQ for mere information."</string>
<string name="export_as_csv_summary">"Opretter filer, der kan åbnes af regneark fra Microsoft Excel eller OpenOffice Calc. Denne fil kan ikke importeres tilbage."</string>
<string name="export_full_backup_summary">"Opretter en fil, der indeholder alle dine data. Denne fil kan importeres tilbage."</string>
<string name="bug_report_failed">"Kunne ikke generere fejlrapport."</string>
<string name="generate_bug_report">"Generer fejlrapport"</string>
<string name="troubleshooting">"Fejlfinding"</string>
<string name="help_translate">"Hjælpe med at oversætte denne app"</string>
<string name="night_mode">"Nat-tilstand"</string>
<string name="use_pure_black">"Brug ren sort i nat-tilstand"</string>
<string name="pure_black_description">"Erstatter grå baggrunde med ren sort i nat-tilstand. Reducerer batteriforbruget i telefoner med AMOLED skærm."</string>
<string name="interface_preferences">"Grænseflade"</string>
<string name="reverse_days">"Omvendt rækkefølge af dage"</string>
<string name="reverse_days_description">"Vis dag i omvendt rækkefølge på hovedskærmen"</string>
<string name="day">"Dag"</string>
<string name="week">"Uge"</string>
<string name="month">"Måned"</string>
<!-- Three-month period -->
<string name="quarter">"Kvartal"</string>
<string name="year">"År"</string>
<!-- Middle part of the sentence '1 time in xx days' -->
<!-- Middle part of the sentence '1 time in xx days' -->
<string name="time_every">"Tid til"</string>
<string name="every_x_days">"Hver %d dage"</string>
<string name="every_x_weeks">"Hver %d uger"</string>
<string name="every_x_months">"Hver %d måneder"</string>
<!-- The old "habit strength" has been replaced by "score". Feel free to translate "score" as "strength" or "stability" if it sounds more natural in your language. -->
<string name="score">"Point"</string>
<string name="reminder_sound">"Påmindelse lyd"</string>
<!-- Appears when the user disables the reminder sound. Could also be "no sound", "mute" or "silent". -->
<string name="none">"Ingen"</string>
</resources>
<string name="app_name">Loop Vane Tracker</string>
<string name="main_activity_title">Vaner</string>
<string name="action_settings">Indstillinger</string>
<string name="edit">Rediger</string>
<string name="delete">Slet</string>
<string name="archive">Arkiver</string>
<string name="unarchive">Fjern fra arkiv</string>
<string name="add_habit">Tilføj vane</string>
<string name="color_picker_default_title">Skift farve</string>
<string name="toast_habit_created">Vanen er skabt.</string>
<string name="toast_habit_deleted">Vanen er slettet.</string>
<string name="toast_habit_restored">Vanen er genskabt.</string>
<string name="toast_nothing_to_undo">Intet at fortryde.</string>
<string name="toast_nothing_to_redo">Intet at gengøre.</string>
<string name="toast_habit_changed">Vanen er ændret</string>
<string name="toast_habit_changed_back">Vanen er ændret tilbage.</string>
<string name="toast_habit_archived">Vanerne er arkiveret.</string>
<string name="toast_habit_unarchived">Vanerne er fjernet fra arkivet.</string>
<string name="overview">Overblik</string>
<string name="habit_strength">Vanestyrke</string>
<string name="history">Historie</string>
<string name="clear">Rens</string>
<string name="description_hint">Spørgsmål (Fik du &#8230; i dag)</string>
<string name="repeat">Gentag</string>
<string name="times_every">gange på</string>
<string name="days">dage</string>
<string name="reminder">Påmindelse</string>
<string name="discard">Forkast</string>
<string name="save">Gem</string>
<string name="streaks">i træk</string>
<string name="no_habits_found">Du har ingen aktive vaner</string>
<string name="long_press_to_toggle">Tryk og hold nede for at afkrydse</string>
<string name="reminder_off">Slukket</string>
<string name="validation_name_should_not_be_blank">Navn skal udfyldes.</string>
<string name="validation_number_should_be_positive">Tallet skal være positivt.</string>
<string name="validation_at_most_one_rep_per_day">Du kan højst have én gentagelse per dag</string>
<string name="create_habit">Skab en vane</string>
<string name="edit_habit">Rediger vane</string>
<string name="check">Tjek</string>
<string name="snooze">Senere</string>
<!-- App introduction -->
<string name="intro_title_1">Velkommen</string>
<string name="intro_description_1">Loop Habit Tracker hjælper dig med at holde gode vaner.</string>
<string name="intro_title_2">Skab nogle nye vaner</string>
<string name="intro_description_2">Hver dag, efter at have udført din vane, skal du sætte et flueben i app\'en.</string>
<string name="intro_title_3">Fortsæt</string>
<string name="intro_description_3">Vaner fulgt regelmæssigt gennem langtid modtager en stjerne.</string>
<string name="intro_title_4">Følg dine fremskridt</string>
<string name="intro_description_4">Detaljerede grafer viser dig hvordan dine vaner udvikler sig over tid.</string>
<string name="interval_15_minutes">15 minutter</string>
<string name="interval_30_minutes">30 minutter</string>
<string name="interval_1_hour">1 time</string>
<string name="interval_2_hour">2 timer</string>
<string name="interval_4_hour">4 timer</string>
<string name="interval_8_hour">8 timer</string>
<string name="pref_toggle_title">Vælg gentagelser med kort tryk</string>
<string name="pref_toggle_description">Mere bekvemmeligt, men kan forårsage uhensigtede tryk.</string>
<string name="pref_snooze_interval_title">Snooze interval på påmindelserne</string>
<string name="pref_rate_this_app">Bedøm denne app på Google Play</string>
<string name="pref_send_feedback">Send feedback til udvikleren</string>
<string name="pref_view_source_code">Se kildekoden på GitHub</string>
<string name="pref_view_app_introduction">Se app introduktion</string>
<string name="links">Henvisninger</string>
<string name="behavior">Opførelse</string>
<string name="name">Navn</string>
<string name="settings">Indstillinger</string>
<string name="hint_title">Vidste du?</string>
<string name="hint_drag">For at omarrangere poster, tryk og hold på navnet på den vane, og træk den til det korrekte sted.</string>
<string name="hint_landscape">Du kan se flere dage ved at sætte telefonen i liggende tilstand.</string>
<string name="delete_habits">Slet vaner</string>
<string name="delete_habits_message">Vanerne vil blive slettet permanent. Denne handling kan ikke fortrydes.</string>
<string name="weekends">Weekender</string>
<string name="any_weekday">Mandag til Fredag</string>
<string name="any_day">En hvilken som helst dag i ugen</string>
<string name="select_weekdays">Vælg dage</string>
<string name="export_to_csv">Eksporter som CSV</string>
<string name="done_label">Færdig</string>
<string name="clear_label">Fjern</string>
<string name="select_hours">Vælg timer</string>
<string name="select_minutes">Vælg minutter</string>
<string name="about">Om</string>
<string name="translators">Oversættere</string>
<string name="developers">Udviklere</string>
<string name="frequency">Hyppighed</string>
<string name="checkmark">Afkrydsning</string>
<string name="strength">Styrke</string>
<string name="best_streaks">Bedste striber</string>
<string name="current_streaks">Aktuel stribe</string>
<string name="number_of_repetitions">Antal gentagelser</string>
<string name="last_x_days">Sidste % dage</string>
<string name="last_x_weeks">Sidste %d uger</string>
<string name="last_x_months">Sidste %d måneder</string>
<string name="last_x_years">Sidste %d år</string>
<string name="every_day">Hver dag</string>
<string name="every_week">Hver uge</string>
<string name="two_times_per_week">2 gange om ugen</string>
<string name="five_times_per_week">5 gange om ugen</string>
<string name="custom_frequency">Brugerdefinerede</string>
<string name="help">Hjælp &amp; FAQ</string>
<string name="could_not_export">Kunne ikke eksportere data</string>
<string name="could_not_import">Kunne ikke importere data</string>
<string name="file_not_recognized">Fil ikke genkendt.</string>
<string name="habits_imported">Vaner importeret.</string>
<string name="full_backup_success">Fuld backup eksporteret.</string>
<string name="import_data">Importer data</string>
<string name="export_full_backup">Eksporter fuld backup.</string>
<string name="import_data_summary">Understøtter fuld backup eksporteret af denne app, samt filer genereret af Tickmate, HabitBull eller Rewire. Se FAQ for mere information.</string>
<string name="export_as_csv_summary">Opretter filer, der kan åbnes af regneark fra Microsoft Excel eller OpenOffice Calc. Denne fil kan ikke importeres tilbage.</string>
<string name="export_full_backup_summary">Opretter en fil, der indeholder alle dine data. Denne fil kan importeres tilbage.</string>
<string name="bug_report_failed">Kunne ikke generere fejlrapport.</string>
<string name="generate_bug_report">Generer fejlrapport</string>
<string name="troubleshooting">Fejlfinding</string>
<string name="help_translate">Hjælpe med at oversætte denne app</string>
<string name="night_mode">Nat-tilstand</string>
<string name="use_pure_black">Brug ren sort i nat-tilstand</string>
<string name="pure_black_description">Erstatter grå baggrunde med ren sort i nat-tilstand. Reducerer batteriforbruget i telefoner med AMOLED skærm.</string>
<string name="interface_preferences">Grænseflade</string>
<string name="reverse_days">Omvendt rækkefølge af dage</string>
<string name="reverse_days_description">Vis dag i omvendt rækkefølge på hovedskærmen</string>
<string name="day">Dag</string>
<string name="week">Uge</string>
<string name="month">Måned</string>
<string name="quarter">Kvartal</string>
<string name="year">År</string>
<!-- Middle part of the sentence '1 time in xx days' -->
<string name="time_every">Tid til</string>
<string name="every_x_days">Hver %d dage</string>
<string name="every_x_weeks">Hver %d uger</string>
<string name="every_x_months">Hver %d måneder</string>
<string name="score">Point</string>
<string name="reminder_sound">Påmindelse lyd</string>
<string name="none">Ingen</string>
</resources>

View File

@@ -1,195 +1,178 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com-->
<!--
~ 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/>.
-->
<resources>
<string name="app_name">"Loop Habit Tracker"</string>
<string name="main_activity_title">"Gewohnheiten"</string>
<string name="action_settings">"Einstellungen"</string>
<string name="edit">"Bearbeiten"</string>
<string name="delete">"Löschen"</string>
<string name="archive">"Archivieren"</string>
<string name="unarchive">"Dearchivieren"</string>
<string name="add_habit">"Gewohnheit hinzufügen"</string>
<string name="color_picker_default_title">"Farbe ändern"</string>
<string name="toast_habit_created">"Gewohnheit erstellt."</string>
<string name="toast_habit_deleted">"Gewohnheiten gelöscht."</string>
<string name="toast_habit_restored">"Gewohnheiten wiederhergestellt."</string>
<string name="toast_nothing_to_undo">"Nichts zum rückgängig machen."</string>
<string name="toast_nothing_to_redo">"Nichts zum wiederherstellen."</string>
<string name="toast_habit_changed">"Gewohnheit geändert."</string>
<!-- This appears when the user edits a habit, and then undoes the action. The habit is "changed back" to what is was before. Alternatively, "Habit restored". -->
<string name="toast_habit_changed_back">"Gewohnheit zurückgeändert."</string>
<string name="toast_habit_archived">"Gewohnheiten archiviert."</string>
<string name="toast_habit_unarchived">"Gewohnheiten dearchiviert."</string>
<string name="overview">"Übersicht"</string>
<!-- Fuzzy -->
<string name="habit_strength">"Stärke"</string>
<string name="history">"Verlauf"</string>
<string name="clear">"Löschen"</string>
<string name="description_hint">"Frage (Hast du heute ...?)"</string>
<!-- This and the next two terms form the sentence "Repeat 3 times in 7 days" that you see when you create a habit. Let me know if you have trouble adapting this into your language. -->
<string name="repeat">"Wiederhole"</string>
<!-- Fuzzy -->
<string name="times_every">"Mal in"</string>
<string name="days">"Tagen"</string>
<string name="reminder">"Erinnerung"</string>
<string name="discard">"Verwerfen"</string>
<string name="save">"Speichern"</string>
<!-- Streak as in "winning streak". That is, the number of times a user has performed a habit consecutively. Similar terms are "chains" or "series". -->
<!-- Fuzzy -->
<string name="streaks">"Strähnen"</string>
<string name="no_habits_found">"Du hast keine aktiven Gewohnheiten"</string>
<string name="long_press_to_toggle">"Berühre und halte um zu (de)markieren"</string>
<string name="reminder_off">"Aus"</string>
<string name="validation_name_should_not_be_blank">"Name darf nicht leer sein."</string>
<string name="validation_number_should_be_positive">"Zahl muss positiv sein."</string>
<string name="validation_at_most_one_rep_per_day">"Du musst wenigstens eine Wiederholung pro Tag haben"</string>
<string name="create_habit">"Gewohnheit erstellen"</string>
<string name="edit_habit">"Gewohnheit bearbeiten"</string>
<string name="check">"Abhaken"</string>
<string name="snooze">"Später"</string>
<!-- App introduction -->
<string name="intro_title_1">"Willkommen"</string>
<string name="intro_description_1">"Loop Habit Tracker hilft dir gute Gewohnheiten anzueignen."</string>
<string name="intro_title_2">"Erstelle einige neue Gewohnheiten"</string>
<string name="intro_description_2">"Jeden Tag, nachdem du die Gewohnheit gemacht hast, hake sie in der App ab."</string>
<string name="intro_title_3">"Bleib dran"</string>
<string name="intro_description_3">"Gewohnheiten, die über eine längere Zeit absolviert werden, bekommen einen ganzen Stern."</string>
<string name="intro_title_4">"Verfolge deinen Fortschritt"</string>
<string name="intro_description_4">"Detaillierte Diagramme zeigen dir wie sich deine Gewohnheiten entwickelt haben."</string>
<string name="interval_15_minutes">"15 Minuten"</string>
<string name="interval_30_minutes">"30 Minuten"</string>
<string name="interval_1_hour">"1 Stunde"</string>
<string name="interval_2_hour">"2 Stunden"</string>
<string name="interval_4_hour">"4 Stunden"</string>
<string name="interval_8_hour">"8 Stunden"</string>
<string name="pref_toggle_title">"Gewohnheiten durch kurzes Drücken abhaken"</string>
<string name="pref_toggle_description">"Bequemer, kann aber eine falsche Auswahl verursachen."</string>
<string name="pref_snooze_interval_title">"\"Später erinnern\"-Intervall bei Erinnerungen"</string>
<string name="pref_rate_this_app">"Bewerte diese App bei Google Play"</string>
<string name="pref_send_feedback">"Sende dem Entwickler Feedback"</string>
<string name="pref_view_source_code">"Zeige den Quellcode auf GitHub"</string>
<string name="pref_view_app_introduction">"Zeige Anleitung"</string>
<string name="links">"Links"</string>
<string name="behavior">"Verhalten"</string>
<string name="name">"Name"</string>
<string name="show_archived">"Zeige Archiviertes"</string>
<string name="settings">"Einstellungen"</string>
<string name="snooze_interval">"\"Später erinnern\"-Intervall"</string>
<string name="hint_title">"Wusstest du?"</string>
<string name="hint_drag">"Um Einträge umzusortieren, drücke und ziehe sie an die richtige Stelle."</string>
<string name="hint_landscape">"Du kannst mehr Tage sehen, wenn du dein Smartphone quer hältst."</string>
<string name="delete_habits">"Gewohnheiten löschen"</string>
<string name="delete_habits_message">"Diese Gewohnheit wird permanent gelöscht. Dies kann nicht rückgängig gemacht werden."</string>
<string name="weekends">"An Wochenenden"</string>
<string name="any_weekday">"Werktags"</string>
<string name="any_day">"Jeden Tag"</string>
<string name="select_weekdays">"Wähle die Tage"</string>
<string name="export_to_csv">"Daten als CSV exportieren"</string>
<string name="done_label">"Fertig"</string>
<string name="clear_label">"Löschen"</string>
<string name="select_hours">"Wähle Stunden"</string>
<string name="select_minutes">"Wähle Minuten"</string>
<!-- Short description used on the Google Play store. There is an 80-character limit. -->
<string name="store_short_description">"Nimm gute Gewohnheiten an und verfolge deinen Fortschritt (ohne Werbung)"</string>
<string name="store_description_1">"Loop hilft dir gute Gewohnheiten anzunehmen und deine langfristigen Ziele zu erreichen. Detaillierte Statistiken zeigen dir, wie du dich entwickelt hast. Es ist ohne Werbung und Open Source."</string>
<string name="store_feature_interface">"&lt;b&gt;Einfache, schöne und moderne Oberfläche&lt;/b&gt;
Loop hat eine minimale Oberfläche und ist deshalb einfach zu benutzen. Es folgt den Material Design Richtlinien."</string>
<!-- Fuzzy -->
<string name="store_feature_score">"&lt;b&gt;Habit Wertung&lt;/b&gt;
Um dir deine kleinen Schwächen zu zeigen hat Loop einen Algorithmus, um deine Gewohnheiten zu erkennen. Jede Wiederholung verstärkt diese und jedes Aussetzen schwächt sie. Aber ein paar Verfehlungen nach langem Durchhalten machen natürlich nicht gleich alles zu Nichte."</string>
<string name="store_feature_statistics">"&lt;b&gt;Statistiken&lt;/b&gt;
Schau dir an, wie sich deine Gewohnheiten im Laufe der Zeit entwickelt haben. Schau auf die schönen Diagramme und gehe zurück im gesamten Verlauf."</string>
<string name="store_feature_schedules">"&lt;b&gt;Flexible Zeiten&lt;/b&gt;
Unterstützt sowohl tägliche Vorgaben, als auch komplexere Pläne, wie etwa 3 Mal pro Woche; einmal in jeder anderen Woche; oder jeden anderen Tag."</string>
<string name="store_feature_reminders">"&lt;b&gt;Erinnerungen&lt;/b&gt;
Erstelle individuelle Erinnerungen und wann diese dich benachrichtigen sollen. Kontrolliere deine Vorhaben ganz einfach und lehne sie bei Bedarf direkt ab, ohne die App zu öffnen."</string>
<string name="store_feature_opensource">"&lt;b&gt;Komplett werbefrei und Open Source&lt;/b&gt;
Es gibt absolut keine Werbung, nervende Einblendungen oder merkwürdige Berechtigungen in dieser App und das wird auch so bleiben. Der komplette Quellcode steht unter der GPLv3."</string>
<string name="store_feature_wear">"&lt;b&gt;Optimiert für Smartwatches&lt;/b&gt;
Erinnerungen können direkt von deiner Android Wear Watch abgehakt, pausiert oder verschoben werden."</string>
<string name="about">"Über"</string>
<string name="translators">"Übersetzer"</string>
<string name="developers">"Entwickler"</string>
<!-- %s will get replaced by the version number. For example, "Versão %d" will become "Versão 1.2.0". -->
<string name="version_n">"Version %s"</string>
<string name="frequency">"Frequenz"</string>
<!-- Fuzzy -->
<string name="checkmark">"Häkchen"</string>
<!-- This is a shorter version of "Habit Strength" -->
<!-- Fuzzy -->
<string name="strength">"Stärke"</string>
<!-- Fuzzy -->
<string name="best_streaks">"Beste Strähnen"</string>
<!-- Fuzzy -->
<string name="current_streaks">"Derzeitige Strähne"</string>
<string name="number_of_repetitions">"Anzahl der Wiederholungen"</string>
<string name="last_x_days">"Letzten %d Tage"</string>
<string name="last_x_weeks">"Letzten %d Wochen"</string>
<string name="last_x_months">"Letzten %d Monate"</string>
<string name="last_x_years">"Letzten %d Jahre"</string>
<!-- "All time" number of repetitions. Or number of repetitions "since the beginning". -->
<!-- Fuzzy -->
<string name="all_time">"Allzeit"</string>
<string name="every_day">"Jeden Tag"</string>
<string name="every_week">"Jede Woche"</string>
<string name="two_times_per_week">"2 Mal pro Woche"</string>
<string name="five_times_per_week">"5 Mal pro Woche"</string>
<string name="custom_frequency">"Benutzerdefiniert"</string>
<string name="help">"Hilfe &amp; FAQ"</string>
<string name="could_not_export">"Der Export von Daten ist fehlgeschlagen."</string>
<string name="could_not_import">"Der Import von Daten ist fehlgeschlagen."</string>
<!-- Appears when the user tries to import a file which we do not support or recognize. -->
<string name="file_not_recognized">"Datei nicht erkannt."</string>
<string name="habits_imported">"Gewohnheiten wurden erfolgreich importiert."</string>
<string name="full_backup_success">"Vollständige Sicherung erfolgreich exportiert."</string>
<string name="import_data">"Importiere Daten"</string>
<string name="export_full_backup">"Exportiere vollständige Sicherung"</string>
<string name="import_data_summary">"Unterstützt vollständige Sicherungen dieser App, als auch erstellte Sicherungen von Tickmate, HabitBull oder Rewire. Siehe FAQ für mehr Information."</string>
<string name="export_as_csv_summary">"Erzeugt Dateien, die von Tabellenkalkulationsprogrammen, wie Microsoft Excel oder LibreOffice Calc, geöffnet werden können. Diese Dateien können nicht wieder importiert werden."</string>
<string name="export_full_backup_summary">"Erzeugt eine Datei, die alle deine Daten enthält. Diese Datei kann wieder importiert werden."</string>
<string name="bug_report_failed">"Fehlermeldung konnte nicht erstellt werden."</string>
<string name="generate_bug_report">"Einen Fehler melden"</string>
<string name="troubleshooting">"Fehlerbehebung"</string>
<string name="help_translate">"Hilf diese App zu übersetzen"</string>
<string name="night_mode">"Nachtmodus"</string>
<string name="use_pure_black">"Reines Schwarz im Nachtmodus verwenden"</string>
<string name="pure_black_description">"Ersetzt das Grau im Hintergrund mit einem reinen Schwarz im Nachtmodus. Reduziert den Stromverbrauch von Smartphones mit einem AMOLED Display."</string>
<string name="interface_preferences">"Oberfläche"</string>
<string name="reverse_days">"Die Reihenfolge der Tage umkehren"</string>
<string name="reverse_days_description">"Zeigt die Tage im Hauptfenster in umgekehrter Reihenfolge an."</string>
<string name="day">"Tag"</string>
<string name="week">"Woche"</string>
<string name="month">"Monat"</string>
<!-- Three-month period -->
<string name="quarter">"Quartal"</string>
<string name="year">"Jahr"</string>
<!-- Middle part of the sentence '1 time in xx days' -->
<!-- Middle part of the sentence '1 time in xx days' -->
<string name="time_every">"Mal in"</string>
<string name="every_x_days">"Jeden %d Tag"</string>
<string name="every_x_weeks">"Jede %d Woche"</string>
<string name="every_x_months">"Jeden %d Monat"</string>
<!-- The old "habit strength" has been replaced by "score". Feel free to translate "score" as "strength" or "stability" if it sounds more natural in your language. -->
<string name="score">"Wertung"</string>
<string name="reminder_sound">"Benachrichtigungston"</string>
<!-- Appears when the user disables the reminder sound. Could also be "no sound", "mute" or "silent". -->
<string name="none">"Kein Ton"</string>
</resources>
<string name="app_name">Loop \"Gewohnheiten Tracking\"</string>
<string name="main_activity_title">Gewohnheiten</string>
<string name="action_settings">Einstellungen</string>
<string name="edit">Bearbeiten</string>
<string name="delete">Löschen</string>
<string name="archive">Archivieren</string>
<string name="unarchive">Dearchivieren</string>
<string name="add_habit">Gewohnheit hinzufügen</string>
<string name="color_picker_default_title">Farbe ändern</string>
<string name="toast_habit_created">Gewohnheit erstellt</string>
<string name="toast_habit_deleted">Gewohnheiten gelöscht</string>
<string name="toast_habit_restored">Gewohnheiten wiederhergestellt</string>
<string name="toast_nothing_to_undo">Nichts zum Rückgängig machen</string>
<string name="toast_nothing_to_redo">Nichts zum Wiederherstellen</string>
<string name="toast_habit_changed">Gewohnheit geändert</string>
<string name="toast_habit_changed_back">Gewohnheit zurückgeändert</string>
<string name="toast_habit_archived">Gewohnheiten archiviert</string>
<string name="toast_habit_unarchived">Gewohnheiten dearchiviert</string>
<string name="overview">Übersicht</string>
<string name="habit_strength">Stärke</string>
<string name="history">Verlauf</string>
<string name="clear">Löschen</string>
<string name="description_hint">Frage (Hast du heute ...?)</string>
<string name="repeat">Wiederhole</string>
<string name="times_every">Mal in</string>
<string name="days">Tagen</string>
<string name="reminder">Erinnerung</string>
<string name="discard">Verwerfen</string>
<string name="save">Speichern</string>
<string name="streaks">Strähnen</string>
<string name="no_habits_found">Du hast keine aktiven Gewohnheiten</string>
<string name="long_press_to_toggle">Tippe und halte um aus- bzw. abzuwählen</string>
<string name="reminder_off">Aus</string>
<string name="validation_name_should_not_be_blank">Name darf nicht leer sein.</string>
<string name="validation_number_should_be_positive">Zahl muss positiv sein.</string>
<string name="validation_at_most_one_rep_per_day">Du musst wenigstens eine Wiederholung pro Tag haben</string>
<string name="create_habit">Gewohnheit erstellen</string>
<string name="edit_habit">Gewohnheit bearbeiten</string>
<string name="check">Abhaken</string>
<string name="snooze">Später</string>
<!-- App introduction -->
<string name="intro_title_1">Willkommen</string>
<string name="intro_description_1">Loop Habit Tracker hilft dir gute Gewohnheiten implementieren.</string>
<string name="intro_title_2">Erstelle neue Gewohnheiten</string>
<string name="intro_description_2">Jeden Tag, nachdem du die Gewohnheit gemacht hast, hake sie in der App ab.</string>
<string name="intro_title_3">Bleib dran</string>
<string name="intro_description_3">Gewohnheiten, die über einen längeren Zeitraum absolviert werden, bekommen einen ganzen Stern.</string>
<string name="intro_title_4">Verfolge deinen Fortschritt</string>
<string name="intro_description_4">Detaillierte Diagramme zeigen dir an wie sich deine Gewohnheiten entwickelt haben.</string>
<string name="interval_15_minutes">15 Minuten</string>
<string name="interval_30_minutes">30 Minuten</string>
<string name="interval_1_hour">1 Stunde</string>
<string name="interval_2_hour">2 Stunden</string>
<string name="interval_4_hour">4 Stunden</string>
<string name="interval_8_hour">8 Stunden</string>
<string name="interval_24_hour">24 Stunden</string>
<string name="pref_toggle_title">Gewohnheiten durch kurzes Tippen abhaken</string>
<string name="pref_toggle_description">Abhaken durch einfaches Tippen, anstatt durch Tippen und Halten. Bequemer, kann aber eine falsche Auswahl verursachen.</string>
<string name="pref_snooze_interval_title">\"Später erinnern\"-Intervall bei Erinnerungen</string>
<string name="pref_rate_this_app">Bewerte diese App auf Google Play</string>
<string name="pref_send_feedback">Sende dem Entwickler Feedback</string>
<string name="pref_view_source_code">Zeige den Quellcode auf GitHub</string>
<string name="pref_view_app_introduction">Zeige die Anleitung</string>
<string name="links">Links</string>
<string name="behavior">Verhalten</string>
<string name="name">Name</string>
<string name="settings">Einstellungen</string>
<string name="snooze_interval">\"Später erinnern\"-Intervall</string>
<string name="hint_title">Wusstest du?</string>
<string name="hint_drag">Um Einträge umzusortieren, tippe und ziehe sie an die richtige Stelle.</string>
<string name="hint_landscape">Du kannst mehr Tage sehen, wenn du dein Smartphone quer hältst.</string>
<string name="delete_habits">Gewohnheiten löschen</string>
<string name="delete_habits_message">Diese Gewohnheit wird permanent gelöscht. Dies kann nicht rückgängig gemacht werden.</string>
<string name="habit_not_found">Gewohnheit gelöscht / nicht gefunden</string>
<string name="weekends">An Wochenenden</string>
<string name="any_weekday">Werktags</string>
<string name="any_day">Jeden Tag</string>
<string name="select_weekdays">Wähle die Tage</string>
<string name="export_to_csv">als CSV exportieren</string>
<string name="done_label">Fertig</string>
<string name="clear_label">Löschen</string>
<string name="select_hours">Wähle Stunden</string>
<string name="select_minutes">Wähle Minuten</string>
<string name="about">Über</string>
<string name="translators">Übersetzer</string>
<string name="developers">Entwickler</string>
<string name="version_n">Version %s</string>
<string name="frequency">Frequenz</string>
<string name="checkmark">Häkchen</string>
<string name="strength">Stärke</string>
<string name="best_streaks">Beste Strähnen</string>
<string name="current_streaks">Derzeitige Strähne</string>
<string name="number_of_repetitions">Anzahl der Wiederholungen</string>
<string name="last_x_days">Letzten %d Tage</string>
<string name="last_x_weeks">Letzten %d Wochen</string>
<string name="last_x_months">Letzten %d Monate</string>
<string name="last_x_years">Letzten %d Jahre</string>
<string name="all_time">Allzeit</string>
<string name="every_day">Jeden Tag</string>
<string name="every_week">Jede Woche</string>
<string name="two_times_per_week">2 Mal pro Woche</string>
<string name="five_times_per_week">5 Mal pro Woche</string>
<string name="custom_frequency">Benutzerdefiniert</string>
<string name="help">Hilfe &amp; FAQ</string>
<string name="could_not_export">Der Export von Daten ist fehlgeschlagen.</string>
<string name="could_not_import">Der Import von Daten ist fehlgeschlagen.</string>
<string name="file_not_recognized">Datei nicht erkannt.</string>
<string name="habits_imported">Gewohnheiten wurden erfolgreich importiert.</string>
<string name="full_backup_success">Vollständige Sicherung erfolgreich exportiert.</string>
<string name="import_data">Importiere Daten</string>
<string name="export_full_backup">Exportiere vollständige Sicherung</string>
<string name="import_data_summary">Unterstützt vollständige Sicherungen dieser App, sowie erstellte Sicherungen von Tickmate, HabitBull oder Rewire. Siehe FAQ für mehr Information.</string>
<string name="export_as_csv_summary">Erzeugt Dateien, die von Tabellenkalkulationsprogrammen, wie Microsoft Excel oder LibreOffice Calc, geöffnet werden können. Diese Dateien können nicht wieder importiert werden.</string>
<string name="export_full_backup_summary">Erzeugt eine Datei, die alle deine Daten enthält. Diese Datei kann wieder importiert werden.</string>
<string name="bug_report_failed">Fehlermeldung konnte nicht erstellt werden.</string>
<string name="generate_bug_report">Einen Fehler melden</string>
<string name="troubleshooting">Fehlerbehebung</string>
<string name="help_translate">Hilf diese App zu übersetzen</string>
<string name="night_mode">Nachtmodus</string>
<string name="use_pure_black">Reines Schwarz im Nachtmodus verwenden</string>
<string name="pure_black_description">Ersetzt das Grau im Hintergrund durch ein reines Schwarz im Nachtmodus. Reduziert den Stromverbrauch von Smartphones mit einem AMOLED Display.</string>
<string name="interface_preferences">Oberfläche</string>
<string name="reverse_days">Die Reihenfolge der Tage umkehren</string>
<string name="reverse_days_description">Zeigt die Tage im Hauptfenster in umgekehrter Reihenfolge an</string>
<string name="day">Tag</string>
<string name="week">Woche</string>
<string name="month">Monat</string>
<string name="quarter">Quartal</string>
<string name="year">Jahr</string>
<string name="total">Gesamt</string>
<!-- Middle part of the sentence '1 time in xx days' -->
<string name="time_every">Mal in</string>
<string name="every_x_days">Jeden %d Tag</string>
<string name="every_x_weeks">Jede %d Woche</string>
<string name="every_x_months">Jeden %d Monat</string>
<string name="score">Wertung</string>
<string name="reminder_sound">Benachrichtigungston</string>
<string name="none">Kein Ton</string>
<string name="filter">Filter</string>
<string name="hide_completed">Erledigte Gewohnheiten ausblenden</string>
<string name="hide_archived">Archivierte Gewohnheiten ausblenden</string>
<string name="sticky_notifications">Permanente Benachrichtigungen</string>
<string name="sticky_notifications_description">Verhindert das Wegwischen von Benachrichtigungen.</string>
<string name="repair_database">Datenbank reparieren</string>
<string name="database_repaired">Datenbank repariert.</string>
<string name="uncheck">Abwählen</string>
<string name="toggle">Umschalten</string>
<string name="action">Aktion</string>
<string name="habit">Gewohnheit</string>
<string name="sort">Sortiere</string>
<string name="manually">Manuell</string>
<string name="by_name">Nach Name</string>
<string name="by_color">Nach Farbe</string>
<string name="by_score">Nach Wertung</string>
<string name="download">Runterladen</string>
<string name="export">Export</string>
</resources>

View File

@@ -1,180 +1,157 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com-->
<!--
~ 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/>.
-->
<resources>
<string name="app_name">"Loop - Καταγραφή Συνηθειών"</string>
<string name="main_activity_title">"Συνήθειες"</string>
<string name="action_settings">"Ρυθμίσεις"</string>
<string name="edit">"Επεξεργασία"</string>
<string name="delete">"Διαγραφή"</string>
<string name="archive">"Αρχειοθέτηση"</string>
<string name="unarchive">"Κατάργηση αρχειοθέτησης"</string>
<string name="add_habit">"Νέα συνήθεια"</string>
<string name="color_picker_default_title">"Αλλαγή χρώματος"</string>
<string name="toast_habit_created">"Δημιουργήθηκε συνήθεια."</string>
<string name="toast_habit_deleted">"Συνήθεια διαγράφτηκε."</string>
<string name="toast_habit_restored">"Η συνήθεια επαναφέρθηκε."</string>
<string name="toast_nothing_to_undo">"Τίποτα για αναίρεση"</string>
<string name="toast_nothing_to_redo">"Τίποτα προς επανάληψη."</string>
<string name="toast_habit_changed">"Η συνήθεια άλλαξε"</string>
<!-- This appears when the user edits a habit, and then undoes the action. The habit is "changed back" to what is was before. Alternatively, "Habit restored". -->
<string name="toast_habit_changed_back">"Δεν έγινε αλλαγή."</string>
<string name="toast_habit_archived">"Η συνήθεια αρχειοθετήθηκε."</string>
<string name="toast_habit_unarchived">"Έγινε αφαίρεση αρχειοθέτησης."</string>
<string name="overview">"Επισκόπηση"</string>
<string name="habit_strength">"Δύναμη συνήθειας"</string>
<string name="history">"Ιστορικό"</string>
<string name="clear">"Εκκαθάριση"</string>
<string name="description_hint">"Ερώτηση (Κάνατε...σήμερα;)"</string>
<!-- This and the next two terms form the sentence "Repeat 3 times in 7 days" that you see when you create a habit. Let me know if you have trouble adapting this into your language. -->
<string name="repeat">"Επανέλαβε"</string>
<string name="times_every">"φορές την"</string>
<string name="days">"ημέρες"</string>
<string name="reminder">"Υπενθύμιση"</string>
<string name="discard">"Απόρριψη"</string>
<string name="save">"Αποθήκευση"</string>
<!-- Streak as in "winning streak". That is, the number of times a user has performed a habit consecutively. Similar terms are "chains" or "series". -->
<string name="streaks">"Σερί"</string>
<string name="no_habits_found">"Δεν έχετε ενεργές συνήθειες"</string>
<string name="long_press_to_toggle">"Πατήστε παρατεταμένα για επιλογή η αποεπιλογή"</string>
<string name="reminder_off">"Χωρίς"</string>
<string name="validation_name_should_not_be_blank">"Το όνομα δεν μπορεί να είναι κενό"</string>
<string name="validation_number_should_be_positive">"Πρεπει να είναι θετικό"</string>
<string name="validation_at_most_one_rep_per_day">"Μπορείτε να κάνετε μονάχα μία επανάληψη ανά ημέρα"</string>
<string name="create_habit">"Δημιουργία συνήθειας"</string>
<string name="edit_habit">"Επεξεργασία συνήθειας"</string>
<string name="check">"Επιλογή"</string>
<string name="snooze">"Αργότερα"</string>
<!-- App introduction -->
<string name="intro_title_1">"Καλώς ορίσατε"</string>
<string name="intro_description_1">"Το Loop - Καταγραφή Συνηθειών σας βοηθάει να δημιουργήσετε και να διατηρήσετε καλές συνήθειες."</string>
<string name="intro_title_2">"Δημιουργήστε μερικές νέες συνήθειες"</string>
<string name="intro_description_2">"Κάθε μέρα, με το πέρας της συνήθειας, βάλτε ένα τικ στην εφαρμογή."</string>
<string name="intro_title_3">"Συνεχίστε να το κάνετε"</string>
<string name="intro_description_3">"Συνήθειες που εκτελούνται με συνέπεια για πολύ καιρό"</string>
<string name="intro_title_4">"Κατέγραψε την πρόοδο σου"</string>
<string name="intro_description_4">"Λεπτομερή διαγράμματα σας δείχνουν την πρόοδο των συνηθειών."</string>
<string name="interval_15_minutes">"15 λεπτά"</string>
<string name="interval_30_minutes">"30 λεπτά"</string>
<string name="interval_1_hour">"1 ώρα"</string>
<string name="interval_2_hour">"2 ώρες"</string>
<string name="interval_4_hour">"4 ώρες"</string>
<string name="interval_8_hour">"8 ώρες"</string>
<string name="pref_toggle_title">"Κάντε εναλλαγή των επαναλήψεων με σύντομο πάτημα"</string>
<string name="pref_toggle_description">"Βολικότερο, αλλά ίσως προκαλέσει ακούσιες εναλλαγές."</string>
<string name="pref_snooze_interval_title">"Διάστημα αναβολής υπενθυμίσεων"</string>
<string name="pref_rate_this_app">"Βαθμολογήστε αυτή την εφαρμογή στο Google Play"</string>
<string name="pref_send_feedback">"Στείλετε σχόλια"</string>
<string name="pref_view_source_code">"Δείτε τον πηγαίο κώδικα στο GitHub"</string>
<string name="pref_view_app_introduction">"Δείτε την εισαγωγή"</string>
<string name="links">"Σύνδεσμοι"</string>
<string name="behavior">"Συμπεριφορά"</string>
<string name="name">"Όνομα"</string>
<string name="show_archived">"Αρχειοθετημένα"</string>
<string name="settings">"Ρυθμίσεις"</string>
<string name="snooze_interval">"Διάστημα αναβολής"</string>
<string name="hint_title">"Γνωρίζατε;"</string>
<string name="hint_drag">"Αναδιατάξετε τις συνήθειες πατώντας παρατεταμένα στο όνομα και σύροντας στην σωστή θέση."</string>
<string name="hint_landscape">"Μπορείτε να δείτε περισσότερες ημέρες στην οριζόντια προβολή."</string>
<string name="delete_habits">"Διαγραφή συνηθειών"</string>
<string name="delete_habits_message">"Οι συνήθειες θα διαγραφτούν οριστικά. Αυτό δεν μπορεί να αναιρεθεί."</string>
<string name="weekends">"Σαββατοκύριακα"</string>
<string name="any_weekday">"Δευτέρα μέχρι Παρασκευή"</string>
<string name="any_day">"Οποιαδήποτε μέρα της εβδομάδας"</string>
<string name="select_weekdays">"Επιλογή ημερών"</string>
<string name="export_to_csv">"Εξαγωγή σαν CSV"</string>
<string name="done_label">"Έγινε"</string>
<string name="clear_label">"Εκκαθάριση"</string>
<string name="select_hours">"Επιλογή ωρών"</string>
<string name="select_minutes">"Επιλογή λεπτών"</string>
<!-- Short description used on the Google Play store. There is an 80-character limit. -->
<string name="store_short_description">"Δημιουργήστε καλές συνήθειες και δείτε την πρόοδο τους(ad-free)"</string>
<string name="store_description_1">"Το Loop συμβάλλει στην δημιουργία και διατήρηση καλών συνηθειών, επιτρέποντας την επίτευξη των στόχων σας. Λεπτομερή διαγράμματα και στατιστικά για την πρόοδο των συνηθειών σας. Χωρίς διαφημίσεις, ανοικτού κώδικα."</string>
<string name="store_feature_interface">"&lt;b&gt;Απλή, κομψή και μοντέρνα διεπαφή χρήστη&lt;/b&gt;
Το Loop έχει μια μινιμαλιστική διεπαφή χρήστη που το καθιστά εύκολο στην χρήση ενώ ακολουθεί τις κατευθυντήριες γραμμές του ματεριαλιστικού σχεδιασμού."</string>
<string name="store_feature_score">"&lt;b&gt;Σκόρ συνήθειας&lt;b&gt;
Εκτώς της προβολής του τρέχοντος σερί, το Loop χρησιμοποιεί έναν προηγμένο αλγόριθμο για τον υπολογισμό της δύναμης των συνηθειών σας. Κάθε επανάληψη κάνει την συνήθεια δυνατότερη ενώ κάθε παράλειψη ασθενέστερη. Ωστόσο μερικές χαμένες μέρες μετά από ένα μεγάλο σερί δεν θα καταστρέψουν την συνολική σας πρόοδο."</string>
<string name="store_feature_statistics">"&lt;b&gt;Λεπτομερή διαγράμματα και στατιστικά&lt;/b&gt;
Δείτε καθαρά την πρόοδο των συνηθειών σας σε βάθος χρόνου με όμορφα και λεπτομερή διαγράμματα. Ανατρέξτε στο πλήρες ιστορικό των συνηθειών σας."</string>
<string name="store_feature_schedules">"&lt;b&gt;Ευέλικτα προγράμματα&lt;/b&gt;
Υποστηρίζει εξίσου καθημερινές συνήθειες και συνήθειες με περίπλοκα προγράμματα, όπως 3 φορές κάθε εβδομάδα, μια φορά κάθε δεύτερη εβδομάδα ή ημέρα."</string>
<string name="store_feature_reminders">"&lt;b&gt;Υπενθυμίσεις&lt;/b&gt;
Δημιουργήστε μία εξατομικευμένη υπενθύμιση για την κάθε συνήθεια, σε μια επιλεγμένη ώρα της ημέρας. Τσεκάρετε, απορρίψτε ή αναβάλλετε εύκολα την συνήθεια απευθείας από την υπενθύμιση χωρίς να ανοίξετε την εφαρμογή."</string>
<string name="store_feature_opensource">"&lt;b&gt;Χωρίς διαφημίσεις και ανοικτού κώδικα&lt;/b&gt;
Χωρίς καθόλου διαφημίσεις, ενοχλητικές ειδοποιήσεις ή παρεμβατικές άδειες για την εφαρμογή και δεν θα υπάρξουν ποτέ. Το σύνολο του κώδικα είναι διαθέσιμο υπό το GPLv3."</string>
<string name="store_feature_wear">"&lt;b&gt;Κατασκευασμένο για smartwatch&lt;/b&gt;
Οι υπενθυμίσεις μπορούν να επιλεχθούν, να αναβληθούν ή να απορριφθούν απευθείας από το Android Wear ρολόι σας."</string>
<string name="about">"Σχετικά με"</string>
<string name="translators">"Μεταφραστές"</string>
<string name="developers">"Προγραμματιστές"</string>
<!-- %s will get replaced by the version number. For example, "Versão %d" will become "Versão 1.2.0". -->
<string name="version_n">"Έκδοση %s"</string>
<string name="frequency">"Συχνότητα"</string>
<string name="checkmark">"Σημάδι επιλογής"</string>
<!-- This is a shorter version of "Habit Strength" -->
<string name="strength">"Δύναμη"</string>
<string name="best_streaks">"Καλύτερα σερί"</string>
<string name="current_streaks">"Τρέχον σερί"</string>
<string name="number_of_repetitions">"Αριθμός επαναλήψεων"</string>
<string name="last_x_days">"Τελευταίες %d ημέρες"</string>
<string name="last_x_weeks">"Τελευταίες %d εβδομάδες"</string>
<string name="last_x_months">"Τελευταίους %d μήνες"</string>
<string name="last_x_years">"Τελευταία %d χρόνια"</string>
<!-- "All time" number of repetitions. Or number of repetitions "since the beginning". -->
<string name="all_time">"Όλα"</string>
<string name="every_day">"Κάθε μέρα"</string>
<string name="every_week">"Κάθε εβδομάδα"</string>
<string name="two_times_per_week">"2 φορές την εβδομάδα"</string>
<string name="five_times_per_week">"5 φορές την εβδομάδα"</string>
<string name="custom_frequency">"Προσαρμογή"</string>
<string name="help">"Βοήθεια &amp; FAQ"</string>
<string name="could_not_export">"Αποτυχία εξαγωγής."</string>
<string name="could_not_import">"Αποτυχία εισαγωγής."</string>
<!-- Appears when the user tries to import a file which we do not support or recognize. -->
<string name="file_not_recognized">"Άγνωστο αρχείο."</string>
<string name="habits_imported">"Οι συνήθειες εισάχθηκαν επιτυχώς."</string>
<string name="full_backup_success">"Το πλήρες αντίγραφο εξάχθηκε επιτυχώς."</string>
<string name="import_data">"Εισαγωγή δεδομένων"</string>
<string name="export_full_backup">"Εξαγωγή πλήρους αντιγ. ασφαλείας"</string>
<string name="import_data_summary">"Υποστηρίζει πλήρως αντίγραφα ασφαλείας που έχουν εξαχθεί από την ίδια την εφαρμογή καθώς και από τα Tickmate, HabitBull και Rewire. Δείτε τις FAQ για περισσότερες πληροφορίες."</string>
<string name="export_as_csv_summary">"Παράγει αρχεία τα οποία μπορούν να ανοιχτούν από προγράμματα υπολογιστικών φύλλων όπως το Microsoft Edge ή το OpenOffice Calc. Δεν γίνεται επανεισαγωγή του αρχείου."</string>
<string name="export_full_backup_summary">"Παράγει ένα αρχείο το οποίο περιέχει όλα τα δεδομένα σας. Είναι δυνατή η επανεισαγωγή του αρχείου."</string>
<string name="bug_report_failed">"Απέτυχε ή παραγωγή αναφοράς bug."</string>
<string name="generate_bug_report">"Παραγωγή αναφοράς bug."</string>
<string name="troubleshooting">"Αντιμετ.Προβλημάτων"</string>
<string name="help_translate">"Βοηθήστε στην μετάφραση"</string>
<string name="night_mode">"Νυχτ.Λειτ."</string>
<string name="use_pure_black">"Χρήση απόλυτου μαύρου στη νυχτ.λειτουργία"</string>
<string name="pure_black_description">"Αντικαθιστά τα γκρί υπόβαθρα με απόλυτα μαύρα σε νυχτ.λειτουργία. Μειώνει την κατανάλωση μπαταρίας σε συσκευές με οθόνη AMOLED."</string>
<string name="interface_preferences">"Διεπιφάνεια"</string>
<string name="reverse_days">"Αναστροφή σειράς των ημερών."</string>
<string name="reverse_days_description">"Προβολή των ημερών σε αντίστροφη σειρά στην κυρία οθόνη."</string>
<string name="day">"Ημέρα"</string>
<string name="week">"Εβδομάδα"</string>
<string name="month">"Μήνας"</string>
<!-- Three-month period -->
<string name="quarter">"Τρίμηνο"</string>
<string name="year">"Χρόνος"</string>
<!-- Middle part of the sentence '1 time in xx days' -->
<!-- Middle part of the sentence '1 time in xx days' -->
<string name="time_every">"φορά σε"</string>
<string name="every_x_days">"Κάθε %d ημέρες"</string>
<string name="every_x_weeks">"Κάθε %d εβδομάδες"</string>
<string name="every_x_months">"Κάθε %d μήνες"</string>
<!-- The old "habit strength" has been replaced by "score". Feel free to translate "score" as "strength" or "stability" if it sounds more natural in your language. -->
<string name="score">"Σκόρ"</string>
<string name="reminder_sound">"Ήχος υπενθύμισης"</string>
<!-- Appears when the user disables the reminder sound. Could also be "no sound", "mute" or "silent". -->
<string name="none">"Σιωπηλό"</string>
</resources>
<string name="app_name">Loop - Καταγραφή Συνηθειών</string>
<string name="main_activity_title">Συνήθειες</string>
<string name="action_settings">Ρυθμίσεις</string>
<string name="edit">Επεξεργασία</string>
<string name="delete">Διαγραφή</string>
<string name="archive">Αρχειοθέτηση</string>
<string name="unarchive">Κατάργηση αρχειοθέτησης</string>
<string name="add_habit">Νέα συνήθεια</string>
<string name="color_picker_default_title">Αλλαγή χρώματος</string>
<string name="toast_habit_created">Δημιουργήθηκε συνήθεια.</string>
<string name="toast_habit_deleted">Συνήθεια διαγράφτηκε.</string>
<string name="toast_habit_restored">Η συνήθεια επαναφέρθηκε.</string>
<string name="toast_nothing_to_undo">Τίποτα για αναίρεση</string>
<string name="toast_nothing_to_redo">Τίποτα προς επανάληψη.</string>
<string name="toast_habit_changed">Η συνήθεια άλλαξε</string>
<string name="toast_habit_changed_back">Δεν έγινε αλλαγή.</string>
<string name="toast_habit_archived">Η συνήθεια αρχειοθετήθηκε.</string>
<string name="toast_habit_unarchived">Έγινε αφαίρεση αρχειοθέτησης.</string>
<string name="overview">Επισκόπηση</string>
<string name="habit_strength">Δύναμη συνήθειας</string>
<string name="history">Ιστορικό</string>
<string name="clear">Εκκαθάριση</string>
<string name="description_hint">Ερώτηση (Κάνατε...σήμερα;)</string>
<string name="repeat">Επανέλαβε</string>
<string name="times_every">φορές την</string>
<string name="days">ημέρες</string>
<string name="reminder">Υπενθύμιση</string>
<string name="discard">Απόρριψη</string>
<string name="save">Αποθήκευση</string>
<string name="streaks">Σερί</string>
<string name="no_habits_found">Δεν έχετε ενεργές συνήθειες</string>
<string name="long_press_to_toggle">Πατήστε παρατεταμένα για επιλογή η αποεπιλογή</string>
<string name="reminder_off">Χωρίς</string>
<string name="validation_name_should_not_be_blank">Το όνομα δεν μπορεί να είναι κενό</string>
<string name="validation_number_should_be_positive">Πρεπει να είναι θετικό</string>
<string name="validation_at_most_one_rep_per_day">Μπορείτε να κάνετε μονάχα μία επανάληψη ανά ημέρα</string>
<string name="create_habit">Δημιουργία συνήθειας</string>
<string name="edit_habit">Επεξεργασία συνήθειας</string>
<string name="check">Επιλογή</string>
<string name="snooze">Αργότερα</string>
<!-- App introduction -->
<string name="intro_title_1">Καλώς ορίσατε</string>
<string name="intro_description_1">Το Loop - Καταγραφή Συνηθειών σας βοηθάει να δημιουργήσετε και να διατηρήσετε καλές συνήθειες.</string>
<string name="intro_title_2">Δημιουργήστε μερικές νέες συνήθειες</string>
<string name="intro_description_2">Κάθε μέρα, με το πέρας της συνήθειας, βάλτε ένα τικ στην εφαρμογή.</string>
<string name="intro_title_3">Συνεχίστε να το κάνετε</string>
<string name="intro_description_3">Συνήθειες που εκτελούνται με συνέπεια για πολύ καιρό</string>
<string name="intro_title_4">Κατέγραψε την πρόοδο σου</string>
<string name="intro_description_4">Λεπτομερή διαγράμματα σας δείχνουν την πρόοδο των συνηθειών.</string>
<string name="interval_15_minutes">15 λεπτά</string>
<string name="interval_30_minutes">30 λεπτά</string>
<string name="interval_1_hour">1 ώρα</string>
<string name="interval_2_hour">2 ώρες</string>
<string name="interval_4_hour">4 ώρες</string>
<string name="interval_8_hour">8 ώρες</string>
<string name="pref_toggle_title">Κάντε εναλλαγή των επαναλήψεων με σύντομο πάτημα</string>
<string name="pref_toggle_description">Βολικότερο, αλλά ίσως προκαλέσει ακούσιες εναλλαγές.</string>
<string name="pref_snooze_interval_title">Διάστημα αναβολής υπενθυμίσεων</string>
<string name="pref_rate_this_app">Βαθμολογήστε αυτή την εφαρμογή στο Google Play</string>
<string name="pref_send_feedback">Στείλετε σχόλια</string>
<string name="pref_view_source_code">Δείτε τον πηγαίο κώδικα στο GitHub</string>
<string name="pref_view_app_introduction">Δείτε την εισαγωγή</string>
<string name="links">Σύνδεσμοι</string>
<string name="behavior">Συμπεριφορά</string>
<string name="name">Όνομα</string>
<string name="settings">Ρυθμίσεις</string>
<string name="snooze_interval">Διάστημα αναβολής</string>
<string name="hint_title">Γνωρίζατε;</string>
<string name="hint_drag">Αναδιατάξετε τις συνήθειες πατώντας παρατεταμένα στο όνομα και σύροντας στην σωστή θέση.</string>
<string name="hint_landscape">Μπορείτε να δείτε περισσότερες ημέρες στην οριζόντια προβολή.</string>
<string name="delete_habits">Διαγραφή συνηθειών</string>
<string name="delete_habits_message">Οι συνήθειες θα διαγραφτούν οριστικά. Αυτό δεν μπορεί να αναιρεθεί.</string>
<string name="weekends">Σαββατοκύριακα</string>
<string name="any_weekday">Δευτέρα μέχρι Παρασκευή</string>
<string name="any_day">Οποιαδήποτε μέρα της εβδομάδας</string>
<string name="select_weekdays">Επιλογή ημερών</string>
<string name="export_to_csv">Εξαγωγή σαν CSV</string>
<string name="done_label">Έγινε</string>
<string name="clear_label">Εκκαθάριση</string>
<string name="select_hours">Επιλογή ωρών</string>
<string name="select_minutes">Επιλογή λεπτών</string>
<string name="about">Σχετικά με</string>
<string name="translators">Μεταφραστές</string>
<string name="developers">Προγραμματιστές</string>
<string name="version_n">Έκδοση %s</string>
<string name="frequency">Συχνότητα</string>
<string name="checkmark">Σημάδι επιλογής</string>
<string name="strength">Δύναμη</string>
<string name="best_streaks">Καλύτερα σερί</string>
<string name="current_streaks">Τρέχον σερί</string>
<string name="number_of_repetitions">Αριθμός επαναλήψεων</string>
<string name="last_x_days">Τελευταίες %d ημέρες</string>
<string name="last_x_weeks">Τελευταίες %d εβδομάδες</string>
<string name="last_x_months">Τελευταίους %d μήνες</string>
<string name="last_x_years">Τελευταία %d χρόνια</string>
<string name="all_time">Όλα</string>
<string name="every_day">Κάθε μέρα</string>
<string name="every_week">Κάθε εβδομάδα</string>
<string name="two_times_per_week">2 φορές την εβδομάδα</string>
<string name="five_times_per_week">5 φορές την εβδομάδα</string>
<string name="custom_frequency">Προσαρμογή</string>
<string name="help">Βοήθεια &amp; FAQ</string>
<string name="could_not_export">Αποτυχία εξαγωγής.</string>
<string name="could_not_import">Αποτυχία εισαγωγής.</string>
<string name="file_not_recognized">Άγνωστο αρχείο.</string>
<string name="habits_imported">Οι συνήθειες εισάχθηκαν επιτυχώς.</string>
<string name="full_backup_success">Το πλήρες αντίγραφο εξάχθηκε επιτυχώς.</string>
<string name="import_data">Εισαγωγή δεδομένων</string>
<string name="export_full_backup">Εξαγωγή πλήρους αντιγ. ασφαλείας</string>
<string name="import_data_summary">Υποστηρίζει πλήρως αντίγραφα ασφαλείας που έχουν εξαχθεί από την ίδια την εφαρμογή καθώς και από τα Tickmate, HabitBull και Rewire. Δείτε τις FAQ για περισσότερες πληροφορίες.</string>
<string name="export_as_csv_summary">Παράγει αρχεία τα οποία μπορούν να ανοιχτούν από προγράμματα υπολογιστικών φύλλων όπως το Microsoft Edge ή το OpenOffice Calc. Δεν γίνεται επανεισαγωγή του αρχείου.</string>
<string name="export_full_backup_summary">Παράγει ένα αρχείο το οποίο περιέχει όλα τα δεδομένα σας. Είναι δυνατή η επανεισαγωγή του αρχείου.</string>
<string name="bug_report_failed">Απέτυχε ή παραγωγή αναφοράς bug.</string>
<string name="generate_bug_report">Παραγωγή αναφοράς bug.</string>
<string name="troubleshooting">Αντιμετ.Προβλημάτων</string>
<string name="help_translate">Βοηθήστε στην μετάφραση</string>
<string name="night_mode">Νυχτ.Λειτ.</string>
<string name="use_pure_black">Χρήση απόλυτου μαύρου στη νυχτ.λειτουργία</string>
<string name="pure_black_description">Αντικαθιστά τα γκρί υπόβαθρα με απόλυτα μαύρα σε νυχτ.λειτουργία. Μειώνει την κατανάλωση μπαταρίας σε συσκευές με οθόνη AMOLED.</string>
<string name="interface_preferences">Διεπιφάνεια</string>
<string name="reverse_days">Αναστροφή σειράς των ημερών.</string>
<string name="reverse_days_description">Προβολή των ημερών σε αντίστροφη σειρά στην κυρία οθόνη.</string>
<string name="day">Ημέρα</string>
<string name="week">Εβδομάδα</string>
<string name="month">Μήνας</string>
<string name="quarter">Τρίμηνο</string>
<string name="year">Χρόνος</string>
<!-- Middle part of the sentence '1 time in xx days' -->
<string name="time_every">φορά σε</string>
<string name="every_x_days">Κάθε %d ημέρες</string>
<string name="every_x_weeks">Κάθε %d εβδομάδες</string>
<string name="every_x_months">Κάθε %d μήνες</string>
<string name="score">Σκόρ</string>
<string name="reminder_sound">Ήχος υπενθύμισης</string>
<string name="none">Σιωπηλό</string>
</resources>

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