Merge branch 'dev' into feature/sync
18
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -6,11 +6,16 @@ labels: ''
|
|||||||
assignees: ''
|
assignees: ''
|
||||||
|
|
||||||
---
|
---
|
||||||
|
<!--
|
||||||
|
Please use the template below for your bug report. Issues that do not follow this
|
||||||
|
template, or that do not contain all necessary information (namely, description of
|
||||||
|
the problem, steps to reproduce, phone, phone operating system, and app version)
|
||||||
|
will be closed without further consideration.
|
||||||
|
-->
|
||||||
|
|
||||||
## Pre-submission checklist
|
## Pre-submission checklist
|
||||||
- [ ] I am submitting a bug report, not a feature request.
|
- [ ] I am submitting a bug report, not a feature request.
|
||||||
- [ ] I am running the latest version of Loop Habit Tracker.
|
- [ ] I have searched for similar issues, but did not find any matches.
|
||||||
- [ ] I have have searched for similar issues, but did not find any matches.
|
|
||||||
|
|
||||||
## Description
|
## Description
|
||||||
A clear and concise description of what the problem is.
|
A clear and concise description of what the problem is.
|
||||||
@@ -21,10 +26,11 @@ A clear and concise description of what the problem is.
|
|||||||
3. Scroll down to ....
|
3. Scroll down to ....
|
||||||
4. See error
|
4. See error
|
||||||
|
|
||||||
## Screenshots
|
|
||||||
If applicable, add screenshots to help explain your problem.
|
|
||||||
|
|
||||||
## System information
|
## System information
|
||||||
- Phone: [e.g. Google Pixel 4]
|
- Phone: [e.g. Google Pixel 4]
|
||||||
- Phone Operating System: [e.g. Android 10]
|
- Phone Operating System: [e.g. Android 10]
|
||||||
- App version: [e.g. 1.8.9]
|
- App version: [e.g. 2.0.2]
|
||||||
|
|
||||||
|
## Screenshots
|
||||||
|
If applicable, add screenshots to help explain your problem.
|
||||||
|
|
||||||
|
|||||||
2
.github/dependabot.yml
vendored
@@ -3,4 +3,4 @@ updates:
|
|||||||
- package-ecosystem: "gradle"
|
- package-ecosystem: "gradle"
|
||||||
directory: "/"
|
directory: "/"
|
||||||
schedule:
|
schedule:
|
||||||
interval: "daily"
|
interval: "monthly"
|
||||||
|
|||||||
6
.github/workflows/main.yml
vendored
@@ -30,7 +30,7 @@ jobs:
|
|||||||
AndroidTest:
|
AndroidTest:
|
||||||
needs: Build
|
needs: Build
|
||||||
runs-on: macOS-10.15
|
runs-on: macOS-10.15
|
||||||
timeout-minutes: 45
|
timeout-minutes: 60
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
api: [
|
api: [
|
||||||
@@ -56,7 +56,9 @@ jobs:
|
|||||||
path: uhabits-android/build/outputs/
|
path: uhabits-android/build/outputs/
|
||||||
|
|
||||||
- name: Install flock
|
- name: Install flock
|
||||||
run: brew install util-linux
|
run: |
|
||||||
|
brew install util-linux
|
||||||
|
echo "/usr/local/opt/util-linux/bin" >> $GITHUB_PATH
|
||||||
|
|
||||||
- name: Run Android Tests
|
- name: Run Android Tests
|
||||||
run: ./build.sh android-tests ${{ matrix.api }}
|
run: ./build.sh android-tests ${{ matrix.api }}
|
||||||
|
|||||||
23
CHANGELOG.md
@@ -1,5 +1,28 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## [2.0.3] - 2021-08-21
|
||||||
|
### Fixed
|
||||||
|
- Improve automatic checkmarks for monthly habits (@iSoron, #947)
|
||||||
|
- Fix small theme issues (@iSoron)
|
||||||
|
- Fix ANR on some Samsung phones (@iSoron, #962)
|
||||||
|
- Fix dates before the year 2000 (@iSoron, #967)
|
||||||
|
- Fix notification adding checkmarks to the wrong day (@hiqua, #969)
|
||||||
|
- Fix crashes in widgets (@hiqua, @iSoron, #907, #966, #965)
|
||||||
|
- Fix crash when moving habits (@hiqua, #968)
|
||||||
|
|
||||||
|
## [2.0.2] - 2021-05-23
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- Make checkmark widget resizable
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- Fix crash caused by numerical habits with zero target (@iSoron, #903)
|
||||||
|
- Fix small issues with font size (@iSoron)
|
||||||
|
- Allow fractional target values (@sumanabhi, #911)
|
||||||
|
- Fix IllegalStateException in androidx.customview.view (@iSoron, #906)
|
||||||
|
- Fix crash when selecting habit frequency in some languages (@iSoron, #926)
|
||||||
|
- Fix IllegalArgumentException in RingView (@iSoron, #904)
|
||||||
|
|
||||||
## [2.0.1] - 2021-05-09
|
## [2.0.1] - 2021-05-09
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ source.
|
|||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://play.google.com/store/apps/details?id=org.isoron.uhabits&utm_source=global_co&utm_medium=prtnr&utm_content=Mar2515&utm_campaign=PartBadge&pcampaignid=MKT-AC-global-none-all-co-pr-py-PartBadges-Oct1515-1"><img alt="Get it on Google Play" src="https://play.google.com/intl/en_us/badges/images/apps/en-play-badge-border.png" height="75px"/></a>
|
<a href="https://play.google.com/store/apps/details?id=org.isoron.uhabits&utm_source=global_co&utm_medium=prtnr&utm_content=Mar2515&utm_campaign=PartBadge&pcampaignid=MKT-AC-global-none-all-co-pr-py-PartBadges-Oct1515-1"><img alt="Get it on Google Play" src="https://play.google.com/intl/en_us/badges/images/apps/en-play-badge-border.png" height="75px"/></a>
|
||||||
<a href="http://f-droid.org/app/org.isoron.uhabits"><img alt="Get it on F-Droid" src="http://i.imgur.com/baSPE7X.png" height="75px"/></a>
|
<a href="https://f-droid.org/app/org.isoron.uhabits"><img alt="Get it on F-Droid" src="https://i.imgur.com/baSPE7X.png" height="75px"/></a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
## Screenshots
|
## Screenshots
|
||||||
@@ -109,7 +109,7 @@ contribute, even if you are not a software developer.
|
|||||||
more details.
|
more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License along
|
||||||
with this program. If not, see <http://www.gnu.org/licenses/>.
|
with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
[screen1]: screenshots/1.png
|
[screen1]: screenshots/1.png
|
||||||
[screen2]: screenshots/2.png
|
[screen2]: screenshots/2.png
|
||||||
@@ -123,9 +123,9 @@ contribute, even if you are not a software developer.
|
|||||||
[screen4th]: screenshots/4.thumb.png
|
[screen4th]: screenshots/4.thumb.png
|
||||||
[screen5th]: screenshots/5.thumb.png
|
[screen5th]: screenshots/5.thumb.png
|
||||||
[screen6th]: screenshots/6.thumb.png
|
[screen6th]: screenshots/6.thumb.png
|
||||||
[poedit]: http://translate.loophabits.org
|
[poedit]: https://translate.loophabits.org
|
||||||
[playstore]: https://play.google.com/store/apps/details?id=org.isoron.uhabits
|
[playstore]: https://play.google.com/store/apps/details?id=org.isoron.uhabits
|
||||||
[releases]: https://github.com/iSoron/uhabits/releases
|
[releases]: https://github.com/iSoron/uhabits/releases
|
||||||
[fdroid]: http://f-droid.org/app/org.isoron.uhabits
|
[fdroid]: https://f-droid.org/app/org.isoron.uhabits
|
||||||
[build]: https://github.com/iSoron/uhabits/blob/dev/docs/BUILD.md
|
[build]: https://github.com/iSoron/uhabits/blob/dev/docs/BUILD.md
|
||||||
[beta]: https://play.google.com/apps/testing/org.isoron.uhabits
|
[beta]: https://play.google.com/apps/testing/org.isoron.uhabits
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
plugins {
|
plugins {
|
||||||
val kotlinVersion = "1.4.21"
|
val kotlinVersion = "1.5.0"
|
||||||
id("com.android.application") version ("4.1.0") apply (false)
|
id("com.android.application") version ("4.2.0") apply (false)
|
||||||
id("org.jetbrains.kotlin.android") version kotlinVersion apply (false)
|
id("org.jetbrains.kotlin.android") version kotlinVersion apply (false)
|
||||||
id("org.jetbrains.kotlin.kapt") version kotlinVersion apply (false)
|
id("org.jetbrains.kotlin.kapt") version kotlinVersion apply (false)
|
||||||
id("org.jetbrains.kotlin.android.extensions") version kotlinVersion apply (false)
|
id("org.jetbrains.kotlin.android.extensions") version kotlinVersion apply (false)
|
||||||
id("org.jetbrains.kotlin.multiplatform") version kotlinVersion apply (false)
|
id("org.jetbrains.kotlin.multiplatform") version kotlinVersion apply (false)
|
||||||
id("org.jlleitschuh.gradle.ktlint") version "10.0.0"
|
id("org.jlleitschuh.gradle.ktlint") version "10.1.0"
|
||||||
}
|
}
|
||||||
|
|
||||||
apply {
|
apply {
|
||||||
|
|||||||
23
build.sh
@@ -133,6 +133,9 @@ android_test() {
|
|||||||
log_error "Some $size instrumented tests failed."
|
log_error "Some $size instrumented tests failed."
|
||||||
log_error "Saving logcat: $OUT_LOGCAT..."
|
log_error "Saving logcat: $OUT_LOGCAT..."
|
||||||
$ADB logcat -d > $OUT_LOGCAT
|
$ADB logcat -d > $OUT_LOGCAT
|
||||||
|
log_error "Fetching test screenshots..."
|
||||||
|
$ADB pull /sdcard/Android/data/${PACKAGE_NAME}/files/test-screenshots ${ANDROID_OUTPUTS_DIR}/
|
||||||
|
$ADB shell rm -r /sdcard/Android/data/${PACKAGE_NAME}/files/test-screenshots/
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
log_info "$size tests passed."
|
log_info "$size tests passed."
|
||||||
@@ -198,13 +201,6 @@ android_build() {
|
|||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
android_fetch_images() {
|
|
||||||
log_info "Fetching images"
|
|
||||||
rm -rf ${ANDROID_OUTPUTS_DIR}/test-screenshots
|
|
||||||
$ADB pull /sdcard/Android/data/${PACKAGE_NAME}/files/test-screenshots ${ANDROID_OUTPUTS_DIR}/
|
|
||||||
$ADB shell rm -r /sdcard/Android/data/${PACKAGE_NAME}/files/test-screenshots/
|
|
||||||
}
|
|
||||||
|
|
||||||
android_accept_images() {
|
android_accept_images() {
|
||||||
find ${ANDROID_OUTPUTS_DIR}/test-screenshots -name '*.expected*' -delete
|
find ${ANDROID_OUTPUTS_DIR}/test-screenshots -name '*.expected*' -delete
|
||||||
rsync -av ${ANDROID_OUTPUTS_DIR}/test-screenshots/ uhabits-android/src/androidTest/assets/
|
rsync -av ${ANDROID_OUTPUTS_DIR}/test-screenshots/ uhabits-android/src/androidTest/assets/
|
||||||
@@ -233,18 +229,14 @@ CI/CD script for Loop Habit Tracker.
|
|||||||
|
|
||||||
Usage:
|
Usage:
|
||||||
build.sh build [options]
|
build.sh build [options]
|
||||||
build.sh clean [options]
|
|
||||||
build.sh android-tests <API> [options]
|
build.sh android-tests <API> [options]
|
||||||
build.sh android-tests-parallel <API> <API>... [options]
|
build.sh android-tests-parallel <API> <API>... [options]
|
||||||
build.sh android-fetch-images [options]
|
|
||||||
build.sh android-accept-images [options]
|
build.sh android-accept-images [options]
|
||||||
|
|
||||||
Commands:
|
Commands:
|
||||||
build Build the app and run small tests
|
build Build the app and run small tests
|
||||||
clean Remove all build directories
|
|
||||||
android-tests Run medium and large Android tests on an emulator
|
android-tests Run medium and large Android tests on an emulator
|
||||||
android-tests-parallel Tests multiple API levels simultaneously
|
android-tests-parallel Tests multiple API levels simultaneously
|
||||||
android-fetch-images Fetch failed view test images from device
|
|
||||||
android-accept-images Copy fetched images to corresponding assets folder
|
android-accept-images Copy fetched images to corresponding assets folder
|
||||||
|
|
||||||
Options:
|
Options:
|
||||||
@@ -274,19 +266,17 @@ main() {
|
|||||||
case "$1" in
|
case "$1" in
|
||||||
build)
|
build)
|
||||||
shift; _parse_opts "$@"
|
shift; _parse_opts "$@"
|
||||||
|
clean
|
||||||
core_build
|
core_build
|
||||||
android_build
|
android_build
|
||||||
;;
|
;;
|
||||||
clean)
|
|
||||||
clean
|
|
||||||
;;
|
|
||||||
android-tests)
|
android-tests)
|
||||||
shift; _parse_opts "$@"
|
shift; _parse_opts "$@"
|
||||||
if [ -z $1 ]; then
|
if [ -z $1 ]; then
|
||||||
_print_usage
|
_print_usage
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
for attempt in {1..3}; do
|
for attempt in {1..5}; do
|
||||||
log_info "Running Android tests (attempt $attempt)..."
|
log_info "Running Android tests (attempt $attempt)..."
|
||||||
android_test $1 && return 0
|
android_test $1 && return 0
|
||||||
done
|
done
|
||||||
@@ -297,9 +287,6 @@ main() {
|
|||||||
shift; _parse_opts "$@"
|
shift; _parse_opts "$@"
|
||||||
android_test_parallel $*
|
android_test_parallel $*
|
||||||
;;
|
;;
|
||||||
android-fetch-images)
|
|
||||||
android_fetch_images
|
|
||||||
;;
|
|
||||||
android-accept-images)
|
android-accept-images)
|
||||||
android_accept_images
|
android_accept_images
|
||||||
;;
|
;;
|
||||||
|
|||||||
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
3
gradle/wrapper/gradle-wrapper.properties
vendored
@@ -1,6 +1,5 @@
|
|||||||
#Sat Nov 28 09:55:24 CST 2020
|
|
||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
|
distributionUrl=https\://services.gradle.org/distributions/gradle-7.0-bin.zip
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-6.8-all.zip
|
|
||||||
|
|||||||
2
gradlew
vendored
@@ -82,6 +82,7 @@ esac
|
|||||||
|
|
||||||
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
||||||
|
|
||||||
|
|
||||||
# Determine the Java command to use to start the JVM.
|
# Determine the Java command to use to start the JVM.
|
||||||
if [ -n "$JAVA_HOME" ] ; then
|
if [ -n "$JAVA_HOME" ] ; then
|
||||||
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
||||||
@@ -129,6 +130,7 @@ fi
|
|||||||
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
|
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
|
||||||
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
|
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
|
||||||
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
|
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
|
||||||
|
|
||||||
JAVACMD=`cygpath --unix "$JAVACMD"`
|
JAVACMD=`cygpath --unix "$JAVACMD"`
|
||||||
|
|
||||||
# We build the pattern for arguments to be converted via cygpath
|
# We build the pattern for arguments to be converted via cygpath
|
||||||
|
|||||||
25
gradlew.bat
vendored
@@ -29,6 +29,9 @@ if "%DIRNAME%" == "" set DIRNAME=.
|
|||||||
set APP_BASE_NAME=%~n0
|
set APP_BASE_NAME=%~n0
|
||||||
set APP_HOME=%DIRNAME%
|
set APP_HOME=%DIRNAME%
|
||||||
|
|
||||||
|
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
|
||||||
|
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
|
||||||
|
|
||||||
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||||
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
|
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
|
||||||
|
|
||||||
@@ -37,7 +40,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome
|
|||||||
|
|
||||||
set JAVA_EXE=java.exe
|
set JAVA_EXE=java.exe
|
||||||
%JAVA_EXE% -version >NUL 2>&1
|
%JAVA_EXE% -version >NUL 2>&1
|
||||||
if "%ERRORLEVEL%" == "0" goto init
|
if "%ERRORLEVEL%" == "0" goto execute
|
||||||
|
|
||||||
echo.
|
echo.
|
||||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||||
@@ -51,7 +54,7 @@ goto fail
|
|||||||
set JAVA_HOME=%JAVA_HOME:"=%
|
set JAVA_HOME=%JAVA_HOME:"=%
|
||||||
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
||||||
|
|
||||||
if exist "%JAVA_EXE%" goto init
|
if exist "%JAVA_EXE%" goto execute
|
||||||
|
|
||||||
echo.
|
echo.
|
||||||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
|
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
|
||||||
@@ -61,28 +64,14 @@ echo location of your Java installation.
|
|||||||
|
|
||||||
goto fail
|
goto fail
|
||||||
|
|
||||||
:init
|
|
||||||
@rem Get command-line arguments, handling Windows variants
|
|
||||||
|
|
||||||
if not "%OS%" == "Windows_NT" goto win9xME_args
|
|
||||||
|
|
||||||
:win9xME_args
|
|
||||||
@rem Slurp the command line arguments.
|
|
||||||
set CMD_LINE_ARGS=
|
|
||||||
set _SKIP=2
|
|
||||||
|
|
||||||
:win9xME_args_slurp
|
|
||||||
if "x%~1" == "x" goto execute
|
|
||||||
|
|
||||||
set CMD_LINE_ARGS=%*
|
|
||||||
|
|
||||||
:execute
|
:execute
|
||||||
@rem Setup the command line
|
@rem Setup the command line
|
||||||
|
|
||||||
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
||||||
|
|
||||||
|
|
||||||
@rem Execute Gradle
|
@rem Execute Gradle
|
||||||
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
|
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
|
||||||
|
|
||||||
:end
|
:end
|
||||||
@rem End local scope for the variables with windows NT shell
|
@rem End local scope for the variables with windows NT shell
|
||||||
|
|||||||
@@ -1,350 +1,377 @@
|
|||||||
Name,Languages,"Translated (Words)","Target Words","Approved (Words)",Voted,"""+"" votes received","""-"" votes received","Winning (Words)"
|
Name,Languages,"Translated (Words)","Target Words","Approved (Words)",Voted,"""+"" votes received","""-"" votes received","Winning (Words)",Joined
|
||||||
"Alinson Xavier (iSoron)","Portuguese, Brazilian; Japanese; Spanish; Portuguese; Italian; Chinese Simplified; French; Hungarian; German; Arabic; Hindi; Slovenian; Catalan; Greek; Korean; Bulgarian; Chinese Traditional; Polish; Russian; Serbian (Cyrillic); Turkish; Ukrainian; Czech; Indonesian; Croatian; Danish; Dutch; Romanian; Swedish; Basque; Persian; Vietnamese; Telugu; Finnish; Tamil; Afrikaans; Esperanto; Hebrew",14790,17211,1272,0,1707,70,4259
|
"Alinson Xavier (iSoron)","Portuguese, Brazilian; Japanese; Spanish; Portuguese; Italian; Chinese Simplified; French; Hungarian; German; Arabic; Hindi; Slovenian; Catalan; Greek; Korean; Bulgarian; Chinese Traditional; Polish; Russian; Serbian (Cyrillic); Turkish; Ukrainian; Czech; Indonesian; Croatian; Danish; Dutch; Romanian; Swedish; Basque; Persian; Finnish; Vietnamese; Telugu; Tamil; Afrikaans; Esperanto; Hebrew",14808,17227,1282,0,1779,80,4274,"2016-03-05 18:35:27"
|
||||||
"Slobodan Simić (Слободан Симић) (slsimic)","Serbian (Latin); Serbian (Cyrillic)",2053,1830,2105,12,33,0,1982
|
"Slobodan Simić (Слободан Симић) (slsimic)","Serbian (Latin); Serbian (Cyrillic)",2054,1831,2114,12,33,0,1991,"2021-02-03 14:26:07"
|
||||||
"Oglaigh Rystard (oglaignaheireann)","Ukrainian; Portuguese; Catalan; Greek; Basque; Romanian; Italian",1103,1037,1327,1,13,6,954
|
"Oglaigh Rystard (oglaignaheireann)","Ukrainian; Portuguese; Catalan; Greek; Basque; Romanian; Italian",1103,1037,1327,1,13,6,954,"2017-03-31 09:13:19"
|
||||||
"David (Cliff122)",Swedish,1040,1019,725,6,0,0,700
|
"David (Cliff122)",Swedish,1040,1019,725,6,0,0,700,"2020-01-21 13:56:55"
|
||||||
dukelc,Slovak,919,880,0,0,0,0,0
|
"Omer I.S. (omeritzics)",Hebrew,1000,900,1097,14,1,0,946,"2020-10-11 20:10:51"
|
||||||
KMakoto,"Chinese Traditional",745,1146,949,0,0,0,745
|
dukelc,Slovak,919,880,0,0,0,0,0,"2020-08-27 14:02:41"
|
||||||
"Evren (evrenkiymaz)",Turkish,688,604,0,71,4,0,0
|
"Intan Ayunda (Intan_Ayunda)",Indonesian,800,793,962,0,0,0,711,"2020-10-14 07:51:58"
|
||||||
"David Nos (david.nos)","Catalan; Spanish",667,731,0,0,0,0,0
|
KMakoto,"Chinese Traditional",745,1146,949,0,0,0,745,"2019-10-22 04:19:52"
|
||||||
androide74,Italian,644,659,0,2,0,0,0
|
"Evren (evrenkiymaz)",Turkish,688,604,0,71,5,1,0,"2020-10-04 03:39:16"
|
||||||
Tomairuka,Japanese,633,1636,909,43,0,0,564
|
"David Nos (david.nos)","Catalan; Spanish",667,731,0,0,1,0,0,"2020-01-04 10:15:36"
|
||||||
"Dmitriy Bogdanov (di72nn)",Russian,625,572,1175,0,34,0,519
|
"Antti Kallio (antti.kallio)",Finnish,650,525,0,0,0,0,0,"2021-07-03 05:54:44"
|
||||||
reyhoon,Persian,624,759,0,1,1,0,0
|
androide74,Italian,644,659,0,2,0,0,0,"2020-02-06 15:46:28"
|
||||||
Osoitz,Basque,610,545,0,9,0,0,3
|
Tomairuka,Japanese,633,1636,909,43,0,0,564,"2020-12-12 12:14:22"
|
||||||
fabian.bouchal,German,548,527,0,6,0,3,72
|
"Dmitriy Bogdanov (di72nn)",Russian,625,572,1197,0,36,0,515,"2017-03-31 10:00:48"
|
||||||
boban77,Czech,509,461,0,2,0,0,0
|
reyhoon,Persian,624,759,0,1,3,1,0,"2020-10-01 18:17:23"
|
||||||
"Yoav Argov (YoavArgov)",Hebrew,501,461,0,0,1,8,3
|
Osoitz,Basque,610,545,0,9,0,0,3,"2018-01-23 14:07:47"
|
||||||
REMOVED_USER,Norwegian,501,498,501,0,148,0,501
|
"Saeed Esmaili (saaeed.es20)",Persian,568,774,0,5,4,0,0,"2020-11-26 15:41:15"
|
||||||
"Martim Parente (Sharlimar)",Portuguese,497,534,0,38,0,0,0
|
fabian.bouchal,German,548,527,0,6,0,3,72,"2020-01-07 06:43:37"
|
||||||
"chrrris1987 (Chrrris1987)",Dutch,467,478,0,23,0,0,0
|
boban77,Czech,509,461,0,2,0,0,0,"2020-04-30 13:18:24"
|
||||||
"Huy Ngo (huyngo)",Vietnamese,461,695,0,1,0,0,0
|
"Yoav Argov (YoavArgov)",Hebrew,501,461,0,0,1,8,103,"2017-04-28 07:23:01"
|
||||||
"黄克 (hk13127)","Chinese Simplified",461,765,0,1,0,0,0
|
REMOVED_USER,Norwegian,501,498,501,0,148,0,501,"2017-07-05 19:02:25"
|
||||||
"Arkadiusz Bubak (epitek)",Polish,458,416,29,24,0,3,0
|
"Martim Parente (Sharlimar)",Portuguese,497,534,0,38,0,0,0,"2020-08-26 10:22:11"
|
||||||
marco.baturan,Esperanto,452,452,0,0,0,0,0
|
"chrrris1987 (Chrrris1987)",Dutch,467,478,0,23,0,0,0,"2020-02-03 05:26:04"
|
||||||
"Sief Tarek (sieftarek135)",Arabic,447,455,0,0,0,0,0
|
"Huy Ngo (huyngo)",Vietnamese,461,695,0,1,0,0,0,"2020-01-26 11:58:36"
|
||||||
"Omer I.S. (omeritzics)",Hebrew,428,366,0,14,1,0,0
|
"黄克 (hk13127)","Chinese Simplified",461,765,0,1,0,0,24,"2020-01-17 23:16:03"
|
||||||
"Samuel Guay (SamGuay)",French,426,486,0,6,0,0,0
|
"Arkadiusz Bubak (epitek)",Polish,458,416,29,24,0,3,0,"2020-11-05 05:11:58"
|
||||||
"Diana Karaseva (Sun_Dianka)",Russian,399,373,0,10,1,0,221
|
marco.baturan,Esperanto,452,452,0,0,0,0,0,"2020-06-23 02:49:46"
|
||||||
"Alexander Jansson (dalecarlian)",Swedish,396,406,507,0,0,3,399
|
"Sief Tarek (sieftarek135)",Arabic,447,455,0,0,0,0,0,"2021-02-07 14:35:21"
|
||||||
luiandresgonzalez,Spanish,383,403,0,1,0,0,0
|
"Samuel Guay (SamGuay)",French,426,486,0,6,0,0,0,"2020-06-25 07:14:38"
|
||||||
"Thamara Andrade (tkcandrade)","Portuguese, Brazilian",380,387,0,0,1,0,252
|
"Diana Karaseva (Sun_Dianka)",Russian,399,373,0,10,1,0,209,"2020-01-30 06:40:02"
|
||||||
"Sølv Ræven (soelvraeven)",Danish,370,370,0,0,0,0,0
|
"Alexander Jansson (dalecarlian)",Swedish,396,406,507,0,0,3,399,"2017-06-21 01:37:32"
|
||||||
"Isti (eisti)",Hungarian,367,329,0,0,0,0,0
|
luiandresgonzalez,Spanish,383,403,0,1,28,0,0,"2020-07-11 14:20:44"
|
||||||
"Anh Quân (dangquanuet)",Vietnamese,362,530,0,42,1,0,0
|
"Thamara Andrade (tkcandrade)","Portuguese, Brazilian",380,387,0,0,1,0,252,"2020-01-09 19:35:48"
|
||||||
gapszi,Hungarian,348,301,0,86,0,0,0
|
"Sølv Ræven (soelvraeven)",Danish,370,370,0,0,0,0,0,"2020-11-28 16:46:18"
|
||||||
"Mahdi Nasiri (mahdi.nasiri)",Persian,343,465,0,39,3,0,0
|
"Isti (eisti)",Hungarian,367,329,0,0,0,0,0,"2020-12-03 12:02:51"
|
||||||
Seoyul,Korean,339,825,0,0,27,0,0
|
"Anh Quân (dangquanuet)",Vietnamese,362,530,0,42,2,0,0,"2017-10-29 12:27:44"
|
||||||
"Magimai Prakasam (magimai)",Tamil,336,831,0,12,0,0,0
|
gapszi,Hungarian,348,301,0,86,0,0,0,"2019-04-08 01:35:54"
|
||||||
"Michael Malak (MichaelKMalak)",Arabic,304,271,0,0,0,0,0
|
JY3,"Chinese Simplified",345,585,278,0,1,0,207,"2021-03-08 08:53:35"
|
||||||
"Elina Salminen (salminen.elina.m)",Finnish,297,227,0,0,0,0,0
|
"Mahdi Nasiri (mahdi.nasiri)",Persian,343,465,0,39,3,1,0,"2017-07-14 09:17:25"
|
||||||
ayane.m,Japanese,292,863,0,1,2,0,22
|
Seoyul,Korean,339,825,0,0,27,0,0,"2017-06-21 08:11:39"
|
||||||
"Marius Teufelweich (teufelweich)",German,249,256,606,4,0,0,146
|
"Magimai Prakasam (magimai)",Tamil,336,831,0,12,0,0,0,"2018-04-15 21:16:08"
|
||||||
cobalt59,German,237,234,0,1,23,1,132
|
"Michael Malak (MichaelKMalak)",Arabic,304,271,0,0,0,0,0,"2020-05-26 19:47:58"
|
||||||
"QWERT (lurenjia01)","Chinese Simplified",236,407,0,0,0,0,0
|
"Elina Salminen (salminen.elina.m)",Finnish,297,227,0,0,0,0,0,"2021-01-06 01:28:57"
|
||||||
beriain,Basque,234,235,0,0,2,0,0
|
ayane.m,Japanese,292,863,0,1,3,0,22,"2019-11-20 03:28:26"
|
||||||
"Intan Ayunda (Intan_Ayunda)",Indonesian,228,239,336,0,0,0,135
|
Blinkin,Dutch,284,318,0,1,0,0,0,"2021-06-14 10:30:05"
|
||||||
pnhpnh,Vietnamese,225,343,0,1,3,0,0
|
"Marius Teufelweich (teufelweich)",German,249,256,606,4,2,0,146,"2021-03-12 04:11:38"
|
||||||
"Dika Fitrian Dwi Putra (OsamuDazai)",Indonesian,221,215,0,0,0,0,33
|
cobalt59,German,237,234,0,1,24,1,132,"2017-06-05 05:18:33"
|
||||||
easyrepro,Telugu,214,297,0,0,0,0,0
|
"QWERT (lurenjia01)","Chinese Simplified",236,407,0,0,8,0,19,"2020-03-08 01:46:25"
|
||||||
taras-ko,Ukrainian,211,183,0,1,4,0,19
|
beriain,Basque,234,235,0,0,2,0,0,"2017-03-31 15:42:28"
|
||||||
sojusnik,German,207,200,1,0,30,0,66
|
pnhpnh,Vietnamese,225,343,0,1,3,0,0,"2017-11-27 12:06:07"
|
||||||
axmed99,Ukrainian,203,177,0,40,0,0,53
|
"Dika Fitrian Dwi Putra (OsamuDazai)",Indonesian,221,215,0,0,0,0,48,"2020-07-13 04:40:27"
|
||||||
"Heru Yen (heruyen)",Indonesian,201,201,0,0,0,0,2
|
easyrepro,Telugu,214,297,0,0,0,0,0,"2020-06-12 12:52:10"
|
||||||
Ishmaeel,Turkish,193,174,0,129,6,0,0
|
taras-ko,Ukrainian,211,183,0,1,4,0,19,"2017-10-26 16:52:22"
|
||||||
fbruna17,Danish,181,179,0,1,0,0,0
|
sojusnik,German,207,200,1,0,30,0,66,"2017-04-03 17:11:56"
|
||||||
"Omry Cohen (omrycohen)",Hebrew,175,156,0,1,0,0,0
|
axmed99,Ukrainian,203,177,0,40,0,0,53,"2021-04-01 03:56:20"
|
||||||
Bryanx,Dutch,174,165,0,5,0,0,0
|
"Heru Yen (heruyen)",Indonesian,201,201,0,0,0,0,25,"2020-06-29 18:39:15"
|
||||||
"Pierre GALIEGUE (pierre.galiegue)",French,171,194,0,24,2,0,0
|
"Vijaykumar Borkar (vjkumar)",Hindi,200,364,0,11,0,0,0,"2021-08-06 16:12:15"
|
||||||
DionysosDV,Greek,165,153,0,0,0,0,0
|
Ishmaeel,Turkish,193,174,0,129,6,0,0,"2017-10-04 03:54:00"
|
||||||
"Gustavo Lima (GustavoLima)",Portuguese,158,177,0,1,4,10,0
|
"Aputsiak Niels Janussen (aputtu)",Danish,187,200,0,0,0,0,0,"2019-08-28 05:47:42"
|
||||||
"Aputsiak Niels Janussen (aputtu)",Danish,153,171,0,0,0,0,0
|
_translator,French,181,206,0,11,0,0,0,"2021-07-06 07:54:12"
|
||||||
plitwin,Polish,145,128,0,1,16,0,26
|
fbruna17,Danish,181,179,0,1,0,0,0,"2021-01-28 15:48:47"
|
||||||
"Lương Vĩnh Khang (LuongVinhKhang)",Vietnamese,144,256,0,0,46,1,0
|
"Omry Cohen (omrycohen)",Hebrew,175,156,0,1,0,0,33,"2021-01-18 07:33:23"
|
||||||
azzamsa,Indonesian,142,136,0,48,0,1,50
|
Bryanx,Dutch,174,165,0,5,0,0,0,"2019-11-21 17:08:12"
|
||||||
"Neysa Nasywa (neysanasywa)",Indonesian,140,141,0,0,0,0,35
|
"Pierre GALIEGUE (pierre.galiegue)",French,171,194,0,24,4,0,0,"2020-08-16 11:41:35"
|
||||||
JY3,"Chinese Simplified",136,217,80,0,0,0,80
|
bruhwut,Vietnamese,171,268,0,1,0,0,0,"2021-05-21 07:16:30"
|
||||||
"Mohammed Imthath (mimthath4)",Tamil,136,274,0,0,11,0,0
|
DionysosDV,Greek,165,153,0,0,0,0,0,"2021-02-27 19:05:25"
|
||||||
roptat,French,132,154,0,112,88,5,0
|
"Gustavo Lima (GustavoLima)",Portuguese,158,177,0,1,4,10,0,"2020-08-26 10:35:05"
|
||||||
"Trần Thái (tranhoangthai2001)",Vietnamese,127,186,0,8,1,0,0
|
oscfd,Spanish,155,166,0,1,4,0,0,"2021-05-21 17:58:22"
|
||||||
"OP Smosher (teenwolffan44)","Serbian (Cyrillic)",124,122,0,0,0,0,18
|
plitwin,Polish,145,128,0,1,16,0,26,"2021-01-20 06:18:37"
|
||||||
4001982248998,Esperanto,122,119,0,0,0,0,0
|
"Lương Vĩnh Khang (LuongVinhKhang)",Vietnamese,144,256,0,0,46,1,0,"2017-08-10 10:05:58"
|
||||||
"StoP4Me (Lcqp)",Romanian,121,119,0,0,3,0,0
|
azzamsa,Indonesian,142,136,0,48,0,1,26,"2017-06-16 18:29:45"
|
||||||
Sebastian05067,Spanish,114,133,0,55,18,0,0
|
"yoding (yodingc)","Chinese Traditional; Chinese Simplified",141,271,0,10,0,0,0,"2021-07-07 01:45:45"
|
||||||
"Tanya (MagicUnderHood)",Russian,114,98,0,19,0,0,32
|
"Neysa Nasywa (neysanasywa)",Indonesian,140,141,0,0,0,0,60,"2020-11-18 10:32:10"
|
||||||
REMOVED_USER,Arabic,111,106,0,22,21,2,0
|
"Mohammed Imthath (mimthath4)",Tamil,136,274,0,0,11,0,0,"2018-02-15 22:41:15"
|
||||||
mohmans,Arabic,109,103,0,2,0,0,0
|
roptat,French,132,154,0,112,89,5,0,"2017-04-19 16:54:47"
|
||||||
"Ivan Krušlin (krux3r)",Croatian,108,122,503,0,0,0,108
|
"Trần Thái (tranhoangthai2001)",Vietnamese,127,186,0,8,1,0,0,"2018-03-01 10:51:39"
|
||||||
"Iabin Arteaga (iabin)",Spanish,108,111,0,4,20,0,0
|
"OP Smosher (teenwolffan44)","Serbian (Cyrillic)",124,122,0,0,0,0,18,"2020-11-05 09:41:35"
|
||||||
2kaafone,Finnish,105,90,0,0,0,0,0
|
4001982248998,Esperanto,122,119,0,0,0,0,0,"2017-10-08 04:13:02"
|
||||||
"Adam Jurkiewicz (hasztagg)",Polish,104,105,529,0,0,0,104
|
"StoP4Me (Lcqp)",Romanian,121,119,0,0,3,0,0,"2018-05-06 18:51:59"
|
||||||
"Saeed Esmaili (saaeed.es20)",Persian,104,141,0,0,0,0,0
|
alalloush,Arabic,118,129,0,2,2,0,0,"2017-03-31 12:37:17"
|
||||||
"just a name bro (justanamebr0)",Danish,98,109,0,0,1,0,0
|
"Eilif Adelvice (adelvice)",Spanish,116,126,0,96,0,0,0,"2021-08-05 07:20:21"
|
||||||
"Nam Nguyen (namnl2706)",Vietnamese,95,137,0,0,0,0,0
|
Sebastian05067,Spanish,114,133,0,55,28,0,0,"2017-05-14 00:48:16"
|
||||||
"손유정 (yuwon1213)",Korean,95,57,0,0,0,0,0
|
"Tanya (MagicUnderHood)",Russian,114,98,0,19,0,0,54,"2019-04-21 10:44:03"
|
||||||
ranmagen,Hebrew,91,78,0,0,0,0,0
|
REMOVED_USER,Arabic,111,106,0,22,21,2,0,"2018-01-05 07:01:45"
|
||||||
LoneWanderer,"Chinese Traditional",90,137,0,4,0,0,0
|
mohmans,Arabic,109,103,0,2,0,0,0,"2020-11-23 02:48:00"
|
||||||
"Vo - (voyl)","Chinese Traditional",89,126,0,0,5,0,0
|
"Iabin Arteaga (iabin)",Spanish,108,111,0,4,21,0,0,"2017-08-26 21:08:54"
|
||||||
ikkaz,Indonesian,89,84,0,5,0,0,4
|
"Ivan Krušlin (krux3r)",Croatian,108,122,503,0,0,0,108,"2017-03-31 09:15:24"
|
||||||
"Irene K (Heaun)",Korean,88,75,0,25,0,0,0
|
2kaafone,Finnish,105,90,0,0,0,0,0,"2019-08-12 06:58:48"
|
||||||
"Kumar Anand (kumar0500)",Hindi,87,125,0,0,0,0,0
|
"Adam Jurkiewicz (hasztagg)",Polish,104,105,529,0,0,0,104,"2017-03-31 09:50:51"
|
||||||
Prosta4ok_ua,Ukrainian,87,84,0,1,0,0,17
|
"just a name bro (justanamebr0)",Danish,98,109,0,0,1,0,0,"2019-06-19 11:57:55"
|
||||||
"Ohad Edri (ohadalte)",Hebrew,85,79,0,0,1,3,0
|
"Nam Nguyen (namnl2706)",Vietnamese,95,137,0,0,0,0,0,"2020-08-18 23:02:33"
|
||||||
helectron,Persian,84,102,0,1,0,0,0
|
"손유정 (yuwon1213)",Korean,95,57,0,0,0,0,0,"2021-03-30 05:25:33"
|
||||||
"Radu Cebotari (wildProgrammer)",Romanian,84,92,0,1,0,0,0
|
ranmagen,Hebrew,91,78,0,0,0,0,0,"2021-02-16 05:44:31"
|
||||||
"Israa Z (sosozozo)",Arabic,79,87,0,43,11,0,3
|
LoneWanderer,"Chinese Traditional",90,137,0,4,0,0,0,"2020-09-29 05:24:48"
|
||||||
"Sofia Neves (sofiasonev)","Portuguese, Brazilian",79,84,0,1,0,0,46
|
"Vo - (voyl)","Chinese Traditional",89,126,0,0,5,0,0,"2020-09-02 23:34:42"
|
||||||
Tiralka,French,79,91,0,92,1,0,0
|
ikkaz,Indonesian,89,84,0,5,0,0,4,"2019-09-02 19:58:54"
|
||||||
"Jacob Roller (jdr28070)",Korean,79,61,0,0,0,0,0
|
"Irene K (Heaun)",Korean,88,75,0,25,0,0,0,"2020-03-16 11:31:12"
|
||||||
"Toni Mustonen (toni.mustonen)",Finnish,78,72,0,0,0,0,0
|
Prosta4ok_ua,Ukrainian,87,84,0,1,0,0,17,"2020-01-23 19:43:41"
|
||||||
"Michael (quelbs)",German,76,75,0,1,0,0,39
|
"Kumar Anand (kumar0500)",Hindi,87,125,0,0,0,0,0,"2020-11-07 02:46:09"
|
||||||
"Fauz Aladeem (topfauz)",Arabic,76,77,0,0,0,1,0
|
"Ohad Edri (ohadalte)",Hebrew,85,79,0,0,1,3,18,"2020-07-04 03:42:09"
|
||||||
RealDonald,Dutch,67,69,0,121,10,0,0
|
helectron,Persian,84,102,0,1,0,0,0,"2021-03-02 04:10:51"
|
||||||
sirekanyan,"Armenian; Russian",66,65,0,0,0,0,0
|
"Radu Cebotari (wildProgrammer)",Romanian,84,92,0,1,0,0,0,"2020-02-05 01:20:00"
|
||||||
"Константин К. (kocyak1991)",Russian,64,60,0,0,1,2,0
|
"Sofia Neves (sofiasonev)","Portuguese, Brazilian",79,84,0,1,0,0,46,"2020-03-12 18:19:46"
|
||||||
"Laura Sophie (laurasophie20)",German,62,67,0,4,0,0,0
|
"Jacob Roller (jdr28070)",Korean,79,61,0,0,0,0,0,"2020-01-03 11:36:40"
|
||||||
raden20,Indonesian,61,62,177,0,1,0,64
|
Tiralka,French,79,91,0,92,1,0,0,"2018-02-09 18:39:01"
|
||||||
"Jan Wojtecki (j4nw)",Polish,58,46,0,0,0,0,26
|
"Israa Z (sosozozo)",Arabic,79,87,0,43,12,0,3,"2017-11-27 14:10:50"
|
||||||
"Deepak Bharathi (deepakbharathi1994)",Tamil,56,107,0,0,11,4,0
|
"Toni Mustonen (toni.mustonen)",Finnish,78,72,0,0,0,0,0,"2017-09-02 05:34:12"
|
||||||
"Андрій Козицький (andriikozytskyi1108)",Ukrainian,52,52,0,0,1,0,0
|
"Fauz Aladeem (topfauz)",Arabic,76,77,0,0,0,1,0,"2020-02-21 22:46:12"
|
||||||
REMOVED_USER,Italian,51,52,0,2,0,0,0
|
"Michael (quelbs)",German,76,75,0,1,0,0,39,"2020-08-18 07:39:26"
|
||||||
govindap,"Japanese; Hindi",51,114,0,6,1,0,0
|
"Oliver Gronowski (OliverGronowski)",German,70,69,0,5,0,0,0,"2021-05-14 16:37:10"
|
||||||
"Mare Geldenhuys (mare.geldenhuys)",Afrikaans,50,57,0,0,0,0,0
|
RealDonald,Dutch,67,69,0,121,10,0,0,"2017-06-23 20:10:12"
|
||||||
"Peter Williams (williamspete001)",Japanese,49,133,0,1,0,0,3
|
sirekanyan,"Armenian; Russian",66,65,0,0,0,0,0,"2020-04-18 11:32:52"
|
||||||
"Behnood HRazy (behnoodhr)",Persian,49,70,0,0,0,0,0
|
"Константин К. (kocyak1991)",Russian,64,60,0,0,1,2,0,"2018-06-10 13:39:37"
|
||||||
J3ll3nl,Dutch,48,48,0,0,17,1,3
|
"Laura Sophie (laurasophie20)",German,62,67,0,4,0,0,0,"2018-01-06 14:21:24"
|
||||||
"tat bz (Tat_i)",German,48,56,0,55,0,0,27
|
"Alparslan Sakci (sakci)",Turkish,61,55,0,11,0,0,0,"2021-06-10 11:59:22"
|
||||||
vach,Armenian,47,36,0,0,0,0,0
|
raden20,Indonesian,61,62,177,0,1,0,64,"2017-04-09 22:04:23"
|
||||||
andowero,Czech,47,38,0,0,0,0,0
|
"Jan Wojtecki (j4nw)",Polish,58,46,0,0,0,0,26,"2017-11-02 05:42:14"
|
||||||
"Andrew Firnes (Anechan)",Russian,47,47,0,3,0,0,29
|
"Deepak Bharathi (deepakbharathi1994)",Tamil,56,107,0,0,11,4,0,"2017-09-17 08:00:31"
|
||||||
"Coni Ragni (coni2ragnii)",Spanish,46,46,0,0,0,0,0
|
"Peter Williams (williamspete001)",Japanese,55,147,0,2,0,0,3,"2020-01-01 13:17:44"
|
||||||
"Rahul Shishodia (rahul.shishodia.10)",Hindi,46,85,0,6,0,0,0
|
"Андрій Козицький (andriikozytskyi1108)",Ukrainian,52,52,0,0,1,0,0,"2018-10-22 01:45:08"
|
||||||
Cp0204,"Chinese Simplified",45,72,0,0,0,0,0
|
"Nil riera (nilriera2000)",Catalan,52,61,0,1,0,0,0,"2021-06-22 16:37:44"
|
||||||
"cc (cavaz)",Italian,44,41,0,0,0,0,0
|
REMOVED_USER,Italian,51,52,0,2,0,0,0,"2017-08-21 05:15:31"
|
||||||
"Kamil Dziadek (prso94)",Polish,43,39,0,0,2,0,0
|
govindap,"Japanese; Hindi",51,114,0,6,1,0,0,"2020-06-02 20:15:52"
|
||||||
"Boban Jagertraum (boban40)",Czech,43,38,0,2,1,1,0
|
"Mare Geldenhuys (mare.geldenhuys)",Afrikaans,50,57,0,0,0,0,0,"2017-10-20 18:00:14"
|
||||||
andreea.muscalagiu,Romanian,42,52,0,1,0,0,0
|
"Behnood HRazy (behnoodhr)",Persian,49,70,0,0,0,0,0,"2017-11-25 10:57:21"
|
||||||
"Me Me (gentelwom)",Arabic,42,40,0,0,0,0,0
|
"tat bz (Tat_i)",German,48,56,0,55,0,0,27,"2021-03-26 05:12:54"
|
||||||
"Balázs Keresztury (belidzs)",Hungarian,42,41,501,0,7,0,38
|
J3ll3nl,Dutch,48,48,0,0,17,1,3,"2017-03-31 11:56:09"
|
||||||
MStefanov,Bulgarian,41,55,2,0,2,0,2
|
"Andrew Firnes (Anechan)",Russian,47,47,0,3,0,0,29,"2019-09-18 09:51:59"
|
||||||
"Ali Zali (stm19951995)",Persian,40,60,0,0,0,0,0
|
andowero,Czech,47,38,0,0,0,0,0,"2020-01-20 02:29:01"
|
||||||
"Sofia Veijonen (Suklaa) (sofia.veijonen)",Finnish,40,33,0,0,0,0,0
|
vach,Armenian,47,36,0,0,0,0,0,"2020-04-18 16:53:12"
|
||||||
dusanstrgar,Slovenian,39,41,0,0,0,0,0
|
"Rahul Shishodia (rahul.shishodia.10)",Hindi,46,85,0,6,5,1,0,"2018-12-24 22:18:19"
|
||||||
"Limin Lu (liminlu)","Chinese Simplified",39,79,503,0,0,0,39
|
"Coni Ragni (coni2ragnii)",Spanish,46,46,0,0,0,0,0,"2021-02-28 20:18:37"
|
||||||
Anshoe,Tamil,38,65,0,14,0,0,0
|
Cp0204,"Chinese Simplified",45,72,0,0,0,0,0,"2019-08-20 11:04:27"
|
||||||
anasshm,Arabic,37,36,0,9,0,0,0
|
"cc (cavaz)",Italian,44,41,0,0,0,0,0,"2017-04-01 04:21:08"
|
||||||
hrexen,Armenian,37,37,0,0,0,0,0
|
"Boban Jagertraum (boban40)",Czech,43,38,0,2,1,1,0,"2017-03-31 09:39:16"
|
||||||
REMOVED_USER,Swedish,36,33,0,5,1,0,0
|
"Kamil Dziadek (prso94)",Polish,43,39,0,0,2,0,0,"2020-04-06 17:12:06"
|
||||||
"Abdulrahman (D7M)",Arabic,36,39,0,0,0,0,0
|
"Me Me (gentelwom)",Arabic,42,40,0,0,0,0,0,"2020-11-08 20:44:01"
|
||||||
"長谷川知里 (chase0213)",Japanese,34,138,0,13,0,0,24
|
"Ali Elsheikh (aelsheikh1987)",Arabic,42,41,0,0,0,0,0,"2021-06-16 10:17:26"
|
||||||
"Piotr Łuczyński (peterluczynski)",Polish,33,30,0,6,5,0,2
|
"Balázs Keresztury (belidzs)",Hungarian,42,41,501,0,7,0,38,"2017-04-06 02:40:24"
|
||||||
"milad farahani (miladfarmahini90)",Persian,33,44,0,18,0,0,3
|
andreea.muscalagiu,Romanian,42,52,0,1,0,0,0,"2017-10-22 07:19:49"
|
||||||
"Luis E. Perichon (luisperichon)",Spanish,33,40,0,104,0,0,0
|
"Mateusz Duda (MateuszDuda)",Polish,42,42,0,0,0,0,0,"2021-08-17 11:27:11"
|
||||||
andriikozytskyi2625,Ukrainian,31,23,0,0,0,0,0
|
MStefanov,Bulgarian,41,55,2,0,2,0,2,"2017-03-31 16:09:02"
|
||||||
JoeLi,"Chinese Traditional",31,70,0,12,0,0,24
|
"Sofia Veijonen (Suklaa) (sofia.veijonen)",Finnish,40,33,0,0,0,0,0,"2018-03-07 09:24:22"
|
||||||
Moastafa,Arabic,31,25,0,0,0,0,0
|
"Ali Zali (stm19951995)",Persian,40,60,0,0,0,0,0,"2020-03-23 19:57:26"
|
||||||
REMOVED_USER,Russian,31,30,0,2,4,0,3
|
"Limin Lu (liminlu)","Chinese Simplified",39,79,503,0,0,0,39,"2017-03-31 09:49:35"
|
||||||
"hamza gamal (hamzagamal4444)",Arabic,31,28,0,0,0,0,0
|
dusanstrgar,Slovenian,39,41,0,0,0,0,0,"2017-03-31 10:30:28"
|
||||||
yancyn,"Chinese Simplified",30,40,0,0,0,0,0
|
Anshoe,Tamil,38,65,0,14,0,0,0,"2018-01-02 11:06:52"
|
||||||
"비니몬youtube (khj01025276475)",Korean,29,25,0,0,0,0,0
|
anasshm,Arabic,37,36,0,9,0,0,0,"2019-01-27 04:07:22"
|
||||||
"Ruud Schouten (ruudschouten)",Dutch,29,32,0,41,3,0,0
|
hrexen,Armenian,37,37,0,0,0,0,0,"2020-12-09 02:30:34"
|
||||||
"Guillaume Collic (gcollic)",French,26,28,0,126,11,0,0
|
"Abdulrahman (D7M)",Arabic,36,39,0,0,0,0,0,"2020-01-29 18:55:30"
|
||||||
"Niraj Yadav (neverforgetniraj)",Hindi,26,48,0,0,0,0,0
|
"Maria Chushnyakova (maria.ch)",Russian,36,31,0,3,0,0,0,"2021-08-17 03:23:58"
|
||||||
"Radoslaw Biernacki (radoslaw.biernacki)",Polish,26,24,0,8,0,0,1
|
REMOVED_USER,Swedish,36,33,0,5,1,0,0,"2018-09-29 17:47:33"
|
||||||
"Jonny I (jonny99dj)",Italian,26,26,0,5,0,0,0
|
"長谷川知里 (chase0213)",Japanese,34,138,0,13,0,0,24,"2018-12-14 10:52:44"
|
||||||
"Aaron Dalton (Perlkonig)",French,26,25,0,141,1,0,0
|
"Luis E. Perichon (luisperichon)",Spanish,33,40,0,104,0,0,0,"2017-09-04 13:46:06"
|
||||||
"Eddie (eddieattaboy)","Chinese Traditional",25,34,0,1,0,0,0
|
"Piotr Łuczyński (peterluczynski)",Polish,33,30,0,6,5,0,2,"2020-01-29 07:27:40"
|
||||||
Pan_Filuta,Czech,25,21,0,5,4,0,3
|
"milad farahani (miladfarmahini90)",Persian,33,44,0,18,1,0,3,"2017-08-31 16:09:00"
|
||||||
"eduard83 (barbany.eduard)",Catalan,24,25,0,2,0,0,0
|
andriikozytskyi2625,Ukrainian,31,23,0,0,0,0,0,"2019-07-08 00:16:41"
|
||||||
"Ľuboš Čaky (lubos.caky)",Slovak,23,22,0,0,0,0,0
|
Moastafa,Arabic,31,25,0,0,0,0,0,"2020-07-06 11:37:53"
|
||||||
"Caner Başaran (basarancaner)",Turkish,23,21,0,0,20,0,0
|
"hamza gamal (hamzagamal4444)",Arabic,31,28,0,0,0,0,0,"2020-08-03 15:23:34"
|
||||||
hodanli,Turkish,22,26,0,0,1,0,0
|
REMOVED_USER,Russian,31,30,0,2,4,0,3,"2018-12-03 23:55:47"
|
||||||
"Neeraj Verma (verma.neeraj.in)",Hindi,22,37,0,0,1,0,0
|
JoeLi,"Chinese Traditional",31,70,0,12,0,0,24,"2017-06-25 05:32:48"
|
||||||
"Alcarkse (alexis.brusle)",French,21,25,0,7,11,0,0
|
yancyn,"Chinese Simplified",30,40,0,0,0,0,1,"2020-05-18 20:06:03"
|
||||||
"Shashwat (goforgold)",Hindi,20,33,0,0,0,0,0
|
"비니몬youtube (khj01025276475)",Korean,29,25,0,0,0,0,0,"2020-02-09 20:44:35"
|
||||||
"사자솥 (toke1597)",Korean,19,19,0,0,0,0,0
|
"Ruud Schouten (ruudschouten)",Dutch,29,32,0,41,3,0,0,"2017-07-22 17:49:17"
|
||||||
"İsa Eş (IsaEs)",Turkish,19,17,0,0,6,1,0
|
"Aaron Dalton (Perlkonig)",French,26,25,0,141,1,0,0,"2018-01-14 12:58:19"
|
||||||
sheeCesu,French,19,18,0,48,2,0,0
|
"Niraj Yadav (neverforgetniraj)",Hindi,26,48,0,0,0,0,0,"2017-04-11 02:26:50"
|
||||||
can13,Turkish,19,14,0,8,0,0,0
|
"Guillaume Collic (gcollic)",French,26,28,0,126,11,0,0,"2017-05-05 16:13:00"
|
||||||
"Magdalena Urbańczyk (madziia139)",Polish,19,19,0,0,0,0,0
|
"Radoslaw Biernacki (radoslaw.biernacki)",Polish,26,24,0,8,0,0,1,"2020-12-15 17:55:31"
|
||||||
axikman11111,Uyghur,18,19,0,0,0,0,0
|
"Jonny I (jonny99dj)",Italian,26,26,0,5,0,0,0,"2017-10-07 07:35:34"
|
||||||
Adeline31,French,17,20,0,3,0,0,0
|
"Eddie (eddieattaboy)","Chinese Traditional",25,34,0,1,0,0,0,"2020-11-04 21:48:05"
|
||||||
"Hoon Jung (hooni100)",Korean,17,10,0,0,0,0,0
|
Pan_Filuta,Czech,25,21,0,5,4,0,3,"2017-04-29 12:55:14"
|
||||||
"Ceara Lopez (cealopez)",Spanish,17,18,0,0,5,1,0
|
"eduard83 (barbany.eduard)",Catalan,24,25,0,2,0,0,0,"2019-06-26 14:59:47"
|
||||||
takoyakibento,Korean,17,13,0,3,0,0,0
|
"Ľuboš Čaky (lubos.caky)",Slovak,23,22,0,0,0,0,0,"2019-07-02 16:51:44"
|
||||||
bretzel15,German,16,20,0,0,0,0,0
|
"Caner Başaran (basarancaner)",Turkish,23,21,0,0,21,0,0,"2017-04-09 06:34:59"
|
||||||
engineeringforgood,Russian,16,15,0,0,0,0,0
|
hodanli,Turkish,22,26,0,0,1,0,0,"2017-11-03 14:33:41"
|
||||||
"Şamil Ateşoğlu (m.samilatesoglu)",Turkish,16,22,0,11,6,3,0
|
gnu-ewm,Polish,22,23,0,6,0,0,0,"2021-02-24 03:42:01"
|
||||||
DebatablySane,Bulgarian,16,15,0,48,0,0,0
|
"Neeraj Verma (verma.neeraj.in)",Hindi,22,37,0,0,1,0,0,"2018-07-23 07:16:41"
|
||||||
"Bhava Tharini (bhavidanush)",Tamil,15,37,0,0,0,0,0
|
"Alcarkse (alexis.brusle)",French,21,25,0,7,11,0,0,"2017-08-06 09:32:29"
|
||||||
"Anastasia Borchuk (al2.borchuk)",Russian,14,14,0,0,0,0,0
|
olbotta,Italian,20,25,0,2,0,0,0,"2021-06-06 04:22:55"
|
||||||
"EuiHo Hwang (euiho.hwang)",Korean,14,16,0,0,0,0,0
|
"Shashwat (goforgold)",Hindi,20,33,0,0,0,0,0,"2020-05-17 10:34:42"
|
||||||
iamsurajbobade,Hindi,14,30,0,0,0,0,0
|
"Magdalena Urbańczyk (madziia139)",Polish,19,19,0,0,0,0,0,"2017-10-21 03:01:04"
|
||||||
"Zeynep Esen (nezihaesen50)",Turkish,14,13,0,0,0,0,0
|
sheeCesu,French,19,18,0,48,4,0,0,"2017-12-21 17:01:39"
|
||||||
"Fikret Bilici (fikretbilici)",Turkish,14,13,0,0,0,0,0
|
can13,Turkish,19,14,0,8,0,0,0,"2021-01-03 10:39:03"
|
||||||
"Zeeshan Rabbani (Zeera)",Hindi,14,25,0,0,0,0,0
|
"İsa Eş (IsaEs)",Turkish,19,17,0,0,6,1,0,"2017-06-20 07:30:22"
|
||||||
"Sanji Vinsmock (mukanzhanbolat4)",Russian,14,14,0,0,0,0,0
|
"사자솥 (toke1597)",Korean,19,19,0,0,0,0,0,"2020-02-04 13:36:11"
|
||||||
"Nenad Vukotic (vukotic.nenad)","Serbian (Cyrillic)",13,13,0,1,2,6,0
|
axikman11111,Uyghur,18,19,0,0,0,0,0,"2018-10-13 12:25:31"
|
||||||
"Uwe Mönks (schirinowski)",German,13,12,0,0,0,0,0
|
"Hoon Jung (hooni100)",Korean,17,10,0,0,0,0,0,"2021-01-03 02:26:54"
|
||||||
"Dave (xdave)",Hungarian,13,11,0,0,0,0,0
|
"Ceara Lopez (cealopez)",Spanish,17,18,0,0,5,1,0,"2017-08-22 22:56:13"
|
||||||
soura2,Arabic,12,13,0,0,0,0,0
|
takoyakibento,Korean,17,13,0,3,0,0,0,"2020-08-01 08:44:15"
|
||||||
"shreyas (techiespace)",Hindi,12,20,0,0,0,0,0
|
Adeline31,French,17,20,0,3,0,0,0,"2019-12-06 00:00:11"
|
||||||
"Jo Chuang (josephch405)","Chinese Traditional",11,24,0,0,0,0,11
|
engineeringforgood,Russian,16,15,0,0,0,0,16,"2021-01-22 03:32:35"
|
||||||
Vmrc,French,11,12,0,2,0,0,0
|
bretzel15,German,16,20,0,0,0,0,0,"2020-04-06 02:49:14"
|
||||||
"sathvic k (sathvictripleseven)",Telugu,10,17,0,0,0,0,0
|
"Şamil Ateşoğlu (m.samilatesoglu)",Turkish,16,22,0,11,6,3,0,"2017-07-05 18:37:08"
|
||||||
"Edwin van Rooij (edwinvrooij)",Dutch,10,13,0,17,0,0,0
|
DebatablySane,Bulgarian,16,15,0,48,0,0,0,"2017-07-10 15:13:18"
|
||||||
"Brian Camacho (bmcamacho)",Polish,10,11,0,0,1,0,0
|
"Bhava Tharini (bhavidanush)",Tamil,15,37,0,0,0,0,0,"2019-10-09 05:43:11"
|
||||||
"Ahmed Mosaad (ahmed.mosaad2018)",Arabic,10,12,0,6,0,0,0
|
"Zeynep Esen (nezihaesen50)",Turkish,14,13,0,0,0,0,0,"2020-01-28 07:05:15"
|
||||||
"Mihael Wagner (miha.wagner)",Slovenian,10,9,0,7,0,0,0
|
"Fikret Bilici (fikretbilici)",Turkish,14,13,0,0,0,0,0,"2020-06-21 17:16:11"
|
||||||
"Anonymous edgy nerd (yamentaad)",Arabic,10,13,0,1,0,0,0
|
"EuiHo Hwang (euiho.hwang)",Korean,14,16,0,0,0,0,0,"2020-06-23 02:40:01"
|
||||||
"Martin Vostatek (martinvostatek)",Czech,9,8,0,32,2,0,0
|
"Zeeshan Rabbani (Zeera)",Hindi,14,25,0,0,0,0,0,"2020-09-15 11:32:01"
|
||||||
"Sourire Lucide (sourire_lucide)",Russian,9,10,0,0,1,0,0
|
"Faiz Ahamed (faiznewton)",Tamil,14,31,0,0,0,0,0,"2021-05-06 23:06:46"
|
||||||
"Suhaili Hassan (kucingsyg96)",Indonesian,9,10,0,0,0,0,0
|
"Anastasia Borchuk (al2.borchuk)",Russian,14,14,0,0,0,0,0,"2020-04-14 13:22:49"
|
||||||
"Seweryn Piotrowski (Draxxsx)",Polish,9,10,0,0,19,0,0
|
iamsurajbobade,Hindi,14,30,0,0,0,0,0,"2018-05-21 11:23:27"
|
||||||
Rex123,Persian,8,8,0,0,0,0,0
|
"Sanji Vinsmock (mukanzhanbolat4)",Russian,14,14,0,0,0,0,0,"2020-02-18 12:38:54"
|
||||||
"Konstantin (KZhidovinov)",Russian,7,7,0,0,0,0,0
|
"Maro Chr (caprisunglasses)",Greek,14,17,0,0,0,0,0,"2021-08-17 06:53:33"
|
||||||
pkorove,Greek,7,7,0,0,0,0,0
|
"Nenad Vukotic (vukotic.nenad)","Serbian (Cyrillic)",13,13,0,1,2,6,0,"2019-01-31 14:29:15"
|
||||||
ftfoi,Norwegian,7,6,0,0,0,0,0
|
"Uwe Mönks (schirinowski)",German,13,12,0,0,0,0,0,"2021-02-18 04:00:41"
|
||||||
"Андрій Козицький (andriikozytskyi3807)",Ukrainian,7,12,0,2,0,0,0
|
"Dave (xdave)",Hungarian,13,11,0,0,0,0,0,"2020-03-02 20:56:50"
|
||||||
"Vladimir Pavlychev (KeyJoo)",Russian,7,9,0,0,0,0,0
|
soura2,Arabic,12,13,0,0,0,0,0,"2020-01-13 19:23:47"
|
||||||
"Andrey ZaXeLoN (waragaa)",Russian,7,7,0,8,1,0,0
|
"shreyas (techiespace)",Hindi,12,20,0,0,0,0,0,"2018-06-10 01:14:26"
|
||||||
erfan2927,Persian,6,6,0,0,0,0,0
|
"Sonu Sharma (riteetude)",Hindi,11,23,0,0,0,0,0,"2021-05-30 19:38:00"
|
||||||
dragnus,Arabic,6,6,0,1,1,0,0
|
Vmrc,French,11,12,0,2,0,0,0,"2020-11-02 05:35:06"
|
||||||
"Sam (SorodonSorodon)",German,6,6,0,13,0,0,0
|
"Jo Chuang (josephch405)","Chinese Traditional",11,24,0,0,0,0,11,"2017-06-16 20:21:06"
|
||||||
ChloeLiang,Japanese,6,22,0,0,1,0,3
|
"sathvic k (sathvictripleseven)",Telugu,10,17,0,0,0,0,0,"2020-09-11 08:11:32"
|
||||||
"Burak Ceylan (7burakceylan)",Turkish,6,6,0,0,0,0,0
|
"Brian Camacho (bmcamacho)",Polish,10,11,0,0,1,0,0,"2020-08-03 02:27:28"
|
||||||
"닉닉 (seohu9466)",Korean,6,14,0,13,0,0,0
|
"Anonymous edgy nerd (yamentaad)",Arabic,10,13,0,1,0,0,0,"2018-05-06 09:23:57"
|
||||||
"Matthias Joly (joly.matt12)",French,5,8,0,27,1,0,0
|
"Edwin van Rooij (edwinvrooij)",Dutch,10,13,0,17,0,0,0,"2018-11-05 03:59:10"
|
||||||
"Guerra Ivaneth (rossanaiva-04)",Spanish,5,7,0,0,0,0,0
|
"Mihael Wagner (miha.wagner)",Slovenian,10,9,0,7,0,0,0,"2017-10-18 18:26:29"
|
||||||
"Manuel Tassi (Mannivu)",Italian,5,6,0,0,0,0,0
|
"Ahmed Mosaad (ahmed.mosaad2018)",Arabic,10,12,0,6,0,0,0,"2021-02-03 18:45:43"
|
||||||
"Micaela Pighin (micaelapiighin)",Spanish,5,6,0,1,0,0,0
|
"Suhaili Hassan (kucingsyg96)",Indonesian,9,10,0,0,0,0,0,"2018-06-10 11:55:09"
|
||||||
"Дмитрий Хапенков (d.khapenkov)",Russian,5,5,0,6,4,0,2
|
"Martin Vostatek (martinvostatek)",Czech,9,8,0,32,2,0,0,"2019-01-21 13:52:36"
|
||||||
andriikozytskyi2018,Ukrainian,5,5,0,0,0,0,0
|
"Seweryn Piotrowski (Draxxsx)",Polish,9,10,0,0,19,0,0,"2020-01-02 09:55:48"
|
||||||
"Neko123 (emandic11)","Serbian (Cyrillic)",4,4,0,57,0,0,0
|
"Sourire Lucide (sourire_lucide)",Russian,9,10,0,0,1,0,0,"2018-03-22 01:37:55"
|
||||||
marmo,German,4,4,0,0,0,0,0
|
Rex123,Persian,8,8,0,0,0,0,0,"2017-07-01 00:47:42"
|
||||||
"Eli Besirov (elibesirov07)",Turkish,4,4,0,0,0,0,0
|
"Andrey ZaXeLoN (waragaa)",Russian,7,7,0,8,1,0,0,"2017-09-18 21:37:42"
|
||||||
"Lopo Isaac Fernández (rocapata)",Spanish,4,3,0,0,0,0,0
|
"Konstantin (KZhidovinov)",Russian,7,7,0,0,0,0,0,"2020-01-29 13:35:12"
|
||||||
bziuum,Polish,4,4,0,0,0,0,0
|
"Андрій Козицький (andriikozytskyi3807)",Ukrainian,7,12,0,2,0,0,0,"2020-09-26 20:31:56"
|
||||||
"Thoum Ptrgnt (thomas.petrignet)",French,3,3,0,2,0,3,0
|
ftfoi,Norwegian,7,6,0,0,0,0,0,"2020-04-11 20:42:35"
|
||||||
"Vagner Roberto (vagner.trompete)","Portuguese, Brazilian",3,3,0,0,0,0,0
|
"Vladimir Pavlychev (KeyJoo)",Russian,7,9,0,0,0,0,0,"2017-12-18 02:46:56"
|
||||||
"Unnie Here (Carb)",Hindi,3,8,0,0,0,0,0
|
pkorove,Greek,7,7,0,0,0,0,0,"2020-03-07 11:36:12"
|
||||||
carsten_kafke,German,3,3,0,43,0,0,3
|
erfan2927,Persian,6,6,0,0,0,0,0,"2018-04-09 02:12:44"
|
||||||
Magidxz,Arabic,3,3,0,0,0,0,0
|
"Burak Ceylan (7burakceylan)",Turkish,6,6,0,0,0,0,0,"2018-05-20 17:24:19"
|
||||||
atomjani,Hungarian,3,3,0,0,0,0,0
|
"Sam (SorodonSorodon)",German,6,6,0,13,0,0,0,"2017-04-14 11:09:27"
|
||||||
"Péter Bernát (bernatp)",Hungarian,3,2,0,0,0,0,0
|
"닉닉 (seohu9466)",Korean,6,14,0,13,0,0,0,"2017-10-09 23:08:15"
|
||||||
"Igor Piskun (i_piskun)",Ukrainian,3,3,0,0,0,0,0
|
"Sarita Cajas (sarayanacajas)",Spanish,6,4,0,0,1,0,0,"2021-05-14 14:27:59"
|
||||||
"joabe gabriel (joabegabrielcma1)","Portuguese, Brazilian",3,4,0,0,0,0,0
|
ChloeLiang,Japanese,6,22,0,0,1,0,3,"2017-08-08 05:02:59"
|
||||||
"Oleg Kogut (kogut_oleg)",Ukrainian,3,3,0,0,0,0,0
|
"Manuel Tassi (Mannivu)",Italian,5,6,0,0,0,0,0,"2021-01-03 11:00:33"
|
||||||
"Andrea Bianchi (andreawhite1597)",Italian,3,1,0,1,0,0,0
|
"Tomáš Hrabáček (Hrabyyy)",Czech,5,3,0,0,0,0,0,"2021-05-27 11:58:11"
|
||||||
"Gabriel Cavalcante (gabrielc.alves14)","Portuguese, Brazilian",3,4,0,0,0,0,0
|
"Guerra Ivaneth (rossanaiva-04)",Spanish,5,7,0,0,0,0,0,"2019-02-03 16:48:59"
|
||||||
REMOVED_USER,"Portuguese, Brazilian",3,4,0,0,0,0,0
|
"Дмитрий Хапенков (d.khapenkov)",Russian,5,5,0,6,4,0,2,"2018-01-06 23:00:43"
|
||||||
"Martin Zimdahl (zimdahlmartin)",Swedish,3,2,0,0,1,0,3
|
"Matthias Joly (joly.matt12)",French,5,8,0,27,1,0,0,"2017-08-28 09:53:59"
|
||||||
"Hiohana Rilary (hiohanarilary)","Portuguese, Brazilian",3,4,0,0,0,0,0
|
"Micaela Pighin (micaelapiighin)",Spanish,5,6,0,1,0,0,0,"2019-10-09 23:32:42"
|
||||||
"Sarath S (CyberShark)",Tamil,3,7,0,0,0,0,0
|
andriikozytskyi2018,Ukrainian,5,5,0,0,0,0,0,"2017-09-03 05:24:43"
|
||||||
"Cláudio Bernardo (claudiobernardo.ti)","Portuguese, Brazilian",3,4,0,1,0,0,0
|
marmo,German,4,4,0,0,0,0,0,"2021-01-13 01:16:35"
|
||||||
"hesamiranii (esam.matouri)",Persian,2,2,0,0,0,0,0
|
"Eli Besirov (elibesirov07)",Turkish,4,4,0,0,0,0,0,"2019-03-25 07:12:34"
|
||||||
"조화정 (yunjoo337)",Korean,2,2,0,0,0,0,0
|
"Lopo Isaac Fernández (rocapata)",Spanish,4,3,0,0,0,0,0,"2018-09-20 11:46:22"
|
||||||
"Walid Baazia (walidbaazia2005)",Arabic,2,1,0,0,0,0,0
|
bziuum,Polish,4,4,0,0,0,0,0,"2020-09-01 09:08:01"
|
||||||
LNDDYL,"Chinese Traditional",2,4,0,0,0,0,2
|
"Neko123 (emandic11)","Serbian (Cyrillic)",4,4,0,57,0,0,0,"2021-04-21 15:33:29"
|
||||||
REMOVED_USER,Ukrainian,2,2,0,0,0,0,0
|
Magidxz,Arabic,3,3,0,0,0,0,0,"2021-01-05 05:02:54"
|
||||||
"fatemeh s (fargolseifoori3)",Persian,2,2,0,0,0,0,0
|
"mohammadali barati (mabaraty)",Persian,3,3,0,0,0,0,0,"2021-07-10 05:54:44"
|
||||||
"أم محمد تقي (souadboudia19)",Arabic,2,2,0,0,0,0,0
|
"Sarath S (CyberShark)",Tamil,3,7,0,0,0,0,0,"2020-08-27 22:43:16"
|
||||||
"Alex Stein (diefaust1993)",Russian,2,2,0,4,4,0,2
|
"Unnie Here (Carb)",Hindi,3,8,0,0,0,0,0,"2020-03-18 23:34:35"
|
||||||
"Danial Agh (danialagh)",Persian,2,3,0,0,0,0,0
|
REMOVED_USER,"Portuguese, Brazilian",3,4,0,0,0,0,0,"2018-11-18 09:02:37"
|
||||||
omerfarukbas,Turkish,2,3,0,19,2,0,0
|
"Thoum Ptrgnt (thomas.petrignet)",French,3,3,0,2,0,3,0,"2017-09-23 19:25:52"
|
||||||
"Valerij D (vala.dobler)",German,2,2,0,0,0,0,0
|
"Oleg Kogut (kogut_oleg)",Ukrainian,3,3,0,0,0,0,0,"2018-12-28 14:31:02"
|
||||||
"Naveen jai krishna (njsbpolymer1)",Tamil,2,5,0,0,0,0,0
|
carsten_kafke,German,3,3,0,43,0,0,3,"2017-10-27 13:27:47"
|
||||||
"Balthazar Aubard (Balatzar)",French,2,5,0,0,1,0,0
|
"Vagner Roberto (vagner.trompete)","Portuguese, Brazilian",3,3,0,0,0,0,0,"2017-12-30 17:54:26"
|
||||||
"FAy FAy (fayfayfay52)","Chinese Traditional",2,5,0,0,0,0,0
|
"Igor Piskun (i_piskun)",Ukrainian,3,3,0,0,0,0,0,"2018-01-19 15:20:27"
|
||||||
Soroor_SI,Persian,2,2,0,0,0,0,0
|
"Andrea Bianchi (andreawhite1597)",Italian,3,1,0,1,0,0,0,"2018-01-21 17:45:48"
|
||||||
chavs1997,Russian,2,2,0,9,0,0,0
|
"Cláudio Bernardo (claudiobernardo.ti)","Portuguese, Brazilian",3,4,0,1,0,0,0,"2019-01-08 14:41:10"
|
||||||
amei,"Portuguese, Brazilian",2,2,0,0,0,0,0
|
"Hiohana Rilary (hiohanarilary)","Portuguese, Brazilian",3,4,0,0,0,0,0,"2019-07-31 20:42:20"
|
||||||
"Ilyas Fekhar (il47yas)",Arabic,2,2,0,0,0,0,0
|
"joabe gabriel (joabegabrielcma1)","Portuguese, Brazilian",3,4,0,0,0,0,0,"2018-08-21 09:08:59"
|
||||||
"Ali Zaida (alizaeda92)",Arabic,2,2,0,0,0,0,0
|
"Péter Bernát (bernatp)",Hungarian,3,2,0,0,0,0,0,"2019-11-30 15:50:33"
|
||||||
gnu-ewm,Polish,1,1,0,6,0,0,0
|
"Martin Zimdahl (zimdahlmartin)",Swedish,3,2,0,0,1,0,3,"2018-09-15 04:39:22"
|
||||||
"Luca Gori (grolcu)",Italian,1,2,0,0,0,0,0
|
"Gabriel Cavalcante (gabrielc.alves14)","Portuguese, Brazilian",3,4,0,0,0,0,0,"2018-08-06 22:24:54"
|
||||||
"Alan Jeon (skyisle)",Korean,1,2,0,8,0,0,0
|
atomjani,Hungarian,3,3,0,0,0,0,0,"2019-01-19 00:49:25"
|
||||||
iSoron2,"Portuguese, Brazilian",1,1,0,0,0,0,0
|
"أم محمد تقي (souadboudia19)",Arabic,2,2,0,0,0,0,0,"2020-06-13 15:24:17"
|
||||||
"Anastasiia Bondarenko (nastasya.bondarenko.97)",Russian,1,1,0,0,0,0,0
|
"FAy FAy (fayfayfay52)","Chinese Traditional",2,5,0,0,0,0,0,"2017-10-06 08:53:21"
|
||||||
"Patrick Pimenta (trickap1)","Portuguese, Brazilian",1,1,0,0,0,0,0
|
chavs1997,Russian,2,2,0,9,0,0,0,"2018-05-18 16:58:19"
|
||||||
axd,Spanish,1,1,0,15,0,0,0
|
Soroor_SI,Persian,2,2,0,0,0,0,0,"2018-06-10 06:28:27"
|
||||||
jonesses,German,1,1,0,1,0,0,1
|
"Ilyas Fekhar (il47yas)",Arabic,2,2,0,0,0,0,0,"2018-04-17 22:00:41"
|
||||||
"박찌 (perpact20)",Korean,1,1,0,0,0,0,0
|
"hesamiranii (esam.matouri)",Persian,2,2,0,0,0,0,0,"2018-09-22 16:33:36"
|
||||||
"Kan Black (kanblack.va)",Vietnamese,1,2,0,0,0,1,0
|
"fatemeh s (fargolseifoori3)",Persian,2,2,0,0,0,0,0,"2019-01-31 12:06:57"
|
||||||
REMOVED_USER,Russian,1,2,0,6,1,0,1
|
amei,"Portuguese, Brazilian",2,2,0,0,0,0,0,"2018-04-19 19:42:28"
|
||||||
"Wibi Cahyo (wbcahyoh)",Indonesian,1,3,0,0,0,0,0
|
"Naveen jai krishna (njsbpolymer1)",Tamil,2,5,0,0,0,0,0,"2020-01-10 14:19:41"
|
||||||
"Anton (tT0NG)","Chinese Traditional",1,2,0,0,0,0,1
|
"Danial Agh (danialagh)",Persian,2,3,0,0,0,0,0,"2019-03-30 13:24:16"
|
||||||
"Maria Fefelova (mashafefel)",Russian,1,1,0,0,0,0,0
|
"Walid Baazia (walidbaazia2005)",Arabic,2,1,0,0,0,0,0,"2021-01-27 12:47:34"
|
||||||
Itch,,0,0,0,0,0,0,0
|
"Ali Zaida (alizaeda92)",Arabic,2,2,0,0,0,0,0,"2019-12-01 11:47:00"
|
||||||
"Muhammet Furkan ALMACI (furkan.almaci)",Turkish,0,0,0,1,0,0,0
|
LNDDYL,"Chinese Traditional",2,4,0,0,0,0,2,"2018-04-22 04:00:19"
|
||||||
Sandhu564.,,0,0,0,0,0,0,0
|
"Ño Bí Tã (pt614553)",Arabic,2,8,0,1,0,0,0,"2021-05-22 20:41:01"
|
||||||
"Quentin Hibon (hiq)",,0,0,0,0,0,0,0
|
"Judith Ayala (Azul1612)",Spanish,2,1,0,0,0,1,0,"2021-05-18 17:07:19"
|
||||||
mushin,,0,0,0,0,0,0,0
|
REMOVED_USER,Ukrainian,2,2,0,0,0,0,0,"2017-06-15 12:24:44"
|
||||||
"Balaji Jayaraman (jkbalaji1103)",,0,0,0,0,0,0,0
|
"Valerij D (vala.dobler)",German,2,2,0,0,0,0,0,"2018-09-22 09:38:27"
|
||||||
"Wellington Ribeiro (wellington.rib)",,0,0,0,0,0,0,0
|
"Alex Stein (diefaust1993)",Russian,2,2,0,4,4,0,2,"2017-07-13 06:56:17"
|
||||||
"Javid IRAN (twitteriran98)",Persian,0,0,0,1,0,0,0
|
"조화정 (yunjoo337)",Korean,2,2,0,0,0,0,0,"2019-06-16 22:25:31"
|
||||||
"박인호 (wphestiraid)",Korean,0,0,0,2,0,0,0
|
omerfarukbas,Turkish,2,3,0,19,2,0,0,"2017-08-14 16:10:35"
|
||||||
"Ahmed Nazir (ahmednazir333)",,0,0,0,0,0,0,0
|
"Balthazar Aubard (Balatzar)",French,2,5,0,0,1,0,0,"2017-09-23 01:42:57"
|
||||||
dimateos,,0,0,0,0,0,0,0
|
"Luca Gori (grolcu)",Italian,1,2,0,0,0,0,0,"2020-09-26 23:26:15"
|
||||||
AhmedDz,Arabic,0,0,0,1,0,0,0
|
axd,Spanish,1,1,0,15,0,0,0,"2017-09-12 05:48:51"
|
||||||
"reza golestanzadeh (reza.golestanzadeh)",Persian,0,0,0,1,0,0,0
|
iSoron2,"Portuguese, Brazilian",1,1,0,0,0,0,0,"2017-03-18 17:56:29"
|
||||||
"Petros Bleyan (coolbleyan)",Russian,0,0,0,14,0,0,0
|
REMOVED_USER,Russian,1,2,0,6,1,0,1,"2019-12-26 05:37:01"
|
||||||
Kamalakannan,,0,0,0,0,0,0,0
|
"Wibi Cahyo (wbcahyoh)",Indonesian,1,3,0,0,0,0,0,"2017-12-14 06:35:58"
|
||||||
"Dagna Q (dagnaq)",,0,0,0,0,0,0,0
|
jonesses,German,1,1,0,1,0,0,1,"2021-01-01 08:03:18"
|
||||||
"Thomas Orlita (Thomas995)",Czech,0,0,0,1,0,0,0
|
"Anton (tT0NG)","Chinese Traditional",1,2,0,0,0,0,1,"2017-07-06 14:18:39"
|
||||||
Fazy1380,,0,0,0,0,0,0,0
|
"박찌 (perpact20)",Korean,1,1,0,0,0,0,0,"2018-02-10 10:11:44"
|
||||||
"Rivo Zängov (Eraser)",,0,0,0,0,0,0,0
|
"Alan Jeon (skyisle)",Korean,1,2,0,8,0,0,0,"2018-01-09 10:46:00"
|
||||||
T-v-Gerwen,Dutch,0,0,0,47,0,0,0
|
"Maria Fefelova (mashafefel)",Russian,1,1,0,0,0,0,0,"2019-05-18 02:03:56"
|
||||||
"عبد الناصر سعيد الثبيتي (asaeed)",,0,0,0,0,0,0,0
|
"Anastasiia Bondarenko (nastasya.bondarenko.97)",Russian,1,1,0,0,0,0,0,"2019-06-07 17:43:08"
|
||||||
"Edmunds Edmundam (edmundam)",,0,0,0,0,0,0,0
|
"Kan Black (kanblack.va)",Vietnamese,1,2,0,0,0,1,0,"2019-01-15 03:50:10"
|
||||||
"vi ve (VimalV)",,0,0,0,0,0,0,0
|
"Patrick Pimenta (trickap1)","Portuguese, Brazilian",1,1,0,0,0,0,0,"2018-12-01 14:31:21"
|
||||||
"LeMeD (LeMeS)",French,0,0,0,2,0,0,0
|
"Dagna Q (dagnaq)",,0,0,0,0,0,0,0,"2017-08-06 01:42:52"
|
||||||
"Éjbãss Übbeî (littlebittlebottle)",Norwegian,0,0,0,152,0,0,0
|
Kamalakannan,,0,0,0,0,0,0,0,"2017-05-14 11:40:23"
|
||||||
EmanAmini,,0,0,0,0,0,0,0
|
"Éjbãss Übbeî (littlebittlebottle)",Norwegian,0,0,0,152,0,0,0,"2017-07-05 21:12:02"
|
||||||
AnggaRifandi,,0,0,0,0,0,0,0
|
"Равиль Мифтахов (ravilmif47)",Russian,0,0,0,1,0,0,0,"2019-08-12 21:58:30"
|
||||||
"Mateusz Teteruk (mttet)",Polish,0,0,0,1,0,0,0
|
sanyoniket,,0,0,0,0,0,0,0,"2019-07-23 12:58:40"
|
||||||
"Lori Amico (lavodkaclyde2323)",Italian,0,0,0,1,0,0,0
|
REMOVED_USER,,0,0,0,0,0,0,0,"2020-02-01 03:47:48"
|
||||||
"Florian Stuhlmann (stuhlmann)",German,0,0,0,10,0,0,0
|
"vi ve (VimalV)",,0,0,0,0,0,0,0,"2021-02-08 02:35:45"
|
||||||
"Yasin Okumus (lacivert)",Turkish,0,0,0,1,0,0,0
|
"George Merkulov (george142.emarket)",Russian,0,0,0,11,0,0,0,"2019-06-09 19:47:02"
|
||||||
NairaDNV,Spanish,0,0,0,9,0,0,0
|
"Yasin Okumus (lacivert)",Turkish,0,0,0,1,0,0,0,"2018-02-07 04:13:51"
|
||||||
REMOVED_USER,,0,0,0,0,0,0,0
|
"Petros Bleyan (coolbleyan)",Russian,0,0,0,14,0,0,0,"2017-08-18 18:37:18"
|
||||||
farbod66,Persian,0,0,0,1,0,0,0
|
"LeMeD (LeMeS)",French,0,0,0,2,0,0,0,"2021-02-06 15:35:00"
|
||||||
Raulbertassi,,0,0,0,0,0,0,0
|
ava_rfie,Persian,0,0,0,1,0,0,0,"2019-06-09 16:19:24"
|
||||||
"Равиль Мифтахов (ravilmif47)",Russian,0,0,0,1,0,0,0
|
"Mateusz Teteruk (mttet)",Polish,0,0,0,1,0,0,0,"2021-01-23 13:09:59"
|
||||||
"Pumpith Ungsupanit (pumpithu)",,0,0,0,0,0,0,0
|
EwanB,,0,0,0,0,0,0,0,"2019-11-19 10:04:38"
|
||||||
"Nat Fomicheva (natac)",Russian,0,0,0,3,0,0,0
|
Fazy1380,,0,0,0,0,0,0,0,"2021-04-10 11:02:53"
|
||||||
EwanB,,0,0,0,0,0,0,0
|
"Lori Amico (lavodkaclyde2323)",Italian,0,0,0,1,0,0,0,"2017-04-09 10:08:13"
|
||||||
ava_rfie,Persian,0,0,0,1,0,0,0
|
"Florian Stuhlmann (stuhlmann)",German,0,0,0,10,0,0,0,"2017-04-15 04:04:00"
|
||||||
"George Merkulov (george142.emarket)",Russian,0,0,0,11,0,0,0
|
"عبد الناصر سعيد الثبيتي (asaeed)",,0,0,0,0,0,0,0,"2018-03-13 02:09:35"
|
||||||
REMOVED_USER,,0,0,0,0,0,0,0
|
"Rivo Zängov (Eraser)",,0,0,0,0,0,0,0,"2020-10-13 04:38:26"
|
||||||
sanyoniket,,0,0,0,0,0,0,0
|
Hayder21,,0,0,0,0,0,0,0,"2019-12-31 10:56:24"
|
||||||
"Shuvashish Sahoo (shuvashish76)",,0,0,0,0,0,0,0
|
T-v-Gerwen,Dutch,0,0,0,47,0,0,0,"2018-03-02 10:26:33"
|
||||||
martyaberger,,0,0,0,0,0,0,0
|
"Eduard Boboc (edi.boboc33)",Romanian,0,0,0,4,0,0,0,"2019-12-16 09:08:39"
|
||||||
"Карлен Шаухаев (KarlenShaukhaev)",,0,0,0,0,0,0,0
|
"Samuel Przeździęk (samek22)",Polish,0,0,0,1,0,0,0,"2021-08-01 00:49:01"
|
||||||
"Elmo (oberknecht)",,0,0,0,0,0,0,0
|
"Saiprasath B (Saiprasath)",,0,0,0,0,0,0,0,"2021-07-11 11:10:41"
|
||||||
Irsgram,Russian,0,0,0,1,0,0,0
|
shuvo786,,0,0,0,0,0,0,0,"2019-11-13 00:18:12"
|
||||||
"Matus Zdansky (matuszdansky)",,0,0,0,0,0,0,0
|
"Edmunds Edmundam (edmundam)",,0,0,0,0,0,0,0,"2020-06-01 14:18:18"
|
||||||
shuvo786,,0,0,0,0,0,0,0
|
Itch,,0,0,0,0,0,0,0,"2017-10-16 09:18:42"
|
||||||
"Eduard Boboc (edi.boboc33)",Romanian,0,0,0,4,0,0,0
|
"Manny Farsangy (manifarsangi)",Persian,0,0,0,12,0,0,0,"2021-08-10 05:32:28"
|
||||||
Hayder21,,0,0,0,0,0,0,0
|
"Matus Zdansky (matuszdansky)",,0,0,0,0,0,0,0,"2019-10-20 13:52:24"
|
||||||
AsadullahIlyas,,0,0,0,0,0,0,0
|
"Thomas Orlita (Thomas995)",Czech,0,0,0,1,0,0,0,"2017-12-24 04:08:27"
|
||||||
"Никита Карамов (nikita.karamoff)",Russian,0,0,0,10,0,0,0
|
Irsgram,Russian,0,0,0,1,0,0,0,"2019-09-30 16:42:20"
|
||||||
"Katherine Alexandra Flórez Ramírez (katherine.florez12)",Spanish,0,0,0,46,0,0,0
|
EmanAmini,,0,0,0,0,0,0,0,"2017-03-31 13:27:43"
|
||||||
mdrobulis,,0,0,0,0,0,0,0
|
mushin,,0,0,0,0,0,0,0,"2020-02-02 04:08:05"
|
||||||
"Eliška Roubalová (roubaeli)",Czech,0,0,0,6,0,0,0
|
"Elmo (oberknecht)",,0,0,0,0,0,0,0,"2020-04-16 08:45:50"
|
||||||
droidahmed,Arabic,0,0,0,7,0,0,0
|
AnggaRifandi,,0,0,0,0,0,0,0,"2017-03-31 19:28:35"
|
||||||
"Arjun K. (arjunkdot)",,0,0,0,0,0,0,0
|
"darkkingredian (rediancool)",,0,0,0,0,0,0,0,"2021-07-27 16:04:32"
|
||||||
"Sarah BCNN (fsarahboucenna)",French,0,0,0,16,0,0,0
|
"Sri Harsha Bhogi (sriharshabhogi)",,0,0,0,0,0,0,0,"2018-09-02 05:31:53"
|
||||||
REMOVED_USER,Czech,0,0,0,18,0,0,0
|
"Nat Fomicheva (natac)",Russian,0,0,0,3,0,0,0,"2019-01-25 14:35:02"
|
||||||
BongTran,Vietnamese,0,0,0,2,0,0,0
|
mdrobulis,,0,0,0,0,0,0,0,"2018-05-24 01:40:42"
|
||||||
"Arttu Ylhävuori (arttu.ylhavuori)",,0,0,0,0,0,0,0
|
"Sarah BCNN (fsarahboucenna)",French,0,0,0,16,0,0,0,"2018-02-11 11:07:36"
|
||||||
valney.faria,"Portuguese, Brazilian",0,0,0,1,0,0,0
|
"Arjun K. (arjunkdot)",,0,0,0,0,0,0,0,"2020-09-20 11:16:18"
|
||||||
REMOVED_USER,,0,0,0,0,0,0,0
|
REMOVED_USER,Czech,0,0,0,18,0,0,0,"2018-03-27 06:19:52"
|
||||||
rooban23,,0,0,0,0,0,0,0
|
martyaberger,,0,0,0,0,0,0,0,"2019-01-01 18:48:08"
|
||||||
REMOVED_USER,,0,0,0,0,0,0,0
|
BongTran,Vietnamese,0,0,0,2,0,0,0,"2018-04-24 05:16:07"
|
||||||
"Алтынбек Наурызғали (altinbeknaurizgali)",Russian,0,0,0,1,0,0,0
|
"Arttu Ylhävuori (arttu.ylhavuori)",,0,0,0,0,0,0,0,"2019-07-24 15:03:42"
|
||||||
"Sri Harsha Bhogi (sriharshabhogi)",,0,0,0,0,0,0,0
|
"Никита Карамов (nikita.karamoff)",Russian,0,0,0,10,0,0,0,"2018-10-29 03:57:21"
|
||||||
"Ahnaf Tajwar (atn4404)",,0,0,0,0,0,0,0
|
rooban23,,0,0,0,0,0,0,0,"2020-09-15 11:49:14"
|
||||||
Elham1361,,0,0,0,0,0,0,0
|
"Eliška Roubalová (roubaeli)",Czech,0,0,0,6,0,0,0,"2019-12-31 12:47:29"
|
||||||
dongchen.yue,German,0,0,0,4,0,0,0
|
valney.faria,"Portuguese, Brazilian",0,0,0,1,0,0,0,"2020-02-02 14:45:02"
|
||||||
philfr49,French,0,0,0,2,0,0,0
|
"Алтынбек Наурызғали (altinbeknaurizgali)",Russian,0,0,0,1,0,0,0,"2020-08-12 13:03:49"
|
||||||
|
REMOVED_USER,,0,0,0,0,0,0,0,"2018-10-27 15:34:36"
|
||||||
|
REMOVED_USER,,0,0,0,0,0,0,0,"2018-08-24 00:17:43"
|
||||||
|
Elham1361,,0,0,0,0,0,0,0,"2018-10-27 12:01:06"
|
||||||
|
dongchen.yue,German,0,0,0,4,0,0,0,"2020-09-12 15:05:59"
|
||||||
|
"Ahnaf Tajwar (atn4404)",,0,0,0,0,0,0,0,"2018-10-16 11:13:30"
|
||||||
|
AsadullahIlyas,,0,0,0,0,0,0,0,"2019-01-04 06:14:15"
|
||||||
|
droidahmed,Arabic,0,0,0,7,0,0,0,"2018-01-31 02:18:49"
|
||||||
|
philfr49,French,0,0,0,2,0,0,0,"2018-09-03 14:20:32"
|
||||||
|
"Ahmed Nazir (ahmednazir333)",,0,0,0,0,0,0,0,"2018-05-06 12:10:27"
|
||||||
|
"Balaji Jayaraman (jkbalaji1103)",,0,0,0,0,0,0,0,"2017-10-30 22:12:27"
|
||||||
|
"Wellington Ribeiro (wellington.rib)",,0,0,0,0,0,0,0,"2017-11-16 07:32:25"
|
||||||
|
"Javid IRAN (twitteriran98)",Persian,0,0,0,1,0,0,0,"2017-11-25 16:47:25"
|
||||||
|
"박인호 (wphestiraid)",Korean,0,0,0,2,0,0,0,"2018-01-05 00:33:14"
|
||||||
|
"Pumpith Ungsupanit (pumpithu)",,0,0,0,0,0,0,0,"2019-01-19 23:47:57"
|
||||||
|
Sandhu564.,,0,0,0,0,0,0,0,"2020-12-14 01:27:45"
|
||||||
|
"Quentin Hibon (hiq)",,0,0,0,0,0,0,0,"2021-02-07 16:39:31"
|
||||||
|
AhmedDz,Arabic,0,0,0,1,0,0,0,"2017-12-31 10:12:31"
|
||||||
|
"Shuvashish Sahoo (shuvashish76)",,0,0,0,0,0,0,0,"2020-09-17 09:10:09"
|
||||||
|
REMOVED_USER,,0,0,0,0,0,0,0,"2018-01-05 16:56:12"
|
||||||
|
NairaDNV,Spanish,0,0,0,9,0,0,0,"2018-01-05 19:10:33"
|
||||||
|
Raulbertassi,,0,0,0,0,0,0,0,"2018-01-07 17:23:18"
|
||||||
|
"Карлен Шаухаев (KarlenShaukhaev)",,0,0,0,0,0,0,0,"2020-04-27 08:53:49"
|
||||||
|
dimateos,,0,0,0,0,0,0,0,"2021-01-10 06:29:52"
|
||||||
|
"Katherine Alexandra Flórez Ramírez (katherine.florez12)",Spanish,0,0,0,46,0,0,0,"2018-01-20 02:18:32"
|
||||||
|
"reza golestanzadeh (reza.golestanzadeh)",Persian,0,0,0,1,0,0,0,"2020-10-21 12:07:20"
|
||||||
|
farbod66,Persian,0,0,0,1,0,0,0,"2018-01-20 11:04:23"
|
||||||
|
"Muhammet Furkan ALMACI (furkan.almaci)",Turkish,0,0,0,1,0,0,0,"2017-10-29 13:44:56"
|
||||||
|
|||||||
|
@@ -20,7 +20,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
id("com.github.triplet.play") version "3.2.0"
|
id("com.github.triplet.play") version "3.5.0"
|
||||||
id("com.android.application")
|
id("com.android.application")
|
||||||
id("org.jetbrains.kotlin.android")
|
id("org.jetbrains.kotlin.android")
|
||||||
id("org.jetbrains.kotlin.kapt")
|
id("org.jetbrains.kotlin.kapt")
|
||||||
@@ -37,8 +37,8 @@ android {
|
|||||||
compileSdkVersion(30)
|
compileSdkVersion(30)
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
versionCode(20001)
|
versionCode(20003)
|
||||||
versionName("2.0.1")
|
versionName("2.0.3")
|
||||||
minSdkVersion(23)
|
minSdkVersion(23)
|
||||||
targetSdkVersion(30)
|
targetSdkVersion(30)
|
||||||
applicationId("org.isoron.uhabits")
|
applicationId("org.isoron.uhabits")
|
||||||
@@ -88,11 +88,11 @@ android {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
val daggerVersion = "2.35.1"
|
val daggerVersion = "2.38.1"
|
||||||
val kotlinVersion = "1.5.0"
|
val kotlinVersion = "1.5.21"
|
||||||
val kxCoroutinesVersion = "1.4.2"
|
val kxCoroutinesVersion = "1.5.1"
|
||||||
val ktorVersion = "1.5.4"
|
val ktorVersion = "1.6.2"
|
||||||
val espressoVersion = "3.3.0"
|
val espressoVersion = "3.4.0"
|
||||||
|
|
||||||
androidTestImplementation("androidx.test.espresso:espresso-contrib:$espressoVersion")
|
androidTestImplementation("androidx.test.espresso:espresso-contrib:$espressoVersion")
|
||||||
androidTestImplementation("androidx.test.espresso:espresso-core:$espressoVersion")
|
androidTestImplementation("androidx.test.espresso:espresso-core:$espressoVersion")
|
||||||
@@ -101,9 +101,9 @@ dependencies {
|
|||||||
androidTestImplementation("io.ktor:ktor-client-mock:$ktorVersion")
|
androidTestImplementation("io.ktor:ktor-client-mock:$ktorVersion")
|
||||||
androidTestImplementation("io.ktor:ktor-jackson:$ktorVersion")
|
androidTestImplementation("io.ktor:ktor-jackson:$ktorVersion")
|
||||||
androidTestImplementation("androidx.annotation:annotation:1.2.0")
|
androidTestImplementation("androidx.annotation:annotation:1.2.0")
|
||||||
androidTestImplementation("androidx.test.ext:junit:1.1.2")
|
androidTestImplementation("androidx.test.ext:junit:1.1.3")
|
||||||
androidTestImplementation("androidx.test.uiautomator:uiautomator:2.2.0")
|
androidTestImplementation("androidx.test.uiautomator:uiautomator:2.2.0")
|
||||||
androidTestImplementation("androidx.test:rules:1.3.0")
|
androidTestImplementation("androidx.test:rules:1.4.0")
|
||||||
androidTestImplementation("com.nhaarman.mockitokotlin2:mockito-kotlin:2.2.0")
|
androidTestImplementation("com.nhaarman.mockitokotlin2:mockito-kotlin:2.2.0")
|
||||||
compileOnly("javax.annotation:jsr250-api:1.0")
|
compileOnly("javax.annotation:jsr250-api:1.0")
|
||||||
coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:1.1.5")
|
coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:1.1.5")
|
||||||
@@ -118,12 +118,12 @@ dependencies {
|
|||||||
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlinVersion")
|
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlinVersion")
|
||||||
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:$kxCoroutinesVersion")
|
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:$kxCoroutinesVersion")
|
||||||
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:$kxCoroutinesVersion")
|
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:$kxCoroutinesVersion")
|
||||||
implementation("androidx.appcompat:appcompat:1.2.0")
|
implementation("androidx.appcompat:appcompat:1.3.1")
|
||||||
implementation("androidx.legacy:legacy-preference-v14:1.0.0")
|
implementation("androidx.legacy:legacy-preference-v14:1.0.0")
|
||||||
implementation("androidx.legacy:legacy-support-v4:1.0.0")
|
implementation("androidx.legacy:legacy-support-v4:1.0.0")
|
||||||
implementation("com.google.android.material:material:1.3.0")
|
implementation("com.google.android.material:material:1.4.0")
|
||||||
implementation("com.google.zxing:core:3.4.1")
|
implementation("com.google.zxing:core:3.4.1")
|
||||||
implementation("com.opencsv:opencsv:5.4")
|
implementation("com.opencsv:opencsv:5.5.1")
|
||||||
implementation(project(":uhabits-core"))
|
implementation(project(":uhabits-core"))
|
||||||
kapt("com.google.dagger:dagger-compiler:$daggerVersion")
|
kapt("com.google.dagger:dagger-compiler:$daggerVersion")
|
||||||
kaptAndroidTest("com.google.dagger:dagger-compiler:$daggerVersion")
|
kaptAndroidTest("com.google.dagger:dagger-compiler:$daggerVersion")
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 6.9 KiB After Width: | Height: | Size: 7.6 KiB |
|
Before Width: | Height: | Size: 8.6 KiB After Width: | Height: | Size: 8.9 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
@@ -23,10 +23,10 @@ import org.isoron.uhabits.core.models.Entry.Companion.YES_MANUAL
|
|||||||
import org.isoron.uhabits.core.models.Frequency
|
import org.isoron.uhabits.core.models.Frequency
|
||||||
import org.isoron.uhabits.core.models.Frequency.Companion.DAILY
|
import org.isoron.uhabits.core.models.Frequency.Companion.DAILY
|
||||||
import org.isoron.uhabits.core.models.Habit
|
import org.isoron.uhabits.core.models.Habit
|
||||||
import org.isoron.uhabits.core.models.Habit.Companion.AT_LEAST
|
|
||||||
import org.isoron.uhabits.core.models.Habit.Companion.NUMBER_HABIT
|
|
||||||
import org.isoron.uhabits.core.models.HabitList
|
import org.isoron.uhabits.core.models.HabitList
|
||||||
|
import org.isoron.uhabits.core.models.HabitType
|
||||||
import org.isoron.uhabits.core.models.ModelFactory
|
import org.isoron.uhabits.core.models.ModelFactory
|
||||||
|
import org.isoron.uhabits.core.models.NumericalHabitType
|
||||||
import org.isoron.uhabits.core.models.PaletteColor
|
import org.isoron.uhabits.core.models.PaletteColor
|
||||||
import org.isoron.uhabits.core.models.Timestamp
|
import org.isoron.uhabits.core.models.Timestamp
|
||||||
import org.isoron.uhabits.core.utils.DateUtils.Companion.getToday
|
import org.isoron.uhabits.core.utils.DateUtils.Companion.getToday
|
||||||
@@ -102,8 +102,8 @@ class HabitFixtures(private val modelFactory: ModelFactory, private val habitLis
|
|||||||
val habit = modelFactory.buildHabit().apply {
|
val habit = modelFactory.buildHabit().apply {
|
||||||
name = "Read"
|
name = "Read"
|
||||||
question = "How many pages did you walk today?"
|
question = "How many pages did you walk today?"
|
||||||
type = NUMBER_HABIT
|
type = HabitType.NUMERICAL
|
||||||
targetType = AT_LEAST
|
targetType = NumericalHabitType.AT_LEAST
|
||||||
targetValue = 200.0
|
targetValue = 200.0
|
||||||
unit = "pages"
|
unit = "pages"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ import androidx.test.filters.MediumTest
|
|||||||
import org.isoron.uhabits.BaseViewTest
|
import org.isoron.uhabits.BaseViewTest
|
||||||
import org.isoron.uhabits.core.models.Habit
|
import org.isoron.uhabits.core.models.Habit
|
||||||
import org.isoron.uhabits.core.ui.screens.habits.show.views.ScoreCardPresenter.Companion.buildState
|
import org.isoron.uhabits.core.ui.screens.habits.show.views.ScoreCardPresenter.Companion.buildState
|
||||||
|
import org.isoron.uhabits.core.ui.views.LightTheme
|
||||||
import org.isoron.uhabits.utils.toFixedAndroidColor
|
import org.isoron.uhabits.utils.toFixedAndroidColor
|
||||||
import org.junit.Before
|
import org.junit.Before
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
@@ -39,7 +40,12 @@ class ScoreChartTest : BaseViewTest() {
|
|||||||
super.setUp()
|
super.setUp()
|
||||||
fixtures.purgeHabits(habitList)
|
fixtures.purgeHabits(habitList)
|
||||||
habit = fixtures.createLongHabit()
|
habit = fixtures.createLongHabit()
|
||||||
val state = buildState(habit, prefs.firstWeekdayInt, 0)
|
val state = buildState(
|
||||||
|
habit = habit,
|
||||||
|
firstWeekday = prefs.firstWeekdayInt,
|
||||||
|
spinnerPosition = 0,
|
||||||
|
theme = LightTheme(),
|
||||||
|
)
|
||||||
view = ScoreChart(targetContext).apply {
|
view = ScoreChart(targetContext).apply {
|
||||||
setScores(state.scores)
|
setScores(state.scores)
|
||||||
setColor(state.color.toFixedAndroidColor())
|
setColor(state.color.toFixedAndroidColor())
|
||||||
@@ -72,7 +78,7 @@ class ScoreChartTest : BaseViewTest() {
|
|||||||
@Test
|
@Test
|
||||||
@Throws(Throwable::class)
|
@Throws(Throwable::class)
|
||||||
fun testRender_withMonthlyBucket() {
|
fun testRender_withMonthlyBucket() {
|
||||||
val (scores, bucketSize) = buildState(habit, prefs.firstWeekdayInt, 2)
|
val (scores, bucketSize) = buildState(habit, prefs.firstWeekdayInt, 2, LightTheme())
|
||||||
view.setScores(scores)
|
view.setScores(scores)
|
||||||
view.setBucketSize(bucketSize)
|
view.setBucketSize(bucketSize)
|
||||||
view.invalidate()
|
view.invalidate()
|
||||||
@@ -89,7 +95,7 @@ class ScoreChartTest : BaseViewTest() {
|
|||||||
@Test
|
@Test
|
||||||
@Throws(Throwable::class)
|
@Throws(Throwable::class)
|
||||||
fun testRender_withYearlyBucket() {
|
fun testRender_withYearlyBucket() {
|
||||||
val state = buildState(habit, prefs.firstWeekdayInt, 4)
|
val state = buildState(habit, prefs.firstWeekdayInt, 4, LightTheme())
|
||||||
view.setScores(state.scores)
|
view.setScores(state.scores)
|
||||||
view.setBucketSize(state.bucketSize)
|
view.setBucketSize(state.bucketSize)
|
||||||
view.invalidate()
|
view.invalidate()
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ import androidx.test.filters.MediumTest
|
|||||||
import org.isoron.uhabits.BaseViewTest
|
import org.isoron.uhabits.BaseViewTest
|
||||||
import org.isoron.uhabits.R
|
import org.isoron.uhabits.R
|
||||||
import org.isoron.uhabits.core.ui.screens.habits.show.views.FrequencyCardPresenter
|
import org.isoron.uhabits.core.ui.screens.habits.show.views.FrequencyCardPresenter
|
||||||
|
import org.isoron.uhabits.core.ui.views.LightTheme
|
||||||
import org.junit.Before
|
import org.junit.Before
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
import org.junit.runner.RunWith
|
import org.junit.runner.RunWith
|
||||||
@@ -43,7 +44,13 @@ class FrequencyCardViewTest : BaseViewTest() {
|
|||||||
.from(targetContext)
|
.from(targetContext)
|
||||||
.inflate(R.layout.show_habit, null)
|
.inflate(R.layout.show_habit, null)
|
||||||
.findViewById<View>(R.id.frequencyCard) as FrequencyCardView
|
.findViewById<View>(R.id.frequencyCard) as FrequencyCardView
|
||||||
view.setState(FrequencyCardPresenter.buildState(habit = habit, firstWeekday = 0))
|
view.setState(
|
||||||
|
FrequencyCardPresenter.buildState(
|
||||||
|
habit = habit,
|
||||||
|
firstWeekday = 0,
|
||||||
|
theme = LightTheme(),
|
||||||
|
)
|
||||||
|
)
|
||||||
measureView(view, 800f, 600f)
|
measureView(view, 800f, 600f)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ import org.isoron.uhabits.BaseViewTest
|
|||||||
import org.isoron.uhabits.R
|
import org.isoron.uhabits.R
|
||||||
import org.isoron.uhabits.core.models.PaletteColor
|
import org.isoron.uhabits.core.models.PaletteColor
|
||||||
import org.isoron.uhabits.core.ui.screens.habits.show.views.OverviewCardState
|
import org.isoron.uhabits.core.ui.screens.habits.show.views.OverviewCardState
|
||||||
|
import org.isoron.uhabits.core.ui.views.LightTheme
|
||||||
import org.junit.Before
|
import org.junit.Before
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
import org.junit.runner.RunWith
|
import org.junit.runner.RunWith
|
||||||
@@ -50,6 +51,7 @@ class OverviewCardViewTest : BaseViewTest() {
|
|||||||
scoreYearDiff = 0.74f,
|
scoreYearDiff = 0.74f,
|
||||||
totalCount = 44,
|
totalCount = 44,
|
||||||
color = PaletteColor(7),
|
color = PaletteColor(7),
|
||||||
|
theme = LightTheme(),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
measureView(view, 800f, 300f)
|
measureView(view, 800f, 300f)
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ import androidx.test.filters.MediumTest
|
|||||||
import org.isoron.uhabits.BaseViewTest
|
import org.isoron.uhabits.BaseViewTest
|
||||||
import org.isoron.uhabits.R
|
import org.isoron.uhabits.R
|
||||||
import org.isoron.uhabits.core.ui.screens.habits.show.views.ScoreCardPresenter.Companion.buildState
|
import org.isoron.uhabits.core.ui.screens.habits.show.views.ScoreCardPresenter.Companion.buildState
|
||||||
|
import org.isoron.uhabits.core.ui.views.LightTheme
|
||||||
import org.junit.Before
|
import org.junit.Before
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
import org.junit.runner.RunWith
|
import org.junit.runner.RunWith
|
||||||
@@ -43,7 +44,14 @@ class ScoreCardViewTest : BaseViewTest() {
|
|||||||
.from(targetContext)
|
.from(targetContext)
|
||||||
.inflate(R.layout.show_habit, null)
|
.inflate(R.layout.show_habit, null)
|
||||||
.findViewById<View>(R.id.scoreCard) as ScoreCardView
|
.findViewById<View>(R.id.scoreCard) as ScoreCardView
|
||||||
view.setState(buildState(habit = habit, firstWeekday = 0, spinnerPosition = 0))
|
view.setState(
|
||||||
|
buildState(
|
||||||
|
habit = habit,
|
||||||
|
firstWeekday = 0,
|
||||||
|
spinnerPosition = 0,
|
||||||
|
theme = LightTheme(),
|
||||||
|
)
|
||||||
|
)
|
||||||
measureView(view, 800f, 600f)
|
measureView(view, 800f, 600f)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ import androidx.test.filters.MediumTest
|
|||||||
import org.isoron.uhabits.BaseViewTest
|
import org.isoron.uhabits.BaseViewTest
|
||||||
import org.isoron.uhabits.R
|
import org.isoron.uhabits.R
|
||||||
import org.isoron.uhabits.core.ui.screens.habits.show.views.StreakCardState
|
import org.isoron.uhabits.core.ui.screens.habits.show.views.StreakCardState
|
||||||
|
import org.isoron.uhabits.core.ui.views.LightTheme
|
||||||
import org.junit.Before
|
import org.junit.Before
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
import org.junit.runner.RunWith
|
import org.junit.runner.RunWith
|
||||||
@@ -47,6 +48,7 @@ class StreakCardViewTest : BaseViewTest() {
|
|||||||
StreakCardState(
|
StreakCardState(
|
||||||
bestStreaks = habit.streaks.getBest(10),
|
bestStreaks = habit.streaks.getBest(10),
|
||||||
color = habit.color,
|
color = habit.color,
|
||||||
|
theme = LightTheme(),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
measureView(view, 800f, 600f)
|
measureView(view, 800f, 600f)
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ import org.isoron.uhabits.core.models.PaletteColor
|
|||||||
import org.isoron.uhabits.core.models.Reminder
|
import org.isoron.uhabits.core.models.Reminder
|
||||||
import org.isoron.uhabits.core.models.WeekdayList.Companion.EVERY_DAY
|
import org.isoron.uhabits.core.models.WeekdayList.Companion.EVERY_DAY
|
||||||
import org.isoron.uhabits.core.ui.screens.habits.show.views.SubtitleCardState
|
import org.isoron.uhabits.core.ui.screens.habits.show.views.SubtitleCardState
|
||||||
|
import org.isoron.uhabits.core.ui.views.LightTheme
|
||||||
import org.junit.Before
|
import org.junit.Before
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
import org.junit.runner.RunWith
|
import org.junit.runner.RunWith
|
||||||
@@ -54,6 +55,7 @@ class SubtitleCardViewTest : BaseViewTest() {
|
|||||||
reminder = Reminder(8, 30, EVERY_DAY),
|
reminder = Reminder(8, 30, EVERY_DAY),
|
||||||
unit = "",
|
unit = "",
|
||||||
targetValue = 0.0,
|
targetValue = 0.0,
|
||||||
|
theme = LightTheme(),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
measureView(view, 800f, 200f)
|
measureView(view, 800f, 200f)
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ class CheckmarkWidgetViewTest : BaseViewTest() {
|
|||||||
name = habit.name
|
name = habit.name
|
||||||
}
|
}
|
||||||
view.refresh()
|
view.refresh()
|
||||||
measureView(view, dpToPixels(100), dpToPixels(200))
|
measureView(view, dpToPixels(100), dpToPixels(125))
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ class AndroidCanvas : Canvas {
|
|||||||
var innerDensity = 1.0
|
var innerDensity = 1.0
|
||||||
var innerWidth = 0
|
var innerWidth = 0
|
||||||
var innerHeight = 0
|
var innerHeight = 0
|
||||||
|
var mHeight = 15
|
||||||
|
|
||||||
var paint = Paint().apply {
|
var paint = Paint().apply {
|
||||||
isAntiAlias = true
|
isAntiAlias = true
|
||||||
@@ -64,11 +65,10 @@ class AndroidCanvas : Canvas {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun drawText(text: String, x: Double, y: Double) {
|
override fun drawText(text: String, x: Double, y: Double) {
|
||||||
textPaint.getTextBounds(text, 0, text.length, textBounds)
|
|
||||||
innerCanvas.drawText(
|
innerCanvas.drawText(
|
||||||
text,
|
text,
|
||||||
x.toDp(),
|
x.toDp(),
|
||||||
y.toDp() - textBounds.exactCenterY(),
|
y.toDp() + 0.6f * mHeight,
|
||||||
textPaint,
|
textPaint,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -126,10 +126,17 @@ class AndroidCanvas : Canvas {
|
|||||||
Font.BOLD -> Typeface.DEFAULT_BOLD
|
Font.BOLD -> Typeface.DEFAULT_BOLD
|
||||||
Font.FONT_AWESOME -> getFontAwesome(context)
|
Font.FONT_AWESOME -> getFontAwesome(context)
|
||||||
}
|
}
|
||||||
|
updateMHeight()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun setFontSize(size: Double) {
|
override fun setFontSize(size: Double) {
|
||||||
textPaint.textSize = size.toDp()
|
textPaint.textSize = size.toDp()
|
||||||
|
updateMHeight()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun updateMHeight() {
|
||||||
|
textPaint.getTextBounds("m", 0, 1, textBounds)
|
||||||
|
mHeight = textBounds.height()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun setStrokeWidth(size: Double) {
|
override fun setStrokeWidth(size: Double) {
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ import org.isoron.uhabits.core.preferences.Preferences
|
|||||||
import org.isoron.uhabits.core.ui.ThemeSwitcher
|
import org.isoron.uhabits.core.ui.ThemeSwitcher
|
||||||
import org.isoron.uhabits.core.ui.views.DarkTheme
|
import org.isoron.uhabits.core.ui.views.DarkTheme
|
||||||
import org.isoron.uhabits.core.ui.views.LightTheme
|
import org.isoron.uhabits.core.ui.views.LightTheme
|
||||||
|
import org.isoron.uhabits.core.ui.views.PureBlackTheme
|
||||||
import org.isoron.uhabits.core.ui.views.Theme
|
import org.isoron.uhabits.core.ui.views.Theme
|
||||||
import org.isoron.uhabits.inject.ActivityContext
|
import org.isoron.uhabits.inject.ActivityContext
|
||||||
import org.isoron.uhabits.inject.ActivityScope
|
import org.isoron.uhabits.inject.ActivityScope
|
||||||
@@ -66,7 +67,7 @@ constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun applyPureBlackTheme() {
|
override fun applyPureBlackTheme() {
|
||||||
currentTheme = DarkTheme()
|
currentTheme = PureBlackTheme()
|
||||||
context.setTheme(R.style.AppBaseThemeDark_PureBlack)
|
context.setTheme(R.style.AppBaseThemeDark_PureBlack)
|
||||||
(context as Activity).window.navigationBarColor =
|
(context as Activity).window.navigationBarColor =
|
||||||
ContextCompat.getColor(context, R.color.black)
|
ContextCompat.getColor(context, R.color.black)
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ import org.isoron.uhabits.BuildConfig
|
|||||||
import org.isoron.uhabits.R
|
import org.isoron.uhabits.R
|
||||||
import org.isoron.uhabits.core.models.PaletteColor
|
import org.isoron.uhabits.core.models.PaletteColor
|
||||||
import org.isoron.uhabits.databinding.AboutBinding
|
import org.isoron.uhabits.databinding.AboutBinding
|
||||||
|
import org.isoron.uhabits.utils.currentTheme
|
||||||
import org.isoron.uhabits.utils.setupToolbar
|
import org.isoron.uhabits.utils.setupToolbar
|
||||||
|
|
||||||
@SuppressLint("ViewConstructor")
|
@SuppressLint("ViewConstructor")
|
||||||
@@ -41,7 +42,8 @@ class AboutView(
|
|||||||
setupToolbar(
|
setupToolbar(
|
||||||
toolbar = binding.toolbar,
|
toolbar = binding.toolbar,
|
||||||
color = PaletteColor(11),
|
color = PaletteColor(11),
|
||||||
title = resources.getString(R.string.about)
|
title = resources.getString(R.string.about),
|
||||||
|
theme = currentTheme(),
|
||||||
)
|
)
|
||||||
val version = resources.getString(R.string.version_n)
|
val version = resources.getString(R.string.version_n)
|
||||||
binding.tvContributors.setOnClickListener { screen.showCodeContributorsWebsite() }
|
binding.tvContributors.setOnClickListener { screen.showCodeContributorsWebsite() }
|
||||||
|
|||||||
@@ -19,20 +19,21 @@
|
|||||||
package org.isoron.uhabits.activities.common.dialogs
|
package org.isoron.uhabits.activities.common.dialogs
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
import org.isoron.platform.gui.toInt
|
||||||
import org.isoron.uhabits.R
|
import org.isoron.uhabits.R
|
||||||
import org.isoron.uhabits.core.models.PaletteColor
|
import org.isoron.uhabits.core.models.PaletteColor
|
||||||
|
import org.isoron.uhabits.core.ui.views.Theme
|
||||||
import org.isoron.uhabits.inject.ActivityContext
|
import org.isoron.uhabits.inject.ActivityContext
|
||||||
import org.isoron.uhabits.inject.ActivityScope
|
import org.isoron.uhabits.inject.ActivityScope
|
||||||
import org.isoron.uhabits.utils.StyledResources
|
import org.isoron.uhabits.utils.StyledResources
|
||||||
import org.isoron.uhabits.utils.toThemedAndroidColor
|
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
@ActivityScope
|
@ActivityScope
|
||||||
class ColorPickerDialogFactory @Inject constructor(@param:ActivityContext private val context: Context) {
|
class ColorPickerDialogFactory @Inject constructor(@param:ActivityContext private val context: Context) {
|
||||||
fun create(color: PaletteColor): ColorPickerDialog {
|
fun create(color: PaletteColor, theme: Theme): ColorPickerDialog {
|
||||||
val dialog = ColorPickerDialog()
|
val dialog = ColorPickerDialog()
|
||||||
val res = StyledResources(context)
|
val res = StyledResources(context)
|
||||||
val androidColor = color.toThemedAndroidColor(context)
|
val androidColor = theme.color(color).toInt()
|
||||||
dialog.initialize(
|
dialog.initialize(
|
||||||
R.string.color_picker_default_title,
|
R.string.color_picker_default_title,
|
||||||
res.getPalette(),
|
res.getPalette(),
|
||||||
|
|||||||
@@ -160,26 +160,28 @@ class FrequencyPickerDialog(
|
|||||||
|
|
||||||
private fun populateViews() {
|
private fun populateViews() {
|
||||||
uncheckAll()
|
uncheckAll()
|
||||||
if (freqNumerator == 1) {
|
if (freqDenominator == 30 || freqDenominator == 31) {
|
||||||
if (freqDenominator == 1) {
|
contentView.xTimesPerMonthRadioButton.isChecked = true
|
||||||
contentView.everyDayRadioButton.isChecked = true
|
contentView.xTimesPerMonthTextView.setText(freqNumerator.toString())
|
||||||
} else {
|
focus(contentView.xTimesPerMonthTextView)
|
||||||
contentView.everyXDaysRadioButton.isChecked = true
|
|
||||||
contentView.everyXDaysTextView.setText(freqDenominator.toString())
|
|
||||||
focus(contentView.everyXDaysTextView)
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
if (freqDenominator == 7) {
|
if (freqNumerator == 1) {
|
||||||
contentView.xTimesPerWeekRadioButton.isChecked = true
|
if (freqDenominator == 1) {
|
||||||
contentView.xTimesPerWeekTextView.setText(freqNumerator.toString())
|
contentView.everyDayRadioButton.isChecked = true
|
||||||
focus(contentView.xTimesPerWeekTextView)
|
} else {
|
||||||
} else if (freqDenominator == 30 || freqDenominator == 31) {
|
contentView.everyXDaysRadioButton.isChecked = true
|
||||||
contentView.xTimesPerMonthRadioButton.isChecked = true
|
contentView.everyXDaysTextView.setText(freqDenominator.toString())
|
||||||
contentView.xTimesPerMonthTextView.setText(freqNumerator.toString())
|
focus(contentView.everyXDaysTextView)
|
||||||
focus(contentView.xTimesPerMonthTextView)
|
}
|
||||||
} else {
|
} else {
|
||||||
Log.w("FrequencyPickerDialog", "Unknown frequency: $freqNumerator/$freqDenominator")
|
if (freqDenominator == 7) {
|
||||||
contentView.everyDayRadioButton.isChecked = true
|
contentView.xTimesPerWeekRadioButton.isChecked = true
|
||||||
|
contentView.xTimesPerWeekTextView.setText(freqNumerator.toString())
|
||||||
|
focus(contentView.xTimesPerWeekTextView)
|
||||||
|
} else {
|
||||||
|
Log.w("FrequencyPickerDialog", "Unknown frequency: $freqNumerator/$freqDenominator")
|
||||||
|
contentView.everyDayRadioButton.isChecked = true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ class BundleSavedState : AbsSavedState {
|
|||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
val CREATOR: Parcelable.Creator<BundleSavedState> =
|
@JvmField val CREATOR: Parcelable.Creator<BundleSavedState> =
|
||||||
object : ClassLoaderCreator<BundleSavedState> {
|
object : ClassLoaderCreator<BundleSavedState> {
|
||||||
override fun createFromParcel(
|
override fun createFromParcel(
|
||||||
source: Parcel,
|
source: Parcel,
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ import org.isoron.uhabits.utils.InterfaceUtils.getFontAwesome
|
|||||||
import org.isoron.uhabits.utils.InterfaceUtils.spToPixels
|
import org.isoron.uhabits.utils.InterfaceUtils.spToPixels
|
||||||
import org.isoron.uhabits.utils.PaletteUtils.getAndroidTestColor
|
import org.isoron.uhabits.utils.PaletteUtils.getAndroidTestColor
|
||||||
import org.isoron.uhabits.utils.StyledResources
|
import org.isoron.uhabits.utils.StyledResources
|
||||||
|
import kotlin.math.max
|
||||||
import kotlin.math.min
|
import kotlin.math.min
|
||||||
import kotlin.math.roundToLong
|
import kotlin.math.roundToLong
|
||||||
|
|
||||||
@@ -48,7 +49,7 @@ class RingView : View {
|
|||||||
private var color: Int
|
private var color: Int
|
||||||
private var precision: Float
|
private var precision: Float
|
||||||
private var percentage: Float
|
private var percentage: Float
|
||||||
private var diameter = 0
|
private var diameter = 1
|
||||||
private var thickness: Float
|
private var thickness: Float
|
||||||
private var rect: RectF? = null
|
private var rect: RectF? = null
|
||||||
private var pRing: TextPaint? = null
|
private var pRing: TextPaint? = null
|
||||||
@@ -169,7 +170,7 @@ class RingView : View {
|
|||||||
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
|
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
|
||||||
val width = MeasureSpec.getSize(widthMeasureSpec)
|
val width = MeasureSpec.getSize(widthMeasureSpec)
|
||||||
val height = MeasureSpec.getSize(heightMeasureSpec)
|
val height = MeasureSpec.getSize(heightMeasureSpec)
|
||||||
diameter = min(height, width)
|
diameter = max(1, min(height, width))
|
||||||
pRing!!.textSize = textSize
|
pRing!!.textSize = textSize
|
||||||
em = pRing!!.measureText("M")
|
em = pRing!!.measureText("M")
|
||||||
setMeasuredDimension(diameter, diameter)
|
setMeasuredDimension(diameter, diameter)
|
||||||
|
|||||||
@@ -117,7 +117,11 @@ class TargetChart : View {
|
|||||||
barRect[rect.left + stop + padding, rect.top + baseSize * 0.05f, rect.right - padding] =
|
barRect[rect.left + stop + padding, rect.top + baseSize * 0.05f, rect.right - padding] =
|
||||||
rect.bottom - baseSize * 0.05f
|
rect.bottom - baseSize * 0.05f
|
||||||
canvas.drawRoundRect(barRect, round, round, paint!!)
|
canvas.drawRoundRect(barRect, round, round, paint!!)
|
||||||
var percentage = (values[row] / targets[row]).toFloat()
|
var percentage = if (targets[row] > 0) {
|
||||||
|
(values[row] / targets[row]).toFloat()
|
||||||
|
} else {
|
||||||
|
1.0f
|
||||||
|
}
|
||||||
percentage = min(1.0f, percentage)
|
percentage = min(1.0f, percentage)
|
||||||
|
|
||||||
// Draw completed box
|
// Draw completed box
|
||||||
|
|||||||
@@ -29,10 +29,10 @@ class TaskProgressBar(
|
|||||||
context: Context,
|
context: Context,
|
||||||
private val runner: TaskRunner
|
private val runner: TaskRunner
|
||||||
) : ProgressBar(
|
) : ProgressBar(
|
||||||
context,
|
context,
|
||||||
null,
|
null,
|
||||||
android.R.attr.progressBarStyleHorizontal
|
android.R.attr.progressBarStyleHorizontal
|
||||||
),
|
),
|
||||||
TaskRunner.Listener {
|
TaskRunner.Listener {
|
||||||
|
|
||||||
init {
|
init {
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ package org.isoron.uhabits.activities.habits.edit
|
|||||||
|
|
||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
import android.content.res.ColorStateList
|
import android.content.res.ColorStateList
|
||||||
|
import android.content.res.Resources
|
||||||
import android.graphics.Color
|
import android.graphics.Color
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.text.Html
|
import android.text.Html
|
||||||
@@ -39,6 +40,7 @@ import kotlinx.android.synthetic.main.activity_edit_habit.notesInput
|
|||||||
import kotlinx.android.synthetic.main.activity_edit_habit.questionInput
|
import kotlinx.android.synthetic.main.activity_edit_habit.questionInput
|
||||||
import kotlinx.android.synthetic.main.activity_edit_habit.targetInput
|
import kotlinx.android.synthetic.main.activity_edit_habit.targetInput
|
||||||
import kotlinx.android.synthetic.main.activity_edit_habit.unitInput
|
import kotlinx.android.synthetic.main.activity_edit_habit.unitInput
|
||||||
|
import org.isoron.platform.gui.toInt
|
||||||
import org.isoron.uhabits.HabitsApplication
|
import org.isoron.uhabits.HabitsApplication
|
||||||
import org.isoron.uhabits.R
|
import org.isoron.uhabits.R
|
||||||
import org.isoron.uhabits.activities.AndroidThemeSwitcher
|
import org.isoron.uhabits.activities.AndroidThemeSwitcher
|
||||||
@@ -50,6 +52,8 @@ import org.isoron.uhabits.core.commands.CreateHabitCommand
|
|||||||
import org.isoron.uhabits.core.commands.EditHabitCommand
|
import org.isoron.uhabits.core.commands.EditHabitCommand
|
||||||
import org.isoron.uhabits.core.models.Frequency
|
import org.isoron.uhabits.core.models.Frequency
|
||||||
import org.isoron.uhabits.core.models.Habit
|
import org.isoron.uhabits.core.models.Habit
|
||||||
|
import org.isoron.uhabits.core.models.HabitType
|
||||||
|
import org.isoron.uhabits.core.models.NumericalHabitType
|
||||||
import org.isoron.uhabits.core.models.PaletteColor
|
import org.isoron.uhabits.core.models.PaletteColor
|
||||||
import org.isoron.uhabits.core.models.Reminder
|
import org.isoron.uhabits.core.models.Reminder
|
||||||
import org.isoron.uhabits.core.models.WeekdayList
|
import org.isoron.uhabits.core.models.WeekdayList
|
||||||
@@ -57,7 +61,16 @@ import org.isoron.uhabits.databinding.ActivityEditHabitBinding
|
|||||||
import org.isoron.uhabits.utils.ColorUtils
|
import org.isoron.uhabits.utils.ColorUtils
|
||||||
import org.isoron.uhabits.utils.formatTime
|
import org.isoron.uhabits.utils.formatTime
|
||||||
import org.isoron.uhabits.utils.toFormattedString
|
import org.isoron.uhabits.utils.toFormattedString
|
||||||
import org.isoron.uhabits.utils.toThemedAndroidColor
|
|
||||||
|
fun formatFrequency(freqNum: Int, freqDen: Int, resources: Resources) = when {
|
||||||
|
freqNum == 1 && (freqDen == 30 || freqDen == 31) -> resources.getString(R.string.every_month)
|
||||||
|
freqDen == 30 || freqDen == 31 -> resources.getString(R.string.x_times_per_month, freqNum)
|
||||||
|
freqNum == 1 && freqDen == 1 -> resources.getString(R.string.every_day)
|
||||||
|
freqNum == 1 && freqDen == 7 -> resources.getString(R.string.every_week)
|
||||||
|
freqNum == 1 && freqDen > 1 -> resources.getString(R.string.every_x_days, freqDen)
|
||||||
|
freqDen == 7 -> resources.getString(R.string.x_times_per_week, freqNum)
|
||||||
|
else -> "$freqNum/$freqDen"
|
||||||
|
}
|
||||||
|
|
||||||
class EditHabitActivity : AppCompatActivity() {
|
class EditHabitActivity : AppCompatActivity() {
|
||||||
|
|
||||||
@@ -66,7 +79,7 @@ class EditHabitActivity : AppCompatActivity() {
|
|||||||
private lateinit var commandRunner: CommandRunner
|
private lateinit var commandRunner: CommandRunner
|
||||||
|
|
||||||
var habitId = -1L
|
var habitId = -1L
|
||||||
var habitType = -1
|
lateinit var habitType: HabitType
|
||||||
var unit = ""
|
var unit = ""
|
||||||
var color = PaletteColor(11)
|
var color = PaletteColor(11)
|
||||||
var androidColor = 0
|
var androidColor = 0
|
||||||
@@ -105,12 +118,12 @@ class EditHabitActivity : AppCompatActivity() {
|
|||||||
binding.unitInput.setText(habit.unit)
|
binding.unitInput.setText(habit.unit)
|
||||||
binding.targetInput.setText(habit.targetValue.toString())
|
binding.targetInput.setText(habit.targetValue.toString())
|
||||||
} else {
|
} else {
|
||||||
habitType = intent.getIntExtra("habitType", Habit.YES_NO_HABIT)
|
habitType = HabitType.fromInt(intent.getIntExtra("habitType", HabitType.YES_NO.value))
|
||||||
}
|
}
|
||||||
|
|
||||||
if (state != null) {
|
if (state != null) {
|
||||||
habitId = state.getLong("habitId")
|
habitId = state.getLong("habitId")
|
||||||
habitType = state.getInt("habitType")
|
habitType = HabitType.fromInt(state.getInt("habitType"))
|
||||||
color = PaletteColor(state.getInt("paletteColor"))
|
color = PaletteColor(state.getInt("paletteColor"))
|
||||||
freqNum = state.getInt("freqNum")
|
freqNum = state.getInt("freqNum")
|
||||||
freqDen = state.getInt("freqDen")
|
freqDen = state.getInt("freqDen")
|
||||||
@@ -121,13 +134,16 @@ class EditHabitActivity : AppCompatActivity() {
|
|||||||
|
|
||||||
updateColors()
|
updateColors()
|
||||||
|
|
||||||
if (habitType == Habit.YES_NO_HABIT) {
|
when (habitType) {
|
||||||
binding.unitOuterBox.visibility = View.GONE
|
HabitType.YES_NO -> {
|
||||||
binding.targetOuterBox.visibility = View.GONE
|
binding.unitOuterBox.visibility = View.GONE
|
||||||
} else {
|
binding.targetOuterBox.visibility = View.GONE
|
||||||
binding.nameInput.hint = getString(R.string.measurable_short_example)
|
}
|
||||||
binding.questionInput.hint = getString(R.string.measurable_question_example)
|
HabitType.NUMERICAL -> {
|
||||||
binding.frequencyOuterBox.visibility = View.GONE
|
binding.nameInput.hint = getString(R.string.measurable_short_example)
|
||||||
|
binding.questionInput.hint = getString(R.string.measurable_question_example)
|
||||||
|
binding.frequencyOuterBox.visibility = View.GONE
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
setSupportActionBar(binding.toolbar)
|
setSupportActionBar(binding.toolbar)
|
||||||
@@ -137,7 +153,7 @@ class EditHabitActivity : AppCompatActivity() {
|
|||||||
|
|
||||||
val colorPickerDialogFactory = ColorPickerDialogFactory(this)
|
val colorPickerDialogFactory = ColorPickerDialogFactory(this)
|
||||||
binding.colorButton.setOnClickListener {
|
binding.colorButton.setOnClickListener {
|
||||||
val dialog = colorPickerDialogFactory.create(color)
|
val dialog = colorPickerDialogFactory.create(color, themeSwitcher.currentTheme)
|
||||||
dialog.setListener { paletteColor ->
|
dialog.setListener { paletteColor ->
|
||||||
this.color = paletteColor
|
this.color = paletteColor
|
||||||
updateColors()
|
updateColors()
|
||||||
@@ -244,9 +260,9 @@ class EditHabitActivity : AppCompatActivity() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
habit.frequency = Frequency(freqNum, freqDen)
|
habit.frequency = Frequency(freqNum, freqDen)
|
||||||
if (habitType == Habit.NUMBER_HABIT) {
|
if (habitType == HabitType.NUMERICAL) {
|
||||||
habit.targetValue = targetInput.text.toString().toDouble()
|
habit.targetValue = targetInput.text.toString().toDouble()
|
||||||
habit.targetType = Habit.AT_LEAST
|
habit.targetType = NumericalHabitType.AT_LEAST
|
||||||
habit.unit = unitInput.text.trim().toString()
|
habit.unit = unitInput.text.trim().toString()
|
||||||
}
|
}
|
||||||
habit.type = habitType
|
habit.type = habitType
|
||||||
@@ -274,7 +290,7 @@ class EditHabitActivity : AppCompatActivity() {
|
|||||||
nameInput.error = getFormattedValidationError(R.string.validation_cannot_be_blank)
|
nameInput.error = getFormattedValidationError(R.string.validation_cannot_be_blank)
|
||||||
isValid = false
|
isValid = false
|
||||||
}
|
}
|
||||||
if (habitType == Habit.NUMBER_HABIT) {
|
if (habitType == HabitType.NUMERICAL) {
|
||||||
if (targetInput.text.isEmpty()) {
|
if (targetInput.text.isEmpty()) {
|
||||||
targetInput.error = getString(R.string.validation_cannot_be_blank)
|
targetInput.error = getString(R.string.validation_cannot_be_blank)
|
||||||
isValid = false
|
isValid = false
|
||||||
@@ -299,14 +315,7 @@ class EditHabitActivity : AppCompatActivity() {
|
|||||||
|
|
||||||
@SuppressLint("StringFormatMatches")
|
@SuppressLint("StringFormatMatches")
|
||||||
private fun populateFrequency() {
|
private fun populateFrequency() {
|
||||||
binding.booleanFrequencyPicker.text = when {
|
binding.booleanFrequencyPicker.text = formatFrequency(freqNum, freqDen, resources)
|
||||||
freqNum == 1 && freqDen == 1 -> getString(R.string.every_day)
|
|
||||||
freqNum == 1 && freqDen == 7 -> getString(R.string.every_week)
|
|
||||||
freqNum == 1 && freqDen > 1 -> getString(R.string.every_x_days, freqDen)
|
|
||||||
freqDen == 7 -> getString(R.string.x_times_per_week, freqNum)
|
|
||||||
freqDen == 30 || freqDen == 31 -> getString(R.string.x_times_per_month, freqNum)
|
|
||||||
else -> "$freqNum/$freqDen"
|
|
||||||
}
|
|
||||||
binding.numericalFrequencyPicker.text = when (freqDen) {
|
binding.numericalFrequencyPicker.text = when (freqDen) {
|
||||||
1 -> getString(R.string.every_day)
|
1 -> getString(R.string.every_day)
|
||||||
7 -> getString(R.string.every_week)
|
7 -> getString(R.string.every_week)
|
||||||
@@ -316,7 +325,7 @@ class EditHabitActivity : AppCompatActivity() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun updateColors() {
|
private fun updateColors() {
|
||||||
androidColor = color.toThemedAndroidColor(this)
|
androidColor = themeSwitcher.currentTheme.color(color).toInt()
|
||||||
binding.colorButton.backgroundTintList = ColorStateList.valueOf(androidColor)
|
binding.colorButton.backgroundTintList = ColorStateList.valueOf(androidColor)
|
||||||
if (!themeSwitcher.isNightMode) {
|
if (!themeSwitcher.isNightMode) {
|
||||||
val darkerAndroidColor = ColorUtils.mixColors(Color.BLACK, androidColor, 0.15f)
|
val darkerAndroidColor = ColorUtils.mixColors(Color.BLACK, androidColor, 0.15f)
|
||||||
@@ -334,7 +343,7 @@ class EditHabitActivity : AppCompatActivity() {
|
|||||||
super.onSaveInstanceState(state)
|
super.onSaveInstanceState(state)
|
||||||
with(state) {
|
with(state) {
|
||||||
putLong("habitId", habitId)
|
putLong("habitId", habitId)
|
||||||
putInt("habitType", habitType)
|
putInt("habitType", habitType.value)
|
||||||
putInt("paletteColor", color.paletteIndex)
|
putInt("paletteColor", color.paletteIndex)
|
||||||
putInt("androidColor", androidColor)
|
putInt("androidColor", androidColor)
|
||||||
putInt("freqNum", freqNum)
|
putInt("freqNum", freqNum)
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ import android.view.View
|
|||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import androidx.appcompat.app.AppCompatDialogFragment
|
import androidx.appcompat.app.AppCompatDialogFragment
|
||||||
import org.isoron.uhabits.R
|
import org.isoron.uhabits.R
|
||||||
import org.isoron.uhabits.core.models.Habit
|
import org.isoron.uhabits.core.models.HabitType
|
||||||
import org.isoron.uhabits.databinding.SelectHabitTypeBinding
|
import org.isoron.uhabits.databinding.SelectHabitTypeBinding
|
||||||
import org.isoron.uhabits.intents.IntentFactory
|
import org.isoron.uhabits.intents.IntentFactory
|
||||||
|
|
||||||
@@ -40,13 +40,13 @@ class HabitTypeDialog : AppCompatDialogFragment() {
|
|||||||
val binding = SelectHabitTypeBinding.inflate(inflater, container, false)
|
val binding = SelectHabitTypeBinding.inflate(inflater, container, false)
|
||||||
|
|
||||||
binding.buttonYesNo.setOnClickListener {
|
binding.buttonYesNo.setOnClickListener {
|
||||||
val intent = IntentFactory().startEditActivity(activity!!, Habit.YES_NO_HABIT)
|
val intent = IntentFactory().startEditActivity(activity!!, HabitType.YES_NO.value)
|
||||||
startActivity(intent)
|
startActivity(intent)
|
||||||
dismiss()
|
dismiss()
|
||||||
}
|
}
|
||||||
|
|
||||||
binding.buttonMeasurable.setOnClickListener {
|
binding.buttonMeasurable.setOnClickListener {
|
||||||
val intent = IntentFactory().startEditActivity(activity!!, Habit.NUMBER_HABIT)
|
val intent = IntentFactory().startEditActivity(activity!!, HabitType.NUMERICAL.value)
|
||||||
startActivity(intent)
|
startActivity(intent)
|
||||||
dismiss()
|
dismiss()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ import org.isoron.uhabits.inject.ActivityContextModule
|
|||||||
import org.isoron.uhabits.inject.DaggerHabitsActivityComponent
|
import org.isoron.uhabits.inject.DaggerHabitsActivityComponent
|
||||||
import org.isoron.uhabits.utils.restartWithFade
|
import org.isoron.uhabits.utils.restartWithFade
|
||||||
|
|
||||||
class ListHabitsActivity : AppCompatActivity() {
|
class ListHabitsActivity : AppCompatActivity(), Preferences.Listener {
|
||||||
|
|
||||||
var pureBlack: Boolean = false
|
var pureBlack: Boolean = false
|
||||||
lateinit var taskRunner: TaskRunner
|
lateinit var taskRunner: TaskRunner
|
||||||
@@ -54,6 +54,10 @@ class ListHabitsActivity : AppCompatActivity() {
|
|||||||
|
|
||||||
private lateinit var menu: ListHabitsMenu
|
private lateinit var menu: ListHabitsMenu
|
||||||
|
|
||||||
|
override fun onQuestionMarksChanged() {
|
||||||
|
invalidateOptionsMenu()
|
||||||
|
}
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
|
|
||||||
@@ -66,6 +70,7 @@ class ListHabitsActivity : AppCompatActivity() {
|
|||||||
component.themeSwitcher.apply()
|
component.themeSwitcher.apply()
|
||||||
|
|
||||||
prefs = appComponent.preferences
|
prefs = appComponent.preferences
|
||||||
|
prefs.addListener(this)
|
||||||
syncManager = appComponent.syncManager
|
syncManager = appComponent.syncManager
|
||||||
pureBlack = prefs.isPureBlackEnabled
|
pureBlack = prefs.isPureBlackEnabled
|
||||||
midnightTimer = appComponent.midnightTimer
|
midnightTimer = appComponent.midnightTimer
|
||||||
|
|||||||
@@ -52,6 +52,11 @@ class ListHabitsMenu @Inject constructor(
|
|||||||
nightModeItem.isChecked = themeSwitcher.isNightMode
|
nightModeItem.isChecked = themeSwitcher.isNightMode
|
||||||
hideArchivedItem.isChecked = !preferences.showArchived
|
hideArchivedItem.isChecked = !preferences.showArchived
|
||||||
hideCompletedItem.isChecked = !preferences.showCompleted
|
hideCompletedItem.isChecked = !preferences.showCompleted
|
||||||
|
if (preferences.areQuestionMarksEnabled || preferences.isSkipEnabled) {
|
||||||
|
hideCompletedItem.title = activity.resources.getString(R.string.hide_entered)
|
||||||
|
} else {
|
||||||
|
hideCompletedItem.title = activity.resources.getString(R.string.hide_completed)
|
||||||
|
}
|
||||||
updateArrows(menu)
|
updateArrows(menu)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ import org.isoron.uhabits.utils.addAtBottom
|
|||||||
import org.isoron.uhabits.utils.addAtTop
|
import org.isoron.uhabits.utils.addAtTop
|
||||||
import org.isoron.uhabits.utils.addBelow
|
import org.isoron.uhabits.utils.addBelow
|
||||||
import org.isoron.uhabits.utils.buildToolbar
|
import org.isoron.uhabits.utils.buildToolbar
|
||||||
|
import org.isoron.uhabits.utils.currentTheme
|
||||||
import org.isoron.uhabits.utils.dim
|
import org.isoron.uhabits.utils.dim
|
||||||
import org.isoron.uhabits.utils.dp
|
import org.isoron.uhabits.utils.dp
|
||||||
import org.isoron.uhabits.utils.setupToolbar
|
import org.isoron.uhabits.utils.setupToolbar
|
||||||
@@ -93,6 +94,7 @@ class ListHabitsRootView @Inject constructor(
|
|||||||
title = resources.getString(R.string.main_activity_title),
|
title = resources.getString(R.string.main_activity_title),
|
||||||
color = PaletteColor(17),
|
color = PaletteColor(17),
|
||||||
displayHomeAsUpEnabled = false,
|
displayHomeAsUpEnabled = false,
|
||||||
|
theme = currentTheme(),
|
||||||
)
|
)
|
||||||
addView(rootView, MATCH_PARENT, MATCH_PARENT)
|
addView(rootView, MATCH_PARENT, MATCH_PARENT)
|
||||||
listAdapter.setListView(listView)
|
listAdapter.setListView(listView)
|
||||||
|
|||||||
@@ -231,7 +231,7 @@ class ListHabitsScreen
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun showColorPicker(defaultColor: PaletteColor, callback: OnColorPickedCallback) {
|
override fun showColorPicker(defaultColor: PaletteColor, callback: OnColorPickedCallback) {
|
||||||
val picker = colorPickerFactory.create(defaultColor)
|
val picker = colorPickerFactory.create(defaultColor, themeSwitcher.currentTheme!!)
|
||||||
picker.setListener(callback)
|
picker.setListener(callback)
|
||||||
picker.show(activity.supportFragmentManager, "picker")
|
picker.show(activity.supportFragmentManager, "picker")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -131,7 +131,7 @@ class CheckmarkButtonView(
|
|||||||
paint.color = when (value) {
|
paint.color = when (value) {
|
||||||
YES_MANUAL, YES_AUTO, SKIP -> color
|
YES_MANUAL, YES_AUTO, SKIP -> color
|
||||||
NO -> {
|
NO -> {
|
||||||
if (preferences.areQuestionMarksEnabled()) mediumContrastColor
|
if (preferences.areQuestionMarksEnabled) mediumContrastColor
|
||||||
else lowContrastColor
|
else lowContrastColor
|
||||||
}
|
}
|
||||||
else -> lowContrastColor
|
else -> lowContrastColor
|
||||||
@@ -140,7 +140,7 @@ class CheckmarkButtonView(
|
|||||||
SKIP -> R.string.fa_skipped
|
SKIP -> R.string.fa_skipped
|
||||||
NO -> R.string.fa_times
|
NO -> R.string.fa_times
|
||||||
UNKNOWN -> {
|
UNKNOWN -> {
|
||||||
if (preferences.areQuestionMarksEnabled()) R.string.fa_question
|
if (preferences.areQuestionMarksEnabled) R.string.fa_question
|
||||||
else R.string.fa_times
|
else R.string.fa_times
|
||||||
}
|
}
|
||||||
else -> R.string.fa_check
|
else -> R.string.fa_check
|
||||||
@@ -153,7 +153,7 @@ class CheckmarkButtonView(
|
|||||||
paint.style = Paint.Style.FILL
|
paint.style = Paint.Style.FILL
|
||||||
}
|
}
|
||||||
|
|
||||||
paint.textSize = when (value) {
|
paint.textSize = when (id) {
|
||||||
UNKNOWN -> dim(R.dimen.smallerTextSize)
|
UNKNOWN -> dim(R.dimen.smallerTextSize)
|
||||||
else -> dim(R.dimen.smallTextSize)
|
else -> dim(R.dimen.smallTextSize)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
|
|||||||
import android.widget.FrameLayout
|
import android.widget.FrameLayout
|
||||||
import android.widget.LinearLayout
|
import android.widget.LinearLayout
|
||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
|
import org.isoron.platform.gui.toInt
|
||||||
import org.isoron.uhabits.R
|
import org.isoron.uhabits.R
|
||||||
import org.isoron.uhabits.activities.common.views.RingView
|
import org.isoron.uhabits.activities.common.views.RingView
|
||||||
import org.isoron.uhabits.core.models.Habit
|
import org.isoron.uhabits.core.models.Habit
|
||||||
@@ -41,9 +42,9 @@ import org.isoron.uhabits.core.models.Timestamp
|
|||||||
import org.isoron.uhabits.core.ui.screens.habits.list.ListHabitsBehavior
|
import org.isoron.uhabits.core.ui.screens.habits.list.ListHabitsBehavior
|
||||||
import org.isoron.uhabits.core.utils.DateUtils
|
import org.isoron.uhabits.core.utils.DateUtils
|
||||||
import org.isoron.uhabits.inject.ActivityContext
|
import org.isoron.uhabits.inject.ActivityContext
|
||||||
|
import org.isoron.uhabits.utils.currentTheme
|
||||||
import org.isoron.uhabits.utils.dp
|
import org.isoron.uhabits.utils.dp
|
||||||
import org.isoron.uhabits.utils.sres
|
import org.isoron.uhabits.utils.sres
|
||||||
import org.isoron.uhabits.utils.toThemedAndroidColor
|
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
class HabitCardViewFactory
|
class HabitCardViewFactory
|
||||||
@@ -213,7 +214,7 @@ class HabitCardView(
|
|||||||
fun getActiveColor(habit: Habit): Int {
|
fun getActiveColor(habit: Habit): Int {
|
||||||
return when (habit.isArchived) {
|
return when (habit.isArchived) {
|
||||||
true -> sres.getColor(R.attr.contrast60)
|
true -> sres.getColor(R.attr.contrast60)
|
||||||
false -> habit.color.toThemedAndroidColor(context)
|
false -> currentTheme().color(habit.color).toInt()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -169,7 +169,7 @@ class NumberButtonView(
|
|||||||
typeface = BOLD_TYPEFACE
|
typeface = BOLD_TYPEFACE
|
||||||
textSize = dim(R.dimen.smallTextSize)
|
textSize = dim(R.dimen.smallTextSize)
|
||||||
}
|
}
|
||||||
preferences.areQuestionMarksEnabled() -> {
|
preferences.areQuestionMarksEnabled -> {
|
||||||
label = resources.getString(R.string.fa_question)
|
label = resources.getString(R.string.fa_question)
|
||||||
typeface = getFontAwesome()
|
typeface = getFontAwesome()
|
||||||
textSize = dim(R.dimen.smallerTextSize)
|
textSize = dim(R.dimen.smallerTextSize)
|
||||||
|
|||||||
@@ -35,7 +35,12 @@ class ShowHabitView(context: Context) : FrameLayout(context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun setState(data: ShowHabitState) {
|
fun setState(data: ShowHabitState) {
|
||||||
setupToolbar(binding.toolbar, title = data.title, color = data.color)
|
setupToolbar(
|
||||||
|
binding.toolbar,
|
||||||
|
title = data.title,
|
||||||
|
color = data.color,
|
||||||
|
theme = data.theme,
|
||||||
|
)
|
||||||
binding.subtitleCard.setState(data.subtitle)
|
binding.subtitleCard.setState(data.subtitle)
|
||||||
binding.overviewCard.setState(data.overview)
|
binding.overviewCard.setState(data.overview)
|
||||||
binding.notesCard.setState(data.notes)
|
binding.notesCard.setState(data.notes)
|
||||||
|
|||||||
@@ -24,12 +24,12 @@ import android.view.LayoutInflater
|
|||||||
import android.view.View
|
import android.view.View
|
||||||
import android.widget.AdapterView
|
import android.widget.AdapterView
|
||||||
import android.widget.LinearLayout
|
import android.widget.LinearLayout
|
||||||
|
import org.isoron.platform.gui.toInt
|
||||||
import org.isoron.platform.time.JavaLocalDateFormatter
|
import org.isoron.platform.time.JavaLocalDateFormatter
|
||||||
import org.isoron.uhabits.core.ui.screens.habits.show.views.BarCardPresenter
|
import org.isoron.uhabits.core.ui.screens.habits.show.views.BarCardPresenter
|
||||||
import org.isoron.uhabits.core.ui.screens.habits.show.views.BarCardState
|
import org.isoron.uhabits.core.ui.screens.habits.show.views.BarCardState
|
||||||
import org.isoron.uhabits.core.ui.views.BarChart
|
import org.isoron.uhabits.core.ui.views.BarChart
|
||||||
import org.isoron.uhabits.databinding.ShowHabitBarBinding
|
import org.isoron.uhabits.databinding.ShowHabitBarBinding
|
||||||
import org.isoron.uhabits.utils.toThemedAndroidColor
|
|
||||||
import java.util.Locale
|
import java.util.Locale
|
||||||
|
|
||||||
class BarCardView(context: Context, attrs: AttributeSet) : LinearLayout(context, attrs) {
|
class BarCardView(context: Context, attrs: AttributeSet) : LinearLayout(context, attrs) {
|
||||||
@@ -37,7 +37,7 @@ class BarCardView(context: Context, attrs: AttributeSet) : LinearLayout(context,
|
|||||||
private var binding = ShowHabitBarBinding.inflate(LayoutInflater.from(context), this)
|
private var binding = ShowHabitBarBinding.inflate(LayoutInflater.from(context), this)
|
||||||
|
|
||||||
fun setState(state: BarCardState) {
|
fun setState(state: BarCardState) {
|
||||||
val androidColor = state.color.toThemedAndroidColor(context)
|
val androidColor = state.theme.color(state.color).toInt()
|
||||||
binding.chart.view = BarChart(state.theme, JavaLocalDateFormatter(Locale.US)).apply {
|
binding.chart.view = BarChart(state.theme, JavaLocalDateFormatter(Locale.US)).apply {
|
||||||
series = mutableListOf(state.entries.map { it.value / 1000.0 })
|
series = mutableListOf(state.entries.map { it.value / 1000.0 })
|
||||||
colors = mutableListOf(theme.color(state.color.paletteIndex))
|
colors = mutableListOf(theme.color(state.color.paletteIndex))
|
||||||
|
|||||||
@@ -22,16 +22,16 @@ import android.content.Context
|
|||||||
import android.util.AttributeSet
|
import android.util.AttributeSet
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.widget.LinearLayout
|
import android.widget.LinearLayout
|
||||||
|
import org.isoron.platform.gui.toInt
|
||||||
import org.isoron.uhabits.core.ui.screens.habits.show.views.FrequencyCardState
|
import org.isoron.uhabits.core.ui.screens.habits.show.views.FrequencyCardState
|
||||||
import org.isoron.uhabits.databinding.ShowHabitFrequencyBinding
|
import org.isoron.uhabits.databinding.ShowHabitFrequencyBinding
|
||||||
import org.isoron.uhabits.utils.toThemedAndroidColor
|
|
||||||
|
|
||||||
class FrequencyCardView(context: Context, attrs: AttributeSet) : LinearLayout(context, attrs) {
|
class FrequencyCardView(context: Context, attrs: AttributeSet) : LinearLayout(context, attrs) {
|
||||||
|
|
||||||
private var binding = ShowHabitFrequencyBinding.inflate(LayoutInflater.from(context), this)
|
private var binding = ShowHabitFrequencyBinding.inflate(LayoutInflater.from(context), this)
|
||||||
|
|
||||||
fun setState(state: FrequencyCardState) {
|
fun setState(state: FrequencyCardState) {
|
||||||
val androidColor = state.color.toThemedAndroidColor(context)
|
val androidColor = state.theme.color(state.color).toInt()
|
||||||
binding.frequencyChart.setFrequency(state.frequency)
|
binding.frequencyChart.setFrequency(state.frequency)
|
||||||
binding.frequencyChart.setFirstWeekday(state.firstWeekday)
|
binding.frequencyChart.setFirstWeekday(state.firstWeekday)
|
||||||
binding.title.setTextColor(androidColor)
|
binding.title.setTextColor(androidColor)
|
||||||
|
|||||||
@@ -22,12 +22,12 @@ import android.content.Context
|
|||||||
import android.util.AttributeSet
|
import android.util.AttributeSet
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.widget.LinearLayout
|
import android.widget.LinearLayout
|
||||||
|
import org.isoron.platform.gui.toInt
|
||||||
import org.isoron.platform.time.JavaLocalDateFormatter
|
import org.isoron.platform.time.JavaLocalDateFormatter
|
||||||
import org.isoron.uhabits.core.ui.screens.habits.show.views.HistoryCardPresenter
|
import org.isoron.uhabits.core.ui.screens.habits.show.views.HistoryCardPresenter
|
||||||
import org.isoron.uhabits.core.ui.screens.habits.show.views.HistoryCardState
|
import org.isoron.uhabits.core.ui.screens.habits.show.views.HistoryCardState
|
||||||
import org.isoron.uhabits.core.ui.views.HistoryChart
|
import org.isoron.uhabits.core.ui.views.HistoryChart
|
||||||
import org.isoron.uhabits.databinding.ShowHabitHistoryBinding
|
import org.isoron.uhabits.databinding.ShowHabitHistoryBinding
|
||||||
import org.isoron.uhabits.utils.toThemedAndroidColor
|
|
||||||
import java.util.Locale
|
import java.util.Locale
|
||||||
|
|
||||||
class HistoryCardView(context: Context, attrs: AttributeSet) : LinearLayout(context, attrs) {
|
class HistoryCardView(context: Context, attrs: AttributeSet) : LinearLayout(context, attrs) {
|
||||||
@@ -35,7 +35,7 @@ class HistoryCardView(context: Context, attrs: AttributeSet) : LinearLayout(cont
|
|||||||
private var binding = ShowHabitHistoryBinding.inflate(LayoutInflater.from(context), this)
|
private var binding = ShowHabitHistoryBinding.inflate(LayoutInflater.from(context), this)
|
||||||
|
|
||||||
fun setState(state: HistoryCardState) {
|
fun setState(state: HistoryCardState) {
|
||||||
val androidColor = state.color.toThemedAndroidColor(context)
|
val androidColor = state.theme.color(state.color).toInt()
|
||||||
binding.title.setTextColor(androidColor)
|
binding.title.setTextColor(androidColor)
|
||||||
binding.chart.view = HistoryChart(
|
binding.chart.view = HistoryChart(
|
||||||
today = state.today,
|
today = state.today,
|
||||||
|
|||||||
@@ -22,11 +22,11 @@ import android.content.Context
|
|||||||
import android.util.AttributeSet
|
import android.util.AttributeSet
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.widget.LinearLayout
|
import android.widget.LinearLayout
|
||||||
|
import org.isoron.platform.gui.toInt
|
||||||
import org.isoron.uhabits.R
|
import org.isoron.uhabits.R
|
||||||
import org.isoron.uhabits.core.ui.screens.habits.show.views.OverviewCardState
|
import org.isoron.uhabits.core.ui.screens.habits.show.views.OverviewCardState
|
||||||
import org.isoron.uhabits.databinding.ShowHabitOverviewBinding
|
import org.isoron.uhabits.databinding.ShowHabitOverviewBinding
|
||||||
import org.isoron.uhabits.utils.StyledResources
|
import org.isoron.uhabits.utils.StyledResources
|
||||||
import org.isoron.uhabits.utils.toThemedAndroidColor
|
|
||||||
import kotlin.math.abs
|
import kotlin.math.abs
|
||||||
|
|
||||||
class OverviewCardView(context: Context, attrs: AttributeSet) : LinearLayout(context, attrs) {
|
class OverviewCardView(context: Context, attrs: AttributeSet) : LinearLayout(context, attrs) {
|
||||||
@@ -42,7 +42,7 @@ class OverviewCardView(context: Context, attrs: AttributeSet) : LinearLayout(con
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun setState(state: OverviewCardState) {
|
fun setState(state: OverviewCardState) {
|
||||||
val androidColor = state.color.toThemedAndroidColor(context)
|
val androidColor = state.theme.color(state.color).toInt()
|
||||||
val res = StyledResources(context)
|
val res = StyledResources(context)
|
||||||
val inactiveColor = res.getColor(R.attr.contrast60)
|
val inactiveColor = res.getColor(R.attr.contrast60)
|
||||||
binding.monthDiffLabel.setTextColor(if (state.scoreMonthDiff >= 0) androidColor else inactiveColor)
|
binding.monthDiffLabel.setTextColor(if (state.scoreMonthDiff >= 0) androidColor else inactiveColor)
|
||||||
|
|||||||
@@ -24,16 +24,16 @@ import android.view.LayoutInflater
|
|||||||
import android.view.View
|
import android.view.View
|
||||||
import android.widget.AdapterView
|
import android.widget.AdapterView
|
||||||
import android.widget.LinearLayout
|
import android.widget.LinearLayout
|
||||||
|
import org.isoron.platform.gui.toInt
|
||||||
import org.isoron.uhabits.core.ui.screens.habits.show.views.ScoreCardPresenter
|
import org.isoron.uhabits.core.ui.screens.habits.show.views.ScoreCardPresenter
|
||||||
import org.isoron.uhabits.core.ui.screens.habits.show.views.ScoreCardState
|
import org.isoron.uhabits.core.ui.screens.habits.show.views.ScoreCardState
|
||||||
import org.isoron.uhabits.databinding.ShowHabitScoreBinding
|
import org.isoron.uhabits.databinding.ShowHabitScoreBinding
|
||||||
import org.isoron.uhabits.utils.toThemedAndroidColor
|
|
||||||
|
|
||||||
class ScoreCardView(context: Context, attrs: AttributeSet) : LinearLayout(context, attrs) {
|
class ScoreCardView(context: Context, attrs: AttributeSet) : LinearLayout(context, attrs) {
|
||||||
private var binding = ShowHabitScoreBinding.inflate(LayoutInflater.from(context), this)
|
private var binding = ShowHabitScoreBinding.inflate(LayoutInflater.from(context), this)
|
||||||
|
|
||||||
fun setState(state: ScoreCardState) {
|
fun setState(state: ScoreCardState) {
|
||||||
val androidColor = state.color.toThemedAndroidColor(context)
|
val androidColor = state.theme.color(state.color).toInt()
|
||||||
binding.title.setTextColor(androidColor)
|
binding.title.setTextColor(androidColor)
|
||||||
binding.spinner.setSelection(state.spinnerPosition)
|
binding.spinner.setSelection(state.spinnerPosition)
|
||||||
binding.scoreView.setScores(state.scores)
|
binding.scoreView.setScores(state.scores)
|
||||||
|
|||||||
@@ -22,16 +22,16 @@ import android.content.Context
|
|||||||
import android.util.AttributeSet
|
import android.util.AttributeSet
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.widget.LinearLayout
|
import android.widget.LinearLayout
|
||||||
|
import org.isoron.platform.gui.toInt
|
||||||
import org.isoron.uhabits.core.ui.screens.habits.show.views.StreakCardState
|
import org.isoron.uhabits.core.ui.screens.habits.show.views.StreakCardState
|
||||||
import org.isoron.uhabits.databinding.ShowHabitStreakBinding
|
import org.isoron.uhabits.databinding.ShowHabitStreakBinding
|
||||||
import org.isoron.uhabits.utils.toThemedAndroidColor
|
|
||||||
|
|
||||||
class StreakCardView(context: Context, attrs: AttributeSet) : LinearLayout(context, attrs) {
|
class StreakCardView(context: Context, attrs: AttributeSet) : LinearLayout(context, attrs) {
|
||||||
private val binding = ShowHabitStreakBinding.inflate(LayoutInflater.from(context), this)
|
private val binding = ShowHabitStreakBinding.inflate(LayoutInflater.from(context), this)
|
||||||
fun setState(state: StreakCardState) {
|
fun setState(state: StreakCardState) {
|
||||||
val color = state.color.toThemedAndroidColor(context)
|
val androidColor = state.theme.color(state.color).toInt()
|
||||||
binding.title.setTextColor(color)
|
binding.title.setTextColor(androidColor)
|
||||||
binding.streakChart.setColor(color)
|
binding.streakChart.setColor(androidColor)
|
||||||
binding.streakChart.setStreaks(state.bestStreaks)
|
binding.streakChart.setStreaks(state.bestStreaks)
|
||||||
postInvalidate()
|
postInvalidate()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,19 +20,18 @@ package org.isoron.uhabits.activities.habits.show.views
|
|||||||
|
|
||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.res.Resources
|
|
||||||
import android.util.AttributeSet
|
import android.util.AttributeSet
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.widget.LinearLayout
|
import android.widget.LinearLayout
|
||||||
|
import org.isoron.platform.gui.toInt
|
||||||
import org.isoron.uhabits.R
|
import org.isoron.uhabits.R
|
||||||
|
import org.isoron.uhabits.activities.habits.edit.formatFrequency
|
||||||
import org.isoron.uhabits.activities.habits.list.views.toShortString
|
import org.isoron.uhabits.activities.habits.list.views.toShortString
|
||||||
import org.isoron.uhabits.core.models.Frequency
|
|
||||||
import org.isoron.uhabits.core.ui.screens.habits.show.views.SubtitleCardState
|
import org.isoron.uhabits.core.ui.screens.habits.show.views.SubtitleCardState
|
||||||
import org.isoron.uhabits.databinding.ShowHabitSubtitleBinding
|
import org.isoron.uhabits.databinding.ShowHabitSubtitleBinding
|
||||||
import org.isoron.uhabits.utils.InterfaceUtils
|
import org.isoron.uhabits.utils.InterfaceUtils
|
||||||
import org.isoron.uhabits.utils.formatTime
|
import org.isoron.uhabits.utils.formatTime
|
||||||
import org.isoron.uhabits.utils.toThemedAndroidColor
|
|
||||||
|
|
||||||
class SubtitleCardView(context: Context, attrs: AttributeSet) : LinearLayout(context, attrs) {
|
class SubtitleCardView(context: Context, attrs: AttributeSet) : LinearLayout(context, attrs) {
|
||||||
|
|
||||||
@@ -47,9 +46,13 @@ class SubtitleCardView(context: Context, attrs: AttributeSet) : LinearLayout(con
|
|||||||
|
|
||||||
@SuppressLint("SetTextI18n")
|
@SuppressLint("SetTextI18n")
|
||||||
fun setState(state: SubtitleCardState) {
|
fun setState(state: SubtitleCardState) {
|
||||||
val color = state.color.toThemedAndroidColor(context)
|
val color = state.theme.color(state.color).toInt()
|
||||||
val reminder = state.reminder
|
val reminder = state.reminder
|
||||||
binding.frequencyLabel.text = state.frequency.format(resources)
|
binding.frequencyLabel.text = formatFrequency(
|
||||||
|
state.frequency.numerator,
|
||||||
|
state.frequency.denominator,
|
||||||
|
resources,
|
||||||
|
)
|
||||||
binding.questionLabel.setTextColor(color)
|
binding.questionLabel.setTextColor(color)
|
||||||
binding.questionLabel.text = state.question
|
binding.questionLabel.text = state.question
|
||||||
binding.reminderLabel.text = if (reminder != null) {
|
binding.reminderLabel.text = if (reminder != null) {
|
||||||
@@ -72,32 +75,4 @@ class SubtitleCardView(context: Context, attrs: AttributeSet) : LinearLayout(con
|
|||||||
|
|
||||||
postInvalidate()
|
postInvalidate()
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressLint("StringFormatMatches")
|
|
||||||
private fun Frequency.format(resources: Resources): String {
|
|
||||||
val num = this.numerator
|
|
||||||
val den = this.denominator
|
|
||||||
if (num == den) {
|
|
||||||
return resources.getString(R.string.every_day)
|
|
||||||
}
|
|
||||||
if (den == 7) {
|
|
||||||
return resources.getString(R.string.x_times_per_week, num)
|
|
||||||
}
|
|
||||||
if (den == 30 || den == 31) {
|
|
||||||
return resources.getString(R.string.x_times_per_month, num)
|
|
||||||
}
|
|
||||||
if (num == 1) {
|
|
||||||
if (den == 7) {
|
|
||||||
return resources.getString(R.string.every_week)
|
|
||||||
}
|
|
||||||
if (den % 7 == 0) {
|
|
||||||
return resources.getString(R.string.every_x_weeks, den / 7)
|
|
||||||
}
|
|
||||||
if (den == 30 || den == 31) {
|
|
||||||
return resources.getString(R.string.every_month)
|
|
||||||
}
|
|
||||||
return resources.getString(R.string.every_x_days, den)
|
|
||||||
}
|
|
||||||
return "$num/$den"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,15 +23,15 @@ import android.content.res.Resources
|
|||||||
import android.util.AttributeSet
|
import android.util.AttributeSet
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.widget.LinearLayout
|
import android.widget.LinearLayout
|
||||||
|
import org.isoron.platform.gui.toInt
|
||||||
import org.isoron.uhabits.R
|
import org.isoron.uhabits.R
|
||||||
import org.isoron.uhabits.core.ui.screens.habits.show.views.TargetCardState
|
import org.isoron.uhabits.core.ui.screens.habits.show.views.TargetCardState
|
||||||
import org.isoron.uhabits.databinding.ShowHabitTargetBinding
|
import org.isoron.uhabits.databinding.ShowHabitTargetBinding
|
||||||
import org.isoron.uhabits.utils.toThemedAndroidColor
|
|
||||||
|
|
||||||
class TargetCardView(context: Context, attrs: AttributeSet) : LinearLayout(context, attrs) {
|
class TargetCardView(context: Context, attrs: AttributeSet) : LinearLayout(context, attrs) {
|
||||||
private val binding = ShowHabitTargetBinding.inflate(LayoutInflater.from(context), this)
|
private val binding = ShowHabitTargetBinding.inflate(LayoutInflater.from(context), this)
|
||||||
fun setState(state: TargetCardState) {
|
fun setState(state: TargetCardState) {
|
||||||
val androidColor = state.color.toThemedAndroidColor(context)
|
val androidColor = state.theme.color(state.color).toInt()
|
||||||
binding.targetChart.setValues(state.values)
|
binding.targetChart.setValues(state.values)
|
||||||
binding.targetChart.setTargets(state.targets)
|
binding.targetChart.setTargets(state.targets)
|
||||||
binding.targetChart.setLabels(state.intervals.map { intervalToLabel(resources, it) })
|
binding.targetChart.setLabels(state.intervals.map { intervalToLabel(resources, it) })
|
||||||
|
|||||||
@@ -32,13 +32,15 @@ class SettingsActivity : AppCompatActivity() {
|
|||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
val component = (application as HabitsApplication).component
|
val component = (application as HabitsApplication).component
|
||||||
AndroidThemeSwitcher(this, component.preferences).apply()
|
val themeSwitcher = AndroidThemeSwitcher(this, component.preferences)
|
||||||
|
themeSwitcher.apply()
|
||||||
|
|
||||||
val binding = SettingsActivityBinding.inflate(LayoutInflater.from(this))
|
val binding = SettingsActivityBinding.inflate(LayoutInflater.from(this))
|
||||||
binding.root.setupToolbar(
|
binding.root.setupToolbar(
|
||||||
toolbar = binding.toolbar,
|
toolbar = binding.toolbar,
|
||||||
title = resources.getString(R.string.settings),
|
title = resources.getString(R.string.settings),
|
||||||
color = PaletteColor(11),
|
color = PaletteColor(11),
|
||||||
|
theme = themeSwitcher.currentTheme,
|
||||||
)
|
)
|
||||||
setContentView(binding.root)
|
setContentView(binding.root)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -57,7 +57,8 @@ class SyncActivity : AppCompatActivity(), SyncBehavior.Screen {
|
|||||||
val component = (application as HabitsApplication).component
|
val component = (application as HabitsApplication).component
|
||||||
val preferences = component.preferences
|
val preferences = component.preferences
|
||||||
val server = RemoteSyncServer(preferences = preferences)
|
val server = RemoteSyncServer(preferences = preferences)
|
||||||
AndroidThemeSwitcher(this, component.preferences).apply()
|
val themeSwitcher = AndroidThemeSwitcher(this, component.preferences)
|
||||||
|
themeSwitcher.apply()
|
||||||
|
|
||||||
behavior = SyncBehavior(this, preferences, server, component.logging)
|
behavior = SyncBehavior(this, preferences, server, component.logging)
|
||||||
binding = ActivitySyncBinding.inflate(layoutInflater)
|
binding = ActivitySyncBinding.inflate(layoutInflater)
|
||||||
@@ -66,6 +67,7 @@ class SyncActivity : AppCompatActivity(), SyncBehavior.Screen {
|
|||||||
toolbar = binding.toolbar,
|
toolbar = binding.toolbar,
|
||||||
color = PaletteColor(11),
|
color = PaletteColor(11),
|
||||||
title = resources.getString(R.string.device_sync),
|
title = resources.getString(R.string.device_sync),
|
||||||
|
theme = themeSwitcher.currentTheme,
|
||||||
)
|
)
|
||||||
binding.syncLink.setOnClickListener { copyToClipboard() }
|
binding.syncLink.setOnClickListener { copyToClipboard() }
|
||||||
binding.instructions.text = Html.fromHtml(resources.getString(R.string.sync_instructions))
|
binding.instructions.text = Html.fromHtml(resources.getString(R.string.sync_instructions))
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ import org.isoron.uhabits.core.models.Habit
|
|||||||
import org.isoron.uhabits.core.models.HabitList
|
import org.isoron.uhabits.core.models.HabitList
|
||||||
import org.isoron.uhabits.core.models.PaletteColor
|
import org.isoron.uhabits.core.models.PaletteColor
|
||||||
import org.isoron.uhabits.databinding.AutomationBinding
|
import org.isoron.uhabits.databinding.AutomationBinding
|
||||||
|
import org.isoron.uhabits.utils.currentTheme
|
||||||
import org.isoron.uhabits.utils.setupToolbar
|
import org.isoron.uhabits.utils.setupToolbar
|
||||||
import java.util.LinkedList
|
import java.util.LinkedList
|
||||||
|
|
||||||
@@ -53,6 +54,7 @@ class EditSettingRootView(
|
|||||||
title = resources.getString(R.string.app_name),
|
title = resources.getString(R.string.app_name),
|
||||||
color = PaletteColor(11),
|
color = PaletteColor(11),
|
||||||
displayHomeAsUpEnabled = false,
|
displayHomeAsUpEnabled = false,
|
||||||
|
theme = currentTheme(),
|
||||||
)
|
)
|
||||||
populateHabitSpinner()
|
populateHabitSpinner()
|
||||||
binding.habitSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
|
binding.habitSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
|
||||||
|
|||||||
@@ -63,13 +63,14 @@ class PendingIntentFactory
|
|||||||
FLAG_UPDATE_CURRENT
|
FLAG_UPDATE_CURRENT
|
||||||
)
|
)
|
||||||
|
|
||||||
fun removeRepetition(habit: Habit): PendingIntent =
|
fun removeRepetition(habit: Habit, timestamp: Timestamp?): PendingIntent =
|
||||||
getBroadcast(
|
getBroadcast(
|
||||||
context,
|
context,
|
||||||
3,
|
3,
|
||||||
Intent(context, WidgetReceiver::class.java).apply {
|
Intent(context, WidgetReceiver::class.java).apply {
|
||||||
action = WidgetReceiver.ACTION_REMOVE_REPETITION
|
action = WidgetReceiver.ACTION_REMOVE_REPETITION
|
||||||
data = Uri.parse(habit.uriString)
|
data = Uri.parse(habit.uriString)
|
||||||
|
if (timestamp != null) putExtra("timestamp", timestamp.unixTime)
|
||||||
},
|
},
|
||||||
FLAG_UPDATE_CURRENT
|
FLAG_UPDATE_CURRENT
|
||||||
)
|
)
|
||||||
@@ -132,17 +133,17 @@ class PendingIntentFactory
|
|||||||
timestamp: Long?
|
timestamp: Long?
|
||||||
):
|
):
|
||||||
PendingIntent =
|
PendingIntent =
|
||||||
getBroadcast(
|
getBroadcast(
|
||||||
widgetContext,
|
widgetContext,
|
||||||
2,
|
2,
|
||||||
Intent(widgetContext, WidgetReceiver::class.java).apply {
|
Intent(widgetContext, WidgetReceiver::class.java).apply {
|
||||||
data = Uri.parse(habit.uriString)
|
data = Uri.parse(habit.uriString)
|
||||||
action = WidgetReceiver.ACTION_SET_NUMERICAL_VALUE
|
action = WidgetReceiver.ACTION_SET_NUMERICAL_VALUE
|
||||||
putExtra("numericalValue", numericalValue)
|
putExtra("numericalValue", numericalValue)
|
||||||
if (timestamp != null) putExtra("timestamp", timestamp)
|
if (timestamp != null) putExtra("timestamp", timestamp)
|
||||||
},
|
},
|
||||||
FLAG_UPDATE_CURRENT
|
FLAG_UPDATE_CURRENT
|
||||||
)
|
)
|
||||||
|
|
||||||
fun updateWidgets(): PendingIntent =
|
fun updateWidgets(): PendingIntent =
|
||||||
getBroadcast(
|
getBroadcast(
|
||||||
|
|||||||
@@ -107,7 +107,7 @@ class AndroidNotificationTray
|
|||||||
val removeRepetitionAction = Action(
|
val removeRepetitionAction = Action(
|
||||||
R.drawable.ic_action_cancel,
|
R.drawable.ic_action_cancel,
|
||||||
context.getString(R.string.no),
|
context.getString(R.string.no),
|
||||||
pendingIntents.removeRepetition(habit)
|
pendingIntents.removeRepetition(habit, timestamp)
|
||||||
)
|
)
|
||||||
|
|
||||||
val enterAction = Action(
|
val enterAction = Action(
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ import android.widget.AdapterView.OnItemClickListener
|
|||||||
import androidx.fragment.app.FragmentActivity
|
import androidx.fragment.app.FragmentActivity
|
||||||
import com.android.datetimepicker.time.RadialPickerLayout
|
import com.android.datetimepicker.time.RadialPickerLayout
|
||||||
import com.android.datetimepicker.time.TimePickerDialog
|
import com.android.datetimepicker.time.TimePickerDialog
|
||||||
|
import org.isoron.platform.gui.toInt
|
||||||
import org.isoron.uhabits.HabitsApplication
|
import org.isoron.uhabits.HabitsApplication
|
||||||
import org.isoron.uhabits.R
|
import org.isoron.uhabits.R
|
||||||
import org.isoron.uhabits.activities.AndroidThemeSwitcher
|
import org.isoron.uhabits.activities.AndroidThemeSwitcher
|
||||||
@@ -35,14 +36,13 @@ import org.isoron.uhabits.core.models.Habit
|
|||||||
import org.isoron.uhabits.core.ui.ThemeSwitcher.Companion.THEME_LIGHT
|
import org.isoron.uhabits.core.ui.ThemeSwitcher.Companion.THEME_LIGHT
|
||||||
import org.isoron.uhabits.receivers.ReminderController
|
import org.isoron.uhabits.receivers.ReminderController
|
||||||
import org.isoron.uhabits.utils.SystemUtils
|
import org.isoron.uhabits.utils.SystemUtils
|
||||||
import org.isoron.uhabits.utils.toThemedAndroidColor
|
|
||||||
import java.util.Calendar
|
import java.util.Calendar
|
||||||
|
|
||||||
class SnoozeDelayPickerActivity : FragmentActivity(), OnItemClickListener {
|
class SnoozeDelayPickerActivity : FragmentActivity(), OnItemClickListener {
|
||||||
private var habit: Habit? = null
|
private var habit: Habit? = null
|
||||||
private var reminderController: ReminderController? = null
|
private var reminderController: ReminderController? = null
|
||||||
private var dialog: AlertDialog? = null
|
private var dialog: AlertDialog? = null
|
||||||
private var color: Int = 0
|
private var androidColor: Int = 0
|
||||||
|
|
||||||
override fun onCreate(bundle: Bundle?) {
|
override fun onCreate(bundle: Bundle?) {
|
||||||
super.onCreate(bundle)
|
super.onCreate(bundle)
|
||||||
@@ -63,7 +63,7 @@ class SnoozeDelayPickerActivity : FragmentActivity(), OnItemClickListener {
|
|||||||
habit = appComponent.habitList.getById(ContentUris.parseId(data))
|
habit = appComponent.habitList.getById(ContentUris.parseId(data))
|
||||||
}
|
}
|
||||||
if (habit == null) finish()
|
if (habit == null) finish()
|
||||||
color = habit!!.color.toThemedAndroidColor(this)
|
androidColor = themeSwitcher.currentTheme.color(habit!!.color).toInt()
|
||||||
reminderController = appComponent.reminderController
|
reminderController = appComponent.reminderController
|
||||||
dialog = AlertDialog.Builder(this)
|
dialog = AlertDialog.Builder(this)
|
||||||
.setTitle(R.string.select_snooze_delay)
|
.setTitle(R.string.select_snooze_delay)
|
||||||
@@ -85,7 +85,7 @@ class SnoozeDelayPickerActivity : FragmentActivity(), OnItemClickListener {
|
|||||||
calendar[Calendar.HOUR_OF_DAY],
|
calendar[Calendar.HOUR_OF_DAY],
|
||||||
calendar[Calendar.MINUTE],
|
calendar[Calendar.MINUTE],
|
||||||
DateFormat.is24HourFormat(this),
|
DateFormat.is24HourFormat(this),
|
||||||
color
|
androidColor
|
||||||
)
|
)
|
||||||
dialog.show(supportFragmentManager, "timePicker")
|
dialog.show(supportFragmentManager, "timePicker")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -92,6 +92,9 @@ class SharedPreferencesStorage
|
|||||||
preferences.setNotificationsSticky(getBoolean(key, false))
|
preferences.setNotificationsSticky(getBoolean(key, false))
|
||||||
"pref_led_notifications" ->
|
"pref_led_notifications" ->
|
||||||
preferences.setNotificationsLed(getBoolean(key, false))
|
preferences.setNotificationsLed(getBoolean(key, false))
|
||||||
|
"pref_unknown_enabled" -> {
|
||||||
|
preferences.areQuestionMarksEnabled = getBoolean(key, false)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
sharedPreferences.registerOnSharedPreferenceChangeListener(this)
|
sharedPreferences.registerOnSharedPreferenceChangeListener(this)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ package org.isoron.uhabits.utils
|
|||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.graphics.Color
|
import android.graphics.Color
|
||||||
import android.util.Log
|
|
||||||
import org.isoron.uhabits.core.models.PaletteColor
|
import org.isoron.uhabits.core.models.PaletteColor
|
||||||
|
|
||||||
object PaletteUtils {
|
object PaletteUtils {
|
||||||
@@ -29,16 +28,6 @@ object PaletteUtils {
|
|||||||
fun getAndroidTestColor(index: Int) = PaletteColor(index).toFixedAndroidColor()
|
fun getAndroidTestColor(index: Int) = PaletteColor(index).toFixedAndroidColor()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun PaletteColor.toThemedAndroidColor(context: Context): Int {
|
|
||||||
val palette = StyledResources(context).getPalette()
|
|
||||||
return if (paletteIndex in palette.indices) {
|
|
||||||
palette[paletteIndex]
|
|
||||||
} else {
|
|
||||||
Log.w("ColorHelper", "Invalid color: $paletteIndex. Returning default.")
|
|
||||||
palette[0]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun PaletteColor.toFixedAndroidColor(): Int {
|
fun PaletteColor.toFixedAndroidColor(): Int {
|
||||||
return intArrayOf(
|
return intArrayOf(
|
||||||
Color.parseColor("#D32F2F"), // 0 red
|
Color.parseColor("#D32F2F"), // 0 red
|
||||||
|
|||||||
@@ -40,8 +40,12 @@ import androidx.appcompat.app.AppCompatActivity
|
|||||||
import androidx.appcompat.widget.Toolbar
|
import androidx.appcompat.widget.Toolbar
|
||||||
import androidx.core.content.FileProvider
|
import androidx.core.content.FileProvider
|
||||||
import com.google.android.material.snackbar.Snackbar
|
import com.google.android.material.snackbar.Snackbar
|
||||||
|
import org.isoron.platform.gui.toInt
|
||||||
|
import org.isoron.uhabits.HabitsApplication
|
||||||
import org.isoron.uhabits.R
|
import org.isoron.uhabits.R
|
||||||
|
import org.isoron.uhabits.activities.AndroidThemeSwitcher
|
||||||
import org.isoron.uhabits.core.models.PaletteColor
|
import org.isoron.uhabits.core.models.PaletteColor
|
||||||
|
import org.isoron.uhabits.core.ui.views.Theme
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
fun RelativeLayout.addBelow(
|
fun RelativeLayout.addBelow(
|
||||||
@@ -157,6 +161,7 @@ fun View.setupToolbar(
|
|||||||
toolbar: Toolbar,
|
toolbar: Toolbar,
|
||||||
title: String,
|
title: String,
|
||||||
color: PaletteColor,
|
color: PaletteColor,
|
||||||
|
theme: Theme,
|
||||||
displayHomeAsUpEnabled: Boolean = true,
|
displayHomeAsUpEnabled: Boolean = true,
|
||||||
) {
|
) {
|
||||||
toolbar.elevation = InterfaceUtils.dpToPixels(context, 2f)
|
toolbar.elevation = InterfaceUtils.dpToPixels(context, 2f)
|
||||||
@@ -165,7 +170,7 @@ fun View.setupToolbar(
|
|||||||
val toolbarColor = if (!res.getBoolean(R.attr.useHabitColorAsPrimary)) {
|
val toolbarColor = if (!res.getBoolean(R.attr.useHabitColorAsPrimary)) {
|
||||||
StyledResources(context).getColor(R.attr.colorPrimary)
|
StyledResources(context).getColor(R.attr.colorPrimary)
|
||||||
} else {
|
} else {
|
||||||
color.toThemedAndroidColor(context)
|
theme.color(color).toInt()
|
||||||
}
|
}
|
||||||
val darkerColor = ColorUtils.mixColors(toolbarColor, Color.BLACK, 0.75f)
|
val darkerColor = ColorUtils.mixColors(toolbarColor, Color.BLACK, 0.75f)
|
||||||
toolbar.background = ColorDrawable(toolbarColor)
|
toolbar.background = ColorDrawable(toolbarColor)
|
||||||
@@ -175,6 +180,13 @@ fun View.setupToolbar(
|
|||||||
activity.supportActionBar?.setDisplayHomeAsUpEnabled(displayHomeAsUpEnabled)
|
activity.supportActionBar?.setDisplayHomeAsUpEnabled(displayHomeAsUpEnabled)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun View.currentTheme(): Theme {
|
||||||
|
val component = (context.applicationContext as HabitsApplication).component
|
||||||
|
val themeSwitcher = AndroidThemeSwitcher(context, component.preferences)
|
||||||
|
themeSwitcher.apply()
|
||||||
|
return themeSwitcher.currentTheme
|
||||||
|
}
|
||||||
|
|
||||||
fun Int.toMeasureSpec(mode: Int) =
|
fun Int.toMeasureSpec(mode: Int) =
|
||||||
View.MeasureSpec.makeMeasureSpec(this, mode)
|
View.MeasureSpec.makeMeasureSpec(this, mode)
|
||||||
|
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ import org.isoron.uhabits.core.commands.CommandRunner
|
|||||||
import org.isoron.uhabits.core.preferences.Preferences
|
import org.isoron.uhabits.core.preferences.Preferences
|
||||||
import org.isoron.uhabits.core.preferences.WidgetPreferences
|
import org.isoron.uhabits.core.preferences.WidgetPreferences
|
||||||
import org.isoron.uhabits.intents.PendingIntentFactory
|
import org.isoron.uhabits.intents.PendingIntentFactory
|
||||||
|
import kotlin.math.max
|
||||||
|
|
||||||
abstract class BaseWidget(val context: Context, val id: Int, val stacked: Boolean) {
|
abstract class BaseWidget(val context: Context, val id: Int, val stacked: Boolean) {
|
||||||
private val widgetPrefs: WidgetPreferences
|
private val widgetPrefs: WidgetPreferences
|
||||||
@@ -103,8 +104,8 @@ abstract class BaseWidget(val context: Context, val id: Int, val stacked: Boolea
|
|||||||
|
|
||||||
private fun getBitmapFromView(view: View): Bitmap {
|
private fun getBitmapFromView(view: View): Bitmap {
|
||||||
view.invalidate()
|
view.invalidate()
|
||||||
val width = view.measuredWidth
|
val width = max(1, view.measuredWidth)
|
||||||
val height = view.measuredHeight
|
val height = max(1, view.measuredHeight)
|
||||||
val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
|
val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
|
||||||
val canvas = Canvas(bitmap)
|
val canvas = Canvas(bitmap)
|
||||||
view.draw(canvas)
|
view.draw(canvas)
|
||||||
|
|||||||
@@ -109,7 +109,7 @@ abstract class BaseWidgetProvider : AppWidgetProvider() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected fun getHabitsFromWidgetId(widgetId: Int): List<Habit> {
|
protected fun getHabitsFromWidgetId(widgetId: Int): List<Habit> {
|
||||||
val selectedIds = widgetPrefs.getHabitIdsFromWidgetId(widgetId)!!
|
val selectedIds = widgetPrefs.getHabitIdsFromWidgetId(widgetId)
|
||||||
val selectedHabits = ArrayList<Habit>(selectedIds.size)
|
val selectedHabits = ArrayList<Habit>(selectedIds.size)
|
||||||
for (id in selectedIds) {
|
for (id in selectedIds) {
|
||||||
val h = habits.getById(id) ?: throw HabitNotFoundException()
|
val h = habits.getById(id) ?: throw HabitNotFoundException()
|
||||||
|
|||||||
@@ -24,10 +24,11 @@ import android.content.Context
|
|||||||
import android.os.Build
|
import android.os.Build
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import androidx.annotation.RequiresApi
|
import androidx.annotation.RequiresApi
|
||||||
|
import org.isoron.platform.gui.toInt
|
||||||
import org.isoron.uhabits.core.models.Entry
|
import org.isoron.uhabits.core.models.Entry
|
||||||
import org.isoron.uhabits.core.models.Habit
|
import org.isoron.uhabits.core.models.Habit
|
||||||
|
import org.isoron.uhabits.core.ui.views.WidgetTheme
|
||||||
import org.isoron.uhabits.core.utils.DateUtils
|
import org.isoron.uhabits.core.utils.DateUtils
|
||||||
import org.isoron.uhabits.utils.toThemedAndroidColor
|
|
||||||
import org.isoron.uhabits.widgets.views.CheckmarkWidgetView
|
import org.isoron.uhabits.widgets.views.CheckmarkWidgetView
|
||||||
|
|
||||||
open class CheckmarkWidget(
|
open class CheckmarkWidget(
|
||||||
@@ -53,7 +54,7 @@ open class CheckmarkWidget(
|
|||||||
(widgetView as CheckmarkWidgetView).apply {
|
(widgetView as CheckmarkWidgetView).apply {
|
||||||
val today = DateUtils.getTodayWithOffset()
|
val today = DateUtils.getTodayWithOffset()
|
||||||
setBackgroundAlpha(preferedBackgroundAlpha)
|
setBackgroundAlpha(preferedBackgroundAlpha)
|
||||||
activeColor = habit.color.toThemedAndroidColor(context)
|
activeColor = WidgetTheme().color(habit.color).toInt()
|
||||||
name = habit.name
|
name = habit.name
|
||||||
entryValue = habit.computedEntries.get(today).value
|
entryValue = habit.computedEntries.get(today).value
|
||||||
if (habit.isNumerical) {
|
if (habit.isNumerical) {
|
||||||
|
|||||||
@@ -22,9 +22,10 @@ package org.isoron.uhabits.widgets
|
|||||||
import android.app.PendingIntent
|
import android.app.PendingIntent
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.view.View
|
import android.view.View
|
||||||
|
import org.isoron.platform.gui.toInt
|
||||||
import org.isoron.uhabits.activities.common.views.FrequencyChart
|
import org.isoron.uhabits.activities.common.views.FrequencyChart
|
||||||
import org.isoron.uhabits.core.models.Habit
|
import org.isoron.uhabits.core.models.Habit
|
||||||
import org.isoron.uhabits.utils.toThemedAndroidColor
|
import org.isoron.uhabits.core.ui.views.WidgetTheme
|
||||||
import org.isoron.uhabits.widgets.views.GraphWidgetView
|
import org.isoron.uhabits.widgets.views.GraphWidgetView
|
||||||
|
|
||||||
class FrequencyWidget(
|
class FrequencyWidget(
|
||||||
@@ -47,7 +48,7 @@ class FrequencyWidget(
|
|||||||
if (preferedBackgroundAlpha >= 255) widgetView.setShadowAlpha(0x4f)
|
if (preferedBackgroundAlpha >= 255) widgetView.setShadowAlpha(0x4f)
|
||||||
(widgetView.dataView as FrequencyChart).apply {
|
(widgetView.dataView as FrequencyChart).apply {
|
||||||
setFirstWeekday(firstWeekday)
|
setFirstWeekday(firstWeekday)
|
||||||
setColor(habit.color.toThemedAndroidColor(context))
|
setColor(WidgetTheme().color(habit.color).toInt())
|
||||||
setFrequency(habit.originalEntries.computeWeekdayFrequency(habit.isNumerical))
|
setFrequency(habit.originalEntries.computeWeekdayFrequency(habit.isNumerical))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,10 +22,11 @@ package org.isoron.uhabits.widgets
|
|||||||
import android.app.PendingIntent
|
import android.app.PendingIntent
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.view.View
|
import android.view.View
|
||||||
|
import org.isoron.platform.gui.toInt
|
||||||
import org.isoron.uhabits.activities.common.views.ScoreChart
|
import org.isoron.uhabits.activities.common.views.ScoreChart
|
||||||
import org.isoron.uhabits.core.models.Habit
|
import org.isoron.uhabits.core.models.Habit
|
||||||
import org.isoron.uhabits.core.ui.screens.habits.show.views.ScoreCardPresenter
|
import org.isoron.uhabits.core.ui.screens.habits.show.views.ScoreCardPresenter
|
||||||
import org.isoron.uhabits.utils.toThemedAndroidColor
|
import org.isoron.uhabits.core.ui.views.WidgetTheme
|
||||||
import org.isoron.uhabits.widgets.views.GraphWidgetView
|
import org.isoron.uhabits.widgets.views.GraphWidgetView
|
||||||
|
|
||||||
class ScoreWidget(
|
class ScoreWidget(
|
||||||
@@ -44,7 +45,8 @@ class ScoreWidget(
|
|||||||
val viewModel = ScoreCardPresenter.buildState(
|
val viewModel = ScoreCardPresenter.buildState(
|
||||||
habit = habit,
|
habit = habit,
|
||||||
firstWeekday = prefs.firstWeekdayInt,
|
firstWeekday = prefs.firstWeekdayInt,
|
||||||
spinnerPosition = prefs.scoreCardSpinnerPosition
|
spinnerPosition = prefs.scoreCardSpinnerPosition,
|
||||||
|
theme = WidgetTheme(),
|
||||||
)
|
)
|
||||||
val widgetView = view as GraphWidgetView
|
val widgetView = view as GraphWidgetView
|
||||||
widgetView.setBackgroundAlpha(preferedBackgroundAlpha)
|
widgetView.setBackgroundAlpha(preferedBackgroundAlpha)
|
||||||
@@ -52,7 +54,7 @@ class ScoreWidget(
|
|||||||
(widgetView.dataView as ScoreChart).apply {
|
(widgetView.dataView as ScoreChart).apply {
|
||||||
setIsTransparencyEnabled(true)
|
setIsTransparencyEnabled(true)
|
||||||
setBucketSize(viewModel.bucketSize)
|
setBucketSize(viewModel.bucketSize)
|
||||||
setColor(habit.color.toThemedAndroidColor(context))
|
setColor(WidgetTheme().color(habit.color).toInt())
|
||||||
setScores(viewModel.scores)
|
setScores(viewModel.scores)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ internal class StackRemoteViewsFactory(private val context: Context, intent: Int
|
|||||||
AppWidgetManager.INVALID_APPWIDGET_ID
|
AppWidgetManager.INVALID_APPWIDGET_ID
|
||||||
)
|
)
|
||||||
private val habitIds: LongArray
|
private val habitIds: LongArray
|
||||||
private val widgetType: StackWidgetType?
|
private val widgetType: StackWidgetType
|
||||||
private var remoteViews = ArrayList<RemoteViews>()
|
private var remoteViews = ArrayList<RemoteViews>()
|
||||||
override fun onCreate() {}
|
override fun onCreate() {}
|
||||||
override fun onDestroy() {}
|
override fun onDestroy() {}
|
||||||
@@ -86,27 +86,27 @@ internal class StackRemoteViewsFactory(private val context: Context, intent: Int
|
|||||||
|
|
||||||
override fun getViewAt(position: Int): RemoteViews? {
|
override fun getViewAt(position: Int): RemoteViews? {
|
||||||
Log.i("StackRemoteViewsFactory", "getViewAt $position")
|
Log.i("StackRemoteViewsFactory", "getViewAt $position")
|
||||||
return if (position < 0 || position > remoteViews.size) null else remoteViews[position]
|
return if (0 <= position && position < remoteViews.size) remoteViews[position] else null
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun constructWidget(
|
private fun constructWidget(
|
||||||
habit: Habit,
|
habit: Habit,
|
||||||
prefs: Preferences
|
prefs: Preferences
|
||||||
): BaseWidget {
|
): BaseWidget {
|
||||||
when (widgetType) {
|
return when (widgetType) {
|
||||||
StackWidgetType.CHECKMARK -> return CheckmarkWidget(context, widgetId, habit, true)
|
StackWidgetType.CHECKMARK -> CheckmarkWidget(context, widgetId, habit, true)
|
||||||
StackWidgetType.FREQUENCY -> return FrequencyWidget(
|
StackWidgetType.FREQUENCY -> FrequencyWidget(
|
||||||
context,
|
context,
|
||||||
widgetId,
|
widgetId,
|
||||||
habit,
|
habit,
|
||||||
prefs.firstWeekdayInt,
|
prefs.firstWeekdayInt,
|
||||||
true
|
true
|
||||||
)
|
)
|
||||||
StackWidgetType.SCORE -> return ScoreWidget(context, widgetId, habit, true)
|
StackWidgetType.SCORE -> ScoreWidget(context, widgetId, habit, true)
|
||||||
StackWidgetType.HISTORY -> return HistoryWidget(context, widgetId, habit, true)
|
StackWidgetType.HISTORY -> HistoryWidget(context, widgetId, habit, true)
|
||||||
StackWidgetType.STREAKS -> return StreakWidget(context, widgetId, habit, true)
|
StackWidgetType.STREAKS -> StreakWidget(context, widgetId, habit, true)
|
||||||
|
StackWidgetType.TARGET -> TargetWidget(context, widgetId, habit, true)
|
||||||
}
|
}
|
||||||
throw IllegalStateException()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getLoadingView(): RemoteViews {
|
override fun getLoadingView(): RemoteViews {
|
||||||
@@ -157,6 +157,7 @@ internal class StackRemoteViewsFactory(private val context: Context, intent: Int
|
|||||||
if (widgetTypeValue < 0) throw RuntimeException("invalid widget type")
|
if (widgetTypeValue < 0) throw RuntimeException("invalid widget type")
|
||||||
if (habitIdsStr == null) throw RuntimeException("habitIdsStr is null")
|
if (habitIdsStr == null) throw RuntimeException("habitIdsStr is null")
|
||||||
widgetType = StackWidgetType.getWidgetTypeFromValue(widgetTypeValue)
|
widgetType = StackWidgetType.getWidgetTypeFromValue(widgetTypeValue)
|
||||||
|
?: throw RuntimeException("unknown widget type value: $widgetTypeValue")
|
||||||
habitIds = splitLongs(habitIdsStr)
|
habitIds = splitLongs(habitIdsStr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,61 +19,59 @@
|
|||||||
package org.isoron.uhabits.widgets
|
package org.isoron.uhabits.widgets
|
||||||
|
|
||||||
import org.isoron.uhabits.R
|
import org.isoron.uhabits.R
|
||||||
|
import java.lang.IllegalStateException
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by victoryu on 11/3/17.
|
|
||||||
*/
|
|
||||||
enum class StackWidgetType(val value: Int) {
|
enum class StackWidgetType(val value: Int) {
|
||||||
CHECKMARK(0), FREQUENCY(1), SCORE(2), // habit strength widget
|
CHECKMARK(0), FREQUENCY(1), SCORE(2), // habit strength widget
|
||||||
HISTORY(3), STREAKS(4), TARGET(5);
|
HISTORY(3), STREAKS(4), TARGET(5);
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
fun getWidgetTypeFromValue(value: Int): StackWidgetType? {
|
fun getWidgetTypeFromValue(value: Int): StackWidgetType? {
|
||||||
return when {
|
return when (value) {
|
||||||
CHECKMARK.value == value -> CHECKMARK
|
CHECKMARK.value -> CHECKMARK
|
||||||
FREQUENCY.value == value -> FREQUENCY
|
FREQUENCY.value -> FREQUENCY
|
||||||
SCORE.value == value -> SCORE
|
SCORE.value -> SCORE
|
||||||
HISTORY.value == value -> HISTORY
|
HISTORY.value -> HISTORY
|
||||||
STREAKS.value == value -> STREAKS
|
STREAKS.value -> STREAKS
|
||||||
TARGET.value == value -> TARGET
|
TARGET.value -> TARGET
|
||||||
else -> null
|
else -> null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getStackWidgetLayoutId(type: StackWidgetType?): Int {
|
fun getStackWidgetLayoutId(type: StackWidgetType?): Int {
|
||||||
when (type) {
|
return when (type) {
|
||||||
CHECKMARK -> return R.layout.checkmark_stackview_widget
|
CHECKMARK -> R.layout.checkmark_stackview_widget
|
||||||
FREQUENCY -> return R.layout.frequency_stackview_widget
|
FREQUENCY -> R.layout.frequency_stackview_widget
|
||||||
SCORE -> return R.layout.score_stackview_widget
|
SCORE -> R.layout.score_stackview_widget
|
||||||
HISTORY -> return R.layout.history_stackview_widget
|
HISTORY -> R.layout.history_stackview_widget
|
||||||
STREAKS -> return R.layout.streak_stackview_widget
|
STREAKS -> R.layout.streak_stackview_widget
|
||||||
TARGET -> return R.layout.target_stackview_widget
|
TARGET -> R.layout.target_stackview_widget
|
||||||
|
else -> throw IllegalStateException()
|
||||||
}
|
}
|
||||||
return 0
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getStackWidgetAdapterViewId(type: StackWidgetType?): Int {
|
fun getStackWidgetAdapterViewId(type: StackWidgetType?): Int {
|
||||||
when (type) {
|
return when (type) {
|
||||||
CHECKMARK -> return R.id.checkmarkStackWidgetView
|
CHECKMARK -> R.id.checkmarkStackWidgetView
|
||||||
FREQUENCY -> return R.id.frequencyStackWidgetView
|
FREQUENCY -> R.id.frequencyStackWidgetView
|
||||||
SCORE -> return R.id.scoreStackWidgetView
|
SCORE -> R.id.scoreStackWidgetView
|
||||||
HISTORY -> return R.id.historyStackWidgetView
|
HISTORY -> R.id.historyStackWidgetView
|
||||||
STREAKS -> return R.id.streakStackWidgetView
|
STREAKS -> R.id.streakStackWidgetView
|
||||||
TARGET -> return R.id.targetStackWidgetView
|
TARGET -> R.id.targetStackWidgetView
|
||||||
|
else -> throw IllegalStateException()
|
||||||
}
|
}
|
||||||
return 0
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getStackWidgetEmptyViewId(type: StackWidgetType?): Int {
|
fun getStackWidgetEmptyViewId(type: StackWidgetType?): Int {
|
||||||
when (type) {
|
return when (type) {
|
||||||
CHECKMARK -> return R.id.checkmarkStackWidgetEmptyView
|
CHECKMARK -> R.id.checkmarkStackWidgetEmptyView
|
||||||
FREQUENCY -> return R.id.frequencyStackWidgetEmptyView
|
FREQUENCY -> R.id.frequencyStackWidgetEmptyView
|
||||||
SCORE -> return R.id.scoreStackWidgetEmptyView
|
SCORE -> R.id.scoreStackWidgetEmptyView
|
||||||
HISTORY -> return R.id.historyStackWidgetEmptyView
|
HISTORY -> R.id.historyStackWidgetEmptyView
|
||||||
STREAKS -> return R.id.streakStackWidgetEmptyView
|
STREAKS -> R.id.streakStackWidgetEmptyView
|
||||||
TARGET -> return R.id.targetStackWidgetEmptyView
|
TARGET -> R.id.targetStackWidgetEmptyView
|
||||||
|
else -> throw IllegalStateException()
|
||||||
}
|
}
|
||||||
return 0
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,9 +24,10 @@ import android.content.Context
|
|||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup.LayoutParams
|
import android.view.ViewGroup.LayoutParams
|
||||||
import android.view.ViewGroup.LayoutParams.MATCH_PARENT
|
import android.view.ViewGroup.LayoutParams.MATCH_PARENT
|
||||||
|
import org.isoron.platform.gui.toInt
|
||||||
import org.isoron.uhabits.activities.common.views.StreakChart
|
import org.isoron.uhabits.activities.common.views.StreakChart
|
||||||
import org.isoron.uhabits.core.models.Habit
|
import org.isoron.uhabits.core.models.Habit
|
||||||
import org.isoron.uhabits.utils.toThemedAndroidColor
|
import org.isoron.uhabits.core.ui.views.WidgetTheme
|
||||||
import org.isoron.uhabits.widgets.views.GraphWidgetView
|
import org.isoron.uhabits.widgets.views.GraphWidgetView
|
||||||
|
|
||||||
class StreakWidget(
|
class StreakWidget(
|
||||||
@@ -46,7 +47,7 @@ class StreakWidget(
|
|||||||
widgetView.setBackgroundAlpha(preferedBackgroundAlpha)
|
widgetView.setBackgroundAlpha(preferedBackgroundAlpha)
|
||||||
if (preferedBackgroundAlpha >= 255) widgetView.setShadowAlpha(0x4f)
|
if (preferedBackgroundAlpha >= 255) widgetView.setShadowAlpha(0x4f)
|
||||||
(widgetView.dataView as StreakChart).apply {
|
(widgetView.dataView as StreakChart).apply {
|
||||||
setColor(habit.color.toThemedAndroidColor(context))
|
setColor(WidgetTheme().color(habit.color).toInt())
|
||||||
setStreaks(habit.streaks.getBest(maxStreakCount))
|
setStreaks(habit.streaks.getBest(maxStreakCount))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,11 +25,12 @@ import android.view.View
|
|||||||
import android.view.ViewGroup.LayoutParams
|
import android.view.ViewGroup.LayoutParams
|
||||||
import android.view.ViewGroup.LayoutParams.MATCH_PARENT
|
import android.view.ViewGroup.LayoutParams.MATCH_PARENT
|
||||||
import kotlinx.coroutines.runBlocking
|
import kotlinx.coroutines.runBlocking
|
||||||
|
import org.isoron.platform.gui.toInt
|
||||||
import org.isoron.uhabits.activities.common.views.TargetChart
|
import org.isoron.uhabits.activities.common.views.TargetChart
|
||||||
import org.isoron.uhabits.activities.habits.show.views.TargetCardView.Companion.intervalToLabel
|
import org.isoron.uhabits.activities.habits.show.views.TargetCardView.Companion.intervalToLabel
|
||||||
import org.isoron.uhabits.core.models.Habit
|
import org.isoron.uhabits.core.models.Habit
|
||||||
import org.isoron.uhabits.core.ui.screens.habits.show.views.TargetCardPresenter
|
import org.isoron.uhabits.core.ui.screens.habits.show.views.TargetCardPresenter
|
||||||
import org.isoron.uhabits.utils.toThemedAndroidColor
|
import org.isoron.uhabits.core.ui.views.WidgetTheme
|
||||||
import org.isoron.uhabits.widgets.views.GraphWidgetView
|
import org.isoron.uhabits.widgets.views.GraphWidgetView
|
||||||
|
|
||||||
class TargetWidget(
|
class TargetWidget(
|
||||||
@@ -49,8 +50,12 @@ class TargetWidget(
|
|||||||
widgetView.setBackgroundAlpha(preferedBackgroundAlpha)
|
widgetView.setBackgroundAlpha(preferedBackgroundAlpha)
|
||||||
if (preferedBackgroundAlpha >= 255) widgetView.setShadowAlpha(0x4f)
|
if (preferedBackgroundAlpha >= 255) widgetView.setShadowAlpha(0x4f)
|
||||||
val chart = (widgetView.dataView as TargetChart)
|
val chart = (widgetView.dataView as TargetChart)
|
||||||
val data = TargetCardPresenter.buildState(habit, prefs.firstWeekdayInt)
|
val data = TargetCardPresenter.buildState(
|
||||||
chart.setColor(data.color.toThemedAndroidColor(context))
|
habit = habit,
|
||||||
|
firstWeekday = prefs.firstWeekdayInt,
|
||||||
|
theme = WidgetTheme(),
|
||||||
|
)
|
||||||
|
chart.setColor(WidgetTheme().color(habit.color).toInt())
|
||||||
chart.setTargets(data.targets)
|
chart.setTargets(data.targets)
|
||||||
chart.setLabels(data.intervals.map { intervalToLabel(context.resources, it) })
|
chart.setLabels(data.intervals.map { intervalToLabel(context.resources, it) })
|
||||||
chart.setValues(data.values)
|
chart.setValues(data.values)
|
||||||
|
|||||||
@@ -95,7 +95,7 @@ class WidgetUpdater
|
|||||||
val modifiedWidgetIds = when (modifiedHabitId) {
|
val modifiedWidgetIds = when (modifiedHabitId) {
|
||||||
null -> widgetIds.toList()
|
null -> widgetIds.toList()
|
||||||
else -> widgetIds.filter { w ->
|
else -> widgetIds.filter { w ->
|
||||||
widgetPrefs.getHabitIdsFromWidgetId(w)!!.contains(modifiedHabitId)
|
widgetPrefs.getHabitIdsFromWidgetId(w).contains(modifiedHabitId)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ import android.widget.ListView
|
|||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
import org.isoron.uhabits.HabitsApplication
|
import org.isoron.uhabits.HabitsApplication
|
||||||
import org.isoron.uhabits.R
|
import org.isoron.uhabits.R
|
||||||
|
import org.isoron.uhabits.activities.AndroidThemeSwitcher
|
||||||
import org.isoron.uhabits.core.preferences.WidgetPreferences
|
import org.isoron.uhabits.core.preferences.WidgetPreferences
|
||||||
import org.isoron.uhabits.widgets.WidgetUpdater
|
import org.isoron.uhabits.widgets.WidgetUpdater
|
||||||
import java.util.ArrayList
|
import java.util.ArrayList
|
||||||
@@ -58,6 +59,7 @@ open class HabitPickerDialog : Activity() {
|
|||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
val component = (applicationContext as HabitsApplication).component
|
val component = (applicationContext as HabitsApplication).component
|
||||||
|
AndroidThemeSwitcher(this, component.preferences).apply()
|
||||||
val habitList = component.habitList
|
val habitList = component.habitList
|
||||||
widgetPreferences = component.widgetPreferences
|
widgetPreferences = component.widgetPreferences
|
||||||
widgetUpdater = component.widgetUpdater
|
widgetUpdater = component.widgetUpdater
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ import org.isoron.uhabits.utils.PaletteUtils.getAndroidTestColor
|
|||||||
import org.isoron.uhabits.utils.StyledResources
|
import org.isoron.uhabits.utils.StyledResources
|
||||||
import kotlin.math.max
|
import kotlin.math.max
|
||||||
import kotlin.math.min
|
import kotlin.math.min
|
||||||
|
import kotlin.math.roundToInt
|
||||||
|
|
||||||
class CheckmarkWidgetView : HabitWidgetView {
|
class CheckmarkWidgetView : HabitWidgetView {
|
||||||
var activeColor: Int = 0
|
var activeColor: Int = 0
|
||||||
@@ -102,7 +103,7 @@ class CheckmarkWidgetView : HabitWidgetView {
|
|||||||
SKIP -> resources.getString(R.string.fa_skipped)
|
SKIP -> resources.getString(R.string.fa_skipped)
|
||||||
UNKNOWN -> {
|
UNKNOWN -> {
|
||||||
run {
|
run {
|
||||||
if (preferences!!.areQuestionMarksEnabled()) {
|
if (preferences!!.areQuestionMarksEnabled) {
|
||||||
return resources.getString(R.string.fa_question)
|
return resources.getString(R.string.fa_question)
|
||||||
} else {
|
} else {
|
||||||
resources.getString(R.string.fa_times)
|
resources.getString(R.string.fa_times)
|
||||||
@@ -118,26 +119,25 @@ class CheckmarkWidgetView : HabitWidgetView {
|
|||||||
get() = R.layout.widget_checkmark
|
get() = R.layout.widget_checkmark
|
||||||
|
|
||||||
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
|
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
|
||||||
val width = MeasureSpec.getSize(widthMeasureSpec)
|
var width = MeasureSpec.getSize(widthMeasureSpec)
|
||||||
val height = MeasureSpec.getSize(heightMeasureSpec)
|
var height = MeasureSpec.getSize(heightMeasureSpec)
|
||||||
var w = width.toFloat()
|
if (height >= width) {
|
||||||
var h = width * 1.25f
|
height = min(height, (width * 1.5).roundToInt())
|
||||||
val scale = min(width / w, height / h)
|
} else {
|
||||||
w *= scale
|
width = min(width, height)
|
||||||
h *= scale
|
}
|
||||||
val newWidthMeasureSpec = MeasureSpec.makeMeasureSpec(w.toInt(), MeasureSpec.EXACTLY)
|
val textSize = min(0.2f * width, getDimension(context, R.dimen.smallerTextSize))
|
||||||
val newHeightMeasureSpec = MeasureSpec.makeMeasureSpec(h.toInt(), MeasureSpec.EXACTLY)
|
|
||||||
var textSize = 0.15f * h
|
|
||||||
val maxTextSize = getDimension(context, R.dimen.smallerTextSize)
|
|
||||||
textSize = min(textSize, maxTextSize)
|
|
||||||
label.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize)
|
label.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize)
|
||||||
if (isNumerical) {
|
if (isNumerical) {
|
||||||
ring.setTextSize(textSize * 0.75f)
|
ring.setTextSize(textSize * 0.9f)
|
||||||
} else {
|
} else {
|
||||||
ring.setTextSize(textSize)
|
ring.setTextSize(textSize)
|
||||||
}
|
}
|
||||||
ring.setThickness(0.15f * textSize)
|
ring.setThickness(0.03f * width)
|
||||||
super.onMeasure(newWidthMeasureSpec, newHeightMeasureSpec)
|
super.onMeasure(
|
||||||
|
MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
|
||||||
|
MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun init() {
|
private fun init() {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
Loop Seguiment d'hàbits t'ajuda a crear i mantenir en la teva vida hàbits positius de llarg termini. Estadístiques i gràfiques detallades et donen una imatge clara de com els teus hàbits han millorat en el temps. L'app és completament sense anuncis, de codi obert i respecta la teva privadesa.
|
Loop Seguiment d'hàbits t'ajuda a crear i mantenir en la teva vida hàbits positius de llarg termini. Gràfics i estadístiques detallades us proporcionen una imatge clara de com els vostres hàbits han millorat amb el pas del temps. L'aplicació Blokada és totalment lliure de publicitat, de codi obert i respecta la vostra privadesa.
|
||||||
|
|
||||||
<b>Interfície minimalista, lleugera i bonica</b>
|
<b>Interfície minimalista, lleugera i bonica</b>
|
||||||
Loop té una interfície elegant i minimalista que es molt fàcil d'usar, inclús per als usuaris primerencs. Altament optimitzada per a que sigui ràpida, l'app funciona bé inclús en telèfons antics.
|
Loop té una interfície elegant i minimalista que es molt fàcil d'usar, inclús per als usuaris primerencs. Altament optimitzada per a que sigui ràpida, l'app funciona bé inclús en telèfons antics.
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
Loop Habit Tracker hilft dir dabei, positive Gewohnheiten in dein Leben zu integrieren und sie dauerhaft zu verfolgen. Detaillierte Diagramme und Statistiken geben Aufschluss darüber, wie sich die Gewohnheiten über die Zeit verändern und verbessern. Die App ist werbefrei, open source und respektiert die Privatsphäre.
|
Loop Habit Tracker hilft dir dabei gute Gewohnheiten zu erlangen und sie ein Leben lang zu pflegen. Detaillierte Diagramme und Statistiken geben Aufschluss darüber, wie sich die Gewohnheiten über die Zeit verändern und verbessern. Die App ist werbefrei, open source und respektiert die Privatsphäre.
|
||||||
|
|
||||||
<b>Schöne, minimalistisch und übersichtliche Benutzeroberfläche</b>
|
<b>Schöne, minimalistisch und übersichtliche Benutzeroberfläche</b>
|
||||||
Loop hat eine elegante und minimalistische Benutzeroberfläche, die selbst für Erstnutzer eine einfache Verwendung möglich macht. Dank vieler Geschwindigkeitsoptimierungen funktioniert die App auch auf älteren Geräten einwandfrei.
|
Loop hat eine elegante und minimalistische Benutzeroberfläche, die selbst für Erstnutzer eine einfache Verwendung möglich macht. Dank vieler Geschwindigkeitsoptimierungen funktioniert die App auch auf älteren Geräten einwandfrei.
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
Erstelle gute Gewohnheiten und verfolge ihren Fortschritt (ohne Werbung)
|
Erlange gute Gewohnheiten und verfolge dessen Fortschritte (ohne Werbung)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
Loop Habit Tracker te ayuda a crear y mantener hábitos positivos y a largo plazo en tu vida. Gráficos detallados y las estadísticas te dan una idea clara de cómo tus hábitos han mejorado con el tiempo. La aplicación es completamente gratis, de código abierto y respeta tu privacidad.
|
Loop Habit Tracker te ayuda a crear y mantener hábitos positivos de largo plazo en tu vida. Gráficos detallados y estadísticas te dan una idea clara de cómo tus hábitos han mejorado con el tiempo. La aplicación es completamente gratis, de código abierto y respeta tu privacidad.
|
||||||
|
|
||||||
<b>Interfase hermosa, minimalista y liviana</b>
|
<b>Interfaz hermosa, minimalista y liviana</b>
|
||||||
Loop tiene una interfaz elegante y minimalista que es muy fácil de usar, incluso para usuarios nuevos. Muy optimizada para la velocidad, la aplicación funciona bien incluso en teléfonos más antiguos.
|
Loop tiene una interfaz elegante y minimalista que es muy fácil de usar, incluso para usuarios nuevos. Altamente optimizada para la velocidad, la aplicación funciona bien incluso en teléfonos más antiguos.
|
||||||
|
|
||||||
<b>Puntaje de hábitos</b>
|
<b>Puntaje de hábitos</b>
|
||||||
Loop tiene una fórmula avanzada para calcular la fuerza de tus hábitos. Cada repetición fortalece tu hábito y cada día perdido lo debilita. Sin embargo, unos días perdidos después de una larga racha no destruirán por completo tu progreso, a diferencia de muchas otras aplicaciones del tipo "no rompas la cadena".
|
Loop tiene una fórmula avanzada para calcular la fuerza de tus hábitos. Cada repetición fortalece tu hábito y cada día perdido lo debilita. Sin embargo, unos días perdidos después de una larga racha no destruirán por completo tu progreso, a diferencia de muchas otras aplicaciones del tipo "no rompas la cadena".
|
||||||
@@ -13,15 +13,15 @@ Además de los hábitos diarios, Loop admite hábitos con horarios más complejo
|
|||||||
Programa notificaciones para recordarte tus hábitos. Cada hábito puede tener su propio recordatorio, a la hora elegida del día. Marca o descarta fácilmente tu hábito directamente de la notificación.
|
Programa notificaciones para recordarte tus hábitos. Cada hábito puede tener su propio recordatorio, a la hora elegida del día. Marca o descarta fácilmente tu hábito directamente de la notificación.
|
||||||
|
|
||||||
<b>Widgets</b>
|
<b>Widgets</b>
|
||||||
Recuerda tus hábitos apenas desbloqueando el teléfono. Los widgets de colores te permiten rastrear tus hábitos directamente desde tu pantalla de inicio, sin siquiera abrir la aplicación.
|
Recuerde sus hábitos cada vez que desbloquee su teléfono. Los widgets de colores te permiten rastrear tus hábitos directamente desde tu pantalla de inicio, sin siquiera abrir la aplicación.
|
||||||
|
|
||||||
<b>Toma el control de tus datos</b>
|
<b>Toma el control de tus datos</b>
|
||||||
Si quieres analizar más tus datos o moverlos a otro servicio, Loop le permite exportarlo a hojas de cálculo, (CSV) o a un archivo de base de datos (SQLite). Para usuarios avanzados, se pueden marcar hábitos a través de otras aplicaciones, como Tasker.
|
Si deseas analizar más sus datos o moverlos a otro servicio, Loop te permite exportarlos a hojas de cálculo (CSV) o a un archivo de base de datos (SQLite). Para usuarios avanzados, se pueden marcar hábitos a través de otras aplicaciones, como Tasker.
|
||||||
|
|
||||||
<b>Sin limitaciones</b>
|
<b>Sin limitaciones</b>
|
||||||
Rastrea tantos hábitos como desees. Loop no impone límites artificiales sobre cuántos hábitos puedes tener. Todas las características están disponibles para todos los usuarios. No hay compras dentro de la aplicación.
|
Rastrea tantos hábitos como desees. Loop no impone límites artificiales sobre cuántos hábitos puedes tener. Todas las características están disponibles para todos los usuarios. No hay compras dentro de la aplicación.
|
||||||
|
|
||||||
<b>Completamente sin publicidades y código abierto</b>
|
<b>Completamente sin anuncios y código abierto</b>
|
||||||
No hay publicidades, notificaciones molestas o permisos intrusivos en esta aplicación, y nunca los habrá. La aplicación es completamente de código abierto (Licencia GPLv3).
|
No hay publicidades, notificaciones molestas o permisos intrusivos en esta aplicación, y nunca los habrá. La aplicación es completamente de código abierto (Licencia GPLv3).
|
||||||
|
|
||||||
<b>Funciona sin conexión y respeta tu privacidad</b>
|
<b>Funciona sin conexión y respeta tu privacidad</b>
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
Loop Habit Tracker به شما کمک میکند تا عادتهای مثبت طولانیمدت را در زندگی ایجاد و حفظ کنید. نمودارها و آمارهای دقیق، تصویری واضح از چگونگی بهبود عادتهای شما در طول زمان به شما میدهد. این برنامه کاملاً بدون تبلیغات و منبعباز است و به حریم خصوصی شما احترام میگذارد.
|
عادتسنج لوپ به شما کمک میکند تا عادتهای مثبت طولانیمدت را در زندگی ایجاد و حفظ کنید. نمودارها و آمارهای دقیق، تصویری واضح از چگونگی بهبود عادتهای شما در طول زمان به شما میدهد. این برنامه کاملاً بدون تبلیغات و منبعباز است و به حریم خصوصی شما احترام میگذارد.
|
||||||
|
|
||||||
<b>رابط کاربری زیبا، مینیمال و سبک</b>
|
<b>رابط کاربری زیبا، مینیمال و سبک</b>
|
||||||
Loop دارای یک رابط زیبا و مینیمال است که استفاده از آن حتی برای کاربرانی که برای بار اول استفاده میکنند بسیار آسان است. این برنامه از نظر سرعت عملکرد بسیار بهینه شده و حتی در تلفنهای قدیمی نیز به خوبی کار میکند.
|
Loop دارای یک رابط زیبا و مینیمال است که استفاده از آن حتی برای کاربرانی که برای بار اول استفاده میکنند بسیار آسان است. این برنامه از نظر سرعت عملکرد بسیار بهینه شده و حتی در تلفنهای قدیمی نیز به خوبی کار میکند.
|
||||||
|
|
||||||
<b>نمره عادت</b>
|
<b>نمره عادت</b>
|
||||||
Loop فرمول پیشرفتهای برای محاسبه قدرت عادتهای شما دارد. هر تکرار عادت شما را قویتر میکند و هر روز فراموششده آن را ضعیف میکند. چند روز از دست رفته پس از یک رشته طولانی ، برخلاف بسیاری از برنامه های شکننده نشده ، پیشرفت شما را به طور کامل از بین نمی برد.
|
لوپ فرمول پیشرفتهای برای محاسبه قدرت عادتهای شما دارد. هر تکرار عادت شما را قویتر میکند و هر روز فراموششده آن را ضعیف میکند. ولی برخلاف دیگر برنامههای عادتسنج، اگر بعد از یک روند طولانی حفظ عادت، چند روز آن عادت را انجام ندهید، پیشرفت شما به صورت کامل نابود نخواهد شد.
|
||||||
|
|
||||||
برنامهریزی با دست باز
|
<b>برنامهریزی منعطف</b>
|
||||||
علاوه بر علاوه بر عادتهایی که هر روز باید تکرار شوند، شما میتوانید برنامهریزیهای متنوعی دیگری را تنظیم کنید، مثلا هفته ای سه بار یا روز در میان
|
علاوه بر علاوه بر عادتهایی که هر روز باید تکرار شوند، شما میتوانید برنامهریزیهای متنوعی دیگری را تنظیم کنید، مثلا هفته ای سه بار یا روز در میان
|
||||||
|
|
||||||
یاداوری
|
یاداوری
|
||||||
@@ -19,11 +19,11 @@ Loop فرمول پیشرفتهای برای محاسبه قدرت عادت
|
|||||||
اگر می خواهید داده های خود را بیشتر تجزیه و تحلیل کنید ، یا آنها را به سرویس دیگری منتقل کنید ، Loop به شما امکان می دهد آنها را به صفحه گسترده (CSV) یا یک پرونده پایگاه داده (SQLite) صادر کنید. برای کاربران قدرت ، علامت های تأیید را می توان از طریق برنامه های دیگر مانند Tasker اضافه کرد.
|
اگر می خواهید داده های خود را بیشتر تجزیه و تحلیل کنید ، یا آنها را به سرویس دیگری منتقل کنید ، Loop به شما امکان می دهد آنها را به صفحه گسترده (CSV) یا یک پرونده پایگاه داده (SQLite) صادر کنید. برای کاربران قدرت ، علامت های تأیید را می توان از طریق برنامه های دیگر مانند Tasker اضافه کرد.
|
||||||
|
|
||||||
<b>بدون محدودیت</b>
|
<b>بدون محدودیت</b>
|
||||||
هر تعداد که می خواهید عادت ها را دنبال کنید. حلقه محدودیتی مصنوعی در تعداد عادت های شما ایجاد نمی کند. همه ویژگی ها در دسترس همه کاربران است. هیچ خرید درون برنامه ای وجود ندارد.
|
هر تعداد که می خواهید عادت ها را دنبال کنید. حلقه محدودیتی مصنوعی در تعداد عادت های شما ایجاد نمی کند. همه ویژگیها برای همه کاربران در دسترس هستند. هیچ خرید درونبرنامهای وجود ندارد.
|
||||||
|
|
||||||
<b>کاملاً بدون آگهی و منبع آزاد</b>
|
<b>کاملاً بدون آگهی و منبع باز</b>
|
||||||
هیچ تبلیغی ، اعلان آزار دهنده یا مجوز سرزده در این برنامه وجود ندارد و هرگز وجود نخواهد داشت. برنامه کاملاً منبع باز (GPLv3) است.
|
هیچ تبلیغ، اعلان آزاردهنده یا مجوز بیاجازه در این برنامه وجود ندارد و هرگز وجود نخواهد داشت. برنامه کاملاً منبع باز (GPLv3) است.
|
||||||
|
|
||||||
<b>بصورت آفلاین کار می کند و به حریم خصوصی شما احترام می گذارد</b>
|
<b>به صورت آفلاین کار میکند و به حریم خصوصی شما احترام می گذارد</b>
|
||||||
حلقه به اتصال اینترنت یا ثبت نام آنلاین حساب نیاز ندارد. اطلاعات محرمانه شما هرگز برای کسی ارسال نمی شود. نه توسعه دهندگان و نه اشخاص ثالث به آن دسترسی ندارند.
|
لوپ به اینترنت یا ثبتنام آنلاین نیاز ندارد. اطلاعات محرمانه شما هرگز به جایی ارسال نمیشود. نه توسعهدهندگان و نه اشخاص ثالث به آن دسترسی ندارند.
|
||||||
|
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
ایجاد عادت های خوب و پیگیری پیشرفت آنها در طول زمان (بدون تبلیغ)
|
عادتهای خوب ایجاد کنید و پیشرفت آنها را در طول زمان پیگیری کنید (بدون تبلیغ)
|
||||||
|
|||||||
@@ -1,29 +1,29 @@
|
|||||||
אפליקצית Loop Habit Tracker עוזרת לך ליצור ולשמר הרגלים חיוביים וארוכי טווח בחייך. תרשימים וסטטיסטיקה מפורטים נותנים לך תמונה ברורה כיצד ההרגלים שלך השתפרו לאורך זמן. האפליקציה הינה נטולת פרסומות לחלוטין, כתובה בקוד פתוח וכן מכבדת את הפרטיות שלך.
|
„Loop למעקב אחר ההרגלים” מסייע לך ביצירה ובשימור הרגלים טובים וארוכי טווח. תרשימים וסטטיסטיקה מפורטים נותנים לך תמונה ברורה כיצד ההרגלים שלך השתפרו לאורך זמן. היישום נטול פרסומות לחלוטין, קוד המקור שלו פתוח והוא מכבד את הפרטיות שלך.
|
||||||
|
|
||||||
<b>ממשק יפה, מינימלי וקליל</b>
|
<b>ממשק יפה, חסכוני וקליל</b>
|
||||||
ל־Loop ממשק מינימלי וקל לשימוש, כבר בשימוש הראשון. האפליקציה מותאמת מאוד לפעולה מהירה, ופועלת היטב גם בטלפונים ישנים.
|
ל־Loop ממשק אלגנטי, חסכוני וקל לשימוש אפילו בפעם הראשונה. היישום מותאם במיוחד למהירות, ועובד היטב גם בטלפונים ישנים.
|
||||||
|
|
||||||
<b>ציון הרגל</b>
|
<b>ציון הרגל</b>
|
||||||
ל־Loop יש נוסחה מתקדמת לחישוב חוזק ההרגלים שלך. כל חזרה הופכת את ההרגל שלכם לחזק יותר, וכל יום שהוחמץ הופך אותו לחלש יותר. כמה ימים שהוחמצו לאחר רצף ארוך, לעומת זאת, לא יהרסו לחלוטין את ההתקדמות, בניגוד להרבה אפליקציות אחרות מסוג "אל תשברו את השרשרת".
|
ל־Loop יש נוסחה מתקדמת לחישוב חוזק ההרגלים שלך. כל חזרה על ההרגל מחזקת אותו, וכל יום שהוחמץ מחליש אותו. כמה ימים שהוחמצו לאחר רצף ארוך, לעומת זאת, לא יהרסו לחלוטין את ההתקדמות, בניגוד ליישומים רבים אחרים מסוג „לא לשבור את השרשרת”.
|
||||||
|
|
||||||
<b>לוחות זמנים גמישים</b>
|
<b>לוחות זמנים גמישים</b>
|
||||||
בנוסף להרגלים יומיומיים, Loop תומכת בהרגלים עם לוחות זמנים מורכבים יותר, כמו 3 פעמים בשבוע או "יום כן יום לא".
|
בנוסף להרגלים יומיומיים, Loop תומך בהרגלים עם לוחות זמנים מורכבים יותר, כמו 3 פעמים בשבוע או „יום כן יום לא”.
|
||||||
|
|
||||||
<b>תזכורות</b>
|
<b>תזכורות</b>
|
||||||
אפשר לתזמן התראות קבועות עם תזכורות לגבי ההרגלים שלך. לכל הרגל יכולה להיות תזכורת משלו, בשעה שנבחרה ביום. אפשר לסמן או לדחות את עשיית ההרגל ישירות מההתראה בקלות.
|
אפשר לתזמן התראות קבועות עם תזכורות לגבי ההרגלים שלך. לכל הרגל יכולה להיות תזכורת משלו, בשעה שנבחרה ביום. אפשר לסמן או לדחות את עשיית ההרגל ישירות מההתראה בקלות.
|
||||||
|
|
||||||
<b>ווידג'טים</b>
|
<b>יישומונים</b>
|
||||||
היזכרו בהרגלים בכל שחרור נעילת הטלפון. ווידג'טים צבעוניים מאפשרים לך לעקוב אחר הרגליך ישירות ממסך הבית שלך, מבלי לפתוח את האפליקציה אפילו.
|
להיזכר בהרגלים בכל שחרור נעילת הטלפון. יישומונים צבעוניים שמאפשרים לך לעקוב אחר ההרגלים ישירות ממסך הבית, מבלי לפתוח אפילו את היישום.
|
||||||
|
|
||||||
<b>השליטה בנתונים היא בידיים שלך</b>
|
<b>השליטה בנתונים היא בידיים שלך</b>
|
||||||
אם ברצונך לנתח עוד יותר את הנתונים שלך, או להעביר אותם לשירות אחר, Loop מאפשרת לך לייצא אותם לגיליונות אלקטרוניים (CSV) או לקובץ מסד נתונים (SQLite). עבור משתמשים מובילים, ישנה יכולת להוסיף ביקורת באמצעות אפליקציות אחרות, כגון Tasker.
|
אם ברצונך לנתח יותר לעומק את הנתונים שלך, או להעבירם לשירות אחר, Loop מאפשרת לך לייצא אותם לגיליונות אלקטרוניים (CSV) או לקובץ מסד נתונים (SQLite). למשתמשים מתקדמים, אפשר לסמן הרגלים דרך יישומים אחרים, כגון Tasker.
|
||||||
|
|
||||||
<b>בלי הגבלות</b>
|
<b>בלי הגבלות</b>
|
||||||
עקבו אחר כמה הרגלים שתרצו. Loop לא מגבילה את כמות ההרגלים שאפשר להוסיף. כל התכונות זמינות לכל המשתמשים. אין רכישות מתוך האפליקציה.
|
אפשר לעקוב אחר כמה הרגלים שרוצים. Loop לא מגבילה את כמות ההרגלים שאפשר להוסיף. כל התכונות זמינות לכל המשתמשים. אין רכישות מתוך היישום.
|
||||||
|
|
||||||
<b>נטול פרסומות במלואו ובקוד פתוח</b>
|
<b>היישום נטול פרסומות במלואו וקוד המקור שלו פתוח</b>
|
||||||
אין שום פרסומות, התראות מעצבנות או הרשאות פולשניות ביישום הזה, ולעולם לא יהיו. הקוד של היישום הזה פתוח במלואו (GPLv3).
|
אין שום פרסומות, התראות מעצבנות או הרשאות פולשניות ביישום הזה, ולעולם לא יהיו. קוד היישום הזה פתוח לחלוטין (GPLv3).
|
||||||
|
|
||||||
<b>עובד במצב לא מקוון ומכבד את פרטיותך</b>
|
<b>עובד במצב לא מקוון ומכבד את פרטיותך</b>
|
||||||
ל־Loop לא נחוצים חיבור לאינטרנט או הרשמה לחשבון מקוון. הנתונים הסודיים שלך לא נשלחים לאחרים בכלל. גם למפתחים וגם לגורמי צד שלישי כלשהם אין גישה אליהם.
|
ל־Loop לא נחוצים חיבור לאינטרנט או הרשמה לחשבון מקוון. הנתונים הסודיים שלך לא נשלחים לאחרים כלל. גם למפתחים וגם לגורמי צד שלישי כלשהם אין גישה אליהם.
|
||||||
|
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
התחלת הרגלים טובים ומעקב אחר ההתקדמות בעשייתם למשך זמן (ללא פרסומות)
|
התחלת הרגלים טובים ומעקב אחר ההתקדמות בעשייתם לאורך זמן (ללא פרסומות)
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ Plan notificaties om jezelf te herinneren aan je gewoontes. Elke gewoonte kan zi
|
|||||||
<b>Widgets</b>
|
<b>Widgets</b>
|
||||||
Wordt bij elke telefoonontgrendeling herinnerd aan je gewoontes. Kleurrijke widgets maken het mogelijk je gewoontes direct vanuit het startscherm te tracken, zonder de app te openen.
|
Wordt bij elke telefoonontgrendeling herinnerd aan je gewoontes. Kleurrijke widgets maken het mogelijk je gewoontes direct vanuit het startscherm te tracken, zonder de app te openen.
|
||||||
|
|
||||||
<b>Neem controle over uw gegevens</b>
|
<b>Neem controle over je gegevens</b>
|
||||||
Als je jouw gegevens verder wilt analyseren, of wil verplaatsen in een andere service, dan geeft Loop je de mogelijkheid het te exporteren naar spreadsheets (CSV) of naar een databasebestand (SQlite). Voor hoofdgebruikers kunnen vinkjes worden toegevoegd via andere apps, zoals Tasker.
|
Als je jouw gegevens verder wilt analyseren, of wil verplaatsen in een andere service, dan geeft Loop je de mogelijkheid het te exporteren naar spreadsheets (CSV) of naar een databasebestand (SQlite). Voor hoofdgebruikers kunnen vinkjes worden toegevoegd via andere apps, zoals Tasker.
|
||||||
|
|
||||||
<b>Geen beperkingen</b>
|
<b>Geen beperkingen</b>
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
Трекер привычек Loop помогает вам создавать и поддерживать долгосрочные позитивные привычки в своей жизни. Подробные графики и статистика дадут вам чёткое представление о том, как ваши привычки улучшились с течением времени. Приложение полностью без рекламы, с открытым исходным кодом и с уважением к вашей конфиденциальности.
|
Трекер привычек Loop помогает вам создавать и поддерживать долгосрочные позитивные привычки в своей жизни. Подробные графики и статистика дадут вам чёткое представление о том, как ваши привычки улучшились с течением времени. Приложение полностью без рекламы, с открытым исходным кодом и с уважением к вашей конфиденциальности.
|
||||||
|
|
||||||
<b>Красивый, минималистичный и лёгкий интерфейс</b>
|
<b>Красивый, минималистичный и лёгкий интерфейс</b>
|
||||||
У Loop изящный и минималистичный интерфейс, который очень прост в использовании даже для начинающих пользователей. Высокооптимизированное для скорости, приложение хорошо работает даже на старых телефонах.
|
У Loop изящный и минималистичный интерфейс, который очень прост в использовании даже для начинающих пользователей. Оптимизированное по скорости приложение хорошо работает даже на старых телефонах.
|
||||||
|
|
||||||
<b>Показатель привычек</b>
|
<b>Показатель устойчивости привычки</b>
|
||||||
У Loop есть продвинутая формула для расчёта силы ваших привычек. Каждое повторение делает вашу привычку сильнее, а каждый пропущенный день - слабее. Однако несколько пропущенных дней после долгой полосы не погубят ваш прогресс в отличие от многих других приложений типа "не разрывай цепь".
|
У Loop есть продвинутая формула для расчёта силы ваших привычек. Каждое повторение делает вашу привычку сильнее, а каждый пропущенный день - слабее. Однако несколько пропущенных дней после долгой полосы не погубят ваш прогресс в отличие от многих других приложений типа "не разрывай цепь".
|
||||||
|
|
||||||
<b>Гибкий график</b>
|
<b>Гибкий график</b>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
Loop 习惯记录(以下简称“Loop”)可以帮助您建立好习惯且随着时间记录你的进步。 详细的图表和统计数据,可以使您更清楚地看到自己的进步。 该应用是完全无广告的开源软件,并且它尊重您的隐私。
|
Loop 习惯记录(以下简称“Loop”)能帮你养成和长期保持好习惯。 详细的图表和统计数据能让您更清楚地看到自己的进步。 这是一个完全无广告的开源应用,它尊重您的隐私。
|
||||||
|
|
||||||
<b>优雅、简约、轻巧</b>
|
<b>优雅、简约、轻巧</b>
|
||||||
Loop 具有优雅而简约的界面,即使对于初次使用的用户,也非常易于使用。 该应用针对速度进行了高度优化,即使在较旧的手机上也可以正常运行。
|
Loop 具有优雅而简约的界面,即使对于初次使用的用户,也非常易于使用。 该应用针对速度进行了高度优化,即使在较旧的手机上也可以正常运行。
|
||||||
@@ -12,7 +12,7 @@ Loop 有高级的公式来计算您习惯的强度。 多多重复会使你的
|
|||||||
<b>提醒</b>
|
<b>提醒</b>
|
||||||
设定通知以提醒您完成习惯。 每一种习惯都有属于自己的通知,您可以选定当天的某个时间提醒该习惯。 同时从通知中轻松地检查或取消您的习惯。
|
设定通知以提醒您完成习惯。 每一种习惯都有属于自己的通知,您可以选定当天的某个时间提醒该习惯。 同时从通知中轻松地检查或取消您的习惯。
|
||||||
|
|
||||||
<b>小部件</b>
|
<b>微件</b>
|
||||||
当您解锁手机时, 多彩的小部件可让您直接从主屏幕记录自己的习惯,而无需打开应用程序。
|
当您解锁手机时, 多彩的小部件可让您直接从主屏幕记录自己的习惯,而无需打开应用程序。
|
||||||
|
|
||||||
<b>掌控您的数据</b>
|
<b>掌控您的数据</b>
|
||||||
@@ -22,7 +22,7 @@ Loop 有高级的公式来计算您习惯的强度。 多多重复会使你的
|
|||||||
想记录多少习惯都没问题! Loop 对您的习惯没有任何限制, 所有用户均可使用所有功能, 并且没有应用内购买。
|
想记录多少习惯都没问题! Loop 对您的习惯没有任何限制, 所有用户均可使用所有功能, 并且没有应用内购买。
|
||||||
|
|
||||||
<b>完全无广告的开源软件</b>
|
<b>完全无广告的开源软件</b>
|
||||||
此应用程序中永远没有任何广告,烦人的通知或侵入性权限, 应用程序是完全开源的,完整的代码在GPLv3。
|
本应用永远都不会有广告和烦人的通知,也不会索取侵入性权限。 本应用是完全开源的(GPLv3)。
|
||||||
|
|
||||||
<b>脱机工作并尊重您的隐私</b>
|
<b>脱机工作并尊重您的隐私</b>
|
||||||
Loop 不需要网络连接或在线帐户注册。 您的用户数据永远不会发送给任何人, 包括开发人员和任何第三方都无法访问它。
|
Loop 不需要网络连接或在线帐户注册。 您的用户数据永远不会发送给任何人, 包括开发人员和任何第三方都无法访问它。
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
建立好习惯且随着时间记录你的进步(无广告)
|
养成好习惯并随时记录你的进步(无广告)
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
2.0.3:
|
||||||
|
* Bug fixes
|
||||||
2.0:
|
2.0:
|
||||||
* Track numeric habits (e.g. how many pages did you read?)
|
* Track numeric habits (e.g. how many pages did you read?)
|
||||||
* Skip days without breaking your streak
|
* Skip days without breaking your streak
|
||||||
|
|||||||
@@ -30,9 +30,11 @@
|
|||||||
<TextView style="@style/About.Item" android:text="tat bz" />
|
<TextView style="@style/About.Item" android:text="tat bz" />
|
||||||
<TextView style="@style/About.Item.Language" android:text="Español" />
|
<TextView style="@style/About.Item.Language" android:text="Español" />
|
||||||
<TextView style="@style/About.Item" android:text="Ander Raso Vazquez" />
|
<TextView style="@style/About.Item" android:text="Ander Raso Vazquez" />
|
||||||
|
<TextView style="@style/About.Item" android:text="Eilif Adelvice" />
|
||||||
<TextView style="@style/About.Item" android:text="Iabin Arteaga" />
|
<TextView style="@style/About.Item" android:text="Iabin Arteaga" />
|
||||||
<TextView style="@style/About.Item" android:text="Sebastian05067" />
|
<TextView style="@style/About.Item" android:text="Sebastian05067" />
|
||||||
<TextView style="@style/About.Item" android:text="luiandresgonzalez" />
|
<TextView style="@style/About.Item" android:text="luiandresgonzalez" />
|
||||||
|
<TextView style="@style/About.Item" android:text="oscfd" />
|
||||||
<TextView style="@style/About.Item.Language" android:text="Esperanto" />
|
<TextView style="@style/About.Item.Language" android:text="Esperanto" />
|
||||||
<TextView style="@style/About.Item" android:text="4001982248998" />
|
<TextView style="@style/About.Item" android:text="4001982248998" />
|
||||||
<TextView style="@style/About.Item" android:text="marco.baturan" />
|
<TextView style="@style/About.Item" android:text="marco.baturan" />
|
||||||
@@ -48,11 +50,14 @@
|
|||||||
<TextView style="@style/About.Item" android:text="Samuel Guay" />
|
<TextView style="@style/About.Item" android:text="Samuel Guay" />
|
||||||
<TextView style="@style/About.Item" android:text="Thibaut Girka" />
|
<TextView style="@style/About.Item" android:text="Thibaut Girka" />
|
||||||
<TextView style="@style/About.Item" android:text="Tiralka" />
|
<TextView style="@style/About.Item" android:text="Tiralka" />
|
||||||
|
<TextView style="@style/About.Item" android:text="_translator" />
|
||||||
<TextView style="@style/About.Item" android:text="roptat" />
|
<TextView style="@style/About.Item" android:text="roptat" />
|
||||||
<TextView style="@style/About.Item.Language" android:text="Fārsi" />
|
<TextView style="@style/About.Item.Language" android:text="Fārsi" />
|
||||||
<TextView style="@style/About.Item" android:text="Behnood HRazy" />
|
<TextView style="@style/About.Item" android:text="Behnood HRazy" />
|
||||||
<TextView style="@style/About.Item" android:text="Eman" />
|
<TextView style="@style/About.Item" android:text="Eman" />
|
||||||
<TextView style="@style/About.Item" android:text="Saeed Esmaili" />
|
<TextView style="@style/About.Item" android:text="Saeed Esmaili" />
|
||||||
|
<TextView style="@style/About.Item.Language" android:text="Hindi" />
|
||||||
|
<TextView style="@style/About.Item" android:text="Vijaykumar Borkar" />
|
||||||
<TextView style="@style/About.Item.Language" android:text="Hrvatski" />
|
<TextView style="@style/About.Item.Language" android:text="Hrvatski" />
|
||||||
<TextView style="@style/About.Item" android:text="Ivan Krušlin" />
|
<TextView style="@style/About.Item" android:text="Ivan Krušlin" />
|
||||||
<TextView style="@style/About.Item.Language" android:text="Italiano" />
|
<TextView style="@style/About.Item.Language" android:text="Italiano" />
|
||||||
@@ -63,6 +68,7 @@
|
|||||||
<TextView style="@style/About.Item" android:text="Isti" />
|
<TextView style="@style/About.Item" android:text="Isti" />
|
||||||
<TextView style="@style/About.Item" android:text="gapszi" />
|
<TextView style="@style/About.Item" android:text="gapszi" />
|
||||||
<TextView style="@style/About.Item.Language" android:text="Nederlands" />
|
<TextView style="@style/About.Item.Language" android:text="Nederlands" />
|
||||||
|
<TextView style="@style/About.Item" android:text="Blinkin" />
|
||||||
<TextView style="@style/About.Item" android:text="Bryanx" />
|
<TextView style="@style/About.Item" android:text="Bryanx" />
|
||||||
<TextView style="@style/About.Item" android:text="Jelle den Butter" />
|
<TextView style="@style/About.Item" android:text="Jelle den Butter" />
|
||||||
<TextView style="@style/About.Item" android:text="Mark Macaré" />
|
<TextView style="@style/About.Item" android:text="Mark Macaré" />
|
||||||
@@ -91,6 +97,7 @@
|
|||||||
<TextView style="@style/About.Item" android:text="Dušan Strgar" />
|
<TextView style="@style/About.Item" android:text="Dušan Strgar" />
|
||||||
<TextView style="@style/About.Item.Language" android:text="Suomen kieli" />
|
<TextView style="@style/About.Item.Language" android:text="Suomen kieli" />
|
||||||
<TextView style="@style/About.Item" android:text="2kaafone" />
|
<TextView style="@style/About.Item" android:text="2kaafone" />
|
||||||
|
<TextView style="@style/About.Item" android:text="Antti Kallio" />
|
||||||
<TextView style="@style/About.Item" android:text="Elina Salminen" />
|
<TextView style="@style/About.Item" android:text="Elina Salminen" />
|
||||||
<TextView style="@style/About.Item" android:text="Sofia Veijonen" />
|
<TextView style="@style/About.Item" android:text="Sofia Veijonen" />
|
||||||
<TextView style="@style/About.Item.Language" android:text="Svenska" />
|
<TextView style="@style/About.Item.Language" android:text="Svenska" />
|
||||||
@@ -104,6 +111,7 @@
|
|||||||
<TextView style="@style/About.Item" android:text="Huy Ngo" />
|
<TextView style="@style/About.Item" android:text="Huy Ngo" />
|
||||||
<TextView style="@style/About.Item" android:text="Lương Vĩnh Khang" />
|
<TextView style="@style/About.Item" android:text="Lương Vĩnh Khang" />
|
||||||
<TextView style="@style/About.Item" android:text="Trần Thái" />
|
<TextView style="@style/About.Item" android:text="Trần Thái" />
|
||||||
|
<TextView style="@style/About.Item" android:text="bruhwut" />
|
||||||
<TextView style="@style/About.Item" android:text="pnhpnh" />
|
<TextView style="@style/About.Item" android:text="pnhpnh" />
|
||||||
<TextView style="@style/About.Item.Language" android:text="Türkçe" />
|
<TextView style="@style/About.Item.Language" android:text="Türkçe" />
|
||||||
<TextView style="@style/About.Item" android:text="Caner Başaran" />
|
<TextView style="@style/About.Item" android:text="Caner Başaran" />
|
||||||
@@ -124,6 +132,7 @@
|
|||||||
<TextView style="@style/About.Item" android:text="Diana Karaseva" />
|
<TextView style="@style/About.Item" android:text="Diana Karaseva" />
|
||||||
<TextView style="@style/About.Item" android:text="Dmitriy Bogdanov" />
|
<TextView style="@style/About.Item" android:text="Dmitriy Bogdanov" />
|
||||||
<TextView style="@style/About.Item" android:text="Tanya" />
|
<TextView style="@style/About.Item" android:text="Tanya" />
|
||||||
|
<TextView style="@style/About.Item" android:text="engineeringforgood" />
|
||||||
<TextView style="@style/About.Item.Language" android:text="Українська" />
|
<TextView style="@style/About.Item.Language" android:text="Українська" />
|
||||||
<TextView style="@style/About.Item" android:text="Oglaigh Rystard" />
|
<TextView style="@style/About.Item" android:text="Oglaigh Rystard" />
|
||||||
<TextView style="@style/About.Item" android:text="Prosta4ok_ua" />
|
<TextView style="@style/About.Item" android:text="Prosta4ok_ua" />
|
||||||
@@ -136,6 +145,7 @@
|
|||||||
<TextView style="@style/About.Item" android:text="Slobodan Simić" />
|
<TextView style="@style/About.Item" android:text="Slobodan Simić" />
|
||||||
<TextView style="@style/About.Item" android:text="Đorđe Vasiljević" />
|
<TextView style="@style/About.Item" android:text="Đorđe Vasiljević" />
|
||||||
<TextView style="@style/About.Item.Language" android:text="עברית" />
|
<TextView style="@style/About.Item.Language" android:text="עברית" />
|
||||||
|
<TextView style="@style/About.Item" android:text="Ohad Edri" />
|
||||||
<TextView style="@style/About.Item" android:text="Omer I.S." />
|
<TextView style="@style/About.Item" android:text="Omer I.S." />
|
||||||
<TextView style="@style/About.Item" android:text="Omry Cohen" />
|
<TextView style="@style/About.Item" android:text="Omry Cohen" />
|
||||||
<TextView style="@style/About.Item" android:text="Yoav Argov" />
|
<TextView style="@style/About.Item" android:text="Yoav Argov" />
|
||||||
@@ -147,6 +157,7 @@
|
|||||||
<TextView style="@style/About.Item" android:text="Michael Malak" />
|
<TextView style="@style/About.Item" android:text="Michael Malak" />
|
||||||
<TextView style="@style/About.Item" android:text="Saeed Esmaili" />
|
<TextView style="@style/About.Item" android:text="Saeed Esmaili" />
|
||||||
<TextView style="@style/About.Item" android:text="Sief Tarek" />
|
<TextView style="@style/About.Item" android:text="Sief Tarek" />
|
||||||
|
<TextView style="@style/About.Item" android:text="alalloush" />
|
||||||
<TextView style="@style/About.Item" android:text="mohmans" />
|
<TextView style="@style/About.Item" android:text="mohmans" />
|
||||||
<TextView style="@style/About.Item" android:text="reyhoon" />
|
<TextView style="@style/About.Item" android:text="reyhoon" />
|
||||||
<TextView style="@style/About.Item.Language" android:text="فارسی" />
|
<TextView style="@style/About.Item.Language" android:text="فارسی" />
|
||||||
@@ -171,6 +182,7 @@
|
|||||||
<TextView style="@style/About.Item" android:text="QWERT" />
|
<TextView style="@style/About.Item" android:text="QWERT" />
|
||||||
<TextView style="@style/About.Item" android:text="Ting-Hua" />
|
<TextView style="@style/About.Item" android:text="Ting-Hua" />
|
||||||
<TextView style="@style/About.Item" android:text="XuToTo" />
|
<TextView style="@style/About.Item" android:text="XuToTo" />
|
||||||
|
<TextView style="@style/About.Item" android:text="yoding" />
|
||||||
<TextView style="@style/About.Item" android:text="黄克" />
|
<TextView style="@style/About.Item" android:text="黄克" />
|
||||||
<TextView style="@style/About.Item.Language" android:text="日本語" />
|
<TextView style="@style/About.Item.Language" android:text="日本語" />
|
||||||
<TextView style="@style/About.Item" android:text="Naofumi F" />
|
<TextView style="@style/About.Item" android:text="Naofumi F" />
|
||||||
|
|||||||
@@ -185,7 +185,7 @@
|
|||||||
style="@style/FormInput"
|
style="@style/FormInput"
|
||||||
android:id="@+id/targetInput"
|
android:id="@+id/targetInput"
|
||||||
android:maxLines="1"
|
android:maxLines="1"
|
||||||
android:inputType="number"
|
android:inputType="numberDecimal"
|
||||||
android:hint="@string/example_target"/>
|
android:hint="@string/example_target"/>
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
</FrameLayout>
|
</FrameLayout>
|
||||||
@@ -248,4 +248,4 @@
|
|||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
</ScrollView>
|
</ScrollView>
|
||||||
|
|
||||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||||
|
|||||||
@@ -31,19 +31,19 @@
|
|||||||
android:id="@+id/scoreRing"
|
android:id="@+id/scoreRing"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="0dp"
|
android:layout_height="0dp"
|
||||||
android:layout_weight="1"
|
android:layout_weight="0.9"
|
||||||
habit:thickness="2"
|
habit:thickness="2"
|
||||||
habit:textSize="16"
|
habit:textSize="16"
|
||||||
habit:enableFontAwesome="true"
|
habit:enableFontAwesome="true"
|
||||||
android:layout_marginTop="8dp"
|
android:layout_marginTop="8dp"
|
||||||
android:layout_marginLeft="12dp"
|
android:layout_marginLeft="4dp"
|
||||||
android:layout_marginRight="12dp"/>
|
android:layout_marginRight="4dp"/>
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/label"
|
android:id="@+id/label"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_weight="0"
|
android:layout_weight="0.1"
|
||||||
android:textSize="12sp"
|
android:textSize="12sp"
|
||||||
android:textColor="@color/white"
|
android:textColor="@color/white"
|
||||||
android:layout_marginLeft="6dp"
|
android:layout_marginLeft="6dp"
|
||||||
|
|||||||
@@ -17,9 +17,7 @@
|
|||||||
~ You should have received a copy of the GNU General Public License along
|
~ You should have received a copy of the GNU General Public License along
|
||||||
~ with this program. If not, see <http://www.gnu.org/licenses/>.
|
~ with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
-->
|
-->
|
||||||
|
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
|
||||||
<string name="app_name">Loop - Gewoonte Boekhouer</string>
|
<string name="app_name">Loop - Gewoonte Boekhouer</string>
|
||||||
<string name="main_activity_title">Gewoontes</string>
|
<string name="main_activity_title">Gewoontes</string>
|
||||||
<string name="action_settings">Instellings</string>
|
<string name="action_settings">Instellings</string>
|
||||||
@@ -30,12 +28,7 @@
|
|||||||
<string name="add_habit">Voeg gewoonte by</string>
|
<string name="add_habit">Voeg gewoonte by</string>
|
||||||
<string name="color_picker_default_title">Verander kleur</string>
|
<string name="color_picker_default_title">Verander kleur</string>
|
||||||
<string name="toast_habit_created">Gewoonte geskep</string>
|
<string name="toast_habit_created">Gewoonte geskep</string>
|
||||||
<string name="toast_habit_deleted">Gewoontes verwyder</string>
|
|
||||||
<string name="toast_habit_changed">Gewoonte verander</string>
|
|
||||||
<string name="toast_habit_archived">Gewoontes geargiveer</string>
|
|
||||||
<string name="toast_habit_unarchived">Gewoontes gedeargiveer</string>
|
|
||||||
<string name="overview">Oorsig</string>
|
<string name="overview">Oorsig</string>
|
||||||
<!-- App introduction -->
|
|
||||||
<string name="intro_title_1">Welkom</string>
|
<string name="intro_title_1">Welkom</string>
|
||||||
<string name="interval_15_minutes">15 minute</string>
|
<string name="interval_15_minutes">15 minute</string>
|
||||||
<string name="interval_30_minutes">30 minute</string>
|
<string name="interval_30_minutes">30 minute</string>
|
||||||
@@ -45,6 +38,4 @@
|
|||||||
<string name="interval_8_hour">8 ure</string>
|
<string name="interval_8_hour">8 ure</string>
|
||||||
<string name="interval_24_hour">24 ure</string>
|
<string name="interval_24_hour">24 ure</string>
|
||||||
<string name="settings">Instellings</string>
|
<string name="settings">Instellings</string>
|
||||||
<!-- Different types of habits -->
|
|
||||||
<!-- Middle part of the sentence '1 time in xx days' -->
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--
|
<!--
|
||||||
~ Copyright (C) 2016 Álinson Santos Xavier <isoron@gmail.com>
|
~ Copyright (C) 2016-2021 Álinson Santos Xavier <git@axavier.org>
|
||||||
~
|
~
|
||||||
~ This file is part of Loop Habit Tracker.
|
~ This file is part of Loop Habit Tracker.
|
||||||
~
|
~
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
~ You should have received a copy of the GNU General Public License along
|
~ You should have received a copy of the GNU General Public License along
|
||||||
~ with this program. If not, see <http://www.gnu.org/licenses/>.
|
~ with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
-->
|
-->
|
||||||
<resources>
|
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||||
<string name="app_name">Loop Habit Tracker</string>
|
<string name="app_name">Loop Habit Tracker</string>
|
||||||
<string name="main_activity_title">عادات</string>
|
<string name="main_activity_title">عادات</string>
|
||||||
<string name="action_settings">إعدادات</string>
|
<string name="action_settings">إعدادات</string>
|
||||||
@@ -28,19 +28,15 @@
|
|||||||
<string name="add_habit">إضافة عادة</string>
|
<string name="add_habit">إضافة عادة</string>
|
||||||
<string name="color_picker_default_title">تغيير اللون</string>
|
<string name="color_picker_default_title">تغيير اللون</string>
|
||||||
<string name="toast_habit_created">تم إنشاء عادة</string>
|
<string name="toast_habit_created">تم إنشاء عادة</string>
|
||||||
<string name="toast_habit_deleted">تم حذف العادات</string>
|
|
||||||
<string name="toast_habit_changed">تم تغيير عادة</string>
|
|
||||||
<string name="toast_habit_archived">تم أرشفه العادات </string>
|
|
||||||
<string name="toast_habit_unarchived">تم الغاء ارشفه العادات </string>
|
|
||||||
<string name="overview">نظرة عامة</string>
|
<string name="overview">نظرة عامة</string>
|
||||||
<string name="habit_strength">قوة العادة</string>
|
<string name="habit_strength">قوة العادة</string>
|
||||||
<string name="history">السجل</string>
|
<string name="history">السجل</string>
|
||||||
<string name="clear">إزالة</string>
|
<string name="clear">إزالة</string>
|
||||||
<string name="days">أيام</string>
|
|
||||||
<string name="reminder">تذكير</string>
|
<string name="reminder">تذكير</string>
|
||||||
<string name="save">حفظ</string>
|
<string name="save">حفظ</string>
|
||||||
<string name="streaks">الإنجازات </string>
|
<string name="streaks">الإنجازات </string>
|
||||||
<string name="no_habits_found"> لا يوجد لديك عادات مفعله</string>
|
<string name="no_habits_found"> لا يوجد لديك عادات مفعله</string>
|
||||||
|
<string name="no_habits_left_to_do">لقد أنهيت ألعمل لليوم</string>
|
||||||
<string name="long_press_to_toggle">إلمس و إستمر لتحقق أو ازل. </string>
|
<string name="long_press_to_toggle">إلمس و إستمر لتحقق أو ازل. </string>
|
||||||
<string name="reminder_off">إيقاف</string>
|
<string name="reminder_off">إيقاف</string>
|
||||||
<string name="create_habit">انشاء العادة</string>
|
<string name="create_habit">انشاء العادة</string>
|
||||||
@@ -64,20 +60,16 @@
|
|||||||
<string name="interval_custom">مخصص... </string>
|
<string name="interval_custom">مخصص... </string>
|
||||||
<string name="pref_toggle_title">تبديل وضعية العادة بضغطة قصيرة </string>
|
<string name="pref_toggle_title">تبديل وضعية العادة بضغطة قصيرة </string>
|
||||||
<string name="pref_toggle_description">وضع علامات الاختيار الموجودة بنقرة واحدة بدلاً من الصحافة وعقد. أكثر ملاءمة، ولكن قد يتسبب في تبديل عرضي. </string>
|
<string name="pref_toggle_description">وضع علامات الاختيار الموجودة بنقرة واحدة بدلاً من الصحافة وعقد. أكثر ملاءمة، ولكن قد يتسبب في تبديل عرضي. </string>
|
||||||
<string name="pref_snooze_interval_title">فترتي الغفوى على التذكير </string>
|
|
||||||
<string name="pref_rate_this_app">تقييم هذا التطبيق على جوجل بلاي </string>
|
<string name="pref_rate_this_app">تقييم هذا التطبيق على جوجل بلاي </string>
|
||||||
<string name="pref_send_feedback">أرسل الملاحظات إلى المطور </string>
|
<string name="pref_send_feedback">أرسل الملاحظات إلى المطور </string>
|
||||||
<string name="pref_view_source_code">إفحص التعليمات البرمجية على GitHub </string>
|
<string name="pref_view_source_code">إفحص التعليمات البرمجية على GitHub </string>
|
||||||
<string name="links">روابط </string>
|
<string name="links">روابط </string>
|
||||||
<string name="name">اسم </string>
|
<string name="name">اسم </string>
|
||||||
<string name="settings">إعدادات</string>
|
<string name="settings">إعدادات</string>
|
||||||
<string name="snooze_interval">فترتي الغفوه </string>
|
|
||||||
<string name="select_snooze_delay">حدد تأخير الغفوة </string>
|
<string name="select_snooze_delay">حدد تأخير الغفوة </string>
|
||||||
<string name="hint_title">هل كنت تعلم؟ </string>
|
<string name="hint_title">هل كنت تعلم؟ </string>
|
||||||
<string name="hint_drag">لإعادة ترتيب القوائم، أضغط اسم من هذه العادة، ثم اسحبه إلى المكان الصحيح. </string>
|
<string name="hint_drag">لإعادة ترتيب القوائم، أضغط اسم من هذه العادة، ثم اسحبه إلى المكان الصحيح. </string>
|
||||||
<string name="hint_landscape">يمكنك ان ترى المزيد أيام عن طريق وضع الهاتف في وضع أفقي. </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="habit_not_found">العادة حذفت/لم يتم العثور عليها </string>
|
||||||
<string name="weekends">عطلة نهاية الأسبوع </string>
|
<string name="weekends">عطلة نهاية الأسبوع </string>
|
||||||
<string name="any_weekday">أيام الأسبوع. </string>
|
<string name="any_weekday">أيام الأسبوع. </string>
|
||||||
@@ -111,7 +103,7 @@
|
|||||||
<string name="generate_bug_report">توليد تقرير الاعطال. </string>
|
<string name="generate_bug_report">توليد تقرير الاعطال. </string>
|
||||||
<string name="troubleshooting">استكشاف الأخطاء وإصلاحها. </string>
|
<string name="troubleshooting">استكشاف الأخطاء وإصلاحها. </string>
|
||||||
<string name="help_translate">المساعدة في ترجمة هذا البرنامج. </string>
|
<string name="help_translate">المساعدة في ترجمة هذا البرنامج. </string>
|
||||||
<string name="night_mode">الوضع الليلي. </string>
|
<string name="night_mode" comment="dark_theme">الوضع الليلي. </string>
|
||||||
<string name="use_pure_black">استخدام أسود نقي في الوضع الليلي. </string>
|
<string name="use_pure_black">استخدام أسود نقي في الوضع الليلي. </string>
|
||||||
<string name="pure_black_description">يستبدل خلفيات رمادية مع أسود نقي في الوضع الليلي. يقلل من استهلاك البطارية في الهواتف مع شاشة AMOLED. .</string>
|
<string name="pure_black_description">يستبدل خلفيات رمادية مع أسود نقي في الوضع الليلي. يقلل من استهلاك البطارية في الهواتف مع شاشة AMOLED. .</string>
|
||||||
<string name="interface_preferences">السطح البيني. </string>
|
<string name="interface_preferences">السطح البيني. </string>
|
||||||
@@ -147,6 +139,7 @@
|
|||||||
<string name="by_name">حسب الإسم </string>
|
<string name="by_name">حسب الإسم </string>
|
||||||
<string name="by_color">حسب اللون </string>
|
<string name="by_color">حسب اللون </string>
|
||||||
<string name="by_score">حسب النقاط </string>
|
<string name="by_score">حسب النقاط </string>
|
||||||
|
<string name="by_status">حسب الحالة</string>
|
||||||
<string name="export">استخراج </string>
|
<string name="export">استخراج </string>
|
||||||
<string name="long_press_to_edit">اضغط مع الاستمرار لتغيرالقيمه</string>
|
<string name="long_press_to_edit">اضغط مع الاستمرار لتغيرالقيمه</string>
|
||||||
<string name="change_value">تغيير القيمة </string>
|
<string name="change_value">تغيير القيمة </string>
|
||||||
@@ -170,16 +163,29 @@
|
|||||||
<string name="example_notes">(اختياري)</string>
|
<string name="example_notes">(اختياري)</string>
|
||||||
<string name="yes_or_no_example">مثلا: هل استيقظت باكرا اليوم؟ هل مارست الرياضة؟ هل لعبت الشطرنج؟</string>
|
<string name="yes_or_no_example">مثلا: هل استيقظت باكرا اليوم؟ هل مارست الرياضة؟ هل لعبت الشطرنج؟</string>
|
||||||
<string name="measurable">قابل للقياس</string>
|
<string name="measurable">قابل للقياس</string>
|
||||||
<string name="measurable_example" comment="Feel free to replace "miles" by "km"">مثلا: كم كيلومتراً قطعته اليوم؟ كم صفحة قرأتها؟ كم عدد السعرات الحرارية التي أكلتها؟</string>
|
<string name="measurable_example">مثال، كم ميلاً قطعته اليوم؟ كم عدد الصفحات التي قرأتها؟</string>
|
||||||
<string name="x_times_per_week">%d مرة في الأسبوع</string>
|
<string name="x_times_per_week">%d مرة في الأسبوع</string>
|
||||||
<string name="x_times_per_month">%d مرة في الشهر</string>
|
<string name="x_times_per_month">%d مرة في الشهر</string>
|
||||||
<string name="yes_or_no_short_example">مثال: التمرين</string>
|
<string name="yes_or_no_short_example">مثال: التمرين</string>
|
||||||
<string name="color">اللون</string>
|
<string name="color">اللون</string>
|
||||||
<string name="example_target">مثال: 15</string>
|
<string name="example_target">مثال: 15</string>
|
||||||
<string name="measurable_short_example">مثلا: الجري</string>
|
<string name="measurable_short_example">مثلا: الجري</string>
|
||||||
<string name="measurable_question_example" comment="Feel free to replace "miles" by "km" if that is more common in your country">مثلا: كم كيلومترًا جريته اليوم؟</string>
|
<string name="measurable_question_example">مثلا: كم كيلومترًا جريته اليوم؟</string>
|
||||||
<string name="measurable_units_example" comment="Feel free to replace by "km" if that is more common in your country">مثلا: كيلومترات</string>
|
<string name="measurable_units_example">مثلا: كيلومترات</string>
|
||||||
<string name="every_month">كل شهر</string>
|
<string name="every_month">كل شهر</string>
|
||||||
<string name="validation_cannot_be_blank">لا يمكن أن يكون الإسم فارغًا</string>
|
<string name="validation_cannot_be_blank">لا يمكن أن يكون الإسم فارغًا</string>
|
||||||
<string name="today">اليوم</string>
|
<string name="today">اليوم</string>
|
||||||
|
<string name="enter">ادخل</string>
|
||||||
|
<string name="no_habits">لا توجد عادات</string>
|
||||||
|
<string name="no_numerical_habits">لا توجد عادات قابلة للقياس</string>
|
||||||
|
<string name="no_boolean_habits">لا توجد عادات تجاوب بنعم أو لا</string>
|
||||||
|
<string name="increment">زيادة</string>
|
||||||
|
<string name="decrement">إنقاص</string>
|
||||||
|
<string name="pref_skip_title">تمكين أيام التخطي</string>
|
||||||
|
<string name="pref_skip_description">بدّل مرتين لإضافة تخطي بدلاً من علامة اختيار. التخطيات تحافظ على درجاتك دون تغيير أو خسارة سلسلة الانتصارات.</string>
|
||||||
|
<string name="pref_unknown_title">إظهار علامات الاستفهام للبيانات المفقودة</string>
|
||||||
|
<string name="you_are_now_a_developer">أنت الآن مطوَِر برمجيات!</string>
|
||||||
|
<string name="activity_not_found">لم يتم العثور على تطبيق لإتمام هذا الإجراء</string>
|
||||||
|
<string name="pref_midnight_delay_title">تمديد اليوم بضع ساعات بعد منتصف الليل</string>
|
||||||
|
<string name="pref_midnight_delay_description">انتظر حتى 3:00 صباحاً لعرض يوم جديد. مفيد إذا كنت عادة تذهب إلى السكون بعد منتصف الليل. يتطلب إعادة تشغيل التطبيق.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -17,9 +17,7 @@
|
|||||||
~ You should have received a copy of the GNU General Public License along
|
~ You should have received a copy of the GNU General Public License along
|
||||||
~ with this program. If not, see <http://www.gnu.org/licenses/>.
|
~ with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
-->
|
-->
|
||||||
|
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
|
||||||
<string name="app_name">Loop Следене на навици</string>
|
<string name="app_name">Loop Следене на навици</string>
|
||||||
<string name="main_activity_title">Навици</string>
|
<string name="main_activity_title">Навици</string>
|
||||||
<string name="action_settings">Настройки</string>
|
<string name="action_settings">Настройки</string>
|
||||||
@@ -30,16 +28,10 @@
|
|||||||
<string name="add_habit">Добавяне на навик</string>
|
<string name="add_habit">Добавяне на навик</string>
|
||||||
<string name="color_picker_default_title">Промяна на цвят</string>
|
<string name="color_picker_default_title">Промяна на цвят</string>
|
||||||
<string name="toast_habit_created">Навикът е създаден</string>
|
<string name="toast_habit_created">Навикът е създаден</string>
|
||||||
<string name="toast_habit_deleted">Навиците са изтрити</string>
|
|
||||||
<string name="toast_habit_changed">Навикът е променен</string>
|
|
||||||
<string name="toast_habit_archived">Навиците са архивирани</string>
|
|
||||||
<string name="toast_habit_unarchived">Навиците са разархивирани</string>
|
|
||||||
<string name="overview">Обзор</string>
|
<string name="overview">Обзор</string>
|
||||||
<string name="habit_strength">Сила на навика</string>
|
<string name="habit_strength">Сила на навика</string>
|
||||||
<string name="history">История</string>
|
<string name="history">История</string>
|
||||||
<string name="clear">Изчистване</string>
|
<string name="clear">Изчистване</string>
|
||||||
<string name="times_every">пъти в период от</string>
|
|
||||||
<string name="days">дни</string>
|
|
||||||
<string name="reminder">Напомняне</string>
|
<string name="reminder">Напомняне</string>
|
||||||
<string name="save">Запазване</string>
|
<string name="save">Запазване</string>
|
||||||
<string name="streaks">Поредици</string>
|
<string name="streaks">Поредици</string>
|
||||||
@@ -50,7 +42,6 @@
|
|||||||
<string name="edit_habit">Редактиране на навик</string>
|
<string name="edit_habit">Редактиране на навик</string>
|
||||||
<string name="check">Поставяне на отметка</string>
|
<string name="check">Поставяне на отметка</string>
|
||||||
<string name="snooze">По-късно</string>
|
<string name="snooze">По-късно</string>
|
||||||
<!-- App introduction -->
|
|
||||||
<string name="intro_title_1">Добре дошли</string>
|
<string name="intro_title_1">Добре дошли</string>
|
||||||
<string name="intro_description_1">Loop Следене на навици ви помага да създавате и поддържате добри навици.</string>
|
<string name="intro_description_1">Loop Следене на навици ви помага да създавате и поддържате добри навици.</string>
|
||||||
<string name="intro_title_2">Създайте нови навици</string>
|
<string name="intro_title_2">Създайте нови навици</string>
|
||||||
@@ -75,8 +66,6 @@
|
|||||||
<string name="hint_title">Знаете ли че?</string>
|
<string name="hint_title">Знаете ли че?</string>
|
||||||
<string name="hint_drag">За да пренаредите записите, натиснете и задръжте върху името на навика и го придърпайте до правилното място.</string>
|
<string name="hint_drag">За да пренаредите записите, натиснете и задръжте върху името на навика и го придърпайте до правилното място.</string>
|
||||||
<string name="hint_landscape">Може да виждате повече дни като обърнете телефона си в хоризонтално положение.</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="habit_not_found">Навикът е изтрит / не е намерен</string>
|
||||||
<string name="weekends">Събота и неделя</string>
|
<string name="weekends">Събота и неделя</string>
|
||||||
<string name="any_weekday">От понеделник до петък</string>
|
<string name="any_weekday">От понеделник до петък</string>
|
||||||
@@ -110,7 +99,7 @@
|
|||||||
<string name="generate_bug_report">Генериране на доклад за грешки</string>
|
<string name="generate_bug_report">Генериране на доклад за грешки</string>
|
||||||
<string name="troubleshooting">Отстраняване на проблеми</string>
|
<string name="troubleshooting">Отстраняване на проблеми</string>
|
||||||
<string name="help_translate">Помагане за превода на това приложение</string>
|
<string name="help_translate">Помагане за превода на това приложение</string>
|
||||||
<string name="night_mode">Нощен режим</string>
|
<string name="night_mode" comment="dark_theme">Нощен режим</string>
|
||||||
<string name="use_pure_black">Използване на чисто черно при нощен режим</string>
|
<string name="use_pure_black">Използване на чисто черно при нощен режим</string>
|
||||||
<string name="pure_black_description">Заменя сивите фонове с чисто черни при нощен режим. Намаля разхода на батерията при телефони с AMOLED дисплеи.</string>
|
<string name="pure_black_description">Заменя сивите фонове с чисто черни при нощен режим. Намаля разхода на батерията при телефони с AMOLED дисплеи.</string>
|
||||||
<string name="interface_preferences">Интерфейс</string>
|
<string name="interface_preferences">Интерфейс</string>
|
||||||
@@ -122,8 +111,6 @@
|
|||||||
<string name="quarter">Тримесечие</string>
|
<string name="quarter">Тримесечие</string>
|
||||||
<string name="year">Година</string>
|
<string name="year">Година</string>
|
||||||
<string name="total">Общо</string>
|
<string name="total">Общо</string>
|
||||||
<!-- Different types of habits -->
|
|
||||||
<!-- Middle part of the sentence '1 time in xx days' -->
|
|
||||||
<string name="every_x_days">На всеки %d дни</string>
|
<string name="every_x_days">На всеки %d дни</string>
|
||||||
<string name="every_x_weeks">На всеки %d седмици</string>
|
<string name="every_x_weeks">На всеки %d седмици</string>
|
||||||
<string name="score">Сила</string>
|
<string name="score">Сила</string>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--
|
<!--
|
||||||
~ Copyright (C) 2016 Álinson Santos Xavier <isoron@gmail.com>
|
~ Copyright (C) 2016-2021 Álinson Santos Xavier <git@axavier.org>
|
||||||
~
|
~
|
||||||
~ This file is part of Loop Habit Tracker.
|
~ This file is part of Loop Habit Tracker.
|
||||||
~
|
~
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
~ You should have received a copy of the GNU General Public License along
|
~ You should have received a copy of the GNU General Public License along
|
||||||
~ with this program. If not, see <http://www.gnu.org/licenses/>.
|
~ with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
-->
|
-->
|
||||||
<resources>
|
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||||
<string name="app_name">Loop - Hàbit Rastrejador</string>
|
<string name="app_name">Loop - Hàbit Rastrejador</string>
|
||||||
<string name="main_activity_title">Hàbits</string>
|
<string name="main_activity_title">Hàbits</string>
|
||||||
<string name="action_settings">Configuració</string>
|
<string name="action_settings">Configuració</string>
|
||||||
@@ -28,19 +28,23 @@
|
|||||||
<string name="add_habit">Afegir hàbit</string>
|
<string name="add_habit">Afegir hàbit</string>
|
||||||
<string name="color_picker_default_title">Canviar color</string>
|
<string name="color_picker_default_title">Canviar color</string>
|
||||||
<string name="toast_habit_created">Hàbit creat.</string>
|
<string name="toast_habit_created">Hàbit creat.</string>
|
||||||
<string name="toast_habit_deleted">Hàbits esborrats.</string>
|
<plurals name="toast_habits_changed">
|
||||||
<string name="toast_habit_changed">Hàbit modificat.</string>
|
<item quantity="one">Hàbit modificat.</item>
|
||||||
<string name="toast_habit_archived">Hàbits arxivats.</string>
|
<item quantity="other">Hàbit modificat.</item>
|
||||||
<string name="toast_habit_unarchived">Hàbits trets de l\'arxiu.</string>
|
</plurals>
|
||||||
|
<plurals name="toast_habits_unarchived">
|
||||||
|
<item quantity="one">Hàbit no arxivat</item>
|
||||||
|
<item quantity="other">Hàbit no arxivat</item>
|
||||||
|
</plurals>
|
||||||
<string name="overview">Visió general</string>
|
<string name="overview">Visió general</string>
|
||||||
<string name="habit_strength">Fortalesa de l\'hàbit</string>
|
<string name="habit_strength">Fortalesa de l\'hàbit</string>
|
||||||
<string name="history">Història</string>
|
<string name="history">Història</string>
|
||||||
<string name="clear">Netejar</string>
|
<string name="clear">Netejar</string>
|
||||||
<string name="days">dies</string>
|
|
||||||
<string name="reminder">Recordatori</string>
|
<string name="reminder">Recordatori</string>
|
||||||
<string name="save">Desar</string>
|
<string name="save">Desar</string>
|
||||||
<string name="streaks">Ratxa</string>
|
<string name="streaks">Ratxa</string>
|
||||||
<string name="no_habits_found">No tens hàbits actius</string>
|
<string name="no_habits_found">No tens hàbits actius</string>
|
||||||
|
<string name="no_habits_left_to_do">Ja heu acabat per avui!</string>
|
||||||
<string name="long_press_to_toggle">Prem i manté per a marcar o desmarcar</string>
|
<string name="long_press_to_toggle">Prem i manté per a marcar o desmarcar</string>
|
||||||
<string name="reminder_off">Desactivat</string>
|
<string name="reminder_off">Desactivat</string>
|
||||||
<string name="create_habit">Crear hàbit</string>
|
<string name="create_habit">Crear hàbit</string>
|
||||||
@@ -64,20 +68,20 @@
|
|||||||
<string name="interval_custom">Personalitza...</string>
|
<string name="interval_custom">Personalitza...</string>
|
||||||
<string name="pref_toggle_title">Activar/desactivar repeticions prement curt</string>
|
<string name="pref_toggle_title">Activar/desactivar repeticions prement curt</string>
|
||||||
<string name="pref_toggle_description">Posar les marques de verificació amb un sol toc enlloc de prémer i mantenir. Més adequat, però pot causar activacions accidentals.</string>
|
<string name="pref_toggle_description">Posar les marques de verificació amb un sol toc enlloc de prémer i mantenir. 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_rate_this_app">Valora aquesta app a Google Play</string>
|
||||||
<string name="pref_send_feedback">Enviar resposta al desenvolupador</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_source_code">Veure codi font a Github</string>
|
||||||
<string name="links">Enllaços</string>
|
<string name="links">Enllaços</string>
|
||||||
<string name="name">Nom</string>
|
<string name="name">Nom</string>
|
||||||
<string name="settings">Ajustaments</string>
|
<string name="settings">Ajustaments</string>
|
||||||
<string name="snooze_interval">Interval d\'endarreriment</string>
|
|
||||||
<string name="select_snooze_delay">Selecciona el retard de l\'endarreriment</string>
|
<string name="select_snooze_delay">Selecciona el retard de l\'endarreriment</string>
|
||||||
<string name="hint_title">Ho sabies?</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_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="hint_landscape">Pots veure més dies posant el teu telèfon en orientació apaisada.</string>
|
||||||
<string name="delete_habits">Esborrar hàbits</string>
|
<plurals name="delete_habits_title">
|
||||||
<string name="delete_habits_message">Els hàbits seran esborrats permanentment. Aquesta acció no es pot desfer.</string>
|
<item quantity="one">Esborrar hàbit</item>
|
||||||
|
<item quantity="other">Esborrar hàbit</item>
|
||||||
|
</plurals>
|
||||||
<string name="habit_not_found">Hàbit suprimit / no trobat</string>
|
<string name="habit_not_found">Hàbit suprimit / no trobat</string>
|
||||||
<string name="weekends">Caps de setmana</string>
|
<string name="weekends">Caps de setmana</string>
|
||||||
<string name="any_weekday">Dilluns a divendres</string>
|
<string name="any_weekday">Dilluns a divendres</string>
|
||||||
@@ -111,7 +115,7 @@
|
|||||||
<string name="generate_bug_report">Generar informe d\'error</string>
|
<string name="generate_bug_report">Generar informe d\'error</string>
|
||||||
<string name="troubleshooting">Resolució de problemes</string>
|
<string name="troubleshooting">Resolució de problemes</string>
|
||||||
<string name="help_translate">Ajuda a traduïr aquesta app</string>
|
<string name="help_translate">Ajuda a traduïr aquesta app</string>
|
||||||
<string name="night_mode">Mode nocturn</string>
|
<string name="night_mode" comment="dark_theme">Mode nocturn</string>
|
||||||
<string name="use_pure_black">Utilitzar negre pur en el 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="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="interface_preferences">Interfície</string>
|
||||||
@@ -147,6 +151,7 @@
|
|||||||
<string name="by_name">Per nom</string>
|
<string name="by_name">Per nom</string>
|
||||||
<string name="by_color">Pel color</string>
|
<string name="by_color">Pel color</string>
|
||||||
<string name="by_score">Per marcador</string>
|
<string name="by_score">Per marcador</string>
|
||||||
|
<string name="by_status">Per estat</string>
|
||||||
<string name="export">Exportar</string>
|
<string name="export">Exportar</string>
|
||||||
<string name="long_press_to_edit">Prémer i mantenir per a canviar el valor</string>
|
<string name="long_press_to_edit">Prémer i mantenir per a canviar el valor</string>
|
||||||
<string name="change_value">Canviar el valor</string>
|
<string name="change_value">Canviar el valor</string>
|
||||||
@@ -170,15 +175,14 @@
|
|||||||
<string name="example_notes">Opcional</string>
|
<string name="example_notes">Opcional</string>
|
||||||
<string name="yes_or_no_example">Per exemple, us heu despertat aviat? Heu fet exercici? Heu jugat a escacs?</string>
|
<string name="yes_or_no_example">Per exemple, us heu despertat aviat? Heu fet exercici? Heu jugat a escacs?</string>
|
||||||
<string name="measurable">Mesurable</string>
|
<string name="measurable">Mesurable</string>
|
||||||
<string name="measurable_example" comment="Feel free to replace "miles" by "km"">Per exemple, quants quilòmetres heu recorregut avui? Quantes pàgines heu llegit? Quantes calories heu menjat?</string>
|
|
||||||
<string name="x_times_per_week">%d vegades per setmana</string>
|
<string name="x_times_per_week">%d vegades per setmana</string>
|
||||||
<string name="x_times_per_month">%d vegades al mes</string>
|
<string name="x_times_per_month">%d vegades al mes</string>
|
||||||
<string name="yes_or_no_short_example">Ex. Exercici</string>
|
<string name="yes_or_no_short_example">Ex. Exercici</string>
|
||||||
<string name="color">Color</string>
|
<string name="color">Color</string>
|
||||||
<string name="example_target">ex. 15</string>
|
<string name="example_target">ex. 15</string>
|
||||||
<string name="measurable_short_example">Per exemple: córrer</string>
|
<string name="measurable_short_example">Per exemple: córrer</string>
|
||||||
<string name="measurable_question_example" comment="Feel free to replace "miles" by "km" if that is more common in your country">Per exemple, quants quilòmetres heu recorregut avui?</string>
|
<string name="measurable_question_example">Per exemple, quants quilòmetres heu recorregut avui?</string>
|
||||||
<string name="measurable_units_example" comment="Feel free to replace by "km" if that is more common in your country">per exemple, quilòmetres</string>
|
<string name="measurable_units_example">per exemple, quilòmetres</string>
|
||||||
<string name="every_month">Cada mes</string>
|
<string name="every_month">Cada mes</string>
|
||||||
<string name="validation_cannot_be_blank">No es pot deixar en blanc</string>
|
<string name="validation_cannot_be_blank">No es pot deixar en blanc</string>
|
||||||
<string name="today">Avui</string>
|
<string name="today">Avui</string>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--
|
<!--
|
||||||
~ Copyright (C) 2016 Álinson Santos Xavier <isoron@gmail.com>
|
~ Copyright (C) 2016-2021 Álinson Santos Xavier <git@axavier.org>
|
||||||
~
|
~
|
||||||
~ This file is part of Loop Habit Tracker.
|
~ This file is part of Loop Habit Tracker.
|
||||||
~
|
~
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
~ You should have received a copy of the GNU General Public License along
|
~ You should have received a copy of the GNU General Public License along
|
||||||
~ with this program. If not, see <http://www.gnu.org/licenses/>.
|
~ with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
-->
|
-->
|
||||||
<resources>
|
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||||
<string name="app_name">Loop Habit Tracker</string>
|
<string name="app_name">Loop Habit Tracker</string>
|
||||||
<string name="main_activity_title">Zvyky</string>
|
<string name="main_activity_title">Zvyky</string>
|
||||||
<string name="action_settings">Nastavení</string>
|
<string name="action_settings">Nastavení</string>
|
||||||
@@ -28,15 +28,10 @@
|
|||||||
<string name="add_habit">Přidat zvyk</string>
|
<string name="add_habit">Přidat zvyk</string>
|
||||||
<string name="color_picker_default_title">Změnit barvu</string>
|
<string name="color_picker_default_title">Změnit barvu</string>
|
||||||
<string name="toast_habit_created">Zvyk vytvořen.</string>
|
<string name="toast_habit_created">Zvyk vytvořen.</string>
|
||||||
<string name="toast_habit_deleted">Zvyky smazány.</string>
|
|
||||||
<string name="toast_habit_changed">Zvyk změněn.</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="overview">Přehled</string>
|
||||||
<string name="habit_strength">Síla zvyku</string>
|
<string name="habit_strength">Síla zvyku</string>
|
||||||
<string name="history">Historie</string>
|
<string name="history">Historie</string>
|
||||||
<string name="clear">Smazat</string>
|
<string name="clear">Smazat</string>
|
||||||
<string name="days">dní</string>
|
|
||||||
<string name="reminder">Připomenutí</string>
|
<string name="reminder">Připomenutí</string>
|
||||||
<string name="save">Uložit</string>
|
<string name="save">Uložit</string>
|
||||||
<string name="streaks">Série</string>
|
<string name="streaks">Série</string>
|
||||||
@@ -64,20 +59,16 @@
|
|||||||
<string name="interval_custom">Vlastní...</string>
|
<string name="interval_custom">Vlastní...</string>
|
||||||
<string name="pref_toggle_title">Označte opakování krátkým stisknutím</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_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_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_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_source_code">Zobrazit zdroj. kód na GitHub</string>
|
||||||
<string name="links">Odkazy</string>
|
<string name="links">Odkazy</string>
|
||||||
<string name="name">Jméno</string>
|
<string name="name">Jméno</string>
|
||||||
<string name="settings">Nastavení</string>
|
<string name="settings">Nastavení</string>
|
||||||
<string name="snooze_interval">Interval odkladu</string>
|
|
||||||
<string name="select_snooze_delay">Nastavit délku odložení</string>
|
<string name="select_snooze_delay">Nastavit délku odložení</string>
|
||||||
<string name="hint_title">Věděli jste?</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_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="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="habit_not_found">Zvyk smazán / nenalezen</string>
|
||||||
<string name="weekends">Víkendy</string>
|
<string name="weekends">Víkendy</string>
|
||||||
<string name="any_weekday">Pondělí až pátek</string>
|
<string name="any_weekday">Pondělí až pátek</string>
|
||||||
@@ -111,7 +102,7 @@
|
|||||||
<string name="generate_bug_report">Generovat výpis chyb</string>
|
<string name="generate_bug_report">Generovat výpis chyb</string>
|
||||||
<string name="troubleshooting">Řešení problémů</string>
|
<string name="troubleshooting">Řešení problémů</string>
|
||||||
<string name="help_translate">Pomozte s překladem aplikace</string>
|
<string name="help_translate">Pomozte s překladem aplikace</string>
|
||||||
<string name="night_mode">Noční téma</string>
|
<string name="night_mode" comment="dark_theme">Noční téma</string>
|
||||||
<string name="use_pure_black">Zobrazit čistě černou v nočním tématu</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="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="interface_preferences">Rozhraní</string>
|
||||||
@@ -170,16 +161,16 @@
|
|||||||
<string name="example_notes">(nepovinné)</string>
|
<string name="example_notes">(nepovinné)</string>
|
||||||
<string name="yes_or_no_example">např. Vzbudil ses dnes brzy? Cvičil jsi dnes? Hrál jsi šachy?</string>
|
<string name="yes_or_no_example">např. Vzbudil ses dnes brzy? Cvičil jsi dnes? Hrál jsi šachy?</string>
|
||||||
<string name="measurable">Měřitelný</string>
|
<string name="measurable">Měřitelný</string>
|
||||||
<string name="measurable_example" comment="Feel free to replace "miles" by "km"">např. Kolik kilometrů jsi dnes uběhl? Kolik stránek jsi přečetl? Kolik kalorií jsi snědl?</string>
|
|
||||||
<string name="x_times_per_week">%d krát týdně</string>
|
<string name="x_times_per_week">%d krát týdně</string>
|
||||||
<string name="x_times_per_month">%d krát za měsíc</string>
|
<string name="x_times_per_month">%d krát za měsíc</string>
|
||||||
<string name="yes_or_no_short_example">např. Cvičení</string>
|
<string name="yes_or_no_short_example">např. Cvičení</string>
|
||||||
<string name="color">Barva</string>
|
<string name="color">Barva</string>
|
||||||
<string name="example_target">např. 15</string>
|
<string name="example_target">např. 15</string>
|
||||||
<string name="measurable_short_example">např. Běh</string>
|
<string name="measurable_short_example">např. Běh</string>
|
||||||
<string name="measurable_question_example" comment="Feel free to replace "miles" by "km" if that is more common in your country">Např. kolik mil jste dnes uběhl?</string>
|
<string name="measurable_question_example">Např. kolik mil jste dnes uběhl?</string>
|
||||||
<string name="measurable_units_example" comment="Feel free to replace by "km" if that is more common in your country">např. míle</string>
|
<string name="measurable_units_example">např. míle</string>
|
||||||
<string name="every_month">Každý měsíc</string>
|
<string name="every_month">Každý měsíc</string>
|
||||||
<string name="validation_cannot_be_blank">Musíte vyplnit</string>
|
<string name="validation_cannot_be_blank">Musíte vyplnit</string>
|
||||||
<string name="today">Dnes</string>
|
<string name="today">Dnes</string>
|
||||||
|
<string name="you_are_now_a_developer">Nyní jste vývojář</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -17,9 +17,7 @@
|
|||||||
~ You should have received a copy of the GNU General Public License along
|
~ You should have received a copy of the GNU General Public License along
|
||||||
~ with this program. If not, see <http://www.gnu.org/licenses/>.
|
~ with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
-->
|
-->
|
||||||
|
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
|
||||||
<string name="app_name">Loop Vane Tracker</string>
|
<string name="app_name">Loop Vane Tracker</string>
|
||||||
<string name="main_activity_title">Vaner</string>
|
<string name="main_activity_title">Vaner</string>
|
||||||
<string name="action_settings">Indstillinger</string>
|
<string name="action_settings">Indstillinger</string>
|
||||||
@@ -30,27 +28,37 @@
|
|||||||
<string name="add_habit">Tilføj vane</string>
|
<string name="add_habit">Tilføj vane</string>
|
||||||
<string name="color_picker_default_title">Skift farve</string>
|
<string name="color_picker_default_title">Skift farve</string>
|
||||||
<string name="toast_habit_created">Vanen er skabt.</string>
|
<string name="toast_habit_created">Vanen er skabt.</string>
|
||||||
<string name="toast_habit_deleted">Vaner slettet</string>
|
<plurals name="toast_habits_changed">
|
||||||
<string name="toast_habit_changed">Vanen er ændret</string>
|
<item quantity="one">Vanen er ændret</item>
|
||||||
<string name="toast_habit_archived">Vanerne er arkiveret</string>
|
<item quantity="other">Vanerne er ændret</item>
|
||||||
<string name="toast_habit_unarchived">Vanerne er fjernet fra arkivet</string>
|
</plurals>
|
||||||
|
<plurals name="toast_habits_deleted">
|
||||||
|
<item quantity="one">Vanen er slettet</item>
|
||||||
|
<item quantity="other">Vanerne er slettet</item>
|
||||||
|
</plurals>
|
||||||
|
<plurals name="toast_habits_archived">
|
||||||
|
<item quantity="one">Vanen er arkiveret</item>
|
||||||
|
<item quantity="other">Vanerne er arkiveret</item>
|
||||||
|
</plurals>
|
||||||
|
<plurals name="toast_habits_unarchived">
|
||||||
|
<item quantity="one">Vane taget ud fra arkiv</item>
|
||||||
|
<item quantity="other">Vaner taget ud fra arkiv</item>
|
||||||
|
</plurals>
|
||||||
<string name="overview">Overblik</string>
|
<string name="overview">Overblik</string>
|
||||||
<string name="habit_strength">Vanestyrke</string>
|
<string name="habit_strength">Vanestyrke</string>
|
||||||
<string name="history">Historie</string>
|
<string name="history">Historie</string>
|
||||||
<string name="clear">Ryd</string>
|
<string name="clear">Ryd</string>
|
||||||
<string name="times_every">gange på</string>
|
|
||||||
<string name="days">dage</string>
|
|
||||||
<string name="reminder">Påmindelse</string>
|
<string name="reminder">Påmindelse</string>
|
||||||
<string name="save">Gem</string>
|
<string name="save">Gem</string>
|
||||||
<string name="streaks">Streaks</string>
|
<string name="streaks">Streaks</string>
|
||||||
<string name="no_habits_found">Du har ingen aktive vaner</string>
|
<string name="no_habits_found">Du har ingen aktive vaner</string>
|
||||||
|
<string name="no_habits_left_to_do">Du har klaret alt for i dag!</string>
|
||||||
<string name="long_press_to_toggle">Tryk og hold nede for at afkrydse</string>
|
<string name="long_press_to_toggle">Tryk og hold nede for at afkrydse</string>
|
||||||
<string name="reminder_off">Fra</string>
|
<string name="reminder_off">Fra</string>
|
||||||
<string name="create_habit">Opret vane</string>
|
<string name="create_habit">Opret vane</string>
|
||||||
<string name="edit_habit">Rediger vane</string>
|
<string name="edit_habit">Rediger vane</string>
|
||||||
<string name="check">Afkryds</string>
|
<string name="check">Afkryds</string>
|
||||||
<string name="snooze">Senere</string>
|
<string name="snooze">Senere</string>
|
||||||
<!-- App introduction -->
|
|
||||||
<string name="intro_title_1">Velkommen</string>
|
<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_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_title_2">Skab nogle nye vaner</string>
|
||||||
@@ -64,6 +72,8 @@
|
|||||||
<string name="interval_4_hour">4 timer</string>
|
<string name="interval_4_hour">4 timer</string>
|
||||||
<string name="interval_8_hour">8 timer</string>
|
<string name="interval_8_hour">8 timer</string>
|
||||||
<string name="interval_24_hour">24 timer</string>
|
<string name="interval_24_hour">24 timer</string>
|
||||||
|
<string name="interval_always_ask">Spørg altid</string>
|
||||||
|
<string name="interval_custom">Brugerdefineret...</string>
|
||||||
<string name="pref_toggle_title">Tjek vaner med kort tryk</string>
|
<string name="pref_toggle_title">Tjek vaner med kort tryk</string>
|
||||||
<string name="pref_toggle_description">Sæt tjekmærker med et enkelt tryk i stedet for tryk-og-hold. Mere bekvemmeligt, men kan forårsage uhensigtede tryk.</string>
|
<string name="pref_toggle_description">Sæt tjekmærker med et enkelt tryk i stedet for tryk-og-hold. Mere bekvemmeligt, men kan forårsage uhensigtede tryk.</string>
|
||||||
<string name="pref_rate_this_app">Bedøm denne app på Google Play</string>
|
<string name="pref_rate_this_app">Bedøm denne app på Google Play</string>
|
||||||
@@ -72,11 +82,18 @@
|
|||||||
<string name="links">Henvisninger</string>
|
<string name="links">Henvisninger</string>
|
||||||
<string name="name">Navn</string>
|
<string name="name">Navn</string>
|
||||||
<string name="settings">Indstillinger</string>
|
<string name="settings">Indstillinger</string>
|
||||||
|
<string name="select_snooze_delay">Vælg snooze-forsinkelse</string>
|
||||||
<string name="hint_title">Vidste du?</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_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="hint_landscape">Du kan se flere dage ved at sætte telefonen i liggende tilstand.</string>
|
||||||
<string name="delete_habits">Slet vaner</string>
|
<plurals name="delete_habits_title">
|
||||||
<string name="delete_habits_message">Vanerne vil blive slettet permanent. Denne handling kan ikke fortrydes.</string>
|
<item quantity="one">Slet vane?</item>
|
||||||
|
<item quantity="other">Slet vaner?</item>
|
||||||
|
</plurals>
|
||||||
|
<plurals name="delete_habits_message">
|
||||||
|
<item quantity="one">Vanen vil blive slettet permanent. Denne handling kan ikke fortrydes.</item>
|
||||||
|
<item quantity="other">Vanerne vil blive slettet permanent. Denne handling kan ikke fortrydes.</item>
|
||||||
|
</plurals>
|
||||||
<string name="habit_not_found">Vane slettet / ikke fundet</string>
|
<string name="habit_not_found">Vane slettet / ikke fundet</string>
|
||||||
<string name="weekends">Weekender</string>
|
<string name="weekends">Weekender</string>
|
||||||
<string name="any_weekday">Mandag til Fredag</string>
|
<string name="any_weekday">Mandag til Fredag</string>
|
||||||
@@ -87,13 +104,22 @@
|
|||||||
<string name="clear_label">Fjern</string>
|
<string name="clear_label">Fjern</string>
|
||||||
<string name="select_hours">Vælg timer</string>
|
<string name="select_hours">Vælg timer</string>
|
||||||
<string name="select_minutes">Vælg minutter</string>
|
<string name="select_minutes">Vælg minutter</string>
|
||||||
|
<string-array name="hints">
|
||||||
|
<item>hints</item>
|
||||||
|
<item>hints</item>
|
||||||
|
</string-array>
|
||||||
<string name="about">Om</string>
|
<string name="about">Om</string>
|
||||||
<string name="translators">Oversættere</string>
|
<string name="translators">Oversættere</string>
|
||||||
<string name="developers">Udviklere</string>
|
<string name="developers">Udviklere</string>
|
||||||
<string name="version_n">Version %s</string>
|
<string name="version_n">Version %s</string>
|
||||||
<string name="frequency">Hyppighed</string>
|
<string name="frequency">Hyppighed</string>
|
||||||
<string name="checkmark">Afkrydsning</string>
|
<string name="checkmark">Afkrydsning</string>
|
||||||
<string name="best_streaks">Bedste striber</string>
|
<string name="checkmark_stack_widget" formatted="false">Afkryds stakkontrol</string>
|
||||||
|
<string name="frequency_stack_widget" formatted="false">Frekvens stakkontrol</string>
|
||||||
|
<string name="score_stack_widget" formatted="false">Score stakkontrol</string>
|
||||||
|
<string name="history_stack_widget" formatted="false">Historik stakkontrol</string>
|
||||||
|
<string name="streaks_stack_widget" formatted="false">Uafbrudt række stakkontrol</string>
|
||||||
|
<string name="best_streaks">Bedste streak</string>
|
||||||
<string name="every_day">Hver dag</string>
|
<string name="every_day">Hver dag</string>
|
||||||
<string name="every_week">Hver uge</string>
|
<string name="every_week">Hver uge</string>
|
||||||
<string name="help">Hjælp & FAQ</string>
|
<string name="help">Hjælp & FAQ</string>
|
||||||
@@ -110,7 +136,7 @@
|
|||||||
<string name="generate_bug_report">Generer fejlrapport</string>
|
<string name="generate_bug_report">Generer fejlrapport</string>
|
||||||
<string name="troubleshooting">Fejlfinding</string>
|
<string name="troubleshooting">Fejlfinding</string>
|
||||||
<string name="help_translate">Hjælpe med at oversætte denne app</string>
|
<string name="help_translate">Hjælpe med at oversætte denne app</string>
|
||||||
<string name="night_mode">Nat-tilstand</string>
|
<string name="night_mode" comment="dark_theme">Nat-tilstand</string>
|
||||||
<string name="use_pure_black">Brug ren sort i 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="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="interface_preferences">Grænseflade</string>
|
||||||
@@ -122,8 +148,7 @@
|
|||||||
<string name="quarter">Kvartal</string>
|
<string name="quarter">Kvartal</string>
|
||||||
<string name="year">År</string>
|
<string name="year">År</string>
|
||||||
<string name="total">I alt</string>
|
<string name="total">I alt</string>
|
||||||
<!-- Different types of habits -->
|
<string name="yes_or_no">Ja eller nej</string>
|
||||||
<!-- Middle part of the sentence '1 time in xx days' -->
|
|
||||||
<string name="every_x_days">Hver %d dage</string>
|
<string name="every_x_days">Hver %d dage</string>
|
||||||
<string name="every_x_weeks">Hver %d uger</string>
|
<string name="every_x_weeks">Hver %d uger</string>
|
||||||
<string name="score">Point</string>
|
<string name="score">Point</string>
|
||||||
@@ -134,6 +159,8 @@
|
|||||||
<string name="hide_archived">Skjul arkiverede</string>
|
<string name="hide_archived">Skjul arkiverede</string>
|
||||||
<string name="sticky_notifications">Fastgør notifikationer</string>
|
<string name="sticky_notifications">Fastgør notifikationer</string>
|
||||||
<string name="sticky_notifications_description">Forhindrer notifikationer i at blive swipet væk.</string>
|
<string name="sticky_notifications_description">Forhindrer notifikationer i at blive swipet væk.</string>
|
||||||
|
<string name="led_notifications">Notifikationslys</string>
|
||||||
|
<string name="led_notifications_description">Viser et blinkende lys til påmindelser. Kun tilgængelig i telefoner med LED-notifikationslyskilder.</string>
|
||||||
<string name="repair_database">Reparer database</string>
|
<string name="repair_database">Reparer database</string>
|
||||||
<string name="database_repaired">Database repareret.</string>
|
<string name="database_repaired">Database repareret.</string>
|
||||||
<string name="uncheck">Fjern afkrydsning</string>
|
<string name="uncheck">Fjern afkrydsning</string>
|
||||||
@@ -145,5 +172,54 @@
|
|||||||
<string name="by_name">Efter navn</string>
|
<string name="by_name">Efter navn</string>
|
||||||
<string name="by_color">Efter farve</string>
|
<string name="by_color">Efter farve</string>
|
||||||
<string name="by_score">Efter score</string>
|
<string name="by_score">Efter score</string>
|
||||||
|
<string name="by_status">Efter status</string>
|
||||||
<string name="export">Eksporter</string>
|
<string name="export">Eksporter</string>
|
||||||
|
<string name="long_press_to_edit">Tryk-og-hold for at ændre værdien</string>
|
||||||
|
<string name="change_value">Skift værdi</string>
|
||||||
|
<string name="calendar">Kalender</string>
|
||||||
|
<string name="unit">Enhed</string>
|
||||||
|
<string name="example_question_boolean">f.eks. Har du trænet i dag?</string>
|
||||||
|
<string name="question">Spørgsmål</string>
|
||||||
|
<string name="target">Mål</string>
|
||||||
|
<string name="yes">Ja</string>
|
||||||
|
<string name="no">Nej</string>
|
||||||
|
<string name="customize_notification_summary">Skift lyd-, vibrations-, lys- og andre notifikationsindstillinger</string>
|
||||||
|
<string name="customize_notification">Tilpas notifikationer</string>
|
||||||
|
<string name="pref_view_privacy">Se privatlivspolitik</string>
|
||||||
|
<string name="view_all_contributors">Se alle bidragsydere…</string>
|
||||||
|
<string name="database">Database</string>
|
||||||
|
<string name="widget_opacity_title">Gennemsigtighed af widget</string>
|
||||||
|
<string name="widget_opacity_description">Gør widgets mere gennemsigtige eller mere uigennemsigtige på din startskærm.</string>
|
||||||
|
<string name="first_day_of_the_week">Første dag i ugen</string>
|
||||||
|
<string name="default_reminder_question">Har du fuldført denne vane i dag?</string>
|
||||||
|
<string name="notes">Noter</string>
|
||||||
|
<string name="example_notes">(Valgfrit)</string>
|
||||||
|
<string name="yes_or_no_example">F.eks. vågnede du tidligt i dag? Har du motioneret? Spillede du skak?</string>
|
||||||
|
<string name="measurable">Målbar</string>
|
||||||
|
<string name="measurable_example">f.eks Hvor mange kilometer kørte du i dag? Hvor mange sider læste du?</string>
|
||||||
|
<string name="x_times_per_week">%d gange om ugen</string>
|
||||||
|
<string name="x_times_per_month">%d gange om måneden</string>
|
||||||
|
<string name="yes_or_no_short_example">f.eks. Motion</string>
|
||||||
|
<string name="color">Farve</string>
|
||||||
|
<string name="example_target">f.eks. 15</string>
|
||||||
|
<string name="measurable_short_example">f.eks. Løb</string>
|
||||||
|
<string name="measurable_question_example">F.eks. Hvor mange kilometer har du løbet i dag?</string>
|
||||||
|
<string name="measurable_units_example">f.eks. kilometer</string>
|
||||||
|
<string name="every_month">Hver måned</string>
|
||||||
|
<string name="validation_cannot_be_blank">skal udfyldes</string>
|
||||||
|
<string name="today">I dag</string>
|
||||||
|
<string name="enter">Angiv</string>
|
||||||
|
<string name="no_habits">Ingen vaner fundet</string>
|
||||||
|
<string name="no_numerical_habits">Ingen målbare vaner fundet</string>
|
||||||
|
<string name="no_boolean_habits">Ingen ja-eller-nej vaner fundet</string>
|
||||||
|
<string name="increment">Forøgelse</string>
|
||||||
|
<string name="decrement">Formindskelse</string>
|
||||||
|
<string name="pref_skip_title">Slå overspring af dage til</string>
|
||||||
|
<string name="pref_skip_description">Skift to gange for at tilføje et overspring i stedet for et flueben. Spring over holder din score uændret og bryder ikke din række.</string>
|
||||||
|
<string name="pref_unknown_title">Vis spørgsmålstegn for manglende data</string>
|
||||||
|
<string name="pref_unknown_description">Differentiér dage uden data fra faktiske udeladelser. For at indtaste en udeladelse, skiftes to gange.</string>
|
||||||
|
<string name="you_are_now_a_developer">Du er nu udvikler</string>
|
||||||
|
<string name="activity_not_found">Ingen app fundet til at understøtte denne handling</string>
|
||||||
|
<string name="pref_midnight_delay_title">Forlæng dagen et par timer efter midnat</string>
|
||||||
|
<string name="pref_midnight_delay_description">Vent til 3:00 for at vise en ny dag. Nyttigt, hvis du typisk går i seng efter midnat. Kræver genstart af app.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -99,7 +99,7 @@
|
|||||||
<string name="any_weekday">Montag bis Freitag</string>
|
<string name="any_weekday">Montag bis Freitag</string>
|
||||||
<string name="any_day">Jeden Tag</string>
|
<string name="any_day">Jeden Tag</string>
|
||||||
<string name="select_weekdays">Tage auswählen</string>
|
<string name="select_weekdays">Tage auswählen</string>
|
||||||
<string name="export_to_csv">Daten als CSV exportieren</string>
|
<string name="export_to_csv">Exportiere als CSV</string>
|
||||||
<string name="done_label">Fertig</string>
|
<string name="done_label">Fertig</string>
|
||||||
<string name="clear_label">Löschen</string>
|
<string name="clear_label">Löschen</string>
|
||||||
<string name="select_hours">Stunden auswählen</string>
|
<string name="select_hours">Stunden auswählen</string>
|
||||||
@@ -118,18 +118,18 @@
|
|||||||
<string name="could_not_import">Fehler beim Importieren der Daten.</string>
|
<string name="could_not_import">Fehler beim Importieren der Daten.</string>
|
||||||
<string name="file_not_recognized">Datei nicht erkannt.</string>
|
<string name="file_not_recognized">Datei nicht erkannt.</string>
|
||||||
<string name="habits_imported">Gewohnheiten erfolgreich importiert.</string>
|
<string name="habits_imported">Gewohnheiten erfolgreich importiert.</string>
|
||||||
<string name="import_data">Importiere Daten</string>
|
<string name="import_data">Daten importieren</string>
|
||||||
<string name="export_full_backup">Exportiere vollständige Sicherung</string>
|
<string name="export_full_backup">Exportiere vollständige Sicherung</string>
|
||||||
<string name="import_data_summary">Unterstützt vollständige Sicherungen dieser App, sowie von Tickmate, HabitBull und Rewire erzeugte Sicherungen. Siehe FAQ für weitere Informationen.</string>
|
<string name="import_data_summary">Unterstützt vollständige Sicherungen dieser App, als auch von Tickmate, HabitBull und Rewire. Siehe FAQ für weitere Informationen.</string>
|
||||||
<string name="export_as_csv_summary">Erstellt Dateien, die von Tabellenkalkulationsprogrammen wie Microsoft Excel oder LibreOffice Calc geöffnet werden können. Diese Dateien können nicht wieder importiert werden.</string>
|
<string name="export_as_csv_summary">Erstellt Dateien, die von Tabellenkalkulationsprogrammen wie Microsoft Excel oder LibreOffice Calc geöffnet werden können. Diese Dateien können nicht wieder importiert werden.</string>
|
||||||
<string name="export_full_backup_summary">Erstellt eine Datei, die alle deine Daten enthält. Diese Datei kann wieder importiert werden.</string>
|
<string name="export_full_backup_summary">Erstellt eine Datei, die alle deine Daten enthält. Diese Datei kann wieder importiert werden.</string>
|
||||||
<string name="bug_report_failed">Fehler beim Erstellen eines Fehlerberichts.</string>
|
<string name="bug_report_failed">Fehler beim Erstellen eines Fehlerberichts.</string>
|
||||||
<string name="generate_bug_report">Erstelle einen Fehlerbericht</string>
|
<string name="generate_bug_report">Erstelle einen Fehlerbericht</string>
|
||||||
<string name="troubleshooting">Fehlerbehebung</string>
|
<string name="troubleshooting">Fehlerbehebung</string>
|
||||||
<string name="help_translate">Hilf mit, diese App zu übersetzen</string>
|
<string name="help_translate">Hilf mit, diese App zu übersetzen</string>
|
||||||
<string name="night_mode">Nachtmodus</string>
|
<string name="night_mode" comment="dark_theme">Nachtmodus</string>
|
||||||
<string name="use_pure_black">Verwende reines Schwarz im Nachtmodus</string>
|
<string name="use_pure_black">Verwende reines Schwarz im Nachtmodus</string>
|
||||||
<string name="pure_black_description">Ersetzt im Nachtmodus das Grau des Hintergrunds durch ein reines Schwarz. Reduziert den Stromverbrauch von Smartphones mit einem AMOLED Display.</string>
|
<string name="pure_black_description">Ersetzt im Nachtmodus das Grau des Hintergrunds durch Schwarz. Reduziert den Stromverbrauch von Smartphones mit AMOLED Displays.</string>
|
||||||
<string name="interface_preferences">Oberfläche</string>
|
<string name="interface_preferences">Oberfläche</string>
|
||||||
<string name="reverse_days">Kehre die Tagesreihenfolge um</string>
|
<string name="reverse_days">Kehre die Tagesreihenfolge um</string>
|
||||||
<string name="reverse_days_description">Zeigt die Tage im Hauptfenster in umgekehrter Reihenfolge an.</string>
|
<string name="reverse_days_description">Zeigt die Tage im Hauptfenster in umgekehrter Reihenfolge an.</string>
|
||||||
@@ -211,6 +211,6 @@
|
|||||||
<string name="pref_unknown_description">Tage ohne Daten von tatsächlichen Lücken unterscheiden. Um eine Lücke einzutragen zweimal markieren.</string>
|
<string name="pref_unknown_description">Tage ohne Daten von tatsächlichen Lücken unterscheiden. Um eine Lücke einzutragen zweimal markieren.</string>
|
||||||
<string name="you_are_now_a_developer">Du bist nun ein Entwickler</string>
|
<string name="you_are_now_a_developer">Du bist nun ein Entwickler</string>
|
||||||
<string name="activity_not_found">Für diese Aktion wurde keine App gefunden.</string>
|
<string name="activity_not_found">Für diese Aktion wurde keine App gefunden.</string>
|
||||||
<string name="pref_midnight_delay_title">Den Tag um ein paar Stunden nach Mitternacht verlängern</string>
|
<string name="pref_midnight_delay_title">Verlängere den Tag um ein paar Stunden nach Mitternacht</string>
|
||||||
<string name="pref_midnight_delay_description">Bis 3:00 Uhr warten, bevor ein neuer Tag angezeigt wird. Nützlich, wenn du normalerweise nach Mitternacht schlafen gehst. Benötigt einen Neustart der App.</string>
|
<string name="pref_midnight_delay_description">Bis 3:00 Uhr warten, bevor ein neuer Tag angezeigt wird. Nützlich, wenn du normalerweise nach Mitternacht schlafen gehst. Benötigt einen Neustart der App.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--
|
<!--
|
||||||
~ Copyright (C) 2016 Álinson Santos Xavier <isoron@gmail.com>
|
~ Copyright (C) 2016-2021 Álinson Santos Xavier <git@axavier.org>
|
||||||
~
|
~
|
||||||
~ This file is part of Loop Habit Tracker.
|
~ This file is part of Loop Habit Tracker.
|
||||||
~
|
~
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
~ You should have received a copy of the GNU General Public License along
|
~ You should have received a copy of the GNU General Public License along
|
||||||
~ with this program. If not, see <http://www.gnu.org/licenses/>.
|
~ with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
-->
|
-->
|
||||||
<resources>
|
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||||
<string name="app_name">Loop - Καταγραφή Συνηθειών</string>
|
<string name="app_name">Loop - Καταγραφή Συνηθειών</string>
|
||||||
<string name="main_activity_title">Συνήθειες</string>
|
<string name="main_activity_title">Συνήθειες</string>
|
||||||
<string name="action_settings">Ρυθμίσεις</string>
|
<string name="action_settings">Ρυθμίσεις</string>
|
||||||
@@ -28,15 +28,10 @@
|
|||||||
<string name="add_habit">Νέα συνήθεια</string>
|
<string name="add_habit">Νέα συνήθεια</string>
|
||||||
<string name="color_picker_default_title">Αλλαγή χρώματος</string>
|
<string name="color_picker_default_title">Αλλαγή χρώματος</string>
|
||||||
<string name="toast_habit_created">Η συνήθεια δημιουργήθηκε</string>
|
<string name="toast_habit_created">Η συνήθεια δημιουργήθηκε</string>
|
||||||
<string name="toast_habit_deleted">Οι συνήθειες διαγράφηκαν</string>
|
|
||||||
<string name="toast_habit_changed">Η συνήθεια άλλαξε</string>
|
|
||||||
<string name="toast_habit_archived">Η συνήθεια αρχειοθετήθηκε.</string>
|
|
||||||
<string name="toast_habit_unarchived">Έγινε αφαίρεση αρχειοθέτησης.</string>
|
|
||||||
<string name="overview">Επισκόπηση</string>
|
<string name="overview">Επισκόπηση</string>
|
||||||
<string name="habit_strength">Δύναμη συνήθειας</string>
|
<string name="habit_strength">Δύναμη συνήθειας</string>
|
||||||
<string name="history">Ιστορικό</string>
|
<string name="history">Ιστορικό</string>
|
||||||
<string name="clear">Εκκαθάριση</string>
|
<string name="clear">Εκκαθάριση</string>
|
||||||
<string name="days">ημέρες</string>
|
|
||||||
<string name="reminder">Υπενθύμιση</string>
|
<string name="reminder">Υπενθύμιση</string>
|
||||||
<string name="save">Αποθήκευση</string>
|
<string name="save">Αποθήκευση</string>
|
||||||
<string name="streaks">Σερί</string>
|
<string name="streaks">Σερί</string>
|
||||||
@@ -64,20 +59,16 @@
|
|||||||
<string name="interval_custom">Προσαρμογή</string>
|
<string name="interval_custom">Προσαρμογή</string>
|
||||||
<string name="pref_toggle_title">Κάντε εναλλαγή των επαναλήψεων με σύντομο πάτημα</string>
|
<string name="pref_toggle_title">Κάντε εναλλαγή των επαναλήψεων με σύντομο πάτημα</string>
|
||||||
<string name="pref_toggle_description">Βολικότερο, αλλά ίσως προκαλέσει ακούσιες εναλλαγές.</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_rate_this_app">Βαθμολογήστε αυτή την εφαρμογή στο Google Play</string>
|
||||||
<string name="pref_send_feedback">Στείλετε σχόλια</string>
|
<string name="pref_send_feedback">Στείλετε σχόλια</string>
|
||||||
<string name="pref_view_source_code">Δείτε τον πηγαίο κώδικα στο GitHub</string>
|
<string name="pref_view_source_code">Δείτε τον πηγαίο κώδικα στο GitHub</string>
|
||||||
<string name="links">Σύνδεσμοι</string>
|
<string name="links">Σύνδεσμοι</string>
|
||||||
<string name="name">Όνομα</string>
|
<string name="name">Όνομα</string>
|
||||||
<string name="settings">Ρυθμίσεις</string>
|
<string name="settings">Ρυθμίσεις</string>
|
||||||
<string name="snooze_interval">Διάστημα αναβολής</string>
|
|
||||||
<string name="select_snooze_delay">Επιλογή καθυστέρησης αναβολής</string>
|
<string name="select_snooze_delay">Επιλογή καθυστέρησης αναβολής</string>
|
||||||
<string name="hint_title">Γνωρίζατε;</string>
|
<string name="hint_title">Γνωρίζατε;</string>
|
||||||
<string name="hint_drag">Αναδιατάξετε τις συνήθειες πατώντας παρατεταμένα στο όνομα και σύροντας στην σωστή θέση.</string>
|
<string name="hint_drag">Αναδιατάξετε τις συνήθειες πατώντας παρατεταμένα στο όνομα και σύροντας στην σωστή θέση.</string>
|
||||||
<string name="hint_landscape">Μπορείτε να δείτε περισσότερες ημέρες στην οριζόντια προβολή.</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="habit_not_found">Η συνήθεια διαγράφηκε / δεν βρέθηκε</string>
|
||||||
<string name="weekends">Σαββατοκύριακα</string>
|
<string name="weekends">Σαββατοκύριακα</string>
|
||||||
<string name="any_weekday">Δευτέρα μέχρι Παρασκευή</string>
|
<string name="any_weekday">Δευτέρα μέχρι Παρασκευή</string>
|
||||||
@@ -111,7 +102,7 @@
|
|||||||
<string name="generate_bug_report">Παραγωγή αναφοράς bug.</string>
|
<string name="generate_bug_report">Παραγωγή αναφοράς bug.</string>
|
||||||
<string name="troubleshooting">Αντιμετ.Προβλημάτων</string>
|
<string name="troubleshooting">Αντιμετ.Προβλημάτων</string>
|
||||||
<string name="help_translate">Βοηθήστε στην μετάφραση</string>
|
<string name="help_translate">Βοηθήστε στην μετάφραση</string>
|
||||||
<string name="night_mode">Νυχτ.Λειτ.</string>
|
<string name="night_mode" comment="dark_theme">Νυχτ.Λειτ.</string>
|
||||||
<string name="use_pure_black">Χρήση απόλυτου μαύρου στη νυχτ.λειτουργία</string>
|
<string name="use_pure_black">Χρήση απόλυτου μαύρου στη νυχτ.λειτουργία</string>
|
||||||
<string name="pure_black_description">Αντικαθιστά τα γκρί υπόβαθρα με απόλυτα μαύρα σε νυχτ.λειτουργία. Μειώνει την κατανάλωση μπαταρίας σε συσκευές με οθόνη AMOLED.</string>
|
<string name="pure_black_description">Αντικαθιστά τα γκρί υπόβαθρα με απόλυτα μαύρα σε νυχτ.λειτουργία. Μειώνει την κατανάλωση μπαταρίας σε συσκευές με οθόνη AMOLED.</string>
|
||||||
<string name="interface_preferences">Διεπιφάνεια</string>
|
<string name="interface_preferences">Διεπιφάνεια</string>
|
||||||
@@ -170,15 +161,14 @@
|
|||||||
<string name="example_notes">(Προαιρετικό)</string>
|
<string name="example_notes">(Προαιρετικό)</string>
|
||||||
<string name="yes_or_no_example">π.χ. Ξύπνησες νωρίς σήμερα; Ασκήθηκες; Έπαιξες σκάκι;</string>
|
<string name="yes_or_no_example">π.χ. Ξύπνησες νωρίς σήμερα; Ασκήθηκες; Έπαιξες σκάκι;</string>
|
||||||
<string name="measurable">Μετρήσιμο</string>
|
<string name="measurable">Μετρήσιμο</string>
|
||||||
<string name="measurable_example" comment="Feel free to replace "miles" by "km"">π.χ. Πόσα χιλιόμετρα έτρεξες Πόσες σελίδες διάβασες; Πόσες θερμίδες έφαγες;</string>
|
|
||||||
<string name="x_times_per_week">%d φορές την εβδομάδα</string>
|
<string name="x_times_per_week">%d φορές την εβδομάδα</string>
|
||||||
<string name="x_times_per_month">%d φορές το μήνα</string>
|
<string name="x_times_per_month">%d φορές το μήνα</string>
|
||||||
<string name="yes_or_no_short_example">π.χ. Σωματική άσκηση</string>
|
<string name="yes_or_no_short_example">π.χ. Σωματική άσκηση</string>
|
||||||
<string name="color">Χρώμα</string>
|
<string name="color">Χρώμα</string>
|
||||||
<string name="example_target">π.χ. 15</string>
|
<string name="example_target">π.χ. 15</string>
|
||||||
<string name="measurable_short_example">π.χ. Τρέξιμο</string>
|
<string name="measurable_short_example">π.χ. Τρέξιμο</string>
|
||||||
<string name="measurable_question_example" comment="Feel free to replace "miles" by "km" if that is more common in your country">π.χ. Πόσα χιλιόμετρα έτρεξες σήμερα?</string>
|
<string name="measurable_question_example">π.χ. Πόσα χιλιόμετρα έτρεξες σήμερα?</string>
|
||||||
<string name="measurable_units_example" comment="Feel free to replace by "km" if that is more common in your country">π.χ. χιλιόμετρα</string>
|
<string name="measurable_units_example">π.χ. χιλιόμετρα</string>
|
||||||
<string name="every_month">Κάθε μήνα</string>
|
<string name="every_month">Κάθε μήνα</string>
|
||||||
<string name="validation_cannot_be_blank">Δεν μπορεί να είναι κενό</string>
|
<string name="validation_cannot_be_blank">Δεν μπορεί να είναι κενό</string>
|
||||||
<string name="today">Σήμερα</string>
|
<string name="today">Σήμερα</string>
|
||||||
|
|||||||
@@ -17,9 +17,7 @@
|
|||||||
~ You should have received a copy of the GNU General Public License along
|
~ You should have received a copy of the GNU General Public License along
|
||||||
~ with this program. If not, see <http://www.gnu.org/licenses/>.
|
~ with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
-->
|
-->
|
||||||
|
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources>
|
|
||||||
<string name="app_name">Loop Habit Tracker</string>
|
<string name="app_name">Loop Habit Tracker</string>
|
||||||
<string name="main_activity_title">Kutimoj</string>
|
<string name="main_activity_title">Kutimoj</string>
|
||||||
<string name="action_settings">Agordoj</string>
|
<string name="action_settings">Agordoj</string>
|
||||||
@@ -29,27 +27,56 @@
|
|||||||
<string name="unarchive">Elarĥivigi</string>
|
<string name="unarchive">Elarĥivigi</string>
|
||||||
<string name="add_habit">Aldonu kutimon</string>
|
<string name="add_habit">Aldonu kutimon</string>
|
||||||
<string name="color_picker_default_title">Ŝanĝi koloron</string>
|
<string name="color_picker_default_title">Ŝanĝi koloron</string>
|
||||||
<string name="toast_habit_changed">Kutimo ŝanĝita</string>
|
<string name="toast_habit_created">Kutimo kreita</string>
|
||||||
<string name="toast_habit_archived">Kutimo arĥivita</string>
|
<string name="overview">Generala vidado</string>
|
||||||
<string name="habit_strength">Kutimo forteco</string>
|
<string name="habit_strength">Kutimo forteco</string>
|
||||||
<string name="days">tagoj</string>
|
<string name="history">Historio</string>
|
||||||
|
<string name="clear">Liberigi</string>
|
||||||
<string name="reminder">Memorigaĵoj</string>
|
<string name="reminder">Memorigaĵoj</string>
|
||||||
<string name="save">Konservi</string>
|
<string name="save">Konservi</string>
|
||||||
<string name="streaks">Strioj</string>
|
<string name="streaks">Strioj</string>
|
||||||
|
<string name="no_habits_found">Vi ne havas aktivajn kutimojn</string>
|
||||||
|
<string name="long_press_to_toggle">Premu kaj tenu por kontroli aŭ malmarki</string>
|
||||||
<string name="reminder_off">Neaktiva</string>
|
<string name="reminder_off">Neaktiva</string>
|
||||||
|
<string name="create_habit">Krei kutimon</string>
|
||||||
|
<string name="edit_habit">Eldoni kutimon</string>
|
||||||
|
<string name="check">Kontrolu</string>
|
||||||
<string name="snooze">Poste</string>
|
<string name="snooze">Poste</string>
|
||||||
<!-- App introduction -->
|
|
||||||
<string name="intro_title_1">Bonvenon</string>
|
<string name="intro_title_1">Bonvenon</string>
|
||||||
|
<string name="intro_description_1">Loop Habit Tracker helpas vin krei kaj konservi bonajn kutimojn.</string>
|
||||||
|
<string name="intro_title_2">Krei kelkajn novajn kutimojn</string>
|
||||||
|
<string name="intro_description_2">Ĉiutage, post plenumi vian kutimon, metu markostampon en la app.</string>
|
||||||
|
<string name="intro_title_4">Por atenti vian progreson:</string>
|
||||||
|
<string name="intro_description_4">Detalaj grafikaĵoj montras al vi kiel viaj kutimoj pliboniĝis kun la tempo.</string>
|
||||||
<string name="interval_15_minutes">15 minutoj</string>
|
<string name="interval_15_minutes">15 minutoj</string>
|
||||||
<string name="interval_30_minutes">30 minutoj</string>
|
<string name="interval_30_minutes">30 minutoj</string>
|
||||||
|
<string name="interval_1_hour">1 horo</string>
|
||||||
|
<string name="interval_2_hour">2 horoj</string>
|
||||||
|
<string name="interval_4_hour">4 horoj</string>
|
||||||
|
<string name="interval_8_hour">4 horoj</string>
|
||||||
|
<string name="interval_24_hour">24 horoj</string>
|
||||||
|
<string name="interval_always_ask">Ĉiam demandu</string>
|
||||||
|
<string name="interval_custom">Kutimo</string>
|
||||||
|
<string name="pref_toggle_title">Ŝalti per mallonga gazetaro</string>
|
||||||
|
<string name="pref_toggle_description">Metu markilojn per sola frapeto anstataŭ premi kaj teni. Pli oportune, sed eble kaŭzas hazardajn ŝanĝojn.</string>
|
||||||
|
<string name="pref_rate_this_app">Taksu ĉi tiun aplikaĵon en Google Play</string>
|
||||||
|
<string name="pref_send_feedback">Sendu reagojn al programisto</string>
|
||||||
|
<string name="pref_view_source_code">Vidu fontkodon ĉe GitHub</string>
|
||||||
|
<string name="links">Ligilo</string>
|
||||||
|
<string name="name">Nomo</string>
|
||||||
<string name="settings">Agordoj</string>
|
<string name="settings">Agordoj</string>
|
||||||
<string name="delete_habits">Forigi kutimojn</string>
|
<string name="select_snooze_delay">Elektu dormetigas prokrasti</string>
|
||||||
|
<string name="hint_title">Ĉu vi sciis?</string>
|
||||||
|
<string name="hint_drag">Por reordigi la enskribojn, premi kaj tenu la nomon de la kutimo, poste trenu ĝin al la ĝusta loko.</string>
|
||||||
|
<string name="hint_landscape">Vi povas vidi pliajn tagojn enmetante vian telefonon en pejzaĝa reĝimo.</string>
|
||||||
|
<string name="habit_not_found">Kutimo forigita / ne trovita</string>
|
||||||
<string name="weekends">Semajnfinoj</string>
|
<string name="weekends">Semajnfinoj</string>
|
||||||
<string name="any_weekday">Lundo al vendredo</string>
|
<string name="any_weekday">Lundo al vendredo</string>
|
||||||
<string name="any_day">Io semajntago</string>
|
<string name="any_day">Io semajntago</string>
|
||||||
<string name="select_weekdays">Elekti tagojn</string>
|
<string name="select_weekdays">Elekti tagojn</string>
|
||||||
<string name="export_to_csv">Eksporti kiel CSV</string>
|
<string name="export_to_csv">Eksporti kiel CSV</string>
|
||||||
<string name="done_label">Farite</string>
|
<string name="done_label">Farite</string>
|
||||||
|
<string name="clear_label">Liberigi</string>
|
||||||
<string name="select_hours">Elekti horojn</string>
|
<string name="select_hours">Elekti horojn</string>
|
||||||
<string name="select_minutes">Elekti minutojn</string>
|
<string name="select_minutes">Elekti minutojn</string>
|
||||||
<string name="about">Pri programo</string>
|
<string name="about">Pri programo</string>
|
||||||
@@ -57,29 +84,73 @@
|
|||||||
<string name="developers">Evoluigantoj</string>
|
<string name="developers">Evoluigantoj</string>
|
||||||
<string name="version_n">Versio %s</string>
|
<string name="version_n">Versio %s</string>
|
||||||
<string name="frequency">Frekvenco</string>
|
<string name="frequency">Frekvenco</string>
|
||||||
|
<string name="checkmark">Markobutono</string>
|
||||||
|
<string name="best_streaks">Plej bonaj strioj</string>
|
||||||
<string name="every_day">Ĉiu tago</string>
|
<string name="every_day">Ĉiu tago</string>
|
||||||
<string name="every_week">Ĉiu semajno</string>
|
<string name="every_week">Ĉiu semajno</string>
|
||||||
<string name="help">Helpo & Ofte Demandite</string>
|
<string name="help">Helpo & Ofte Demandite</string>
|
||||||
|
<string name="could_not_export">Malsukcesis eksporti datumojn.</string>
|
||||||
|
<string name="could_not_import">Malsukcesis importi datumojn.</string>
|
||||||
<string name="file_not_recognized">Dosiero ne rekonita.</string>
|
<string name="file_not_recognized">Dosiero ne rekonita.</string>
|
||||||
|
<string name="habits_imported">Kutimoj importitaj sukcese.</string>
|
||||||
|
<string name="import_data">Importi datumojn</string>
|
||||||
|
<string name="export_full_backup">Eksporti plenan sekurkopion</string>
|
||||||
|
<string name="import_data_summary">Elportas plenajn sekurkopiojn eksportitajn de ĉi tiu aplikaĵo, same kiel dosierojn generitajn de Tickmate, HabitBull aŭ Rewire. Vidu DPO por pliaj informoj.</string>
|
||||||
|
<string name="export_as_csv_summary">Generas dosierojn, kiujn oni povas malfermi per kalkultabelaj programoj kiel Microsoft Excel aŭ OpenOffice Calc. Ĉi tiu dosiero ne povas esti importita reen.</string>
|
||||||
|
<string name="export_full_backup_summary">Generas dosieron, kiu enhavas ĉiujn viajn datumojn. Ĉi tiu dosiero povas esti importita reen.</string>
|
||||||
|
<string name="bug_report_failed">Malsukcesis generi raporton pri eraroj.</string>
|
||||||
|
<string name="generate_bug_report">Generu raporton pri eraroj</string>
|
||||||
<string name="troubleshooting">Problemserĉado</string>
|
<string name="troubleshooting">Problemserĉado</string>
|
||||||
<string name="night_mode">Nokta reĝimo</string>
|
<string name="help_translate">Helpu traduki ĉi tiun aplikon</string>
|
||||||
|
<string name="night_mode" comment="dark_theme">Nokta reĝimo</string>
|
||||||
|
<string name="use_pure_black">Uzu puran nigron en malhela temo</string>
|
||||||
|
<string name="pure_black_description">Anstataŭigas grizajn fonojn per pura nigra en malhela temo. Reduktas baterian uzon en telefonoj kun AMOLED-ekrano.</string>
|
||||||
|
<string name="interface_preferences">Intervizago</string>
|
||||||
|
<string name="reverse_days">Reversa ordo de tagoj</string>
|
||||||
|
<string name="reverse_days_description">Montri tagojn en inversa ordo sur la ĉefa ekrano.</string>
|
||||||
<string name="day">Tago</string>
|
<string name="day">Tago</string>
|
||||||
<string name="week">Semajno</string>
|
<string name="week">Semajno</string>
|
||||||
<string name="month">Monato</string>
|
<string name="month">Monato</string>
|
||||||
<string name="quarter">Jarkvarono</string>
|
<string name="quarter">Jarkvarono</string>
|
||||||
<string name="year">Jaro</string>
|
<string name="year">Jaro</string>
|
||||||
<!-- Different types of habits -->
|
<string name="total">Totalo</string>
|
||||||
<!-- Middle part of the sentence '1 time in xx days' -->
|
<string name="yes_or_no">Jes aŭ ne</string>
|
||||||
|
<string name="every_x_days">Ĉiujn %d tagojn</string>
|
||||||
|
<string name="every_x_weeks">Ĉiuj %d semajnoj</string>
|
||||||
|
<string name="score">Poentaroj</string>
|
||||||
|
<string name="reminder_sound">rememor-sonorilo</string>
|
||||||
<string name="none">Nenio</string>
|
<string name="none">Nenio</string>
|
||||||
<string name="filter">Filtrilo</string>
|
<string name="filter">Filtrilo</string>
|
||||||
<string name="hide_completed">Kaŝi kompletajn</string>
|
<string name="hide_completed">Kaŝi kompletajn</string>
|
||||||
<string name="hide_archived">Kaŝi arĥivitajn</string>
|
<string name="hide_archived">Kaŝi arĥivitajn</string>
|
||||||
|
<string name="sticky_notifications">Faru sciigojn gluaj</string>
|
||||||
|
<string name="sticky_notifications_description">Malhelpas, ke sciigoj estu forglititaj.</string>
|
||||||
|
<string name="led_notifications">Atentiga lumo</string>
|
||||||
|
<string name="led_notifications_description">Montras palpebrumantan lumon por memorigiloj. Nur havebla en telefonoj kun LED-sciigaj lumoj.</string>
|
||||||
<string name="repair_database">Ripari datumbazon</string>
|
<string name="repair_database">Ripari datumbazon</string>
|
||||||
<string name="database_repaired">Datumbazon riparita.</string>
|
<string name="database_repaired">Datumbazon riparita.</string>
|
||||||
|
<string name="uncheck">Malmarku</string>
|
||||||
|
<string name="toggle">Ŝalti</string>
|
||||||
<string name="action">Ago</string>
|
<string name="action">Ago</string>
|
||||||
<string name="habit">Kutimo</string>
|
<string name="habit">Kutimo</string>
|
||||||
<string name="sort">Enkursigi</string>
|
<string name="sort">Enkursigi</string>
|
||||||
|
<string name="manually">Mane</string>
|
||||||
<string name="by_name">Laŭ nomo</string>
|
<string name="by_name">Laŭ nomo</string>
|
||||||
<string name="by_color">Laŭ koloro</string>
|
<string name="by_color">Laŭ koloro</string>
|
||||||
|
<string name="by_score">Laŭ poentaro</string>
|
||||||
<string name="export">Eksporti</string>
|
<string name="export">Eksporti</string>
|
||||||
|
<string name="long_press_to_edit">Premu kaj tenu por ŝanĝi la valoron</string>
|
||||||
|
<string name="change_value">Ŝanĝi valoron</string>
|
||||||
|
<string name="calendar">Kalendaro:</string>
|
||||||
|
<string name="unit">Unueco</string>
|
||||||
|
<string name="example_question_boolean">ekz. Ĉu vi ekzercis hodiaŭ?</string>
|
||||||
|
<string name="question">Demando</string>
|
||||||
|
<string name="target">Celo</string>
|
||||||
|
<string name="yes">Jes</string>
|
||||||
|
<string name="no">Ne</string>
|
||||||
|
<string name="customize_notification_summary">Ŝanĝu sonon, vibron, lumon kaj aliajn sciigajn agordojn</string>
|
||||||
|
<string name="customize_notification">Adaptitaj sciigoj</string>
|
||||||
|
<string name="pref_view_privacy">Vidu privatecan politikon</string>
|
||||||
|
<string name="view_all_contributors">Rigardi ĉiujn kontribuantojn…</string>
|
||||||
|
<string name="database">Datumbazo</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--
|
<!--
|
||||||
~ Copyright (C) 2016 Álinson Santos Xavier <isoron@gmail.com>
|
~ Copyright (C) 2016-2021 Álinson Santos Xavier <git@axavier.org>
|
||||||
~
|
~
|
||||||
~ This file is part of Loop Habit Tracker.
|
~ This file is part of Loop Habit Tracker.
|
||||||
~
|
~
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
~ You should have received a copy of the GNU General Public License along
|
~ You should have received a copy of the GNU General Public License along
|
||||||
~ with this program. If not, see <http://www.gnu.org/licenses/>.
|
~ with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
-->
|
-->
|
||||||
<resources>
|
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||||
<string name="app_name">Loop Analizador de Hábitos</string>
|
<string name="app_name">Loop Analizador de Hábitos</string>
|
||||||
<string name="main_activity_title">Hábitos</string>
|
<string name="main_activity_title">Hábitos</string>
|
||||||
<string name="action_settings">Configuración</string>
|
<string name="action_settings">Configuración</string>
|
||||||
@@ -28,19 +28,31 @@
|
|||||||
<string name="add_habit">Agregar hábito</string>
|
<string name="add_habit">Agregar hábito</string>
|
||||||
<string name="color_picker_default_title">Cambiar color</string>
|
<string name="color_picker_default_title">Cambiar color</string>
|
||||||
<string name="toast_habit_created">Hábito creado</string>
|
<string name="toast_habit_created">Hábito creado</string>
|
||||||
<string name="toast_habit_deleted">Hábitos eliminados</string>
|
<plurals name="toast_habits_changed">
|
||||||
<string name="toast_habit_changed">Hábito cambiado</string>
|
<item quantity="one">Hábito cambiado</item>
|
||||||
<string name="toast_habit_archived">Hábitos archivados</string>
|
<item quantity="other">Hábitos cambiados</item>
|
||||||
<string name="toast_habit_unarchived">Hábitos desarchivados</string>
|
</plurals>
|
||||||
|
<plurals name="toast_habits_deleted">
|
||||||
|
<item quantity="one">Hábito eliminado</item>
|
||||||
|
<item quantity="other">Hábitos eliminados</item>
|
||||||
|
</plurals>
|
||||||
|
<plurals name="toast_habits_archived">
|
||||||
|
<item quantity="one">Hábito archivado</item>
|
||||||
|
<item quantity="other">Hábitos archivados</item>
|
||||||
|
</plurals>
|
||||||
|
<plurals name="toast_habits_unarchived">
|
||||||
|
<item quantity="one">Hábito desarchivado</item>
|
||||||
|
<item quantity="other">Hábitos desarchivados</item>
|
||||||
|
</plurals>
|
||||||
<string name="overview">Resumen</string>
|
<string name="overview">Resumen</string>
|
||||||
<string name="habit_strength">Fuerza del hábito</string>
|
<string name="habit_strength">Fuerza del hábito</string>
|
||||||
<string name="history">Historial</string>
|
<string name="history">Historial</string>
|
||||||
<string name="clear">Borrar</string>
|
<string name="clear">Borrar</string>
|
||||||
<string name="days">días</string>
|
|
||||||
<string name="reminder">Recordatorio</string>
|
<string name="reminder">Recordatorio</string>
|
||||||
<string name="save">Guardar</string>
|
<string name="save">Guardar</string>
|
||||||
<string name="streaks">Rachas</string>
|
<string name="streaks">Rachas</string>
|
||||||
<string name="no_habits_found">No tienes hábitos activos</string>
|
<string name="no_habits_found">No tienes hábitos activos</string>
|
||||||
|
<string name="no_habits_left_to_do">¡Ya terminaste todo por hoy!</string>
|
||||||
<string name="long_press_to_toggle">Mantener apretado para marcar o desmarcar</string>
|
<string name="long_press_to_toggle">Mantener apretado para marcar o desmarcar</string>
|
||||||
<string name="reminder_off">Apagado</string>
|
<string name="reminder_off">Apagado</string>
|
||||||
<string name="create_habit">Crear hábito</string>
|
<string name="create_habit">Crear hábito</string>
|
||||||
@@ -64,20 +76,24 @@
|
|||||||
<string name="interval_custom">Personalizar...</string>
|
<string name="interval_custom">Personalizar...</string>
|
||||||
<string name="pref_toggle_title">Marca las repeticiones con una pulsación corta</string>
|
<string name="pref_toggle_title">Marca las repeticiones con una pulsación corta</string>
|
||||||
<string name="pref_toggle_description">Más cómodo, pero puede causar marcas accidentales.</string>
|
<string name="pref_toggle_description">Más cómodo, pero puede causar marcas accidentales.</string>
|
||||||
<string name="pref_snooze_interval_title">Tiempo de espera al aplazar recordatorios</string>
|
|
||||||
<string name="pref_rate_this_app">Valora esta aplicación en Google Play</string>
|
<string name="pref_rate_this_app">Valora esta aplicación en Google Play</string>
|
||||||
<string name="pref_send_feedback">Enviar sugerencias al desarrollador</string>
|
<string name="pref_send_feedback">Enviar sugerencias al desarrollador</string>
|
||||||
<string name="pref_view_source_code">Ver código fuente en GitHub</string>
|
<string name="pref_view_source_code">Ver código fuente en GitHub</string>
|
||||||
<string name="links">Enlaces</string>
|
<string name="links">Enlaces</string>
|
||||||
<string name="name">Nombre</string>
|
<string name="name">Nombre</string>
|
||||||
<string name="settings">Configuración</string>
|
<string name="settings">Configuración</string>
|
||||||
<string name="snooze_interval">Intervalo de espera</string>
|
|
||||||
<string name="select_snooze_delay">Seleccione el retardo de la interrupción</string>
|
<string name="select_snooze_delay">Seleccione el retardo de la interrupción</string>
|
||||||
<string name="hint_title">¿Sabías qué?</string>
|
<string name="hint_title">¿Sabías qué?</string>
|
||||||
<string name="hint_drag">Para reordenar las entradas, mantén la pulsado sobre el nombre del hábito, después arrástralo a su posición correcta.</string>
|
<string name="hint_drag">Para reordenar las entradas, mantén la pulsado sobre el nombre del hábito, después arrástralo a su posición correcta.</string>
|
||||||
<string name="hint_landscape">Puedes ver más días al poner tu teléfono en modo horizontal.</string>
|
<string name="hint_landscape">Puedes ver más días al poner tu teléfono en modo horizontal.</string>
|
||||||
<string name="delete_habits">Eliminar Hábitos</string>
|
<plurals name="delete_habits_title">
|
||||||
<string name="delete_habits_message">Los hábitos serán eliminados permanentemente. Esta acción no se puede deshacer.</string>
|
<item quantity="one">¿Eliminar hábito?</item>
|
||||||
|
<item quantity="other">¿Eliminar hábitos?</item>
|
||||||
|
</plurals>
|
||||||
|
<plurals name="delete_habits_message">
|
||||||
|
<item quantity="one">El hábito se eliminará permanentemente. Esta acción no se puede deshacer.</item>
|
||||||
|
<item quantity="other">Los hábitos se eliminarán permanentemente. Esta acción no se puede deshacer.</item>
|
||||||
|
</plurals>
|
||||||
<string name="habit_not_found">Hábito eliminado / no encontrado</string>
|
<string name="habit_not_found">Hábito eliminado / no encontrado</string>
|
||||||
<string name="weekends">Fines de semana</string>
|
<string name="weekends">Fines de semana</string>
|
||||||
<string name="any_weekday">De lunes a viernes</string>
|
<string name="any_weekday">De lunes a viernes</string>
|
||||||
@@ -111,7 +127,7 @@
|
|||||||
<string name="generate_bug_report">Generar reporte de errores</string>
|
<string name="generate_bug_report">Generar reporte de errores</string>
|
||||||
<string name="troubleshooting">Solución de problemas</string>
|
<string name="troubleshooting">Solución de problemas</string>
|
||||||
<string name="help_translate">Ayuda a traducir esta app</string>
|
<string name="help_translate">Ayuda a traducir esta app</string>
|
||||||
<string name="night_mode">Modo nocturno</string>
|
<string name="night_mode" comment="dark_theme">Modo nocturno</string>
|
||||||
<string name="use_pure_black">Utilizar color negro en modo nocturno</string>
|
<string name="use_pure_black">Utilizar color negro en modo nocturno</string>
|
||||||
<string name="pure_black_description">Reemplaza fondos grises por color negro en modo nocturno. Reduce el consumo de batería en teléfonos con pantalla AMOLED.</string>
|
<string name="pure_black_description">Reemplaza fondos grises por color negro en modo nocturno. Reduce el consumo de batería en teléfonos con pantalla AMOLED.</string>
|
||||||
<string name="interface_preferences">Interfície</string>
|
<string name="interface_preferences">Interfície</string>
|
||||||
@@ -147,6 +163,7 @@
|
|||||||
<string name="by_name">Por nombre</string>
|
<string name="by_name">Por nombre</string>
|
||||||
<string name="by_color">Por color</string>
|
<string name="by_color">Por color</string>
|
||||||
<string name="by_score">Por puntuación</string>
|
<string name="by_score">Por puntuación</string>
|
||||||
|
<string name="by_status">Por estado</string>
|
||||||
<string name="export">Exportar</string>
|
<string name="export">Exportar</string>
|
||||||
<string name="long_press_to_edit">Mantenga presionado para cambiar el valor</string>
|
<string name="long_press_to_edit">Mantenga presionado para cambiar el valor</string>
|
||||||
<string name="change_value">Cambiar valor</string>
|
<string name="change_value">Cambiar valor</string>
|
||||||
@@ -170,16 +187,30 @@
|
|||||||
<string name="example_notes">(Opcional)</string>
|
<string name="example_notes">(Opcional)</string>
|
||||||
<string name="yes_or_no_example">por ejemplo, ¿te despertaste temprano hoy? ¿Hiciste ejercicio? ¿Jugaste al ajedrez?</string>
|
<string name="yes_or_no_example">por ejemplo, ¿te despertaste temprano hoy? ¿Hiciste ejercicio? ¿Jugaste al ajedrez?</string>
|
||||||
<string name="measurable">Medible</string>
|
<string name="measurable">Medible</string>
|
||||||
<string name="measurable_example" comment="Feel free to replace "miles" by "km"">por ejemplo, ¿cuántos quilómetros has corrido hoy? ¿Cuántas páginas has leído? ¿Cuántas calorías has comido?</string>
|
<string name="measurable_example">ej. ¿Cuántas millas ha corrido hoy? ¿Cuántas páginas ha leído?</string>
|
||||||
<string name="x_times_per_week">%d veces por semana</string>
|
<string name="x_times_per_week">%d veces por semana</string>
|
||||||
<string name="x_times_per_month">%d veces al mes</string>
|
<string name="x_times_per_month">%d veces al mes</string>
|
||||||
<string name="yes_or_no_short_example">ej. Ejercicio</string>
|
<string name="yes_or_no_short_example">ej. Ejercicio</string>
|
||||||
<string name="color">Color</string>
|
<string name="color">Color</string>
|
||||||
<string name="example_target">ej. 15</string>
|
<string name="example_target">ej. 15</string>
|
||||||
<string name="measurable_short_example">por ejemplo, correr</string>
|
<string name="measurable_short_example">por ejemplo, correr</string>
|
||||||
<string name="measurable_question_example" comment="Feel free to replace "miles" by "km" if that is more common in your country">ej. ¿Cuántos quilómetros has corrido hoy?</string>
|
<string name="measurable_question_example">ej. ¿Cuántos quilómetros has corrido hoy?</string>
|
||||||
<string name="measurable_units_example" comment="Feel free to replace by "km" if that is more common in your country">ej. millas</string>
|
<string name="measurable_units_example">ej. millas</string>
|
||||||
<string name="every_month">Cada mes</string>
|
<string name="every_month">Cada mes</string>
|
||||||
<string name="validation_cannot_be_blank">No puede estar en blanco</string>
|
<string name="validation_cannot_be_blank">No puede estar en blanco</string>
|
||||||
<string name="today">Hoy</string>
|
<string name="today">Hoy</string>
|
||||||
|
<string name="enter">Introducir</string>
|
||||||
|
<string name="no_habits">No se encontraron hábitos</string>
|
||||||
|
<string name="no_numerical_habits">No se encontraron hábitos medibles</string>
|
||||||
|
<string name="no_boolean_habits">No se encontraron hábitos de sí o no</string>
|
||||||
|
<string name="increment">Incrementar</string>
|
||||||
|
<string name="decrement">Decrementar</string>
|
||||||
|
<string name="pref_skip_title">Habilitar días libres</string>
|
||||||
|
<string name="pref_skip_description">Alternar dos veces para agregar un salto en lugar de una marca de verificación. Los saltos mantienen su puntaje sin cambios y no rompen su racha.</string>
|
||||||
|
<string name="pref_unknown_title">Mostrar interrogantes para datos faltantes</string>
|
||||||
|
<string name="pref_unknown_description">Diferenciar los días sin datos de los lapsos reales. Para ingresar un lapso, alternar dos veces.</string>
|
||||||
|
<string name="you_are_now_a_developer">Ahora eres desarrollador</string>
|
||||||
|
<string name="activity_not_found">No se encontró ninguna aplicación que admita esta acción</string>
|
||||||
|
<string name="pref_midnight_delay_title">Ampliar día unas horas después de medianoche</string>
|
||||||
|
<string name="pref_midnight_delay_description">Esperar hasta las 3:00 AM para mostrar un nuevo día. Útil si normalmente vas a dormir después de medianoche. Requiere reiniciar la aplicación.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--
|
<!--
|
||||||
~ Copyright (C) 2016 Álinson Santos Xavier <isoron@gmail.com>
|
~ Copyright (C) 2016-2021 Álinson Santos Xavier <git@axavier.org>
|
||||||
~
|
~
|
||||||
~ This file is part of Loop Habit Tracker.
|
~ This file is part of Loop Habit Tracker.
|
||||||
~
|
~
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
~ You should have received a copy of the GNU General Public License along
|
~ You should have received a copy of the GNU General Public License along
|
||||||
~ with this program. If not, see <http://www.gnu.org/licenses/>.
|
~ with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
-->
|
-->
|
||||||
<resources>
|
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||||
<string name="app_name">Loop Habit Tracker</string>
|
<string name="app_name">Loop Habit Tracker</string>
|
||||||
<string name="main_activity_title">Ohiturak</string>
|
<string name="main_activity_title">Ohiturak</string>
|
||||||
<string name="action_settings">Ezarpenak</string>
|
<string name="action_settings">Ezarpenak</string>
|
||||||
@@ -28,15 +28,10 @@
|
|||||||
<string name="add_habit">Gehitu ohitura</string>
|
<string name="add_habit">Gehitu ohitura</string>
|
||||||
<string name="color_picker_default_title">Kolorea aldatu</string>
|
<string name="color_picker_default_title">Kolorea aldatu</string>
|
||||||
<string name="toast_habit_created">Ohitura sortu da</string>
|
<string name="toast_habit_created">Ohitura sortu da</string>
|
||||||
<string name="toast_habit_deleted">Ohiturak ezabatu dira</string>
|
|
||||||
<string name="toast_habit_changed">Ohitura aldatu egin da</string>
|
|
||||||
<string name="toast_habit_archived">Ohiturak artxibatu dira</string>
|
|
||||||
<string name="toast_habit_unarchived">Ohiturak desartxibatu dira</string>
|
|
||||||
<string name="overview">Ikuspegi orokorra</string>
|
<string name="overview">Ikuspegi orokorra</string>
|
||||||
<string name="habit_strength">Ohituraren indarra</string>
|
<string name="habit_strength">Ohituraren indarra</string>
|
||||||
<string name="history">Historia</string>
|
<string name="history">Historia</string>
|
||||||
<string name="clear">Garbitu</string>
|
<string name="clear">Garbitu</string>
|
||||||
<string name="days">egunetan</string>
|
|
||||||
<string name="reminder">Oroigarria</string>
|
<string name="reminder">Oroigarria</string>
|
||||||
<string name="save">Gorde</string>
|
<string name="save">Gorde</string>
|
||||||
<string name="streaks">Boladak</string>
|
<string name="streaks">Boladak</string>
|
||||||
@@ -64,20 +59,16 @@
|
|||||||
<string name="interval_custom">Pertsonalizatua...</string>
|
<string name="interval_custom">Pertsonalizatua...</string>
|
||||||
<string name="pref_toggle_title">Ukitze laburrarekin markatu</string>
|
<string name="pref_toggle_title">Ukitze laburrarekin markatu</string>
|
||||||
<string name="pref_toggle_description">Ukitze bakar batekin marka jartzen du ukitu eta mantendu egin beharrean. Erosoagoa, baina nahi gabeko markak ekar litzake.</string>
|
<string name="pref_toggle_description">Ukitze bakar batekin marka jartzen du ukitu eta mantendu egin beharrean. Erosoagoa, baina nahi gabeko markak ekar litzake.</string>
|
||||||
<string name="pref_snooze_interval_title">Atzeratze tartea oroigarrietan</string>
|
|
||||||
<string name="pref_rate_this_app">Aplikazio hau Google Playen puntuatu</string>
|
<string name="pref_rate_this_app">Aplikazio hau Google Playen puntuatu</string>
|
||||||
<string name="pref_send_feedback">Zure iritzia garatzaileari bidali</string>
|
<string name="pref_send_feedback">Zure iritzia garatzaileari bidali</string>
|
||||||
<string name="pref_view_source_code">Iturburu kodea GitHuben ikusi</string>
|
<string name="pref_view_source_code">Iturburu kodea GitHuben ikusi</string>
|
||||||
<string name="links">Loturak</string>
|
<string name="links">Loturak</string>
|
||||||
<string name="name">Izena</string>
|
<string name="name">Izena</string>
|
||||||
<string name="settings">Ezarpenak</string>
|
<string name="settings">Ezarpenak</string>
|
||||||
<string name="snooze_interval">Atzeratze tartea</string>
|
|
||||||
<string name="select_snooze_delay">Aukeratu atzerapen denbora</string>
|
<string name="select_snooze_delay">Aukeratu atzerapen denbora</string>
|
||||||
<string name="hint_title">Ba al zenekien?</string>
|
<string name="hint_title">Ba al zenekien?</string>
|
||||||
<string name="hint_drag">Sarrerak berrantolatzeko, sakatu eta mantendu ohituraren izena, ondoren mugi ezazu leku aproposera.</string>
|
<string name="hint_drag">Sarrerak berrantolatzeko, sakatu eta mantendu ohituraren izena, ondoren mugi ezazu leku aproposera.</string>
|
||||||
<string name="hint_landscape">Egun gehiago ikus ditzakezu zure gailua paisai moduan jarriz.</string>
|
<string name="hint_landscape">Egun gehiago ikus ditzakezu zure gailua paisai moduan jarriz.</string>
|
||||||
<string name="delete_habits">Ohiturak ezabatu</string>
|
|
||||||
<string name="delete_habits_message">Ohiturak betirako ezabatuko dira. Ekintza hau ezin da desegin.</string>
|
|
||||||
<string name="habit_not_found">Ohitura ezabatua / ez aurkitua</string>
|
<string name="habit_not_found">Ohitura ezabatua / ez aurkitua</string>
|
||||||
<string name="weekends">Asteburuak</string>
|
<string name="weekends">Asteburuak</string>
|
||||||
<string name="any_weekday">Astelehenetik ostiralera</string>
|
<string name="any_weekday">Astelehenetik ostiralera</string>
|
||||||
@@ -111,7 +102,7 @@
|
|||||||
<string name="generate_bug_report">Akats txostena sortu</string>
|
<string name="generate_bug_report">Akats txostena sortu</string>
|
||||||
<string name="troubleshooting">Arazoen konponketa</string>
|
<string name="troubleshooting">Arazoen konponketa</string>
|
||||||
<string name="help_translate">Lagundu aplikazio hau itzultzen</string>
|
<string name="help_translate">Lagundu aplikazio hau itzultzen</string>
|
||||||
<string name="night_mode">Azal iluna</string>
|
<string name="night_mode" comment="dark_theme">Azal iluna</string>
|
||||||
<string name="use_pure_black">erabili beltz hutsa azal ilunean</string>
|
<string name="use_pure_black">erabili beltz hutsa azal ilunean</string>
|
||||||
<string name="pure_black_description">Atzeko plano grisak beltz hutsez aldatzen ditu azal ilunean. Bateriaren erabilera gutxitzen du AMOLED duten gailuetan.</string>
|
<string name="pure_black_description">Atzeko plano grisak beltz hutsez aldatzen ditu azal ilunean. Bateriaren erabilera gutxitzen du AMOLED duten gailuetan.</string>
|
||||||
<string name="interface_preferences">Interfazea</string>
|
<string name="interface_preferences">Interfazea</string>
|
||||||
@@ -170,15 +161,14 @@
|
|||||||
<string name="example_notes">(Aukerazkoa)</string>
|
<string name="example_notes">(Aukerazkoa)</string>
|
||||||
<string name="yes_or_no_example">adib. Gaur goiz esnatu zara? Ariketa fisikoa egin al duzu? Xakean jolastu al duzu?</string>
|
<string name="yes_or_no_example">adib. Gaur goiz esnatu zara? Ariketa fisikoa egin al duzu? Xakean jolastu al duzu?</string>
|
||||||
<string name="measurable">Neurgarria</string>
|
<string name="measurable">Neurgarria</string>
|
||||||
<string name="measurable_example" comment="Feel free to replace "miles" by "km"">adib. Zenbat kilometro egin dituzu korrika gaur? Zenbat orrialde irakurri dituzu? Zenbat kaloria jan dituzu?</string>
|
|
||||||
<string name="x_times_per_week">Astean %d aldiz</string>
|
<string name="x_times_per_week">Astean %d aldiz</string>
|
||||||
<string name="x_times_per_month">Hilean %d aldiz</string>
|
<string name="x_times_per_month">Hilean %d aldiz</string>
|
||||||
<string name="yes_or_no_short_example">adib. Ariketa</string>
|
<string name="yes_or_no_short_example">adib. Ariketa</string>
|
||||||
<string name="color">Kolorea</string>
|
<string name="color">Kolorea</string>
|
||||||
<string name="example_target">adib. 15</string>
|
<string name="example_target">adib. 15</string>
|
||||||
<string name="measurable_short_example">adib. Korrika egin</string>
|
<string name="measurable_short_example">adib. Korrika egin</string>
|
||||||
<string name="measurable_question_example" comment="Feel free to replace "miles" by "km" if that is more common in your country">adib. Zenbat kilometro egin dituzu korrika gaur?</string>
|
<string name="measurable_question_example">adib. Zenbat kilometro egin dituzu korrika gaur?</string>
|
||||||
<string name="measurable_units_example" comment="Feel free to replace by "km" if that is more common in your country">adib. Kilometroak</string>
|
<string name="measurable_units_example">adib. Kilometroak</string>
|
||||||
<string name="every_month">Hilabetero</string>
|
<string name="every_month">Hilabetero</string>
|
||||||
<string name="validation_cannot_be_blank">Ezin da hutsik egon</string>
|
<string name="validation_cannot_be_blank">Ezin da hutsik egon</string>
|
||||||
<string name="today">Gaur</string>
|
<string name="today">Gaur</string>
|
||||||
|
|||||||