Merge branch 'dev' into feature/sync
18
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -6,11 +6,16 @@ labels: ''
|
||||
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
|
||||
- [ ] I am submitting a bug report, not a feature request.
|
||||
- [ ] I am running the latest version of Loop Habit Tracker.
|
||||
- [ ] I have have searched for similar issues, but did not find any matches.
|
||||
- [ ] I have searched for similar issues, but did not find any matches.
|
||||
|
||||
## Description
|
||||
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 ....
|
||||
4. See error
|
||||
|
||||
## Screenshots
|
||||
If applicable, add screenshots to help explain your problem.
|
||||
|
||||
## System information
|
||||
- Phone: [e.g. Google Pixel 4]
|
||||
- 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"
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: "daily"
|
||||
interval: "monthly"
|
||||
|
||||
6
.github/workflows/main.yml
vendored
@@ -30,7 +30,7 @@ jobs:
|
||||
AndroidTest:
|
||||
needs: Build
|
||||
runs-on: macOS-10.15
|
||||
timeout-minutes: 45
|
||||
timeout-minutes: 60
|
||||
strategy:
|
||||
matrix:
|
||||
api: [
|
||||
@@ -56,7 +56,9 @@ jobs:
|
||||
path: uhabits-android/build/outputs/
|
||||
|
||||
- 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
|
||||
run: ./build.sh android-tests ${{ matrix.api }}
|
||||
|
||||
23
CHANGELOG.md
@@ -1,5 +1,28 @@
|
||||
# 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
|
||||
|
||||
### Added
|
||||
|
||||
@@ -18,7 +18,7 @@ source.
|
||||
|
||||
<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="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>
|
||||
|
||||
## Screenshots
|
||||
@@ -109,7 +109,7 @@ contribute, even if you are not a software developer.
|
||||
more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
[screen1]: screenshots/1.png
|
||||
[screen2]: screenshots/2.png
|
||||
@@ -123,9 +123,9 @@ contribute, even if you are not a software developer.
|
||||
[screen4th]: screenshots/4.thumb.png
|
||||
[screen5th]: screenshots/5.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
|
||||
[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
|
||||
[beta]: https://play.google.com/apps/testing/org.isoron.uhabits
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
plugins {
|
||||
val kotlinVersion = "1.4.21"
|
||||
id("com.android.application") version ("4.1.0") apply (false)
|
||||
val kotlinVersion = "1.5.0"
|
||||
id("com.android.application") version ("4.2.0") apply (false)
|
||||
id("org.jetbrains.kotlin.android") 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.multiplatform") version kotlinVersion apply (false)
|
||||
id("org.jlleitschuh.gradle.ktlint") version "10.0.0"
|
||||
id("org.jlleitschuh.gradle.ktlint") version "10.1.0"
|
||||
}
|
||||
|
||||
apply {
|
||||
|
||||
23
build.sh
@@ -133,6 +133,9 @@ android_test() {
|
||||
log_error "Some $size instrumented tests failed."
|
||||
log_error "Saving logcat: $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
|
||||
fi
|
||||
log_info "$size tests passed."
|
||||
@@ -198,13 +201,6 @@ android_build() {
|
||||
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() {
|
||||
find ${ANDROID_OUTPUTS_DIR}/test-screenshots -name '*.expected*' -delete
|
||||
rsync -av ${ANDROID_OUTPUTS_DIR}/test-screenshots/ uhabits-android/src/androidTest/assets/
|
||||
@@ -233,18 +229,14 @@ CI/CD script for Loop Habit Tracker.
|
||||
|
||||
Usage:
|
||||
build.sh build [options]
|
||||
build.sh clean [options]
|
||||
build.sh android-tests <API> [options]
|
||||
build.sh android-tests-parallel <API> <API>... [options]
|
||||
build.sh android-fetch-images [options]
|
||||
build.sh android-accept-images [options]
|
||||
|
||||
Commands:
|
||||
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-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
|
||||
|
||||
Options:
|
||||
@@ -274,19 +266,17 @@ main() {
|
||||
case "$1" in
|
||||
build)
|
||||
shift; _parse_opts "$@"
|
||||
clean
|
||||
core_build
|
||||
android_build
|
||||
;;
|
||||
clean)
|
||||
clean
|
||||
;;
|
||||
android-tests)
|
||||
shift; _parse_opts "$@"
|
||||
if [ -z $1 ]; then
|
||||
_print_usage
|
||||
exit 1
|
||||
fi
|
||||
for attempt in {1..3}; do
|
||||
for attempt in {1..5}; do
|
||||
log_info "Running Android tests (attempt $attempt)..."
|
||||
android_test $1 && return 0
|
||||
done
|
||||
@@ -297,9 +287,6 @@ main() {
|
||||
shift; _parse_opts "$@"
|
||||
android_test_parallel $*
|
||||
;;
|
||||
android-fetch-images)
|
||||
android_fetch_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
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.0-bin.zip
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
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
|
||||
|
||||
|
||||
# Determine the Java command to use to start the JVM.
|
||||
if [ -n "$JAVA_HOME" ] ; then
|
||||
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
||||
@@ -129,6 +130,7 @@ fi
|
||||
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
|
||||
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
|
||||
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
|
||||
|
||||
JAVACMD=`cygpath --unix "$JAVACMD"`
|
||||
|
||||
# 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_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.
|
||||
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
|
||||
|
||||
@@ -37,7 +40,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome
|
||||
|
||||
set JAVA_EXE=java.exe
|
||||
%JAVA_EXE% -version >NUL 2>&1
|
||||
if "%ERRORLEVEL%" == "0" goto init
|
||||
if "%ERRORLEVEL%" == "0" goto execute
|
||||
|
||||
echo.
|
||||
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_EXE=%JAVA_HOME%/bin/java.exe
|
||||
|
||||
if exist "%JAVA_EXE%" goto init
|
||||
if exist "%JAVA_EXE%" goto execute
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
|
||||
@@ -61,28 +64,14 @@ echo location of your Java installation.
|
||||
|
||||
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
|
||||
@rem Setup the command line
|
||||
|
||||
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
||||
|
||||
|
||||
@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
|
||||
@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)"
|
||||
"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
|
||||
"Slobodan Simić (Слободан Симић) (slsimic)","Serbian (Latin); Serbian (Cyrillic)",2053,1830,2105,12,33,0,1982
|
||||
"Oglaigh Rystard (oglaignaheireann)","Ukrainian; Portuguese; Catalan; Greek; Basque; Romanian; Italian",1103,1037,1327,1,13,6,954
|
||||
"David (Cliff122)",Swedish,1040,1019,725,6,0,0,700
|
||||
dukelc,Slovak,919,880,0,0,0,0,0
|
||||
KMakoto,"Chinese Traditional",745,1146,949,0,0,0,745
|
||||
"Evren (evrenkiymaz)",Turkish,688,604,0,71,4,0,0
|
||||
"David Nos (david.nos)","Catalan; Spanish",667,731,0,0,0,0,0
|
||||
androide74,Italian,644,659,0,2,0,0,0
|
||||
Tomairuka,Japanese,633,1636,909,43,0,0,564
|
||||
"Dmitriy Bogdanov (di72nn)",Russian,625,572,1175,0,34,0,519
|
||||
reyhoon,Persian,624,759,0,1,1,0,0
|
||||
Osoitz,Basque,610,545,0,9,0,0,3
|
||||
fabian.bouchal,German,548,527,0,6,0,3,72
|
||||
boban77,Czech,509,461,0,2,0,0,0
|
||||
"Yoav Argov (YoavArgov)",Hebrew,501,461,0,0,1,8,3
|
||||
REMOVED_USER,Norwegian,501,498,501,0,148,0,501
|
||||
"Martim Parente (Sharlimar)",Portuguese,497,534,0,38,0,0,0
|
||||
"chrrris1987 (Chrrris1987)",Dutch,467,478,0,23,0,0,0
|
||||
"Huy Ngo (huyngo)",Vietnamese,461,695,0,1,0,0,0
|
||||
"黄克 (hk13127)","Chinese Simplified",461,765,0,1,0,0,0
|
||||
"Arkadiusz Bubak (epitek)",Polish,458,416,29,24,0,3,0
|
||||
marco.baturan,Esperanto,452,452,0,0,0,0,0
|
||||
"Sief Tarek (sieftarek135)",Arabic,447,455,0,0,0,0,0
|
||||
"Omer I.S. (omeritzics)",Hebrew,428,366,0,14,1,0,0
|
||||
"Samuel Guay (SamGuay)",French,426,486,0,6,0,0,0
|
||||
"Diana Karaseva (Sun_Dianka)",Russian,399,373,0,10,1,0,221
|
||||
"Alexander Jansson (dalecarlian)",Swedish,396,406,507,0,0,3,399
|
||||
luiandresgonzalez,Spanish,383,403,0,1,0,0,0
|
||||
"Thamara Andrade (tkcandrade)","Portuguese, Brazilian",380,387,0,0,1,0,252
|
||||
"Sølv Ræven (soelvraeven)",Danish,370,370,0,0,0,0,0
|
||||
"Isti (eisti)",Hungarian,367,329,0,0,0,0,0
|
||||
"Anh Quân (dangquanuet)",Vietnamese,362,530,0,42,1,0,0
|
||||
gapszi,Hungarian,348,301,0,86,0,0,0
|
||||
"Mahdi Nasiri (mahdi.nasiri)",Persian,343,465,0,39,3,0,0
|
||||
Seoyul,Korean,339,825,0,0,27,0,0
|
||||
"Magimai Prakasam (magimai)",Tamil,336,831,0,12,0,0,0
|
||||
"Michael Malak (MichaelKMalak)",Arabic,304,271,0,0,0,0,0
|
||||
"Elina Salminen (salminen.elina.m)",Finnish,297,227,0,0,0,0,0
|
||||
ayane.m,Japanese,292,863,0,1,2,0,22
|
||||
"Marius Teufelweich (teufelweich)",German,249,256,606,4,0,0,146
|
||||
cobalt59,German,237,234,0,1,23,1,132
|
||||
"QWERT (lurenjia01)","Chinese Simplified",236,407,0,0,0,0,0
|
||||
beriain,Basque,234,235,0,0,2,0,0
|
||||
"Intan Ayunda (Intan_Ayunda)",Indonesian,228,239,336,0,0,0,135
|
||||
pnhpnh,Vietnamese,225,343,0,1,3,0,0
|
||||
"Dika Fitrian Dwi Putra (OsamuDazai)",Indonesian,221,215,0,0,0,0,33
|
||||
easyrepro,Telugu,214,297,0,0,0,0,0
|
||||
taras-ko,Ukrainian,211,183,0,1,4,0,19
|
||||
sojusnik,German,207,200,1,0,30,0,66
|
||||
axmed99,Ukrainian,203,177,0,40,0,0,53
|
||||
"Heru Yen (heruyen)",Indonesian,201,201,0,0,0,0,2
|
||||
Ishmaeel,Turkish,193,174,0,129,6,0,0
|
||||
fbruna17,Danish,181,179,0,1,0,0,0
|
||||
"Omry Cohen (omrycohen)",Hebrew,175,156,0,1,0,0,0
|
||||
Bryanx,Dutch,174,165,0,5,0,0,0
|
||||
"Pierre GALIEGUE (pierre.galiegue)",French,171,194,0,24,2,0,0
|
||||
DionysosDV,Greek,165,153,0,0,0,0,0
|
||||
"Gustavo Lima (GustavoLima)",Portuguese,158,177,0,1,4,10,0
|
||||
"Aputsiak Niels Janussen (aputtu)",Danish,153,171,0,0,0,0,0
|
||||
plitwin,Polish,145,128,0,1,16,0,26
|
||||
"Lương Vĩnh Khang (LuongVinhKhang)",Vietnamese,144,256,0,0,46,1,0
|
||||
azzamsa,Indonesian,142,136,0,48,0,1,50
|
||||
"Neysa Nasywa (neysanasywa)",Indonesian,140,141,0,0,0,0,35
|
||||
JY3,"Chinese Simplified",136,217,80,0,0,0,80
|
||||
"Mohammed Imthath (mimthath4)",Tamil,136,274,0,0,11,0,0
|
||||
roptat,French,132,154,0,112,88,5,0
|
||||
"Trần Thái (tranhoangthai2001)",Vietnamese,127,186,0,8,1,0,0
|
||||
"OP Smosher (teenwolffan44)","Serbian (Cyrillic)",124,122,0,0,0,0,18
|
||||
4001982248998,Esperanto,122,119,0,0,0,0,0
|
||||
"StoP4Me (Lcqp)",Romanian,121,119,0,0,3,0,0
|
||||
Sebastian05067,Spanish,114,133,0,55,18,0,0
|
||||
"Tanya (MagicUnderHood)",Russian,114,98,0,19,0,0,32
|
||||
REMOVED_USER,Arabic,111,106,0,22,21,2,0
|
||||
mohmans,Arabic,109,103,0,2,0,0,0
|
||||
"Ivan Krušlin (krux3r)",Croatian,108,122,503,0,0,0,108
|
||||
"Iabin Arteaga (iabin)",Spanish,108,111,0,4,20,0,0
|
||||
2kaafone,Finnish,105,90,0,0,0,0,0
|
||||
"Adam Jurkiewicz (hasztagg)",Polish,104,105,529,0,0,0,104
|
||||
"Saeed Esmaili (saaeed.es20)",Persian,104,141,0,0,0,0,0
|
||||
"just a name bro (justanamebr0)",Danish,98,109,0,0,1,0,0
|
||||
"Nam Nguyen (namnl2706)",Vietnamese,95,137,0,0,0,0,0
|
||||
"손유정 (yuwon1213)",Korean,95,57,0,0,0,0,0
|
||||
ranmagen,Hebrew,91,78,0,0,0,0,0
|
||||
LoneWanderer,"Chinese Traditional",90,137,0,4,0,0,0
|
||||
"Vo - (voyl)","Chinese Traditional",89,126,0,0,5,0,0
|
||||
ikkaz,Indonesian,89,84,0,5,0,0,4
|
||||
"Irene K (Heaun)",Korean,88,75,0,25,0,0,0
|
||||
"Kumar Anand (kumar0500)",Hindi,87,125,0,0,0,0,0
|
||||
Prosta4ok_ua,Ukrainian,87,84,0,1,0,0,17
|
||||
"Ohad Edri (ohadalte)",Hebrew,85,79,0,0,1,3,0
|
||||
helectron,Persian,84,102,0,1,0,0,0
|
||||
"Radu Cebotari (wildProgrammer)",Romanian,84,92,0,1,0,0,0
|
||||
"Israa Z (sosozozo)",Arabic,79,87,0,43,11,0,3
|
||||
"Sofia Neves (sofiasonev)","Portuguese, Brazilian",79,84,0,1,0,0,46
|
||||
Tiralka,French,79,91,0,92,1,0,0
|
||||
"Jacob Roller (jdr28070)",Korean,79,61,0,0,0,0,0
|
||||
"Toni Mustonen (toni.mustonen)",Finnish,78,72,0,0,0,0,0
|
||||
"Michael (quelbs)",German,76,75,0,1,0,0,39
|
||||
"Fauz Aladeem (topfauz)",Arabic,76,77,0,0,0,1,0
|
||||
RealDonald,Dutch,67,69,0,121,10,0,0
|
||||
sirekanyan,"Armenian; Russian",66,65,0,0,0,0,0
|
||||
"Константин К. (kocyak1991)",Russian,64,60,0,0,1,2,0
|
||||
"Laura Sophie (laurasophie20)",German,62,67,0,4,0,0,0
|
||||
raden20,Indonesian,61,62,177,0,1,0,64
|
||||
"Jan Wojtecki (j4nw)",Polish,58,46,0,0,0,0,26
|
||||
"Deepak Bharathi (deepakbharathi1994)",Tamil,56,107,0,0,11,4,0
|
||||
"Андрій Козицький (andriikozytskyi1108)",Ukrainian,52,52,0,0,1,0,0
|
||||
REMOVED_USER,Italian,51,52,0,2,0,0,0
|
||||
govindap,"Japanese; Hindi",51,114,0,6,1,0,0
|
||||
"Mare Geldenhuys (mare.geldenhuys)",Afrikaans,50,57,0,0,0,0,0
|
||||
"Peter Williams (williamspete001)",Japanese,49,133,0,1,0,0,3
|
||||
"Behnood HRazy (behnoodhr)",Persian,49,70,0,0,0,0,0
|
||||
J3ll3nl,Dutch,48,48,0,0,17,1,3
|
||||
"tat bz (Tat_i)",German,48,56,0,55,0,0,27
|
||||
vach,Armenian,47,36,0,0,0,0,0
|
||||
andowero,Czech,47,38,0,0,0,0,0
|
||||
"Andrew Firnes (Anechan)",Russian,47,47,0,3,0,0,29
|
||||
"Coni Ragni (coni2ragnii)",Spanish,46,46,0,0,0,0,0
|
||||
"Rahul Shishodia (rahul.shishodia.10)",Hindi,46,85,0,6,0,0,0
|
||||
Cp0204,"Chinese Simplified",45,72,0,0,0,0,0
|
||||
"cc (cavaz)",Italian,44,41,0,0,0,0,0
|
||||
"Kamil Dziadek (prso94)",Polish,43,39,0,0,2,0,0
|
||||
"Boban Jagertraum (boban40)",Czech,43,38,0,2,1,1,0
|
||||
andreea.muscalagiu,Romanian,42,52,0,1,0,0,0
|
||||
"Me Me (gentelwom)",Arabic,42,40,0,0,0,0,0
|
||||
"Balázs Keresztury (belidzs)",Hungarian,42,41,501,0,7,0,38
|
||||
MStefanov,Bulgarian,41,55,2,0,2,0,2
|
||||
"Ali Zali (stm19951995)",Persian,40,60,0,0,0,0,0
|
||||
"Sofia Veijonen (Suklaa) (sofia.veijonen)",Finnish,40,33,0,0,0,0,0
|
||||
dusanstrgar,Slovenian,39,41,0,0,0,0,0
|
||||
"Limin Lu (liminlu)","Chinese Simplified",39,79,503,0,0,0,39
|
||||
Anshoe,Tamil,38,65,0,14,0,0,0
|
||||
anasshm,Arabic,37,36,0,9,0,0,0
|
||||
hrexen,Armenian,37,37,0,0,0,0,0
|
||||
REMOVED_USER,Swedish,36,33,0,5,1,0,0
|
||||
"Abdulrahman (D7M)",Arabic,36,39,0,0,0,0,0
|
||||
"長谷川知里 (chase0213)",Japanese,34,138,0,13,0,0,24
|
||||
"Piotr Łuczyński (peterluczynski)",Polish,33,30,0,6,5,0,2
|
||||
"milad farahani (miladfarmahini90)",Persian,33,44,0,18,0,0,3
|
||||
"Luis E. Perichon (luisperichon)",Spanish,33,40,0,104,0,0,0
|
||||
andriikozytskyi2625,Ukrainian,31,23,0,0,0,0,0
|
||||
JoeLi,"Chinese Traditional",31,70,0,12,0,0,24
|
||||
Moastafa,Arabic,31,25,0,0,0,0,0
|
||||
REMOVED_USER,Russian,31,30,0,2,4,0,3
|
||||
"hamza gamal (hamzagamal4444)",Arabic,31,28,0,0,0,0,0
|
||||
yancyn,"Chinese Simplified",30,40,0,0,0,0,0
|
||||
"비니몬youtube (khj01025276475)",Korean,29,25,0,0,0,0,0
|
||||
"Ruud Schouten (ruudschouten)",Dutch,29,32,0,41,3,0,0
|
||||
"Guillaume Collic (gcollic)",French,26,28,0,126,11,0,0
|
||||
"Niraj Yadav (neverforgetniraj)",Hindi,26,48,0,0,0,0,0
|
||||
"Radoslaw Biernacki (radoslaw.biernacki)",Polish,26,24,0,8,0,0,1
|
||||
"Jonny I (jonny99dj)",Italian,26,26,0,5,0,0,0
|
||||
"Aaron Dalton (Perlkonig)",French,26,25,0,141,1,0,0
|
||||
"Eddie (eddieattaboy)","Chinese Traditional",25,34,0,1,0,0,0
|
||||
Pan_Filuta,Czech,25,21,0,5,4,0,3
|
||||
"eduard83 (barbany.eduard)",Catalan,24,25,0,2,0,0,0
|
||||
"Ľuboš Čaky (lubos.caky)",Slovak,23,22,0,0,0,0,0
|
||||
"Caner Başaran (basarancaner)",Turkish,23,21,0,0,20,0,0
|
||||
hodanli,Turkish,22,26,0,0,1,0,0
|
||||
"Neeraj Verma (verma.neeraj.in)",Hindi,22,37,0,0,1,0,0
|
||||
"Alcarkse (alexis.brusle)",French,21,25,0,7,11,0,0
|
||||
"Shashwat (goforgold)",Hindi,20,33,0,0,0,0,0
|
||||
"사자솥 (toke1597)",Korean,19,19,0,0,0,0,0
|
||||
"İsa Eş (IsaEs)",Turkish,19,17,0,0,6,1,0
|
||||
sheeCesu,French,19,18,0,48,2,0,0
|
||||
can13,Turkish,19,14,0,8,0,0,0
|
||||
"Magdalena Urbańczyk (madziia139)",Polish,19,19,0,0,0,0,0
|
||||
axikman11111,Uyghur,18,19,0,0,0,0,0
|
||||
Adeline31,French,17,20,0,3,0,0,0
|
||||
"Hoon Jung (hooni100)",Korean,17,10,0,0,0,0,0
|
||||
"Ceara Lopez (cealopez)",Spanish,17,18,0,0,5,1,0
|
||||
takoyakibento,Korean,17,13,0,3,0,0,0
|
||||
bretzel15,German,16,20,0,0,0,0,0
|
||||
engineeringforgood,Russian,16,15,0,0,0,0,0
|
||||
"Şamil Ateşoğlu (m.samilatesoglu)",Turkish,16,22,0,11,6,3,0
|
||||
DebatablySane,Bulgarian,16,15,0,48,0,0,0
|
||||
"Bhava Tharini (bhavidanush)",Tamil,15,37,0,0,0,0,0
|
||||
"Anastasia Borchuk (al2.borchuk)",Russian,14,14,0,0,0,0,0
|
||||
"EuiHo Hwang (euiho.hwang)",Korean,14,16,0,0,0,0,0
|
||||
iamsurajbobade,Hindi,14,30,0,0,0,0,0
|
||||
"Zeynep Esen (nezihaesen50)",Turkish,14,13,0,0,0,0,0
|
||||
"Fikret Bilici (fikretbilici)",Turkish,14,13,0,0,0,0,0
|
||||
"Zeeshan Rabbani (Zeera)",Hindi,14,25,0,0,0,0,0
|
||||
"Sanji Vinsmock (mukanzhanbolat4)",Russian,14,14,0,0,0,0,0
|
||||
"Nenad Vukotic (vukotic.nenad)","Serbian (Cyrillic)",13,13,0,1,2,6,0
|
||||
"Uwe Mönks (schirinowski)",German,13,12,0,0,0,0,0
|
||||
"Dave (xdave)",Hungarian,13,11,0,0,0,0,0
|
||||
soura2,Arabic,12,13,0,0,0,0,0
|
||||
"shreyas (techiespace)",Hindi,12,20,0,0,0,0,0
|
||||
"Jo Chuang (josephch405)","Chinese Traditional",11,24,0,0,0,0,11
|
||||
Vmrc,French,11,12,0,2,0,0,0
|
||||
"sathvic k (sathvictripleseven)",Telugu,10,17,0,0,0,0,0
|
||||
"Edwin van Rooij (edwinvrooij)",Dutch,10,13,0,17,0,0,0
|
||||
"Brian Camacho (bmcamacho)",Polish,10,11,0,0,1,0,0
|
||||
"Ahmed Mosaad (ahmed.mosaad2018)",Arabic,10,12,0,6,0,0,0
|
||||
"Mihael Wagner (miha.wagner)",Slovenian,10,9,0,7,0,0,0
|
||||
"Anonymous edgy nerd (yamentaad)",Arabic,10,13,0,1,0,0,0
|
||||
"Martin Vostatek (martinvostatek)",Czech,9,8,0,32,2,0,0
|
||||
"Sourire Lucide (sourire_lucide)",Russian,9,10,0,0,1,0,0
|
||||
"Suhaili Hassan (kucingsyg96)",Indonesian,9,10,0,0,0,0,0
|
||||
"Seweryn Piotrowski (Draxxsx)",Polish,9,10,0,0,19,0,0
|
||||
Rex123,Persian,8,8,0,0,0,0,0
|
||||
"Konstantin (KZhidovinov)",Russian,7,7,0,0,0,0,0
|
||||
pkorove,Greek,7,7,0,0,0,0,0
|
||||
ftfoi,Norwegian,7,6,0,0,0,0,0
|
||||
"Андрій Козицький (andriikozytskyi3807)",Ukrainian,7,12,0,2,0,0,0
|
||||
"Vladimir Pavlychev (KeyJoo)",Russian,7,9,0,0,0,0,0
|
||||
"Andrey ZaXeLoN (waragaa)",Russian,7,7,0,8,1,0,0
|
||||
erfan2927,Persian,6,6,0,0,0,0,0
|
||||
dragnus,Arabic,6,6,0,1,1,0,0
|
||||
"Sam (SorodonSorodon)",German,6,6,0,13,0,0,0
|
||||
ChloeLiang,Japanese,6,22,0,0,1,0,3
|
||||
"Burak Ceylan (7burakceylan)",Turkish,6,6,0,0,0,0,0
|
||||
"닉닉 (seohu9466)",Korean,6,14,0,13,0,0,0
|
||||
"Matthias Joly (joly.matt12)",French,5,8,0,27,1,0,0
|
||||
"Guerra Ivaneth (rossanaiva-04)",Spanish,5,7,0,0,0,0,0
|
||||
"Manuel Tassi (Mannivu)",Italian,5,6,0,0,0,0,0
|
||||
"Micaela Pighin (micaelapiighin)",Spanish,5,6,0,1,0,0,0
|
||||
"Дмитрий Хапенков (d.khapenkov)",Russian,5,5,0,6,4,0,2
|
||||
andriikozytskyi2018,Ukrainian,5,5,0,0,0,0,0
|
||||
"Neko123 (emandic11)","Serbian (Cyrillic)",4,4,0,57,0,0,0
|
||||
marmo,German,4,4,0,0,0,0,0
|
||||
"Eli Besirov (elibesirov07)",Turkish,4,4,0,0,0,0,0
|
||||
"Lopo Isaac Fernández (rocapata)",Spanish,4,3,0,0,0,0,0
|
||||
bziuum,Polish,4,4,0,0,0,0,0
|
||||
"Thoum Ptrgnt (thomas.petrignet)",French,3,3,0,2,0,3,0
|
||||
"Vagner Roberto (vagner.trompete)","Portuguese, Brazilian",3,3,0,0,0,0,0
|
||||
"Unnie Here (Carb)",Hindi,3,8,0,0,0,0,0
|
||||
carsten_kafke,German,3,3,0,43,0,0,3
|
||||
Magidxz,Arabic,3,3,0,0,0,0,0
|
||||
atomjani,Hungarian,3,3,0,0,0,0,0
|
||||
"Péter Bernát (bernatp)",Hungarian,3,2,0,0,0,0,0
|
||||
"Igor Piskun (i_piskun)",Ukrainian,3,3,0,0,0,0,0
|
||||
"joabe gabriel (joabegabrielcma1)","Portuguese, Brazilian",3,4,0,0,0,0,0
|
||||
"Oleg Kogut (kogut_oleg)",Ukrainian,3,3,0,0,0,0,0
|
||||
"Andrea Bianchi (andreawhite1597)",Italian,3,1,0,1,0,0,0
|
||||
"Gabriel Cavalcante (gabrielc.alves14)","Portuguese, Brazilian",3,4,0,0,0,0,0
|
||||
REMOVED_USER,"Portuguese, Brazilian",3,4,0,0,0,0,0
|
||||
"Martin Zimdahl (zimdahlmartin)",Swedish,3,2,0,0,1,0,3
|
||||
"Hiohana Rilary (hiohanarilary)","Portuguese, Brazilian",3,4,0,0,0,0,0
|
||||
"Sarath S (CyberShark)",Tamil,3,7,0,0,0,0,0
|
||||
"Cláudio Bernardo (claudiobernardo.ti)","Portuguese, Brazilian",3,4,0,1,0,0,0
|
||||
"hesamiranii (esam.matouri)",Persian,2,2,0,0,0,0,0
|
||||
"조화정 (yunjoo337)",Korean,2,2,0,0,0,0,0
|
||||
"Walid Baazia (walidbaazia2005)",Arabic,2,1,0,0,0,0,0
|
||||
LNDDYL,"Chinese Traditional",2,4,0,0,0,0,2
|
||||
REMOVED_USER,Ukrainian,2,2,0,0,0,0,0
|
||||
"fatemeh s (fargolseifoori3)",Persian,2,2,0,0,0,0,0
|
||||
"أم محمد تقي (souadboudia19)",Arabic,2,2,0,0,0,0,0
|
||||
"Alex Stein (diefaust1993)",Russian,2,2,0,4,4,0,2
|
||||
"Danial Agh (danialagh)",Persian,2,3,0,0,0,0,0
|
||||
omerfarukbas,Turkish,2,3,0,19,2,0,0
|
||||
"Valerij D (vala.dobler)",German,2,2,0,0,0,0,0
|
||||
"Naveen jai krishna (njsbpolymer1)",Tamil,2,5,0,0,0,0,0
|
||||
"Balthazar Aubard (Balatzar)",French,2,5,0,0,1,0,0
|
||||
"FAy FAy (fayfayfay52)","Chinese Traditional",2,5,0,0,0,0,0
|
||||
Soroor_SI,Persian,2,2,0,0,0,0,0
|
||||
chavs1997,Russian,2,2,0,9,0,0,0
|
||||
amei,"Portuguese, Brazilian",2,2,0,0,0,0,0
|
||||
"Ilyas Fekhar (il47yas)",Arabic,2,2,0,0,0,0,0
|
||||
"Ali Zaida (alizaeda92)",Arabic,2,2,0,0,0,0,0
|
||||
gnu-ewm,Polish,1,1,0,6,0,0,0
|
||||
"Luca Gori (grolcu)",Italian,1,2,0,0,0,0,0
|
||||
"Alan Jeon (skyisle)",Korean,1,2,0,8,0,0,0
|
||||
iSoron2,"Portuguese, Brazilian",1,1,0,0,0,0,0
|
||||
"Anastasiia Bondarenko (nastasya.bondarenko.97)",Russian,1,1,0,0,0,0,0
|
||||
"Patrick Pimenta (trickap1)","Portuguese, Brazilian",1,1,0,0,0,0,0
|
||||
axd,Spanish,1,1,0,15,0,0,0
|
||||
jonesses,German,1,1,0,1,0,0,1
|
||||
"박찌 (perpact20)",Korean,1,1,0,0,0,0,0
|
||||
"Kan Black (kanblack.va)",Vietnamese,1,2,0,0,0,1,0
|
||||
REMOVED_USER,Russian,1,2,0,6,1,0,1
|
||||
"Wibi Cahyo (wbcahyoh)",Indonesian,1,3,0,0,0,0,0
|
||||
"Anton (tT0NG)","Chinese Traditional",1,2,0,0,0,0,1
|
||||
"Maria Fefelova (mashafefel)",Russian,1,1,0,0,0,0,0
|
||||
Itch,,0,0,0,0,0,0,0
|
||||
"Muhammet Furkan ALMACI (furkan.almaci)",Turkish,0,0,0,1,0,0,0
|
||||
Sandhu564.,,0,0,0,0,0,0,0
|
||||
"Quentin Hibon (hiq)",,0,0,0,0,0,0,0
|
||||
mushin,,0,0,0,0,0,0,0
|
||||
"Balaji Jayaraman (jkbalaji1103)",,0,0,0,0,0,0,0
|
||||
"Wellington Ribeiro (wellington.rib)",,0,0,0,0,0,0,0
|
||||
"Javid IRAN (twitteriran98)",Persian,0,0,0,1,0,0,0
|
||||
"박인호 (wphestiraid)",Korean,0,0,0,2,0,0,0
|
||||
"Ahmed Nazir (ahmednazir333)",,0,0,0,0,0,0,0
|
||||
dimateos,,0,0,0,0,0,0,0
|
||||
AhmedDz,Arabic,0,0,0,1,0,0,0
|
||||
"reza golestanzadeh (reza.golestanzadeh)",Persian,0,0,0,1,0,0,0
|
||||
"Petros Bleyan (coolbleyan)",Russian,0,0,0,14,0,0,0
|
||||
Kamalakannan,,0,0,0,0,0,0,0
|
||||
"Dagna Q (dagnaq)",,0,0,0,0,0,0,0
|
||||
"Thomas Orlita (Thomas995)",Czech,0,0,0,1,0,0,0
|
||||
Fazy1380,,0,0,0,0,0,0,0
|
||||
"Rivo Zängov (Eraser)",,0,0,0,0,0,0,0
|
||||
T-v-Gerwen,Dutch,0,0,0,47,0,0,0
|
||||
"عبد الناصر سعيد الثبيتي (asaeed)",,0,0,0,0,0,0,0
|
||||
"Edmunds Edmundam (edmundam)",,0,0,0,0,0,0,0
|
||||
"vi ve (VimalV)",,0,0,0,0,0,0,0
|
||||
"LeMeD (LeMeS)",French,0,0,0,2,0,0,0
|
||||
"Éjbãss Übbeî (littlebittlebottle)",Norwegian,0,0,0,152,0,0,0
|
||||
EmanAmini,,0,0,0,0,0,0,0
|
||||
AnggaRifandi,,0,0,0,0,0,0,0
|
||||
"Mateusz Teteruk (mttet)",Polish,0,0,0,1,0,0,0
|
||||
"Lori Amico (lavodkaclyde2323)",Italian,0,0,0,1,0,0,0
|
||||
"Florian Stuhlmann (stuhlmann)",German,0,0,0,10,0,0,0
|
||||
"Yasin Okumus (lacivert)",Turkish,0,0,0,1,0,0,0
|
||||
NairaDNV,Spanish,0,0,0,9,0,0,0
|
||||
REMOVED_USER,,0,0,0,0,0,0,0
|
||||
farbod66,Persian,0,0,0,1,0,0,0
|
||||
Raulbertassi,,0,0,0,0,0,0,0
|
||||
"Равиль Мифтахов (ravilmif47)",Russian,0,0,0,1,0,0,0
|
||||
"Pumpith Ungsupanit (pumpithu)",,0,0,0,0,0,0,0
|
||||
"Nat Fomicheva (natac)",Russian,0,0,0,3,0,0,0
|
||||
EwanB,,0,0,0,0,0,0,0
|
||||
ava_rfie,Persian,0,0,0,1,0,0,0
|
||||
"George Merkulov (george142.emarket)",Russian,0,0,0,11,0,0,0
|
||||
REMOVED_USER,,0,0,0,0,0,0,0
|
||||
sanyoniket,,0,0,0,0,0,0,0
|
||||
"Shuvashish Sahoo (shuvashish76)",,0,0,0,0,0,0,0
|
||||
martyaberger,,0,0,0,0,0,0,0
|
||||
"Карлен Шаухаев (KarlenShaukhaev)",,0,0,0,0,0,0,0
|
||||
"Elmo (oberknecht)",,0,0,0,0,0,0,0
|
||||
Irsgram,Russian,0,0,0,1,0,0,0
|
||||
"Matus Zdansky (matuszdansky)",,0,0,0,0,0,0,0
|
||||
shuvo786,,0,0,0,0,0,0,0
|
||||
"Eduard Boboc (edi.boboc33)",Romanian,0,0,0,4,0,0,0
|
||||
Hayder21,,0,0,0,0,0,0,0
|
||||
AsadullahIlyas,,0,0,0,0,0,0,0
|
||||
"Никита Карамов (nikita.karamoff)",Russian,0,0,0,10,0,0,0
|
||||
"Katherine Alexandra Flórez Ramírez (katherine.florez12)",Spanish,0,0,0,46,0,0,0
|
||||
mdrobulis,,0,0,0,0,0,0,0
|
||||
"Eliška Roubalová (roubaeli)",Czech,0,0,0,6,0,0,0
|
||||
droidahmed,Arabic,0,0,0,7,0,0,0
|
||||
"Arjun K. (arjunkdot)",,0,0,0,0,0,0,0
|
||||
"Sarah BCNN (fsarahboucenna)",French,0,0,0,16,0,0,0
|
||||
REMOVED_USER,Czech,0,0,0,18,0,0,0
|
||||
BongTran,Vietnamese,0,0,0,2,0,0,0
|
||||
"Arttu Ylhävuori (arttu.ylhavuori)",,0,0,0,0,0,0,0
|
||||
valney.faria,"Portuguese, Brazilian",0,0,0,1,0,0,0
|
||||
REMOVED_USER,,0,0,0,0,0,0,0
|
||||
rooban23,,0,0,0,0,0,0,0
|
||||
REMOVED_USER,,0,0,0,0,0,0,0
|
||||
"Алтынбек Наурызғали (altinbeknaurizgali)",Russian,0,0,0,1,0,0,0
|
||||
"Sri Harsha Bhogi (sriharshabhogi)",,0,0,0,0,0,0,0
|
||||
"Ahnaf Tajwar (atn4404)",,0,0,0,0,0,0,0
|
||||
Elham1361,,0,0,0,0,0,0,0
|
||||
dongchen.yue,German,0,0,0,4,0,0,0
|
||||
philfr49,French,0,0,0,2,0,0,0
|
||||
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; 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)",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,"2017-03-31 09:13:19"
|
||||
"David (Cliff122)",Swedish,1040,1019,725,6,0,0,700,"2020-01-21 13:56:55"
|
||||
"Omer I.S. (omeritzics)",Hebrew,1000,900,1097,14,1,0,946,"2020-10-11 20:10:51"
|
||||
dukelc,Slovak,919,880,0,0,0,0,0,"2020-08-27 14:02:41"
|
||||
"Intan Ayunda (Intan_Ayunda)",Indonesian,800,793,962,0,0,0,711,"2020-10-14 07:51:58"
|
||||
KMakoto,"Chinese Traditional",745,1146,949,0,0,0,745,"2019-10-22 04:19:52"
|
||||
"Evren (evrenkiymaz)",Turkish,688,604,0,71,5,1,0,"2020-10-04 03:39:16"
|
||||
"David Nos (david.nos)","Catalan; Spanish",667,731,0,0,1,0,0,"2020-01-04 10:15:36"
|
||||
"Antti Kallio (antti.kallio)",Finnish,650,525,0,0,0,0,0,"2021-07-03 05:54:44"
|
||||
androide74,Italian,644,659,0,2,0,0,0,"2020-02-06 15:46:28"
|
||||
Tomairuka,Japanese,633,1636,909,43,0,0,564,"2020-12-12 12:14:22"
|
||||
"Dmitriy Bogdanov (di72nn)",Russian,625,572,1197,0,36,0,515,"2017-03-31 10:00:48"
|
||||
reyhoon,Persian,624,759,0,1,3,1,0,"2020-10-01 18:17:23"
|
||||
Osoitz,Basque,610,545,0,9,0,0,3,"2018-01-23 14:07:47"
|
||||
"Saeed Esmaili (saaeed.es20)",Persian,568,774,0,5,4,0,0,"2020-11-26 15:41:15"
|
||||
fabian.bouchal,German,548,527,0,6,0,3,72,"2020-01-07 06:43:37"
|
||||
boban77,Czech,509,461,0,2,0,0,0,"2020-04-30 13:18:24"
|
||||
"Yoav Argov (YoavArgov)",Hebrew,501,461,0,0,1,8,103,"2017-04-28 07:23:01"
|
||||
REMOVED_USER,Norwegian,501,498,501,0,148,0,501,"2017-07-05 19:02:25"
|
||||
"Martim Parente (Sharlimar)",Portuguese,497,534,0,38,0,0,0,"2020-08-26 10:22:11"
|
||||
"chrrris1987 (Chrrris1987)",Dutch,467,478,0,23,0,0,0,"2020-02-03 05:26:04"
|
||||
"Huy Ngo (huyngo)",Vietnamese,461,695,0,1,0,0,0,"2020-01-26 11:58:36"
|
||||
"黄克 (hk13127)","Chinese Simplified",461,765,0,1,0,0,24,"2020-01-17 23:16:03"
|
||||
"Arkadiusz Bubak (epitek)",Polish,458,416,29,24,0,3,0,"2020-11-05 05:11:58"
|
||||
marco.baturan,Esperanto,452,452,0,0,0,0,0,"2020-06-23 02:49:46"
|
||||
"Sief Tarek (sieftarek135)",Arabic,447,455,0,0,0,0,0,"2021-02-07 14:35:21"
|
||||
"Samuel Guay (SamGuay)",French,426,486,0,6,0,0,0,"2020-06-25 07:14:38"
|
||||
"Diana Karaseva (Sun_Dianka)",Russian,399,373,0,10,1,0,209,"2020-01-30 06:40:02"
|
||||
"Alexander Jansson (dalecarlian)",Swedish,396,406,507,0,0,3,399,"2017-06-21 01:37:32"
|
||||
luiandresgonzalez,Spanish,383,403,0,1,28,0,0,"2020-07-11 14:20:44"
|
||||
"Thamara Andrade (tkcandrade)","Portuguese, Brazilian",380,387,0,0,1,0,252,"2020-01-09 19:35:48"
|
||||
"Sølv Ræven (soelvraeven)",Danish,370,370,0,0,0,0,0,"2020-11-28 16:46:18"
|
||||
"Isti (eisti)",Hungarian,367,329,0,0,0,0,0,"2020-12-03 12:02:51"
|
||||
"Anh Quân (dangquanuet)",Vietnamese,362,530,0,42,2,0,0,"2017-10-29 12:27:44"
|
||||
gapszi,Hungarian,348,301,0,86,0,0,0,"2019-04-08 01:35:54"
|
||||
JY3,"Chinese Simplified",345,585,278,0,1,0,207,"2021-03-08 08:53:35"
|
||||
"Mahdi Nasiri (mahdi.nasiri)",Persian,343,465,0,39,3,1,0,"2017-07-14 09:17:25"
|
||||
Seoyul,Korean,339,825,0,0,27,0,0,"2017-06-21 08:11:39"
|
||||
"Magimai Prakasam (magimai)",Tamil,336,831,0,12,0,0,0,"2018-04-15 21:16:08"
|
||||
"Michael Malak (MichaelKMalak)",Arabic,304,271,0,0,0,0,0,"2020-05-26 19:47:58"
|
||||
"Elina Salminen (salminen.elina.m)",Finnish,297,227,0,0,0,0,0,"2021-01-06 01:28:57"
|
||||
ayane.m,Japanese,292,863,0,1,3,0,22,"2019-11-20 03:28:26"
|
||||
Blinkin,Dutch,284,318,0,1,0,0,0,"2021-06-14 10:30:05"
|
||||
"Marius Teufelweich (teufelweich)",German,249,256,606,4,2,0,146,"2021-03-12 04:11:38"
|
||||
cobalt59,German,237,234,0,1,24,1,132,"2017-06-05 05:18:33"
|
||||
"QWERT (lurenjia01)","Chinese Simplified",236,407,0,0,8,0,19,"2020-03-08 01:46:25"
|
||||
beriain,Basque,234,235,0,0,2,0,0,"2017-03-31 15:42:28"
|
||||
pnhpnh,Vietnamese,225,343,0,1,3,0,0,"2017-11-27 12:06:07"
|
||||
"Dika Fitrian Dwi Putra (OsamuDazai)",Indonesian,221,215,0,0,0,0,48,"2020-07-13 04:40:27"
|
||||
easyrepro,Telugu,214,297,0,0,0,0,0,"2020-06-12 12:52:10"
|
||||
taras-ko,Ukrainian,211,183,0,1,4,0,19,"2017-10-26 16:52:22"
|
||||
sojusnik,German,207,200,1,0,30,0,66,"2017-04-03 17:11:56"
|
||||
axmed99,Ukrainian,203,177,0,40,0,0,53,"2021-04-01 03:56:20"
|
||||
"Heru Yen (heruyen)",Indonesian,201,201,0,0,0,0,25,"2020-06-29 18:39:15"
|
||||
"Vijaykumar Borkar (vjkumar)",Hindi,200,364,0,11,0,0,0,"2021-08-06 16:12:15"
|
||||
Ishmaeel,Turkish,193,174,0,129,6,0,0,"2017-10-04 03:54:00"
|
||||
"Aputsiak Niels Janussen (aputtu)",Danish,187,200,0,0,0,0,0,"2019-08-28 05:47:42"
|
||||
_translator,French,181,206,0,11,0,0,0,"2021-07-06 07:54:12"
|
||||
fbruna17,Danish,181,179,0,1,0,0,0,"2021-01-28 15:48:47"
|
||||
"Omry Cohen (omrycohen)",Hebrew,175,156,0,1,0,0,33,"2021-01-18 07:33:23"
|
||||
Bryanx,Dutch,174,165,0,5,0,0,0,"2019-11-21 17:08:12"
|
||||
"Pierre GALIEGUE (pierre.galiegue)",French,171,194,0,24,4,0,0,"2020-08-16 11:41:35"
|
||||
bruhwut,Vietnamese,171,268,0,1,0,0,0,"2021-05-21 07:16:30"
|
||||
DionysosDV,Greek,165,153,0,0,0,0,0,"2021-02-27 19:05:25"
|
||||
"Gustavo Lima (GustavoLima)",Portuguese,158,177,0,1,4,10,0,"2020-08-26 10:35:05"
|
||||
oscfd,Spanish,155,166,0,1,4,0,0,"2021-05-21 17:58:22"
|
||||
plitwin,Polish,145,128,0,1,16,0,26,"2021-01-20 06:18:37"
|
||||
"Lương Vĩnh Khang (LuongVinhKhang)",Vietnamese,144,256,0,0,46,1,0,"2017-08-10 10:05:58"
|
||||
azzamsa,Indonesian,142,136,0,48,0,1,26,"2017-06-16 18:29:45"
|
||||
"yoding (yodingc)","Chinese Traditional; Chinese Simplified",141,271,0,10,0,0,0,"2021-07-07 01:45:45"
|
||||
"Neysa Nasywa (neysanasywa)",Indonesian,140,141,0,0,0,0,60,"2020-11-18 10:32:10"
|
||||
"Mohammed Imthath (mimthath4)",Tamil,136,274,0,0,11,0,0,"2018-02-15 22:41:15"
|
||||
roptat,French,132,154,0,112,89,5,0,"2017-04-19 16:54:47"
|
||||
"Trần Thái (tranhoangthai2001)",Vietnamese,127,186,0,8,1,0,0,"2018-03-01 10:51:39"
|
||||
"OP Smosher (teenwolffan44)","Serbian (Cyrillic)",124,122,0,0,0,0,18,"2020-11-05 09:41:35"
|
||||
4001982248998,Esperanto,122,119,0,0,0,0,0,"2017-10-08 04:13:02"
|
||||
"StoP4Me (Lcqp)",Romanian,121,119,0,0,3,0,0,"2018-05-06 18:51:59"
|
||||
alalloush,Arabic,118,129,0,2,2,0,0,"2017-03-31 12:37:17"
|
||||
"Eilif Adelvice (adelvice)",Spanish,116,126,0,96,0,0,0,"2021-08-05 07:20:21"
|
||||
Sebastian05067,Spanish,114,133,0,55,28,0,0,"2017-05-14 00:48:16"
|
||||
"Tanya (MagicUnderHood)",Russian,114,98,0,19,0,0,54,"2019-04-21 10:44:03"
|
||||
REMOVED_USER,Arabic,111,106,0,22,21,2,0,"2018-01-05 07:01:45"
|
||||
mohmans,Arabic,109,103,0,2,0,0,0,"2020-11-23 02:48:00"
|
||||
"Iabin Arteaga (iabin)",Spanish,108,111,0,4,21,0,0,"2017-08-26 21:08:54"
|
||||
"Ivan Krušlin (krux3r)",Croatian,108,122,503,0,0,0,108,"2017-03-31 09:15:24"
|
||||
2kaafone,Finnish,105,90,0,0,0,0,0,"2019-08-12 06:58:48"
|
||||
"Adam Jurkiewicz (hasztagg)",Polish,104,105,529,0,0,0,104,"2017-03-31 09:50:51"
|
||||
"just a name bro (justanamebr0)",Danish,98,109,0,0,1,0,0,"2019-06-19 11:57:55"
|
||||
"Nam Nguyen (namnl2706)",Vietnamese,95,137,0,0,0,0,0,"2020-08-18 23:02:33"
|
||||
"손유정 (yuwon1213)",Korean,95,57,0,0,0,0,0,"2021-03-30 05:25:33"
|
||||
ranmagen,Hebrew,91,78,0,0,0,0,0,"2021-02-16 05:44:31"
|
||||
LoneWanderer,"Chinese Traditional",90,137,0,4,0,0,0,"2020-09-29 05:24:48"
|
||||
"Vo - (voyl)","Chinese Traditional",89,126,0,0,5,0,0,"2020-09-02 23:34:42"
|
||||
ikkaz,Indonesian,89,84,0,5,0,0,4,"2019-09-02 19:58:54"
|
||||
"Irene K (Heaun)",Korean,88,75,0,25,0,0,0,"2020-03-16 11:31:12"
|
||||
Prosta4ok_ua,Ukrainian,87,84,0,1,0,0,17,"2020-01-23 19:43:41"
|
||||
"Kumar Anand (kumar0500)",Hindi,87,125,0,0,0,0,0,"2020-11-07 02:46:09"
|
||||
"Ohad Edri (ohadalte)",Hebrew,85,79,0,0,1,3,18,"2020-07-04 03:42:09"
|
||||
helectron,Persian,84,102,0,1,0,0,0,"2021-03-02 04:10:51"
|
||||
"Radu Cebotari (wildProgrammer)",Romanian,84,92,0,1,0,0,0,"2020-02-05 01:20:00"
|
||||
"Sofia Neves (sofiasonev)","Portuguese, Brazilian",79,84,0,1,0,0,46,"2020-03-12 18:19:46"
|
||||
"Jacob Roller (jdr28070)",Korean,79,61,0,0,0,0,0,"2020-01-03 11:36:40"
|
||||
Tiralka,French,79,91,0,92,1,0,0,"2018-02-09 18:39:01"
|
||||
"Israa Z (sosozozo)",Arabic,79,87,0,43,12,0,3,"2017-11-27 14:10:50"
|
||||
"Toni Mustonen (toni.mustonen)",Finnish,78,72,0,0,0,0,0,"2017-09-02 05:34:12"
|
||||
"Fauz Aladeem (topfauz)",Arabic,76,77,0,0,0,1,0,"2020-02-21 22:46:12"
|
||||
"Michael (quelbs)",German,76,75,0,1,0,0,39,"2020-08-18 07:39:26"
|
||||
"Oliver Gronowski (OliverGronowski)",German,70,69,0,5,0,0,0,"2021-05-14 16:37:10"
|
||||
RealDonald,Dutch,67,69,0,121,10,0,0,"2017-06-23 20:10:12"
|
||||
sirekanyan,"Armenian; Russian",66,65,0,0,0,0,0,"2020-04-18 11:32:52"
|
||||
"Константин К. (kocyak1991)",Russian,64,60,0,0,1,2,0,"2018-06-10 13:39:37"
|
||||
"Laura Sophie (laurasophie20)",German,62,67,0,4,0,0,0,"2018-01-06 14:21:24"
|
||||
"Alparslan Sakci (sakci)",Turkish,61,55,0,11,0,0,0,"2021-06-10 11:59:22"
|
||||
raden20,Indonesian,61,62,177,0,1,0,64,"2017-04-09 22:04:23"
|
||||
"Jan Wojtecki (j4nw)",Polish,58,46,0,0,0,0,26,"2017-11-02 05:42:14"
|
||||
"Deepak Bharathi (deepakbharathi1994)",Tamil,56,107,0,0,11,4,0,"2017-09-17 08:00:31"
|
||||
"Peter Williams (williamspete001)",Japanese,55,147,0,2,0,0,3,"2020-01-01 13:17:44"
|
||||
"Андрій Козицький (andriikozytskyi1108)",Ukrainian,52,52,0,0,1,0,0,"2018-10-22 01:45:08"
|
||||
"Nil riera (nilriera2000)",Catalan,52,61,0,1,0,0,0,"2021-06-22 16:37:44"
|
||||
REMOVED_USER,Italian,51,52,0,2,0,0,0,"2017-08-21 05:15:31"
|
||||
govindap,"Japanese; Hindi",51,114,0,6,1,0,0,"2020-06-02 20:15:52"
|
||||
"Mare Geldenhuys (mare.geldenhuys)",Afrikaans,50,57,0,0,0,0,0,"2017-10-20 18:00:14"
|
||||
"Behnood HRazy (behnoodhr)",Persian,49,70,0,0,0,0,0,"2017-11-25 10:57:21"
|
||||
"tat bz (Tat_i)",German,48,56,0,55,0,0,27,"2021-03-26 05:12:54"
|
||||
J3ll3nl,Dutch,48,48,0,0,17,1,3,"2017-03-31 11:56:09"
|
||||
"Andrew Firnes (Anechan)",Russian,47,47,0,3,0,0,29,"2019-09-18 09:51:59"
|
||||
andowero,Czech,47,38,0,0,0,0,0,"2020-01-20 02:29:01"
|
||||
vach,Armenian,47,36,0,0,0,0,0,"2020-04-18 16:53:12"
|
||||
"Rahul Shishodia (rahul.shishodia.10)",Hindi,46,85,0,6,5,1,0,"2018-12-24 22:18:19"
|
||||
"Coni Ragni (coni2ragnii)",Spanish,46,46,0,0,0,0,0,"2021-02-28 20:18:37"
|
||||
Cp0204,"Chinese Simplified",45,72,0,0,0,0,0,"2019-08-20 11:04:27"
|
||||
"cc (cavaz)",Italian,44,41,0,0,0,0,0,"2017-04-01 04:21:08"
|
||||
"Boban Jagertraum (boban40)",Czech,43,38,0,2,1,1,0,"2017-03-31 09:39:16"
|
||||
"Kamil Dziadek (prso94)",Polish,43,39,0,0,2,0,0,"2020-04-06 17:12:06"
|
||||
"Me Me (gentelwom)",Arabic,42,40,0,0,0,0,0,"2020-11-08 20:44:01"
|
||||
"Ali Elsheikh (aelsheikh1987)",Arabic,42,41,0,0,0,0,0,"2021-06-16 10:17:26"
|
||||
"Balázs Keresztury (belidzs)",Hungarian,42,41,501,0,7,0,38,"2017-04-06 02:40:24"
|
||||
andreea.muscalagiu,Romanian,42,52,0,1,0,0,0,"2017-10-22 07:19:49"
|
||||
"Mateusz Duda (MateuszDuda)",Polish,42,42,0,0,0,0,0,"2021-08-17 11:27:11"
|
||||
MStefanov,Bulgarian,41,55,2,0,2,0,2,"2017-03-31 16:09:02"
|
||||
"Sofia Veijonen (Suklaa) (sofia.veijonen)",Finnish,40,33,0,0,0,0,0,"2018-03-07 09:24:22"
|
||||
"Ali Zali (stm19951995)",Persian,40,60,0,0,0,0,0,"2020-03-23 19:57:26"
|
||||
"Limin Lu (liminlu)","Chinese Simplified",39,79,503,0,0,0,39,"2017-03-31 09:49:35"
|
||||
dusanstrgar,Slovenian,39,41,0,0,0,0,0,"2017-03-31 10:30:28"
|
||||
Anshoe,Tamil,38,65,0,14,0,0,0,"2018-01-02 11:06:52"
|
||||
anasshm,Arabic,37,36,0,9,0,0,0,"2019-01-27 04:07:22"
|
||||
hrexen,Armenian,37,37,0,0,0,0,0,"2020-12-09 02:30:34"
|
||||
"Abdulrahman (D7M)",Arabic,36,39,0,0,0,0,0,"2020-01-29 18:55:30"
|
||||
"Maria Chushnyakova (maria.ch)",Russian,36,31,0,3,0,0,0,"2021-08-17 03:23:58"
|
||||
REMOVED_USER,Swedish,36,33,0,5,1,0,0,"2018-09-29 17:47:33"
|
||||
"長谷川知里 (chase0213)",Japanese,34,138,0,13,0,0,24,"2018-12-14 10:52:44"
|
||||
"Luis E. Perichon (luisperichon)",Spanish,33,40,0,104,0,0,0,"2017-09-04 13:46:06"
|
||||
"Piotr Łuczyński (peterluczynski)",Polish,33,30,0,6,5,0,2,"2020-01-29 07:27:40"
|
||||
"milad farahani (miladfarmahini90)",Persian,33,44,0,18,1,0,3,"2017-08-31 16:09:00"
|
||||
andriikozytskyi2625,Ukrainian,31,23,0,0,0,0,0,"2019-07-08 00:16:41"
|
||||
Moastafa,Arabic,31,25,0,0,0,0,0,"2020-07-06 11:37:53"
|
||||
"hamza gamal (hamzagamal4444)",Arabic,31,28,0,0,0,0,0,"2020-08-03 15:23:34"
|
||||
REMOVED_USER,Russian,31,30,0,2,4,0,3,"2018-12-03 23:55:47"
|
||||
JoeLi,"Chinese Traditional",31,70,0,12,0,0,24,"2017-06-25 05:32:48"
|
||||
yancyn,"Chinese Simplified",30,40,0,0,0,0,1,"2020-05-18 20:06:03"
|
||||
"비니몬youtube (khj01025276475)",Korean,29,25,0,0,0,0,0,"2020-02-09 20:44:35"
|
||||
"Ruud Schouten (ruudschouten)",Dutch,29,32,0,41,3,0,0,"2017-07-22 17:49:17"
|
||||
"Aaron Dalton (Perlkonig)",French,26,25,0,141,1,0,0,"2018-01-14 12:58:19"
|
||||
"Niraj Yadav (neverforgetniraj)",Hindi,26,48,0,0,0,0,0,"2017-04-11 02:26:50"
|
||||
"Guillaume Collic (gcollic)",French,26,28,0,126,11,0,0,"2017-05-05 16:13:00"
|
||||
"Radoslaw Biernacki (radoslaw.biernacki)",Polish,26,24,0,8,0,0,1,"2020-12-15 17:55:31"
|
||||
"Jonny I (jonny99dj)",Italian,26,26,0,5,0,0,0,"2017-10-07 07:35:34"
|
||||
"Eddie (eddieattaboy)","Chinese Traditional",25,34,0,1,0,0,0,"2020-11-04 21:48:05"
|
||||
Pan_Filuta,Czech,25,21,0,5,4,0,3,"2017-04-29 12:55:14"
|
||||
"eduard83 (barbany.eduard)",Catalan,24,25,0,2,0,0,0,"2019-06-26 14:59:47"
|
||||
"Ľuboš Čaky (lubos.caky)",Slovak,23,22,0,0,0,0,0,"2019-07-02 16:51:44"
|
||||
"Caner Başaran (basarancaner)",Turkish,23,21,0,0,21,0,0,"2017-04-09 06:34:59"
|
||||
hodanli,Turkish,22,26,0,0,1,0,0,"2017-11-03 14:33:41"
|
||||
gnu-ewm,Polish,22,23,0,6,0,0,0,"2021-02-24 03:42:01"
|
||||
"Neeraj Verma (verma.neeraj.in)",Hindi,22,37,0,0,1,0,0,"2018-07-23 07:16:41"
|
||||
"Alcarkse (alexis.brusle)",French,21,25,0,7,11,0,0,"2017-08-06 09:32:29"
|
||||
olbotta,Italian,20,25,0,2,0,0,0,"2021-06-06 04:22:55"
|
||||
"Shashwat (goforgold)",Hindi,20,33,0,0,0,0,0,"2020-05-17 10:34:42"
|
||||
"Magdalena Urbańczyk (madziia139)",Polish,19,19,0,0,0,0,0,"2017-10-21 03:01:04"
|
||||
sheeCesu,French,19,18,0,48,4,0,0,"2017-12-21 17:01:39"
|
||||
can13,Turkish,19,14,0,8,0,0,0,"2021-01-03 10:39:03"
|
||||
"İsa Eş (IsaEs)",Turkish,19,17,0,0,6,1,0,"2017-06-20 07:30:22"
|
||||
"사자솥 (toke1597)",Korean,19,19,0,0,0,0,0,"2020-02-04 13:36:11"
|
||||
axikman11111,Uyghur,18,19,0,0,0,0,0,"2018-10-13 12:25:31"
|
||||
"Hoon Jung (hooni100)",Korean,17,10,0,0,0,0,0,"2021-01-03 02:26:54"
|
||||
"Ceara Lopez (cealopez)",Spanish,17,18,0,0,5,1,0,"2017-08-22 22:56:13"
|
||||
takoyakibento,Korean,17,13,0,3,0,0,0,"2020-08-01 08:44:15"
|
||||
Adeline31,French,17,20,0,3,0,0,0,"2019-12-06 00:00:11"
|
||||
engineeringforgood,Russian,16,15,0,0,0,0,16,"2021-01-22 03:32:35"
|
||||
bretzel15,German,16,20,0,0,0,0,0,"2020-04-06 02:49:14"
|
||||
"Şamil Ateşoğlu (m.samilatesoglu)",Turkish,16,22,0,11,6,3,0,"2017-07-05 18:37:08"
|
||||
DebatablySane,Bulgarian,16,15,0,48,0,0,0,"2017-07-10 15:13:18"
|
||||
"Bhava Tharini (bhavidanush)",Tamil,15,37,0,0,0,0,0,"2019-10-09 05:43:11"
|
||||
"Zeynep Esen (nezihaesen50)",Turkish,14,13,0,0,0,0,0,"2020-01-28 07:05:15"
|
||||
"Fikret Bilici (fikretbilici)",Turkish,14,13,0,0,0,0,0,"2020-06-21 17:16:11"
|
||||
"EuiHo Hwang (euiho.hwang)",Korean,14,16,0,0,0,0,0,"2020-06-23 02:40:01"
|
||||
"Zeeshan Rabbani (Zeera)",Hindi,14,25,0,0,0,0,0,"2020-09-15 11:32:01"
|
||||
"Faiz Ahamed (faiznewton)",Tamil,14,31,0,0,0,0,0,"2021-05-06 23:06:46"
|
||||
"Anastasia Borchuk (al2.borchuk)",Russian,14,14,0,0,0,0,0,"2020-04-14 13:22:49"
|
||||
iamsurajbobade,Hindi,14,30,0,0,0,0,0,"2018-05-21 11:23:27"
|
||||
"Sanji Vinsmock (mukanzhanbolat4)",Russian,14,14,0,0,0,0,0,"2020-02-18 12:38:54"
|
||||
"Maro Chr (caprisunglasses)",Greek,14,17,0,0,0,0,0,"2021-08-17 06:53:33"
|
||||
"Nenad Vukotic (vukotic.nenad)","Serbian (Cyrillic)",13,13,0,1,2,6,0,"2019-01-31 14:29:15"
|
||||
"Uwe Mönks (schirinowski)",German,13,12,0,0,0,0,0,"2021-02-18 04:00:41"
|
||||
"Dave (xdave)",Hungarian,13,11,0,0,0,0,0,"2020-03-02 20:56:50"
|
||||
soura2,Arabic,12,13,0,0,0,0,0,"2020-01-13 19:23:47"
|
||||
"shreyas (techiespace)",Hindi,12,20,0,0,0,0,0,"2018-06-10 01:14:26"
|
||||
"Sonu Sharma (riteetude)",Hindi,11,23,0,0,0,0,0,"2021-05-30 19:38:00"
|
||||
Vmrc,French,11,12,0,2,0,0,0,"2020-11-02 05:35:06"
|
||||
"Jo Chuang (josephch405)","Chinese Traditional",11,24,0,0,0,0,11,"2017-06-16 20:21:06"
|
||||
"sathvic k (sathvictripleseven)",Telugu,10,17,0,0,0,0,0,"2020-09-11 08:11:32"
|
||||
"Brian Camacho (bmcamacho)",Polish,10,11,0,0,1,0,0,"2020-08-03 02:27:28"
|
||||
"Anonymous edgy nerd (yamentaad)",Arabic,10,13,0,1,0,0,0,"2018-05-06 09:23:57"
|
||||
"Edwin van Rooij (edwinvrooij)",Dutch,10,13,0,17,0,0,0,"2018-11-05 03:59:10"
|
||||
"Mihael Wagner (miha.wagner)",Slovenian,10,9,0,7,0,0,0,"2017-10-18 18:26:29"
|
||||
"Ahmed Mosaad (ahmed.mosaad2018)",Arabic,10,12,0,6,0,0,0,"2021-02-03 18:45:43"
|
||||
"Suhaili Hassan (kucingsyg96)",Indonesian,9,10,0,0,0,0,0,"2018-06-10 11:55:09"
|
||||
"Martin Vostatek (martinvostatek)",Czech,9,8,0,32,2,0,0,"2019-01-21 13:52:36"
|
||||
"Seweryn Piotrowski (Draxxsx)",Polish,9,10,0,0,19,0,0,"2020-01-02 09:55:48"
|
||||
"Sourire Lucide (sourire_lucide)",Russian,9,10,0,0,1,0,0,"2018-03-22 01:37:55"
|
||||
Rex123,Persian,8,8,0,0,0,0,0,"2017-07-01 00:47:42"
|
||||
"Andrey ZaXeLoN (waragaa)",Russian,7,7,0,8,1,0,0,"2017-09-18 21:37:42"
|
||||
"Konstantin (KZhidovinov)",Russian,7,7,0,0,0,0,0,"2020-01-29 13:35:12"
|
||||
"Андрій Козицький (andriikozytskyi3807)",Ukrainian,7,12,0,2,0,0,0,"2020-09-26 20:31:56"
|
||||
ftfoi,Norwegian,7,6,0,0,0,0,0,"2020-04-11 20:42:35"
|
||||
"Vladimir Pavlychev (KeyJoo)",Russian,7,9,0,0,0,0,0,"2017-12-18 02:46:56"
|
||||
pkorove,Greek,7,7,0,0,0,0,0,"2020-03-07 11:36:12"
|
||||
erfan2927,Persian,6,6,0,0,0,0,0,"2018-04-09 02:12:44"
|
||||
"Burak Ceylan (7burakceylan)",Turkish,6,6,0,0,0,0,0,"2018-05-20 17:24:19"
|
||||
"Sam (SorodonSorodon)",German,6,6,0,13,0,0,0,"2017-04-14 11:09:27"
|
||||
"닉닉 (seohu9466)",Korean,6,14,0,13,0,0,0,"2017-10-09 23:08:15"
|
||||
"Sarita Cajas (sarayanacajas)",Spanish,6,4,0,0,1,0,0,"2021-05-14 14:27:59"
|
||||
ChloeLiang,Japanese,6,22,0,0,1,0,3,"2017-08-08 05:02:59"
|
||||
"Manuel Tassi (Mannivu)",Italian,5,6,0,0,0,0,0,"2021-01-03 11:00:33"
|
||||
"Tomáš Hrabáček (Hrabyyy)",Czech,5,3,0,0,0,0,0,"2021-05-27 11:58:11"
|
||||
"Guerra Ivaneth (rossanaiva-04)",Spanish,5,7,0,0,0,0,0,"2019-02-03 16:48:59"
|
||||
"Дмитрий Хапенков (d.khapenkov)",Russian,5,5,0,6,4,0,2,"2018-01-06 23:00:43"
|
||||
"Matthias Joly (joly.matt12)",French,5,8,0,27,1,0,0,"2017-08-28 09:53:59"
|
||||
"Micaela Pighin (micaelapiighin)",Spanish,5,6,0,1,0,0,0,"2019-10-09 23:32:42"
|
||||
andriikozytskyi2018,Ukrainian,5,5,0,0,0,0,0,"2017-09-03 05:24:43"
|
||||
marmo,German,4,4,0,0,0,0,0,"2021-01-13 01:16:35"
|
||||
"Eli Besirov (elibesirov07)",Turkish,4,4,0,0,0,0,0,"2019-03-25 07:12:34"
|
||||
"Lopo Isaac Fernández (rocapata)",Spanish,4,3,0,0,0,0,0,"2018-09-20 11:46:22"
|
||||
bziuum,Polish,4,4,0,0,0,0,0,"2020-09-01 09:08:01"
|
||||
"Neko123 (emandic11)","Serbian (Cyrillic)",4,4,0,57,0,0,0,"2021-04-21 15:33:29"
|
||||
Magidxz,Arabic,3,3,0,0,0,0,0,"2021-01-05 05:02:54"
|
||||
"mohammadali barati (mabaraty)",Persian,3,3,0,0,0,0,0,"2021-07-10 05:54:44"
|
||||
"Sarath S (CyberShark)",Tamil,3,7,0,0,0,0,0,"2020-08-27 22:43:16"
|
||||
"Unnie Here (Carb)",Hindi,3,8,0,0,0,0,0,"2020-03-18 23:34:35"
|
||||
REMOVED_USER,"Portuguese, Brazilian",3,4,0,0,0,0,0,"2018-11-18 09:02:37"
|
||||
"Thoum Ptrgnt (thomas.petrignet)",French,3,3,0,2,0,3,0,"2017-09-23 19:25:52"
|
||||
"Oleg Kogut (kogut_oleg)",Ukrainian,3,3,0,0,0,0,0,"2018-12-28 14:31:02"
|
||||
carsten_kafke,German,3,3,0,43,0,0,3,"2017-10-27 13:27:47"
|
||||
"Vagner Roberto (vagner.trompete)","Portuguese, Brazilian",3,3,0,0,0,0,0,"2017-12-30 17:54:26"
|
||||
"Igor Piskun (i_piskun)",Ukrainian,3,3,0,0,0,0,0,"2018-01-19 15:20:27"
|
||||
"Andrea Bianchi (andreawhite1597)",Italian,3,1,0,1,0,0,0,"2018-01-21 17:45:48"
|
||||
"Cláudio Bernardo (claudiobernardo.ti)","Portuguese, Brazilian",3,4,0,1,0,0,0,"2019-01-08 14:41:10"
|
||||
"Hiohana Rilary (hiohanarilary)","Portuguese, Brazilian",3,4,0,0,0,0,0,"2019-07-31 20:42:20"
|
||||
"joabe gabriel (joabegabrielcma1)","Portuguese, Brazilian",3,4,0,0,0,0,0,"2018-08-21 09:08:59"
|
||||
"Péter Bernát (bernatp)",Hungarian,3,2,0,0,0,0,0,"2019-11-30 15:50:33"
|
||||
"Martin Zimdahl (zimdahlmartin)",Swedish,3,2,0,0,1,0,3,"2018-09-15 04:39:22"
|
||||
"Gabriel Cavalcante (gabrielc.alves14)","Portuguese, Brazilian",3,4,0,0,0,0,0,"2018-08-06 22:24:54"
|
||||
atomjani,Hungarian,3,3,0,0,0,0,0,"2019-01-19 00:49:25"
|
||||
"أم محمد تقي (souadboudia19)",Arabic,2,2,0,0,0,0,0,"2020-06-13 15:24:17"
|
||||
"FAy FAy (fayfayfay52)","Chinese Traditional",2,5,0,0,0,0,0,"2017-10-06 08:53:21"
|
||||
chavs1997,Russian,2,2,0,9,0,0,0,"2018-05-18 16:58:19"
|
||||
Soroor_SI,Persian,2,2,0,0,0,0,0,"2018-06-10 06:28:27"
|
||||
"Ilyas Fekhar (il47yas)",Arabic,2,2,0,0,0,0,0,"2018-04-17 22:00:41"
|
||||
"hesamiranii (esam.matouri)",Persian,2,2,0,0,0,0,0,"2018-09-22 16:33:36"
|
||||
"fatemeh s (fargolseifoori3)",Persian,2,2,0,0,0,0,0,"2019-01-31 12:06:57"
|
||||
amei,"Portuguese, Brazilian",2,2,0,0,0,0,0,"2018-04-19 19:42:28"
|
||||
"Naveen jai krishna (njsbpolymer1)",Tamil,2,5,0,0,0,0,0,"2020-01-10 14:19:41"
|
||||
"Danial Agh (danialagh)",Persian,2,3,0,0,0,0,0,"2019-03-30 13:24:16"
|
||||
"Walid Baazia (walidbaazia2005)",Arabic,2,1,0,0,0,0,0,"2021-01-27 12:47:34"
|
||||
"Ali Zaida (alizaeda92)",Arabic,2,2,0,0,0,0,0,"2019-12-01 11:47:00"
|
||||
LNDDYL,"Chinese Traditional",2,4,0,0,0,0,2,"2018-04-22 04:00:19"
|
||||
"Ño Bí Tã (pt614553)",Arabic,2,8,0,1,0,0,0,"2021-05-22 20:41:01"
|
||||
"Judith Ayala (Azul1612)",Spanish,2,1,0,0,0,1,0,"2021-05-18 17:07:19"
|
||||
REMOVED_USER,Ukrainian,2,2,0,0,0,0,0,"2017-06-15 12:24:44"
|
||||
"Valerij D (vala.dobler)",German,2,2,0,0,0,0,0,"2018-09-22 09:38:27"
|
||||
"Alex Stein (diefaust1993)",Russian,2,2,0,4,4,0,2,"2017-07-13 06:56:17"
|
||||
"조화정 (yunjoo337)",Korean,2,2,0,0,0,0,0,"2019-06-16 22:25:31"
|
||||
omerfarukbas,Turkish,2,3,0,19,2,0,0,"2017-08-14 16:10:35"
|
||||
"Balthazar Aubard (Balatzar)",French,2,5,0,0,1,0,0,"2017-09-23 01:42:57"
|
||||
"Luca Gori (grolcu)",Italian,1,2,0,0,0,0,0,"2020-09-26 23:26:15"
|
||||
axd,Spanish,1,1,0,15,0,0,0,"2017-09-12 05:48:51"
|
||||
iSoron2,"Portuguese, Brazilian",1,1,0,0,0,0,0,"2017-03-18 17:56:29"
|
||||
REMOVED_USER,Russian,1,2,0,6,1,0,1,"2019-12-26 05:37:01"
|
||||
"Wibi Cahyo (wbcahyoh)",Indonesian,1,3,0,0,0,0,0,"2017-12-14 06:35:58"
|
||||
jonesses,German,1,1,0,1,0,0,1,"2021-01-01 08:03:18"
|
||||
"Anton (tT0NG)","Chinese Traditional",1,2,0,0,0,0,1,"2017-07-06 14:18:39"
|
||||
"박찌 (perpact20)",Korean,1,1,0,0,0,0,0,"2018-02-10 10:11:44"
|
||||
"Alan Jeon (skyisle)",Korean,1,2,0,8,0,0,0,"2018-01-09 10:46:00"
|
||||
"Maria Fefelova (mashafefel)",Russian,1,1,0,0,0,0,0,"2019-05-18 02:03:56"
|
||||
"Anastasiia Bondarenko (nastasya.bondarenko.97)",Russian,1,1,0,0,0,0,0,"2019-06-07 17:43:08"
|
||||
"Kan Black (kanblack.va)",Vietnamese,1,2,0,0,0,1,0,"2019-01-15 03:50:10"
|
||||
"Patrick Pimenta (trickap1)","Portuguese, Brazilian",1,1,0,0,0,0,0,"2018-12-01 14:31:21"
|
||||
"Dagna Q (dagnaq)",,0,0,0,0,0,0,0,"2017-08-06 01:42:52"
|
||||
Kamalakannan,,0,0,0,0,0,0,0,"2017-05-14 11:40:23"
|
||||
"Éjbãss Übbeî (littlebittlebottle)",Norwegian,0,0,0,152,0,0,0,"2017-07-05 21:12:02"
|
||||
"Равиль Мифтахов (ravilmif47)",Russian,0,0,0,1,0,0,0,"2019-08-12 21:58:30"
|
||||
sanyoniket,,0,0,0,0,0,0,0,"2019-07-23 12:58:40"
|
||||
REMOVED_USER,,0,0,0,0,0,0,0,"2020-02-01 03:47:48"
|
||||
"vi ve (VimalV)",,0,0,0,0,0,0,0,"2021-02-08 02:35:45"
|
||||
"George Merkulov (george142.emarket)",Russian,0,0,0,11,0,0,0,"2019-06-09 19:47:02"
|
||||
"Yasin Okumus (lacivert)",Turkish,0,0,0,1,0,0,0,"2018-02-07 04:13:51"
|
||||
"Petros Bleyan (coolbleyan)",Russian,0,0,0,14,0,0,0,"2017-08-18 18:37:18"
|
||||
"LeMeD (LeMeS)",French,0,0,0,2,0,0,0,"2021-02-06 15:35:00"
|
||||
ava_rfie,Persian,0,0,0,1,0,0,0,"2019-06-09 16:19:24"
|
||||
"Mateusz Teteruk (mttet)",Polish,0,0,0,1,0,0,0,"2021-01-23 13:09:59"
|
||||
EwanB,,0,0,0,0,0,0,0,"2019-11-19 10:04:38"
|
||||
Fazy1380,,0,0,0,0,0,0,0,"2021-04-10 11:02:53"
|
||||
"Lori Amico (lavodkaclyde2323)",Italian,0,0,0,1,0,0,0,"2017-04-09 10:08:13"
|
||||
"Florian Stuhlmann (stuhlmann)",German,0,0,0,10,0,0,0,"2017-04-15 04:04:00"
|
||||
"عبد الناصر سعيد الثبيتي (asaeed)",,0,0,0,0,0,0,0,"2018-03-13 02:09:35"
|
||||
"Rivo Zängov (Eraser)",,0,0,0,0,0,0,0,"2020-10-13 04:38:26"
|
||||
Hayder21,,0,0,0,0,0,0,0,"2019-12-31 10:56:24"
|
||||
T-v-Gerwen,Dutch,0,0,0,47,0,0,0,"2018-03-02 10:26:33"
|
||||
"Eduard Boboc (edi.boboc33)",Romanian,0,0,0,4,0,0,0,"2019-12-16 09:08:39"
|
||||
"Samuel Przeździęk (samek22)",Polish,0,0,0,1,0,0,0,"2021-08-01 00:49:01"
|
||||
"Saiprasath B (Saiprasath)",,0,0,0,0,0,0,0,"2021-07-11 11:10:41"
|
||||
shuvo786,,0,0,0,0,0,0,0,"2019-11-13 00:18:12"
|
||||
"Edmunds Edmundam (edmundam)",,0,0,0,0,0,0,0,"2020-06-01 14:18:18"
|
||||
Itch,,0,0,0,0,0,0,0,"2017-10-16 09:18:42"
|
||||
"Manny Farsangy (manifarsangi)",Persian,0,0,0,12,0,0,0,"2021-08-10 05:32:28"
|
||||
"Matus Zdansky (matuszdansky)",,0,0,0,0,0,0,0,"2019-10-20 13:52:24"
|
||||
"Thomas Orlita (Thomas995)",Czech,0,0,0,1,0,0,0,"2017-12-24 04:08:27"
|
||||
Irsgram,Russian,0,0,0,1,0,0,0,"2019-09-30 16:42:20"
|
||||
EmanAmini,,0,0,0,0,0,0,0,"2017-03-31 13:27:43"
|
||||
mushin,,0,0,0,0,0,0,0,"2020-02-02 04:08:05"
|
||||
"Elmo (oberknecht)",,0,0,0,0,0,0,0,"2020-04-16 08:45:50"
|
||||
AnggaRifandi,,0,0,0,0,0,0,0,"2017-03-31 19:28:35"
|
||||
"darkkingredian (rediancool)",,0,0,0,0,0,0,0,"2021-07-27 16:04:32"
|
||||
"Sri Harsha Bhogi (sriharshabhogi)",,0,0,0,0,0,0,0,"2018-09-02 05:31:53"
|
||||
"Nat Fomicheva (natac)",Russian,0,0,0,3,0,0,0,"2019-01-25 14:35:02"
|
||||
mdrobulis,,0,0,0,0,0,0,0,"2018-05-24 01:40:42"
|
||||
"Sarah BCNN (fsarahboucenna)",French,0,0,0,16,0,0,0,"2018-02-11 11:07:36"
|
||||
"Arjun K. (arjunkdot)",,0,0,0,0,0,0,0,"2020-09-20 11:16:18"
|
||||
REMOVED_USER,Czech,0,0,0,18,0,0,0,"2018-03-27 06:19:52"
|
||||
martyaberger,,0,0,0,0,0,0,0,"2019-01-01 18:48:08"
|
||||
BongTran,Vietnamese,0,0,0,2,0,0,0,"2018-04-24 05:16:07"
|
||||
"Arttu Ylhävuori (arttu.ylhavuori)",,0,0,0,0,0,0,0,"2019-07-24 15:03:42"
|
||||
"Никита Карамов (nikita.karamoff)",Russian,0,0,0,10,0,0,0,"2018-10-29 03:57:21"
|
||||
rooban23,,0,0,0,0,0,0,0,"2020-09-15 11:49:14"
|
||||
"Eliška Roubalová (roubaeli)",Czech,0,0,0,6,0,0,0,"2019-12-31 12:47:29"
|
||||
valney.faria,"Portuguese, Brazilian",0,0,0,1,0,0,0,"2020-02-02 14:45:02"
|
||||
"Алтынбек Наурызғали (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 {
|
||||
id("com.github.triplet.play") version "3.2.0"
|
||||
id("com.github.triplet.play") version "3.5.0"
|
||||
id("com.android.application")
|
||||
id("org.jetbrains.kotlin.android")
|
||||
id("org.jetbrains.kotlin.kapt")
|
||||
@@ -37,8 +37,8 @@ android {
|
||||
compileSdkVersion(30)
|
||||
|
||||
defaultConfig {
|
||||
versionCode(20001)
|
||||
versionName("2.0.1")
|
||||
versionCode(20003)
|
||||
versionName("2.0.3")
|
||||
minSdkVersion(23)
|
||||
targetSdkVersion(30)
|
||||
applicationId("org.isoron.uhabits")
|
||||
@@ -88,11 +88,11 @@ android {
|
||||
}
|
||||
|
||||
dependencies {
|
||||
val daggerVersion = "2.35.1"
|
||||
val kotlinVersion = "1.5.0"
|
||||
val kxCoroutinesVersion = "1.4.2"
|
||||
val ktorVersion = "1.5.4"
|
||||
val espressoVersion = "3.3.0"
|
||||
val daggerVersion = "2.38.1"
|
||||
val kotlinVersion = "1.5.21"
|
||||
val kxCoroutinesVersion = "1.5.1"
|
||||
val ktorVersion = "1.6.2"
|
||||
val espressoVersion = "3.4.0"
|
||||
|
||||
androidTestImplementation("androidx.test.espresso:espresso-contrib:$espressoVersion")
|
||||
androidTestImplementation("androidx.test.espresso:espresso-core:$espressoVersion")
|
||||
@@ -101,9 +101,9 @@ dependencies {
|
||||
androidTestImplementation("io.ktor:ktor-client-mock:$ktorVersion")
|
||||
androidTestImplementation("io.ktor:ktor-jackson:$ktorVersion")
|
||||
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:rules:1.3.0")
|
||||
androidTestImplementation("androidx.test:rules:1.4.0")
|
||||
androidTestImplementation("com.nhaarman.mockitokotlin2:mockito-kotlin:2.2.0")
|
||||
compileOnly("javax.annotation:jsr250-api:1.0")
|
||||
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.kotlinx:kotlinx-coroutines-android:$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-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.opencsv:opencsv:5.4")
|
||||
implementation("com.opencsv:opencsv:5.5.1")
|
||||
implementation(project(":uhabits-core"))
|
||||
kapt("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.Companion.DAILY
|
||||
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.HabitType
|
||||
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.Timestamp
|
||||
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 {
|
||||
name = "Read"
|
||||
question = "How many pages did you walk today?"
|
||||
type = NUMBER_HABIT
|
||||
targetType = AT_LEAST
|
||||
type = HabitType.NUMERICAL
|
||||
targetType = NumericalHabitType.AT_LEAST
|
||||
targetValue = 200.0
|
||||
unit = "pages"
|
||||
}
|
||||
|
||||
@@ -23,6 +23,7 @@ import androidx.test.filters.MediumTest
|
||||
import org.isoron.uhabits.BaseViewTest
|
||||
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.views.LightTheme
|
||||
import org.isoron.uhabits.utils.toFixedAndroidColor
|
||||
import org.junit.Before
|
||||
import org.junit.Test
|
||||
@@ -39,7 +40,12 @@ class ScoreChartTest : BaseViewTest() {
|
||||
super.setUp()
|
||||
fixtures.purgeHabits(habitList)
|
||||
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 {
|
||||
setScores(state.scores)
|
||||
setColor(state.color.toFixedAndroidColor())
|
||||
@@ -72,7 +78,7 @@ class ScoreChartTest : BaseViewTest() {
|
||||
@Test
|
||||
@Throws(Throwable::class)
|
||||
fun testRender_withMonthlyBucket() {
|
||||
val (scores, bucketSize) = buildState(habit, prefs.firstWeekdayInt, 2)
|
||||
val (scores, bucketSize) = buildState(habit, prefs.firstWeekdayInt, 2, LightTheme())
|
||||
view.setScores(scores)
|
||||
view.setBucketSize(bucketSize)
|
||||
view.invalidate()
|
||||
@@ -89,7 +95,7 @@ class ScoreChartTest : BaseViewTest() {
|
||||
@Test
|
||||
@Throws(Throwable::class)
|
||||
fun testRender_withYearlyBucket() {
|
||||
val state = buildState(habit, prefs.firstWeekdayInt, 4)
|
||||
val state = buildState(habit, prefs.firstWeekdayInt, 4, LightTheme())
|
||||
view.setScores(state.scores)
|
||||
view.setBucketSize(state.bucketSize)
|
||||
view.invalidate()
|
||||
|
||||
@@ -25,6 +25,7 @@ import androidx.test.filters.MediumTest
|
||||
import org.isoron.uhabits.BaseViewTest
|
||||
import org.isoron.uhabits.R
|
||||
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.Test
|
||||
import org.junit.runner.RunWith
|
||||
@@ -43,7 +44,13 @@ class FrequencyCardViewTest : BaseViewTest() {
|
||||
.from(targetContext)
|
||||
.inflate(R.layout.show_habit, null)
|
||||
.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)
|
||||
}
|
||||
|
||||
|
||||
@@ -26,6 +26,7 @@ import org.isoron.uhabits.BaseViewTest
|
||||
import org.isoron.uhabits.R
|
||||
import org.isoron.uhabits.core.models.PaletteColor
|
||||
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.Test
|
||||
import org.junit.runner.RunWith
|
||||
@@ -50,6 +51,7 @@ class OverviewCardViewTest : BaseViewTest() {
|
||||
scoreYearDiff = 0.74f,
|
||||
totalCount = 44,
|
||||
color = PaletteColor(7),
|
||||
theme = LightTheme(),
|
||||
)
|
||||
)
|
||||
measureView(view, 800f, 300f)
|
||||
|
||||
@@ -25,6 +25,7 @@ import androidx.test.filters.MediumTest
|
||||
import org.isoron.uhabits.BaseViewTest
|
||||
import org.isoron.uhabits.R
|
||||
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.Test
|
||||
import org.junit.runner.RunWith
|
||||
@@ -43,7 +44,14 @@ class ScoreCardViewTest : BaseViewTest() {
|
||||
.from(targetContext)
|
||||
.inflate(R.layout.show_habit, null)
|
||||
.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)
|
||||
}
|
||||
|
||||
|
||||
@@ -25,6 +25,7 @@ import androidx.test.filters.MediumTest
|
||||
import org.isoron.uhabits.BaseViewTest
|
||||
import org.isoron.uhabits.R
|
||||
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.Test
|
||||
import org.junit.runner.RunWith
|
||||
@@ -47,6 +48,7 @@ class StreakCardViewTest : BaseViewTest() {
|
||||
StreakCardState(
|
||||
bestStreaks = habit.streaks.getBest(10),
|
||||
color = habit.color,
|
||||
theme = LightTheme(),
|
||||
)
|
||||
)
|
||||
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.WeekdayList.Companion.EVERY_DAY
|
||||
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.Test
|
||||
import org.junit.runner.RunWith
|
||||
@@ -54,6 +55,7 @@ class SubtitleCardViewTest : BaseViewTest() {
|
||||
reminder = Reminder(8, 30, EVERY_DAY),
|
||||
unit = "",
|
||||
targetValue = 0.0,
|
||||
theme = LightTheme(),
|
||||
)
|
||||
)
|
||||
measureView(view, 800f, 200f)
|
||||
|
||||
@@ -50,7 +50,7 @@ class CheckmarkWidgetViewTest : BaseViewTest() {
|
||||
name = habit.name
|
||||
}
|
||||
view.refresh()
|
||||
measureView(view, dpToPixels(100), dpToPixels(200))
|
||||
measureView(view, dpToPixels(100), dpToPixels(125))
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
@@ -36,6 +36,7 @@ class AndroidCanvas : Canvas {
|
||||
var innerDensity = 1.0
|
||||
var innerWidth = 0
|
||||
var innerHeight = 0
|
||||
var mHeight = 15
|
||||
|
||||
var paint = Paint().apply {
|
||||
isAntiAlias = true
|
||||
@@ -64,11 +65,10 @@ class AndroidCanvas : Canvas {
|
||||
}
|
||||
|
||||
override fun drawText(text: String, x: Double, y: Double) {
|
||||
textPaint.getTextBounds(text, 0, text.length, textBounds)
|
||||
innerCanvas.drawText(
|
||||
text,
|
||||
x.toDp(),
|
||||
y.toDp() - textBounds.exactCenterY(),
|
||||
y.toDp() + 0.6f * mHeight,
|
||||
textPaint,
|
||||
)
|
||||
}
|
||||
@@ -126,10 +126,17 @@ class AndroidCanvas : Canvas {
|
||||
Font.BOLD -> Typeface.DEFAULT_BOLD
|
||||
Font.FONT_AWESOME -> getFontAwesome(context)
|
||||
}
|
||||
updateMHeight()
|
||||
}
|
||||
|
||||
override fun setFontSize(size: Double) {
|
||||
textPaint.textSize = size.toDp()
|
||||
updateMHeight()
|
||||
}
|
||||
|
||||
private fun updateMHeight() {
|
||||
textPaint.getTextBounds("m", 0, 1, textBounds)
|
||||
mHeight = textBounds.height()
|
||||
}
|
||||
|
||||
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.views.DarkTheme
|
||||
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.inject.ActivityContext
|
||||
import org.isoron.uhabits.inject.ActivityScope
|
||||
@@ -66,7 +67,7 @@ constructor(
|
||||
}
|
||||
|
||||
override fun applyPureBlackTheme() {
|
||||
currentTheme = DarkTheme()
|
||||
currentTheme = PureBlackTheme()
|
||||
context.setTheme(R.style.AppBaseThemeDark_PureBlack)
|
||||
(context as Activity).window.navigationBarColor =
|
||||
ContextCompat.getColor(context, R.color.black)
|
||||
|
||||
@@ -26,6 +26,7 @@ import org.isoron.uhabits.BuildConfig
|
||||
import org.isoron.uhabits.R
|
||||
import org.isoron.uhabits.core.models.PaletteColor
|
||||
import org.isoron.uhabits.databinding.AboutBinding
|
||||
import org.isoron.uhabits.utils.currentTheme
|
||||
import org.isoron.uhabits.utils.setupToolbar
|
||||
|
||||
@SuppressLint("ViewConstructor")
|
||||
@@ -41,7 +42,8 @@ class AboutView(
|
||||
setupToolbar(
|
||||
toolbar = binding.toolbar,
|
||||
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)
|
||||
binding.tvContributors.setOnClickListener { screen.showCodeContributorsWebsite() }
|
||||
|
||||
@@ -19,20 +19,21 @@
|
||||
package org.isoron.uhabits.activities.common.dialogs
|
||||
|
||||
import android.content.Context
|
||||
import org.isoron.platform.gui.toInt
|
||||
import org.isoron.uhabits.R
|
||||
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.ActivityScope
|
||||
import org.isoron.uhabits.utils.StyledResources
|
||||
import org.isoron.uhabits.utils.toThemedAndroidColor
|
||||
import javax.inject.Inject
|
||||
|
||||
@ActivityScope
|
||||
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 res = StyledResources(context)
|
||||
val androidColor = color.toThemedAndroidColor(context)
|
||||
val androidColor = theme.color(color).toInt()
|
||||
dialog.initialize(
|
||||
R.string.color_picker_default_title,
|
||||
res.getPalette(),
|
||||
|
||||
@@ -160,26 +160,28 @@ class FrequencyPickerDialog(
|
||||
|
||||
private fun populateViews() {
|
||||
uncheckAll()
|
||||
if (freqNumerator == 1) {
|
||||
if (freqDenominator == 1) {
|
||||
contentView.everyDayRadioButton.isChecked = true
|
||||
} else {
|
||||
contentView.everyXDaysRadioButton.isChecked = true
|
||||
contentView.everyXDaysTextView.setText(freqDenominator.toString())
|
||||
focus(contentView.everyXDaysTextView)
|
||||
}
|
||||
if (freqDenominator == 30 || freqDenominator == 31) {
|
||||
contentView.xTimesPerMonthRadioButton.isChecked = true
|
||||
contentView.xTimesPerMonthTextView.setText(freqNumerator.toString())
|
||||
focus(contentView.xTimesPerMonthTextView)
|
||||
} else {
|
||||
if (freqDenominator == 7) {
|
||||
contentView.xTimesPerWeekRadioButton.isChecked = true
|
||||
contentView.xTimesPerWeekTextView.setText(freqNumerator.toString())
|
||||
focus(contentView.xTimesPerWeekTextView)
|
||||
} else if (freqDenominator == 30 || freqDenominator == 31) {
|
||||
contentView.xTimesPerMonthRadioButton.isChecked = true
|
||||
contentView.xTimesPerMonthTextView.setText(freqNumerator.toString())
|
||||
focus(contentView.xTimesPerMonthTextView)
|
||||
if (freqNumerator == 1) {
|
||||
if (freqDenominator == 1) {
|
||||
contentView.everyDayRadioButton.isChecked = true
|
||||
} else {
|
||||
contentView.everyXDaysRadioButton.isChecked = true
|
||||
contentView.everyXDaysTextView.setText(freqDenominator.toString())
|
||||
focus(contentView.everyXDaysTextView)
|
||||
}
|
||||
} else {
|
||||
Log.w("FrequencyPickerDialog", "Unknown frequency: $freqNumerator/$freqDenominator")
|
||||
contentView.everyDayRadioButton.isChecked = true
|
||||
if (freqDenominator == 7) {
|
||||
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 {
|
||||
val CREATOR: Parcelable.Creator<BundleSavedState> =
|
||||
@JvmField val CREATOR: Parcelable.Creator<BundleSavedState> =
|
||||
object : ClassLoaderCreator<BundleSavedState> {
|
||||
override fun createFromParcel(
|
||||
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.PaletteUtils.getAndroidTestColor
|
||||
import org.isoron.uhabits.utils.StyledResources
|
||||
import kotlin.math.max
|
||||
import kotlin.math.min
|
||||
import kotlin.math.roundToLong
|
||||
|
||||
@@ -48,7 +49,7 @@ class RingView : View {
|
||||
private var color: Int
|
||||
private var precision: Float
|
||||
private var percentage: Float
|
||||
private var diameter = 0
|
||||
private var diameter = 1
|
||||
private var thickness: Float
|
||||
private var rect: RectF? = null
|
||||
private var pRing: TextPaint? = null
|
||||
@@ -169,7 +170,7 @@ class RingView : View {
|
||||
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
|
||||
val width = MeasureSpec.getSize(widthMeasureSpec)
|
||||
val height = MeasureSpec.getSize(heightMeasureSpec)
|
||||
diameter = min(height, width)
|
||||
diameter = max(1, min(height, width))
|
||||
pRing!!.textSize = textSize
|
||||
em = pRing!!.measureText("M")
|
||||
setMeasuredDimension(diameter, diameter)
|
||||
|
||||
@@ -117,7 +117,11 @@ class TargetChart : View {
|
||||
barRect[rect.left + stop + padding, rect.top + baseSize * 0.05f, rect.right - padding] =
|
||||
rect.bottom - baseSize * 0.05f
|
||||
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)
|
||||
|
||||
// Draw completed box
|
||||
|
||||
@@ -29,10 +29,10 @@ class TaskProgressBar(
|
||||
context: Context,
|
||||
private val runner: TaskRunner
|
||||
) : ProgressBar(
|
||||
context,
|
||||
null,
|
||||
android.R.attr.progressBarStyleHorizontal
|
||||
),
|
||||
context,
|
||||
null,
|
||||
android.R.attr.progressBarStyleHorizontal
|
||||
),
|
||||
TaskRunner.Listener {
|
||||
|
||||
init {
|
||||
|
||||
@@ -21,6 +21,7 @@ package org.isoron.uhabits.activities.habits.edit
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.res.ColorStateList
|
||||
import android.content.res.Resources
|
||||
import android.graphics.Color
|
||||
import android.os.Bundle
|
||||
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.targetInput
|
||||
import kotlinx.android.synthetic.main.activity_edit_habit.unitInput
|
||||
import org.isoron.platform.gui.toInt
|
||||
import org.isoron.uhabits.HabitsApplication
|
||||
import org.isoron.uhabits.R
|
||||
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.models.Frequency
|
||||
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.Reminder
|
||||
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.formatTime
|
||||
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() {
|
||||
|
||||
@@ -66,7 +79,7 @@ class EditHabitActivity : AppCompatActivity() {
|
||||
private lateinit var commandRunner: CommandRunner
|
||||
|
||||
var habitId = -1L
|
||||
var habitType = -1
|
||||
lateinit var habitType: HabitType
|
||||
var unit = ""
|
||||
var color = PaletteColor(11)
|
||||
var androidColor = 0
|
||||
@@ -105,12 +118,12 @@ class EditHabitActivity : AppCompatActivity() {
|
||||
binding.unitInput.setText(habit.unit)
|
||||
binding.targetInput.setText(habit.targetValue.toString())
|
||||
} else {
|
||||
habitType = intent.getIntExtra("habitType", Habit.YES_NO_HABIT)
|
||||
habitType = HabitType.fromInt(intent.getIntExtra("habitType", HabitType.YES_NO.value))
|
||||
}
|
||||
|
||||
if (state != null) {
|
||||
habitId = state.getLong("habitId")
|
||||
habitType = state.getInt("habitType")
|
||||
habitType = HabitType.fromInt(state.getInt("habitType"))
|
||||
color = PaletteColor(state.getInt("paletteColor"))
|
||||
freqNum = state.getInt("freqNum")
|
||||
freqDen = state.getInt("freqDen")
|
||||
@@ -121,13 +134,16 @@ class EditHabitActivity : AppCompatActivity() {
|
||||
|
||||
updateColors()
|
||||
|
||||
if (habitType == Habit.YES_NO_HABIT) {
|
||||
binding.unitOuterBox.visibility = View.GONE
|
||||
binding.targetOuterBox.visibility = View.GONE
|
||||
} else {
|
||||
binding.nameInput.hint = getString(R.string.measurable_short_example)
|
||||
binding.questionInput.hint = getString(R.string.measurable_question_example)
|
||||
binding.frequencyOuterBox.visibility = View.GONE
|
||||
when (habitType) {
|
||||
HabitType.YES_NO -> {
|
||||
binding.unitOuterBox.visibility = View.GONE
|
||||
binding.targetOuterBox.visibility = View.GONE
|
||||
}
|
||||
HabitType.NUMERICAL -> {
|
||||
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)
|
||||
@@ -137,7 +153,7 @@ class EditHabitActivity : AppCompatActivity() {
|
||||
|
||||
val colorPickerDialogFactory = ColorPickerDialogFactory(this)
|
||||
binding.colorButton.setOnClickListener {
|
||||
val dialog = colorPickerDialogFactory.create(color)
|
||||
val dialog = colorPickerDialogFactory.create(color, themeSwitcher.currentTheme)
|
||||
dialog.setListener { paletteColor ->
|
||||
this.color = paletteColor
|
||||
updateColors()
|
||||
@@ -244,9 +260,9 @@ class EditHabitActivity : AppCompatActivity() {
|
||||
}
|
||||
|
||||
habit.frequency = Frequency(freqNum, freqDen)
|
||||
if (habitType == Habit.NUMBER_HABIT) {
|
||||
if (habitType == HabitType.NUMERICAL) {
|
||||
habit.targetValue = targetInput.text.toString().toDouble()
|
||||
habit.targetType = Habit.AT_LEAST
|
||||
habit.targetType = NumericalHabitType.AT_LEAST
|
||||
habit.unit = unitInput.text.trim().toString()
|
||||
}
|
||||
habit.type = habitType
|
||||
@@ -274,7 +290,7 @@ class EditHabitActivity : AppCompatActivity() {
|
||||
nameInput.error = getFormattedValidationError(R.string.validation_cannot_be_blank)
|
||||
isValid = false
|
||||
}
|
||||
if (habitType == Habit.NUMBER_HABIT) {
|
||||
if (habitType == HabitType.NUMERICAL) {
|
||||
if (targetInput.text.isEmpty()) {
|
||||
targetInput.error = getString(R.string.validation_cannot_be_blank)
|
||||
isValid = false
|
||||
@@ -299,14 +315,7 @@ class EditHabitActivity : AppCompatActivity() {
|
||||
|
||||
@SuppressLint("StringFormatMatches")
|
||||
private fun populateFrequency() {
|
||||
binding.booleanFrequencyPicker.text = when {
|
||||
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.booleanFrequencyPicker.text = formatFrequency(freqNum, freqDen, resources)
|
||||
binding.numericalFrequencyPicker.text = when (freqDen) {
|
||||
1 -> getString(R.string.every_day)
|
||||
7 -> getString(R.string.every_week)
|
||||
@@ -316,7 +325,7 @@ class EditHabitActivity : AppCompatActivity() {
|
||||
}
|
||||
|
||||
private fun updateColors() {
|
||||
androidColor = color.toThemedAndroidColor(this)
|
||||
androidColor = themeSwitcher.currentTheme.color(color).toInt()
|
||||
binding.colorButton.backgroundTintList = ColorStateList.valueOf(androidColor)
|
||||
if (!themeSwitcher.isNightMode) {
|
||||
val darkerAndroidColor = ColorUtils.mixColors(Color.BLACK, androidColor, 0.15f)
|
||||
@@ -334,7 +343,7 @@ class EditHabitActivity : AppCompatActivity() {
|
||||
super.onSaveInstanceState(state)
|
||||
with(state) {
|
||||
putLong("habitId", habitId)
|
||||
putInt("habitType", habitType)
|
||||
putInt("habitType", habitType.value)
|
||||
putInt("paletteColor", color.paletteIndex)
|
||||
putInt("androidColor", androidColor)
|
||||
putInt("freqNum", freqNum)
|
||||
|
||||
@@ -25,7 +25,7 @@ import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.appcompat.app.AppCompatDialogFragment
|
||||
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.intents.IntentFactory
|
||||
|
||||
@@ -40,13 +40,13 @@ class HabitTypeDialog : AppCompatDialogFragment() {
|
||||
val binding = SelectHabitTypeBinding.inflate(inflater, container, false)
|
||||
|
||||
binding.buttonYesNo.setOnClickListener {
|
||||
val intent = IntentFactory().startEditActivity(activity!!, Habit.YES_NO_HABIT)
|
||||
val intent = IntentFactory().startEditActivity(activity!!, HabitType.YES_NO.value)
|
||||
startActivity(intent)
|
||||
dismiss()
|
||||
}
|
||||
|
||||
binding.buttonMeasurable.setOnClickListener {
|
||||
val intent = IntentFactory().startEditActivity(activity!!, Habit.NUMBER_HABIT)
|
||||
val intent = IntentFactory().startEditActivity(activity!!, HabitType.NUMERICAL.value)
|
||||
startActivity(intent)
|
||||
dismiss()
|
||||
}
|
||||
|
||||
@@ -40,7 +40,7 @@ import org.isoron.uhabits.inject.ActivityContextModule
|
||||
import org.isoron.uhabits.inject.DaggerHabitsActivityComponent
|
||||
import org.isoron.uhabits.utils.restartWithFade
|
||||
|
||||
class ListHabitsActivity : AppCompatActivity() {
|
||||
class ListHabitsActivity : AppCompatActivity(), Preferences.Listener {
|
||||
|
||||
var pureBlack: Boolean = false
|
||||
lateinit var taskRunner: TaskRunner
|
||||
@@ -54,6 +54,10 @@ class ListHabitsActivity : AppCompatActivity() {
|
||||
|
||||
private lateinit var menu: ListHabitsMenu
|
||||
|
||||
override fun onQuestionMarksChanged() {
|
||||
invalidateOptionsMenu()
|
||||
}
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
|
||||
@@ -66,6 +70,7 @@ class ListHabitsActivity : AppCompatActivity() {
|
||||
component.themeSwitcher.apply()
|
||||
|
||||
prefs = appComponent.preferences
|
||||
prefs.addListener(this)
|
||||
syncManager = appComponent.syncManager
|
||||
pureBlack = prefs.isPureBlackEnabled
|
||||
midnightTimer = appComponent.midnightTimer
|
||||
|
||||
@@ -52,6 +52,11 @@ class ListHabitsMenu @Inject constructor(
|
||||
nightModeItem.isChecked = themeSwitcher.isNightMode
|
||||
hideArchivedItem.isChecked = !preferences.showArchived
|
||||
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)
|
||||
}
|
||||
|
||||
|
||||
@@ -44,6 +44,7 @@ import org.isoron.uhabits.utils.addAtBottom
|
||||
import org.isoron.uhabits.utils.addAtTop
|
||||
import org.isoron.uhabits.utils.addBelow
|
||||
import org.isoron.uhabits.utils.buildToolbar
|
||||
import org.isoron.uhabits.utils.currentTheme
|
||||
import org.isoron.uhabits.utils.dim
|
||||
import org.isoron.uhabits.utils.dp
|
||||
import org.isoron.uhabits.utils.setupToolbar
|
||||
@@ -93,6 +94,7 @@ class ListHabitsRootView @Inject constructor(
|
||||
title = resources.getString(R.string.main_activity_title),
|
||||
color = PaletteColor(17),
|
||||
displayHomeAsUpEnabled = false,
|
||||
theme = currentTheme(),
|
||||
)
|
||||
addView(rootView, MATCH_PARENT, MATCH_PARENT)
|
||||
listAdapter.setListView(listView)
|
||||
|
||||
@@ -231,7 +231,7 @@ class ListHabitsScreen
|
||||
}
|
||||
|
||||
override fun showColorPicker(defaultColor: PaletteColor, callback: OnColorPickedCallback) {
|
||||
val picker = colorPickerFactory.create(defaultColor)
|
||||
val picker = colorPickerFactory.create(defaultColor, themeSwitcher.currentTheme!!)
|
||||
picker.setListener(callback)
|
||||
picker.show(activity.supportFragmentManager, "picker")
|
||||
}
|
||||
|
||||
@@ -131,7 +131,7 @@ class CheckmarkButtonView(
|
||||
paint.color = when (value) {
|
||||
YES_MANUAL, YES_AUTO, SKIP -> color
|
||||
NO -> {
|
||||
if (preferences.areQuestionMarksEnabled()) mediumContrastColor
|
||||
if (preferences.areQuestionMarksEnabled) mediumContrastColor
|
||||
else lowContrastColor
|
||||
}
|
||||
else -> lowContrastColor
|
||||
@@ -140,7 +140,7 @@ class CheckmarkButtonView(
|
||||
SKIP -> R.string.fa_skipped
|
||||
NO -> R.string.fa_times
|
||||
UNKNOWN -> {
|
||||
if (preferences.areQuestionMarksEnabled()) R.string.fa_question
|
||||
if (preferences.areQuestionMarksEnabled) R.string.fa_question
|
||||
else R.string.fa_times
|
||||
}
|
||||
else -> R.string.fa_check
|
||||
@@ -153,7 +153,7 @@ class CheckmarkButtonView(
|
||||
paint.style = Paint.Style.FILL
|
||||
}
|
||||
|
||||
paint.textSize = when (value) {
|
||||
paint.textSize = when (id) {
|
||||
UNKNOWN -> dim(R.dimen.smallerTextSize)
|
||||
else -> dim(R.dimen.smallTextSize)
|
||||
}
|
||||
|
||||
@@ -33,6 +33,7 @@ import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
|
||||
import android.widget.FrameLayout
|
||||
import android.widget.LinearLayout
|
||||
import android.widget.TextView
|
||||
import org.isoron.platform.gui.toInt
|
||||
import org.isoron.uhabits.R
|
||||
import org.isoron.uhabits.activities.common.views.RingView
|
||||
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.utils.DateUtils
|
||||
import org.isoron.uhabits.inject.ActivityContext
|
||||
import org.isoron.uhabits.utils.currentTheme
|
||||
import org.isoron.uhabits.utils.dp
|
||||
import org.isoron.uhabits.utils.sres
|
||||
import org.isoron.uhabits.utils.toThemedAndroidColor
|
||||
import javax.inject.Inject
|
||||
|
||||
class HabitCardViewFactory
|
||||
@@ -213,7 +214,7 @@ class HabitCardView(
|
||||
fun getActiveColor(habit: Habit): Int {
|
||||
return when (habit.isArchived) {
|
||||
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
|
||||
textSize = dim(R.dimen.smallTextSize)
|
||||
}
|
||||
preferences.areQuestionMarksEnabled() -> {
|
||||
preferences.areQuestionMarksEnabled -> {
|
||||
label = resources.getString(R.string.fa_question)
|
||||
typeface = getFontAwesome()
|
||||
textSize = dim(R.dimen.smallerTextSize)
|
||||
|
||||
@@ -35,7 +35,12 @@ class ShowHabitView(context: Context) : FrameLayout(context) {
|
||||
}
|
||||
|
||||
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.overviewCard.setState(data.overview)
|
||||
binding.notesCard.setState(data.notes)
|
||||
|
||||
@@ -24,12 +24,12 @@ import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.widget.AdapterView
|
||||
import android.widget.LinearLayout
|
||||
import org.isoron.platform.gui.toInt
|
||||
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.BarCardState
|
||||
import org.isoron.uhabits.core.ui.views.BarChart
|
||||
import org.isoron.uhabits.databinding.ShowHabitBarBinding
|
||||
import org.isoron.uhabits.utils.toThemedAndroidColor
|
||||
import java.util.Locale
|
||||
|
||||
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)
|
||||
|
||||
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 {
|
||||
series = mutableListOf(state.entries.map { it.value / 1000.0 })
|
||||
colors = mutableListOf(theme.color(state.color.paletteIndex))
|
||||
|
||||
@@ -22,16 +22,16 @@ import android.content.Context
|
||||
import android.util.AttributeSet
|
||||
import android.view.LayoutInflater
|
||||
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.databinding.ShowHabitFrequencyBinding
|
||||
import org.isoron.uhabits.utils.toThemedAndroidColor
|
||||
|
||||
class FrequencyCardView(context: Context, attrs: AttributeSet) : LinearLayout(context, attrs) {
|
||||
|
||||
private var binding = ShowHabitFrequencyBinding.inflate(LayoutInflater.from(context), this)
|
||||
|
||||
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.setFirstWeekday(state.firstWeekday)
|
||||
binding.title.setTextColor(androidColor)
|
||||
|
||||
@@ -22,12 +22,12 @@ import android.content.Context
|
||||
import android.util.AttributeSet
|
||||
import android.view.LayoutInflater
|
||||
import android.widget.LinearLayout
|
||||
import org.isoron.platform.gui.toInt
|
||||
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.HistoryCardState
|
||||
import org.isoron.uhabits.core.ui.views.HistoryChart
|
||||
import org.isoron.uhabits.databinding.ShowHabitHistoryBinding
|
||||
import org.isoron.uhabits.utils.toThemedAndroidColor
|
||||
import java.util.Locale
|
||||
|
||||
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)
|
||||
|
||||
fun setState(state: HistoryCardState) {
|
||||
val androidColor = state.color.toThemedAndroidColor(context)
|
||||
val androidColor = state.theme.color(state.color).toInt()
|
||||
binding.title.setTextColor(androidColor)
|
||||
binding.chart.view = HistoryChart(
|
||||
today = state.today,
|
||||
|
||||
@@ -22,11 +22,11 @@ import android.content.Context
|
||||
import android.util.AttributeSet
|
||||
import android.view.LayoutInflater
|
||||
import android.widget.LinearLayout
|
||||
import org.isoron.platform.gui.toInt
|
||||
import org.isoron.uhabits.R
|
||||
import org.isoron.uhabits.core.ui.screens.habits.show.views.OverviewCardState
|
||||
import org.isoron.uhabits.databinding.ShowHabitOverviewBinding
|
||||
import org.isoron.uhabits.utils.StyledResources
|
||||
import org.isoron.uhabits.utils.toThemedAndroidColor
|
||||
import kotlin.math.abs
|
||||
|
||||
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) {
|
||||
val androidColor = state.color.toThemedAndroidColor(context)
|
||||
val androidColor = state.theme.color(state.color).toInt()
|
||||
val res = StyledResources(context)
|
||||
val inactiveColor = res.getColor(R.attr.contrast60)
|
||||
binding.monthDiffLabel.setTextColor(if (state.scoreMonthDiff >= 0) androidColor else inactiveColor)
|
||||
|
||||
@@ -24,16 +24,16 @@ import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.widget.AdapterView
|
||||
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.ScoreCardState
|
||||
import org.isoron.uhabits.databinding.ShowHabitScoreBinding
|
||||
import org.isoron.uhabits.utils.toThemedAndroidColor
|
||||
|
||||
class ScoreCardView(context: Context, attrs: AttributeSet) : LinearLayout(context, attrs) {
|
||||
private var binding = ShowHabitScoreBinding.inflate(LayoutInflater.from(context), this)
|
||||
|
||||
fun setState(state: ScoreCardState) {
|
||||
val androidColor = state.color.toThemedAndroidColor(context)
|
||||
val androidColor = state.theme.color(state.color).toInt()
|
||||
binding.title.setTextColor(androidColor)
|
||||
binding.spinner.setSelection(state.spinnerPosition)
|
||||
binding.scoreView.setScores(state.scores)
|
||||
|
||||
@@ -22,16 +22,16 @@ import android.content.Context
|
||||
import android.util.AttributeSet
|
||||
import android.view.LayoutInflater
|
||||
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.databinding.ShowHabitStreakBinding
|
||||
import org.isoron.uhabits.utils.toThemedAndroidColor
|
||||
|
||||
class StreakCardView(context: Context, attrs: AttributeSet) : LinearLayout(context, attrs) {
|
||||
private val binding = ShowHabitStreakBinding.inflate(LayoutInflater.from(context), this)
|
||||
fun setState(state: StreakCardState) {
|
||||
val color = state.color.toThemedAndroidColor(context)
|
||||
binding.title.setTextColor(color)
|
||||
binding.streakChart.setColor(color)
|
||||
val androidColor = state.theme.color(state.color).toInt()
|
||||
binding.title.setTextColor(androidColor)
|
||||
binding.streakChart.setColor(androidColor)
|
||||
binding.streakChart.setStreaks(state.bestStreaks)
|
||||
postInvalidate()
|
||||
}
|
||||
|
||||
@@ -20,19 +20,18 @@ package org.isoron.uhabits.activities.habits.show.views
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.Context
|
||||
import android.content.res.Resources
|
||||
import android.util.AttributeSet
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.widget.LinearLayout
|
||||
import org.isoron.platform.gui.toInt
|
||||
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.core.models.Frequency
|
||||
import org.isoron.uhabits.core.ui.screens.habits.show.views.SubtitleCardState
|
||||
import org.isoron.uhabits.databinding.ShowHabitSubtitleBinding
|
||||
import org.isoron.uhabits.utils.InterfaceUtils
|
||||
import org.isoron.uhabits.utils.formatTime
|
||||
import org.isoron.uhabits.utils.toThemedAndroidColor
|
||||
|
||||
class SubtitleCardView(context: Context, attrs: AttributeSet) : LinearLayout(context, attrs) {
|
||||
|
||||
@@ -47,9 +46,13 @@ class SubtitleCardView(context: Context, attrs: AttributeSet) : LinearLayout(con
|
||||
|
||||
@SuppressLint("SetTextI18n")
|
||||
fun setState(state: SubtitleCardState) {
|
||||
val color = state.color.toThemedAndroidColor(context)
|
||||
val color = state.theme.color(state.color).toInt()
|
||||
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.text = state.question
|
||||
binding.reminderLabel.text = if (reminder != null) {
|
||||
@@ -72,32 +75,4 @@ class SubtitleCardView(context: Context, attrs: AttributeSet) : LinearLayout(con
|
||||
|
||||
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.view.LayoutInflater
|
||||
import android.widget.LinearLayout
|
||||
import org.isoron.platform.gui.toInt
|
||||
import org.isoron.uhabits.R
|
||||
import org.isoron.uhabits.core.ui.screens.habits.show.views.TargetCardState
|
||||
import org.isoron.uhabits.databinding.ShowHabitTargetBinding
|
||||
import org.isoron.uhabits.utils.toThemedAndroidColor
|
||||
|
||||
class TargetCardView(context: Context, attrs: AttributeSet) : LinearLayout(context, attrs) {
|
||||
private val binding = ShowHabitTargetBinding.inflate(LayoutInflater.from(context), this)
|
||||
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.setTargets(state.targets)
|
||||
binding.targetChart.setLabels(state.intervals.map { intervalToLabel(resources, it) })
|
||||
|
||||
@@ -32,13 +32,15 @@ class SettingsActivity : AppCompatActivity() {
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
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))
|
||||
binding.root.setupToolbar(
|
||||
toolbar = binding.toolbar,
|
||||
title = resources.getString(R.string.settings),
|
||||
color = PaletteColor(11),
|
||||
theme = themeSwitcher.currentTheme,
|
||||
)
|
||||
setContentView(binding.root)
|
||||
}
|
||||
|
||||
@@ -57,7 +57,8 @@ class SyncActivity : AppCompatActivity(), SyncBehavior.Screen {
|
||||
val component = (application as HabitsApplication).component
|
||||
val preferences = component.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)
|
||||
binding = ActivitySyncBinding.inflate(layoutInflater)
|
||||
@@ -66,6 +67,7 @@ class SyncActivity : AppCompatActivity(), SyncBehavior.Screen {
|
||||
toolbar = binding.toolbar,
|
||||
color = PaletteColor(11),
|
||||
title = resources.getString(R.string.device_sync),
|
||||
theme = themeSwitcher.currentTheme,
|
||||
)
|
||||
binding.syncLink.setOnClickListener { copyToClipboard() }
|
||||
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.PaletteColor
|
||||
import org.isoron.uhabits.databinding.AutomationBinding
|
||||
import org.isoron.uhabits.utils.currentTheme
|
||||
import org.isoron.uhabits.utils.setupToolbar
|
||||
import java.util.LinkedList
|
||||
|
||||
@@ -53,6 +54,7 @@ class EditSettingRootView(
|
||||
title = resources.getString(R.string.app_name),
|
||||
color = PaletteColor(11),
|
||||
displayHomeAsUpEnabled = false,
|
||||
theme = currentTheme(),
|
||||
)
|
||||
populateHabitSpinner()
|
||||
binding.habitSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
|
||||
|
||||
@@ -63,13 +63,14 @@ class PendingIntentFactory
|
||||
FLAG_UPDATE_CURRENT
|
||||
)
|
||||
|
||||
fun removeRepetition(habit: Habit): PendingIntent =
|
||||
fun removeRepetition(habit: Habit, timestamp: Timestamp?): PendingIntent =
|
||||
getBroadcast(
|
||||
context,
|
||||
3,
|
||||
Intent(context, WidgetReceiver::class.java).apply {
|
||||
action = WidgetReceiver.ACTION_REMOVE_REPETITION
|
||||
data = Uri.parse(habit.uriString)
|
||||
if (timestamp != null) putExtra("timestamp", timestamp.unixTime)
|
||||
},
|
||||
FLAG_UPDATE_CURRENT
|
||||
)
|
||||
@@ -132,17 +133,17 @@ class PendingIntentFactory
|
||||
timestamp: Long?
|
||||
):
|
||||
PendingIntent =
|
||||
getBroadcast(
|
||||
widgetContext,
|
||||
2,
|
||||
Intent(widgetContext, WidgetReceiver::class.java).apply {
|
||||
data = Uri.parse(habit.uriString)
|
||||
action = WidgetReceiver.ACTION_SET_NUMERICAL_VALUE
|
||||
putExtra("numericalValue", numericalValue)
|
||||
if (timestamp != null) putExtra("timestamp", timestamp)
|
||||
},
|
||||
FLAG_UPDATE_CURRENT
|
||||
)
|
||||
getBroadcast(
|
||||
widgetContext,
|
||||
2,
|
||||
Intent(widgetContext, WidgetReceiver::class.java).apply {
|
||||
data = Uri.parse(habit.uriString)
|
||||
action = WidgetReceiver.ACTION_SET_NUMERICAL_VALUE
|
||||
putExtra("numericalValue", numericalValue)
|
||||
if (timestamp != null) putExtra("timestamp", timestamp)
|
||||
},
|
||||
FLAG_UPDATE_CURRENT
|
||||
)
|
||||
|
||||
fun updateWidgets(): PendingIntent =
|
||||
getBroadcast(
|
||||
|
||||
@@ -107,7 +107,7 @@ class AndroidNotificationTray
|
||||
val removeRepetitionAction = Action(
|
||||
R.drawable.ic_action_cancel,
|
||||
context.getString(R.string.no),
|
||||
pendingIntents.removeRepetition(habit)
|
||||
pendingIntents.removeRepetition(habit, timestamp)
|
||||
)
|
||||
|
||||
val enterAction = Action(
|
||||
|
||||
@@ -28,6 +28,7 @@ import android.widget.AdapterView.OnItemClickListener
|
||||
import androidx.fragment.app.FragmentActivity
|
||||
import com.android.datetimepicker.time.RadialPickerLayout
|
||||
import com.android.datetimepicker.time.TimePickerDialog
|
||||
import org.isoron.platform.gui.toInt
|
||||
import org.isoron.uhabits.HabitsApplication
|
||||
import org.isoron.uhabits.R
|
||||
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.receivers.ReminderController
|
||||
import org.isoron.uhabits.utils.SystemUtils
|
||||
import org.isoron.uhabits.utils.toThemedAndroidColor
|
||||
import java.util.Calendar
|
||||
|
||||
class SnoozeDelayPickerActivity : FragmentActivity(), OnItemClickListener {
|
||||
private var habit: Habit? = null
|
||||
private var reminderController: ReminderController? = null
|
||||
private var dialog: AlertDialog? = null
|
||||
private var color: Int = 0
|
||||
private var androidColor: Int = 0
|
||||
|
||||
override fun onCreate(bundle: Bundle?) {
|
||||
super.onCreate(bundle)
|
||||
@@ -63,7 +63,7 @@ class SnoozeDelayPickerActivity : FragmentActivity(), OnItemClickListener {
|
||||
habit = appComponent.habitList.getById(ContentUris.parseId(data))
|
||||
}
|
||||
if (habit == null) finish()
|
||||
color = habit!!.color.toThemedAndroidColor(this)
|
||||
androidColor = themeSwitcher.currentTheme.color(habit!!.color).toInt()
|
||||
reminderController = appComponent.reminderController
|
||||
dialog = AlertDialog.Builder(this)
|
||||
.setTitle(R.string.select_snooze_delay)
|
||||
@@ -85,7 +85,7 @@ class SnoozeDelayPickerActivity : FragmentActivity(), OnItemClickListener {
|
||||
calendar[Calendar.HOUR_OF_DAY],
|
||||
calendar[Calendar.MINUTE],
|
||||
DateFormat.is24HourFormat(this),
|
||||
color
|
||||
androidColor
|
||||
)
|
||||
dialog.show(supportFragmentManager, "timePicker")
|
||||
}
|
||||
|
||||
@@ -92,6 +92,9 @@ class SharedPreferencesStorage
|
||||
preferences.setNotificationsSticky(getBoolean(key, false))
|
||||
"pref_led_notifications" ->
|
||||
preferences.setNotificationsLed(getBoolean(key, false))
|
||||
"pref_unknown_enabled" -> {
|
||||
preferences.areQuestionMarksEnabled = getBoolean(key, false)
|
||||
}
|
||||
}
|
||||
sharedPreferences.registerOnSharedPreferenceChangeListener(this)
|
||||
}
|
||||
|
||||
@@ -21,7 +21,6 @@ package org.isoron.uhabits.utils
|
||||
|
||||
import android.content.Context
|
||||
import android.graphics.Color
|
||||
import android.util.Log
|
||||
import org.isoron.uhabits.core.models.PaletteColor
|
||||
|
||||
object PaletteUtils {
|
||||
@@ -29,16 +28,6 @@ object PaletteUtils {
|
||||
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 {
|
||||
return intArrayOf(
|
||||
Color.parseColor("#D32F2F"), // 0 red
|
||||
|
||||
@@ -40,8 +40,12 @@ import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.appcompat.widget.Toolbar
|
||||
import androidx.core.content.FileProvider
|
||||
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.activities.AndroidThemeSwitcher
|
||||
import org.isoron.uhabits.core.models.PaletteColor
|
||||
import org.isoron.uhabits.core.ui.views.Theme
|
||||
import java.io.File
|
||||
|
||||
fun RelativeLayout.addBelow(
|
||||
@@ -157,6 +161,7 @@ fun View.setupToolbar(
|
||||
toolbar: Toolbar,
|
||||
title: String,
|
||||
color: PaletteColor,
|
||||
theme: Theme,
|
||||
displayHomeAsUpEnabled: Boolean = true,
|
||||
) {
|
||||
toolbar.elevation = InterfaceUtils.dpToPixels(context, 2f)
|
||||
@@ -165,7 +170,7 @@ fun View.setupToolbar(
|
||||
val toolbarColor = if (!res.getBoolean(R.attr.useHabitColorAsPrimary)) {
|
||||
StyledResources(context).getColor(R.attr.colorPrimary)
|
||||
} else {
|
||||
color.toThemedAndroidColor(context)
|
||||
theme.color(color).toInt()
|
||||
}
|
||||
val darkerColor = ColorUtils.mixColors(toolbarColor, Color.BLACK, 0.75f)
|
||||
toolbar.background = ColorDrawable(toolbarColor)
|
||||
@@ -175,6 +180,13 @@ fun View.setupToolbar(
|
||||
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) =
|
||||
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.WidgetPreferences
|
||||
import org.isoron.uhabits.intents.PendingIntentFactory
|
||||
import kotlin.math.max
|
||||
|
||||
abstract class BaseWidget(val context: Context, val id: Int, val stacked: Boolean) {
|
||||
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 {
|
||||
view.invalidate()
|
||||
val width = view.measuredWidth
|
||||
val height = view.measuredHeight
|
||||
val width = max(1, view.measuredWidth)
|
||||
val height = max(1, view.measuredHeight)
|
||||
val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
|
||||
val canvas = Canvas(bitmap)
|
||||
view.draw(canvas)
|
||||
|
||||
@@ -109,7 +109,7 @@ abstract class BaseWidgetProvider : AppWidgetProvider() {
|
||||
}
|
||||
|
||||
protected fun getHabitsFromWidgetId(widgetId: Int): List<Habit> {
|
||||
val selectedIds = widgetPrefs.getHabitIdsFromWidgetId(widgetId)!!
|
||||
val selectedIds = widgetPrefs.getHabitIdsFromWidgetId(widgetId)
|
||||
val selectedHabits = ArrayList<Habit>(selectedIds.size)
|
||||
for (id in selectedIds) {
|
||||
val h = habits.getById(id) ?: throw HabitNotFoundException()
|
||||
|
||||
@@ -24,10 +24,11 @@ import android.content.Context
|
||||
import android.os.Build
|
||||
import android.view.View
|
||||
import androidx.annotation.RequiresApi
|
||||
import org.isoron.platform.gui.toInt
|
||||
import org.isoron.uhabits.core.models.Entry
|
||||
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.utils.toThemedAndroidColor
|
||||
import org.isoron.uhabits.widgets.views.CheckmarkWidgetView
|
||||
|
||||
open class CheckmarkWidget(
|
||||
@@ -53,7 +54,7 @@ open class CheckmarkWidget(
|
||||
(widgetView as CheckmarkWidgetView).apply {
|
||||
val today = DateUtils.getTodayWithOffset()
|
||||
setBackgroundAlpha(preferedBackgroundAlpha)
|
||||
activeColor = habit.color.toThemedAndroidColor(context)
|
||||
activeColor = WidgetTheme().color(habit.color).toInt()
|
||||
name = habit.name
|
||||
entryValue = habit.computedEntries.get(today).value
|
||||
if (habit.isNumerical) {
|
||||
|
||||
@@ -22,9 +22,10 @@ package org.isoron.uhabits.widgets
|
||||
import android.app.PendingIntent
|
||||
import android.content.Context
|
||||
import android.view.View
|
||||
import org.isoron.platform.gui.toInt
|
||||
import org.isoron.uhabits.activities.common.views.FrequencyChart
|
||||
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
|
||||
|
||||
class FrequencyWidget(
|
||||
@@ -47,7 +48,7 @@ class FrequencyWidget(
|
||||
if (preferedBackgroundAlpha >= 255) widgetView.setShadowAlpha(0x4f)
|
||||
(widgetView.dataView as FrequencyChart).apply {
|
||||
setFirstWeekday(firstWeekday)
|
||||
setColor(habit.color.toThemedAndroidColor(context))
|
||||
setColor(WidgetTheme().color(habit.color).toInt())
|
||||
setFrequency(habit.originalEntries.computeWeekdayFrequency(habit.isNumerical))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,10 +22,11 @@ package org.isoron.uhabits.widgets
|
||||
import android.app.PendingIntent
|
||||
import android.content.Context
|
||||
import android.view.View
|
||||
import org.isoron.platform.gui.toInt
|
||||
import org.isoron.uhabits.activities.common.views.ScoreChart
|
||||
import org.isoron.uhabits.core.models.Habit
|
||||
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
|
||||
|
||||
class ScoreWidget(
|
||||
@@ -44,7 +45,8 @@ class ScoreWidget(
|
||||
val viewModel = ScoreCardPresenter.buildState(
|
||||
habit = habit,
|
||||
firstWeekday = prefs.firstWeekdayInt,
|
||||
spinnerPosition = prefs.scoreCardSpinnerPosition
|
||||
spinnerPosition = prefs.scoreCardSpinnerPosition,
|
||||
theme = WidgetTheme(),
|
||||
)
|
||||
val widgetView = view as GraphWidgetView
|
||||
widgetView.setBackgroundAlpha(preferedBackgroundAlpha)
|
||||
@@ -52,7 +54,7 @@ class ScoreWidget(
|
||||
(widgetView.dataView as ScoreChart).apply {
|
||||
setIsTransparencyEnabled(true)
|
||||
setBucketSize(viewModel.bucketSize)
|
||||
setColor(habit.color.toThemedAndroidColor(context))
|
||||
setColor(WidgetTheme().color(habit.color).toInt())
|
||||
setScores(viewModel.scores)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -53,7 +53,7 @@ internal class StackRemoteViewsFactory(private val context: Context, intent: Int
|
||||
AppWidgetManager.INVALID_APPWIDGET_ID
|
||||
)
|
||||
private val habitIds: LongArray
|
||||
private val widgetType: StackWidgetType?
|
||||
private val widgetType: StackWidgetType
|
||||
private var remoteViews = ArrayList<RemoteViews>()
|
||||
override fun onCreate() {}
|
||||
override fun onDestroy() {}
|
||||
@@ -86,27 +86,27 @@ internal class StackRemoteViewsFactory(private val context: Context, intent: Int
|
||||
|
||||
override fun getViewAt(position: Int): RemoteViews? {
|
||||
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(
|
||||
habit: Habit,
|
||||
prefs: Preferences
|
||||
): BaseWidget {
|
||||
when (widgetType) {
|
||||
StackWidgetType.CHECKMARK -> return CheckmarkWidget(context, widgetId, habit, true)
|
||||
StackWidgetType.FREQUENCY -> return FrequencyWidget(
|
||||
return when (widgetType) {
|
||||
StackWidgetType.CHECKMARK -> CheckmarkWidget(context, widgetId, habit, true)
|
||||
StackWidgetType.FREQUENCY -> FrequencyWidget(
|
||||
context,
|
||||
widgetId,
|
||||
habit,
|
||||
prefs.firstWeekdayInt,
|
||||
true
|
||||
)
|
||||
StackWidgetType.SCORE -> return ScoreWidget(context, widgetId, habit, true)
|
||||
StackWidgetType.HISTORY -> return HistoryWidget(context, widgetId, habit, true)
|
||||
StackWidgetType.STREAKS -> return StreakWidget(context, widgetId, habit, true)
|
||||
StackWidgetType.SCORE -> ScoreWidget(context, widgetId, habit, true)
|
||||
StackWidgetType.HISTORY -> HistoryWidget(context, widgetId, habit, true)
|
||||
StackWidgetType.STREAKS -> StreakWidget(context, widgetId, habit, true)
|
||||
StackWidgetType.TARGET -> TargetWidget(context, widgetId, habit, true)
|
||||
}
|
||||
throw IllegalStateException()
|
||||
}
|
||||
|
||||
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 (habitIdsStr == null) throw RuntimeException("habitIdsStr is null")
|
||||
widgetType = StackWidgetType.getWidgetTypeFromValue(widgetTypeValue)
|
||||
?: throw RuntimeException("unknown widget type value: $widgetTypeValue")
|
||||
habitIds = splitLongs(habitIdsStr)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,61 +19,59 @@
|
||||
package org.isoron.uhabits.widgets
|
||||
|
||||
import org.isoron.uhabits.R
|
||||
import java.lang.IllegalStateException
|
||||
|
||||
/**
|
||||
* Created by victoryu on 11/3/17.
|
||||
*/
|
||||
enum class StackWidgetType(val value: Int) {
|
||||
CHECKMARK(0), FREQUENCY(1), SCORE(2), // habit strength widget
|
||||
HISTORY(3), STREAKS(4), TARGET(5);
|
||||
|
||||
companion object {
|
||||
fun getWidgetTypeFromValue(value: Int): StackWidgetType? {
|
||||
return when {
|
||||
CHECKMARK.value == value -> CHECKMARK
|
||||
FREQUENCY.value == value -> FREQUENCY
|
||||
SCORE.value == value -> SCORE
|
||||
HISTORY.value == value -> HISTORY
|
||||
STREAKS.value == value -> STREAKS
|
||||
TARGET.value == value -> TARGET
|
||||
return when (value) {
|
||||
CHECKMARK.value -> CHECKMARK
|
||||
FREQUENCY.value -> FREQUENCY
|
||||
SCORE.value -> SCORE
|
||||
HISTORY.value -> HISTORY
|
||||
STREAKS.value -> STREAKS
|
||||
TARGET.value -> TARGET
|
||||
else -> null
|
||||
}
|
||||
}
|
||||
|
||||
fun getStackWidgetLayoutId(type: StackWidgetType?): Int {
|
||||
when (type) {
|
||||
CHECKMARK -> return R.layout.checkmark_stackview_widget
|
||||
FREQUENCY -> return R.layout.frequency_stackview_widget
|
||||
SCORE -> return R.layout.score_stackview_widget
|
||||
HISTORY -> return R.layout.history_stackview_widget
|
||||
STREAKS -> return R.layout.streak_stackview_widget
|
||||
TARGET -> return R.layout.target_stackview_widget
|
||||
return when (type) {
|
||||
CHECKMARK -> R.layout.checkmark_stackview_widget
|
||||
FREQUENCY -> R.layout.frequency_stackview_widget
|
||||
SCORE -> R.layout.score_stackview_widget
|
||||
HISTORY -> R.layout.history_stackview_widget
|
||||
STREAKS -> R.layout.streak_stackview_widget
|
||||
TARGET -> R.layout.target_stackview_widget
|
||||
else -> throw IllegalStateException()
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
fun getStackWidgetAdapterViewId(type: StackWidgetType?): Int {
|
||||
when (type) {
|
||||
CHECKMARK -> return R.id.checkmarkStackWidgetView
|
||||
FREQUENCY -> return R.id.frequencyStackWidgetView
|
||||
SCORE -> return R.id.scoreStackWidgetView
|
||||
HISTORY -> return R.id.historyStackWidgetView
|
||||
STREAKS -> return R.id.streakStackWidgetView
|
||||
TARGET -> return R.id.targetStackWidgetView
|
||||
return when (type) {
|
||||
CHECKMARK -> R.id.checkmarkStackWidgetView
|
||||
FREQUENCY -> R.id.frequencyStackWidgetView
|
||||
SCORE -> R.id.scoreStackWidgetView
|
||||
HISTORY -> R.id.historyStackWidgetView
|
||||
STREAKS -> R.id.streakStackWidgetView
|
||||
TARGET -> R.id.targetStackWidgetView
|
||||
else -> throw IllegalStateException()
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
fun getStackWidgetEmptyViewId(type: StackWidgetType?): Int {
|
||||
when (type) {
|
||||
CHECKMARK -> return R.id.checkmarkStackWidgetEmptyView
|
||||
FREQUENCY -> return R.id.frequencyStackWidgetEmptyView
|
||||
SCORE -> return R.id.scoreStackWidgetEmptyView
|
||||
HISTORY -> return R.id.historyStackWidgetEmptyView
|
||||
STREAKS -> return R.id.streakStackWidgetEmptyView
|
||||
TARGET -> return R.id.targetStackWidgetEmptyView
|
||||
return when (type) {
|
||||
CHECKMARK -> R.id.checkmarkStackWidgetEmptyView
|
||||
FREQUENCY -> R.id.frequencyStackWidgetEmptyView
|
||||
SCORE -> R.id.scoreStackWidgetEmptyView
|
||||
HISTORY -> R.id.historyStackWidgetEmptyView
|
||||
STREAKS -> R.id.streakStackWidgetEmptyView
|
||||
TARGET -> R.id.targetStackWidgetEmptyView
|
||||
else -> throw IllegalStateException()
|
||||
}
|
||||
return 0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,9 +24,10 @@ import android.content.Context
|
||||
import android.view.View
|
||||
import android.view.ViewGroup.LayoutParams
|
||||
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.core.models.Habit
|
||||
import org.isoron.uhabits.utils.toThemedAndroidColor
|
||||
import org.isoron.uhabits.core.ui.views.WidgetTheme
|
||||
import org.isoron.uhabits.widgets.views.GraphWidgetView
|
||||
|
||||
class StreakWidget(
|
||||
@@ -46,7 +47,7 @@ class StreakWidget(
|
||||
widgetView.setBackgroundAlpha(preferedBackgroundAlpha)
|
||||
if (preferedBackgroundAlpha >= 255) widgetView.setShadowAlpha(0x4f)
|
||||
(widgetView.dataView as StreakChart).apply {
|
||||
setColor(habit.color.toThemedAndroidColor(context))
|
||||
setColor(WidgetTheme().color(habit.color).toInt())
|
||||
setStreaks(habit.streaks.getBest(maxStreakCount))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,11 +25,12 @@ import android.view.View
|
||||
import android.view.ViewGroup.LayoutParams
|
||||
import android.view.ViewGroup.LayoutParams.MATCH_PARENT
|
||||
import kotlinx.coroutines.runBlocking
|
||||
import org.isoron.platform.gui.toInt
|
||||
import org.isoron.uhabits.activities.common.views.TargetChart
|
||||
import org.isoron.uhabits.activities.habits.show.views.TargetCardView.Companion.intervalToLabel
|
||||
import org.isoron.uhabits.core.models.Habit
|
||||
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
|
||||
|
||||
class TargetWidget(
|
||||
@@ -49,8 +50,12 @@ class TargetWidget(
|
||||
widgetView.setBackgroundAlpha(preferedBackgroundAlpha)
|
||||
if (preferedBackgroundAlpha >= 255) widgetView.setShadowAlpha(0x4f)
|
||||
val chart = (widgetView.dataView as TargetChart)
|
||||
val data = TargetCardPresenter.buildState(habit, prefs.firstWeekdayInt)
|
||||
chart.setColor(data.color.toThemedAndroidColor(context))
|
||||
val data = TargetCardPresenter.buildState(
|
||||
habit = habit,
|
||||
firstWeekday = prefs.firstWeekdayInt,
|
||||
theme = WidgetTheme(),
|
||||
)
|
||||
chart.setColor(WidgetTheme().color(habit.color).toInt())
|
||||
chart.setTargets(data.targets)
|
||||
chart.setLabels(data.intervals.map { intervalToLabel(context.resources, it) })
|
||||
chart.setValues(data.values)
|
||||
|
||||
@@ -95,7 +95,7 @@ class WidgetUpdater
|
||||
val modifiedWidgetIds = when (modifiedHabitId) {
|
||||
null -> widgetIds.toList()
|
||||
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 org.isoron.uhabits.HabitsApplication
|
||||
import org.isoron.uhabits.R
|
||||
import org.isoron.uhabits.activities.AndroidThemeSwitcher
|
||||
import org.isoron.uhabits.core.preferences.WidgetPreferences
|
||||
import org.isoron.uhabits.widgets.WidgetUpdater
|
||||
import java.util.ArrayList
|
||||
@@ -58,6 +59,7 @@ open class HabitPickerDialog : Activity() {
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
val component = (applicationContext as HabitsApplication).component
|
||||
AndroidThemeSwitcher(this, component.preferences).apply()
|
||||
val habitList = component.habitList
|
||||
widgetPreferences = component.widgetPreferences
|
||||
widgetUpdater = component.widgetUpdater
|
||||
|
||||
@@ -39,6 +39,7 @@ import org.isoron.uhabits.utils.PaletteUtils.getAndroidTestColor
|
||||
import org.isoron.uhabits.utils.StyledResources
|
||||
import kotlin.math.max
|
||||
import kotlin.math.min
|
||||
import kotlin.math.roundToInt
|
||||
|
||||
class CheckmarkWidgetView : HabitWidgetView {
|
||||
var activeColor: Int = 0
|
||||
@@ -102,7 +103,7 @@ class CheckmarkWidgetView : HabitWidgetView {
|
||||
SKIP -> resources.getString(R.string.fa_skipped)
|
||||
UNKNOWN -> {
|
||||
run {
|
||||
if (preferences!!.areQuestionMarksEnabled()) {
|
||||
if (preferences!!.areQuestionMarksEnabled) {
|
||||
return resources.getString(R.string.fa_question)
|
||||
} else {
|
||||
resources.getString(R.string.fa_times)
|
||||
@@ -118,26 +119,25 @@ class CheckmarkWidgetView : HabitWidgetView {
|
||||
get() = R.layout.widget_checkmark
|
||||
|
||||
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
|
||||
val width = MeasureSpec.getSize(widthMeasureSpec)
|
||||
val height = MeasureSpec.getSize(heightMeasureSpec)
|
||||
var w = width.toFloat()
|
||||
var h = width * 1.25f
|
||||
val scale = min(width / w, height / h)
|
||||
w *= scale
|
||||
h *= scale
|
||||
val newWidthMeasureSpec = MeasureSpec.makeMeasureSpec(w.toInt(), MeasureSpec.EXACTLY)
|
||||
val newHeightMeasureSpec = MeasureSpec.makeMeasureSpec(h.toInt(), MeasureSpec.EXACTLY)
|
||||
var textSize = 0.15f * h
|
||||
val maxTextSize = getDimension(context, R.dimen.smallerTextSize)
|
||||
textSize = min(textSize, maxTextSize)
|
||||
var width = MeasureSpec.getSize(widthMeasureSpec)
|
||||
var height = MeasureSpec.getSize(heightMeasureSpec)
|
||||
if (height >= width) {
|
||||
height = min(height, (width * 1.5).roundToInt())
|
||||
} else {
|
||||
width = min(width, height)
|
||||
}
|
||||
val textSize = min(0.2f * width, getDimension(context, R.dimen.smallerTextSize))
|
||||
label.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize)
|
||||
if (isNumerical) {
|
||||
ring.setTextSize(textSize * 0.75f)
|
||||
ring.setTextSize(textSize * 0.9f)
|
||||
} else {
|
||||
ring.setTextSize(textSize)
|
||||
}
|
||||
ring.setThickness(0.15f * textSize)
|
||||
super.onMeasure(newWidthMeasureSpec, newHeightMeasureSpec)
|
||||
ring.setThickness(0.03f * width)
|
||||
super.onMeasure(
|
||||
MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
|
||||
MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)
|
||||
)
|
||||
}
|
||||
|
||||
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>
|
||||
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>
|
||||
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>
|
||||
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.
|
||||
<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. Altamente optimizada para la velocidad, la aplicación funciona bien incluso en teléfonos más antiguos.
|
||||
|
||||
<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".
|
||||
@@ -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.
|
||||
|
||||
<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>
|
||||
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>
|
||||
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).
|
||||
|
||||
<b>Funciona sin conexión y respeta tu privacidad</b>
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
Loop Habit Tracker به شما کمک میکند تا عادتهای مثبت طولانیمدت را در زندگی ایجاد و حفظ کنید. نمودارها و آمارهای دقیق، تصویری واضح از چگونگی بهبود عادتهای شما در طول زمان به شما میدهد. این برنامه کاملاً بدون تبلیغات و منبعباز است و به حریم خصوصی شما احترام میگذارد.
|
||||
عادتسنج لوپ به شما کمک میکند تا عادتهای مثبت طولانیمدت را در زندگی ایجاد و حفظ کنید. نمودارها و آمارهای دقیق، تصویری واضح از چگونگی بهبود عادتهای شما در طول زمان به شما میدهد. این برنامه کاملاً بدون تبلیغات و منبعباز است و به حریم خصوصی شما احترام میگذارد.
|
||||
|
||||
<b>رابط کاربری زیبا، مینیمال و سبک</b>
|
||||
Loop دارای یک رابط زیبا و مینیمال است که استفاده از آن حتی برای کاربرانی که برای بار اول استفاده میکنند بسیار آسان است. این برنامه از نظر سرعت عملکرد بسیار بهینه شده و حتی در تلفنهای قدیمی نیز به خوبی کار میکند.
|
||||
|
||||
<b>نمره عادت</b>
|
||||
Loop فرمول پیشرفتهای برای محاسبه قدرت عادتهای شما دارد. هر تکرار عادت شما را قویتر میکند و هر روز فراموششده آن را ضعیف میکند. چند روز از دست رفته پس از یک رشته طولانی ، برخلاف بسیاری از برنامه های شکننده نشده ، پیشرفت شما را به طور کامل از بین نمی برد.
|
||||
لوپ فرمول پیشرفتهای برای محاسبه قدرت عادتهای شما دارد. هر تکرار عادت شما را قویتر میکند و هر روز فراموششده آن را ضعیف میکند. ولی برخلاف دیگر برنامههای عادتسنج، اگر بعد از یک روند طولانی حفظ عادت، چند روز آن عادت را انجام ندهید، پیشرفت شما به صورت کامل نابود نخواهد شد.
|
||||
|
||||
برنامهریزی با دست باز
|
||||
<b>برنامهریزی منعطف</b>
|
||||
علاوه بر علاوه بر عادتهایی که هر روز باید تکرار شوند، شما میتوانید برنامهریزیهای متنوعی دیگری را تنظیم کنید، مثلا هفته ای سه بار یا روز در میان
|
||||
|
||||
یاداوری
|
||||
@@ -19,11 +19,11 @@ Loop فرمول پیشرفتهای برای محاسبه قدرت عادت
|
||||
اگر می خواهید داده های خود را بیشتر تجزیه و تحلیل کنید ، یا آنها را به سرویس دیگری منتقل کنید ، Loop به شما امکان می دهد آنها را به صفحه گسترده (CSV) یا یک پرونده پایگاه داده (SQLite) صادر کنید. برای کاربران قدرت ، علامت های تأیید را می توان از طریق برنامه های دیگر مانند Tasker اضافه کرد.
|
||||
|
||||
<b>بدون محدودیت</b>
|
||||
هر تعداد که می خواهید عادت ها را دنبال کنید. حلقه محدودیتی مصنوعی در تعداد عادت های شما ایجاد نمی کند. همه ویژگی ها در دسترس همه کاربران است. هیچ خرید درون برنامه ای وجود ندارد.
|
||||
هر تعداد که می خواهید عادت ها را دنبال کنید. حلقه محدودیتی مصنوعی در تعداد عادت های شما ایجاد نمی کند. همه ویژگیها برای همه کاربران در دسترس هستند. هیچ خرید درونبرنامهای وجود ندارد.
|
||||
|
||||
<b>کاملاً بدون آگهی و منبع آزاد</b>
|
||||
هیچ تبلیغی ، اعلان آزار دهنده یا مجوز سرزده در این برنامه وجود ندارد و هرگز وجود نخواهد داشت. برنامه کاملاً منبع باز (GPLv3) است.
|
||||
<b>کاملاً بدون آگهی و منبع باز</b>
|
||||
هیچ تبلیغ، اعلان آزاردهنده یا مجوز بیاجازه در این برنامه وجود ندارد و هرگز وجود نخواهد داشت. برنامه کاملاً منبع باز (GPLv3) است.
|
||||
|
||||
<b>بصورت آفلاین کار می کند و به حریم خصوصی شما احترام می گذارد</b>
|
||||
حلقه به اتصال اینترنت یا ثبت نام آنلاین حساب نیاز ندارد. اطلاعات محرمانه شما هرگز برای کسی ارسال نمی شود. نه توسعه دهندگان و نه اشخاص ثالث به آن دسترسی ندارند.
|
||||
<b>به صورت آفلاین کار میکند و به حریم خصوصی شما احترام می گذارد</b>
|
||||
لوپ به اینترنت یا ثبتنام آنلاین نیاز ندارد. اطلاعات محرمانه شما هرگز به جایی ارسال نمیشود. نه توسعهدهندگان و نه اشخاص ثالث به آن دسترسی ندارند.
|
||||
|
||||
|
||||
@@ -1 +1 @@
|
||||
ایجاد عادت های خوب و پیگیری پیشرفت آنها در طول زمان (بدون تبلیغ)
|
||||
عادتهای خوب ایجاد کنید و پیشرفت آنها را در طول زمان پیگیری کنید (بدون تبلیغ)
|
||||
|
||||
@@ -1,29 +1,29 @@
|
||||
אפליקצית Loop Habit Tracker עוזרת לך ליצור ולשמר הרגלים חיוביים וארוכי טווח בחייך. תרשימים וסטטיסטיקה מפורטים נותנים לך תמונה ברורה כיצד ההרגלים שלך השתפרו לאורך זמן. האפליקציה הינה נטולת פרסומות לחלוטין, כתובה בקוד פתוח וכן מכבדת את הפרטיות שלך.
|
||||
„Loop למעקב אחר ההרגלים” מסייע לך ביצירה ובשימור הרגלים טובים וארוכי טווח. תרשימים וסטטיסטיקה מפורטים נותנים לך תמונה ברורה כיצד ההרגלים שלך השתפרו לאורך זמן. היישום נטול פרסומות לחלוטין, קוד המקור שלו פתוח והוא מכבד את הפרטיות שלך.
|
||||
|
||||
<b>ממשק יפה, מינימלי וקליל</b>
|
||||
ל־Loop ממשק מינימלי וקל לשימוש, כבר בשימוש הראשון. האפליקציה מותאמת מאוד לפעולה מהירה, ופועלת היטב גם בטלפונים ישנים.
|
||||
<b>ממשק יפה, חסכוני וקליל</b>
|
||||
ל־Loop ממשק אלגנטי, חסכוני וקל לשימוש אפילו בפעם הראשונה. היישום מותאם במיוחד למהירות, ועובד היטב גם בטלפונים ישנים.
|
||||
|
||||
<b>ציון הרגל</b>
|
||||
ל־Loop יש נוסחה מתקדמת לחישוב חוזק ההרגלים שלך. כל חזרה הופכת את ההרגל שלכם לחזק יותר, וכל יום שהוחמץ הופך אותו לחלש יותר. כמה ימים שהוחמצו לאחר רצף ארוך, לעומת זאת, לא יהרסו לחלוטין את ההתקדמות, בניגוד להרבה אפליקציות אחרות מסוג "אל תשברו את השרשרת".
|
||||
ל־Loop יש נוסחה מתקדמת לחישוב חוזק ההרגלים שלך. כל חזרה על ההרגל מחזקת אותו, וכל יום שהוחמץ מחליש אותו. כמה ימים שהוחמצו לאחר רצף ארוך, לעומת זאת, לא יהרסו לחלוטין את ההתקדמות, בניגוד ליישומים רבים אחרים מסוג „לא לשבור את השרשרת”.
|
||||
|
||||
<b>לוחות זמנים גמישים</b>
|
||||
בנוסף להרגלים יומיומיים, Loop תומכת בהרגלים עם לוחות זמנים מורכבים יותר, כמו 3 פעמים בשבוע או "יום כן יום לא".
|
||||
בנוסף להרגלים יומיומיים, Loop תומך בהרגלים עם לוחות זמנים מורכבים יותר, כמו 3 פעמים בשבוע או „יום כן יום לא”.
|
||||
|
||||
<b>תזכורות</b>
|
||||
אפשר לתזמן התראות קבועות עם תזכורות לגבי ההרגלים שלך. לכל הרגל יכולה להיות תזכורת משלו, בשעה שנבחרה ביום. אפשר לסמן או לדחות את עשיית ההרגל ישירות מההתראה בקלות.
|
||||
|
||||
<b>ווידג'טים</b>
|
||||
היזכרו בהרגלים בכל שחרור נעילת הטלפון. ווידג'טים צבעוניים מאפשרים לך לעקוב אחר הרגליך ישירות ממסך הבית שלך, מבלי לפתוח את האפליקציה אפילו.
|
||||
<b>יישומונים</b>
|
||||
להיזכר בהרגלים בכל שחרור נעילת הטלפון. יישומונים צבעוניים שמאפשרים לך לעקוב אחר ההרגלים ישירות ממסך הבית, מבלי לפתוח אפילו את היישום.
|
||||
|
||||
<b>השליטה בנתונים היא בידיים שלך</b>
|
||||
אם ברצונך לנתח עוד יותר את הנתונים שלך, או להעביר אותם לשירות אחר, Loop מאפשרת לך לייצא אותם לגיליונות אלקטרוניים (CSV) או לקובץ מסד נתונים (SQLite). עבור משתמשים מובילים, ישנה יכולת להוסיף ביקורת באמצעות אפליקציות אחרות, כגון Tasker.
|
||||
אם ברצונך לנתח יותר לעומק את הנתונים שלך, או להעבירם לשירות אחר, Loop מאפשרת לך לייצא אותם לגיליונות אלקטרוניים (CSV) או לקובץ מסד נתונים (SQLite). למשתמשים מתקדמים, אפשר לסמן הרגלים דרך יישומים אחרים, כגון Tasker.
|
||||
|
||||
<b>בלי הגבלות</b>
|
||||
עקבו אחר כמה הרגלים שתרצו. Loop לא מגבילה את כמות ההרגלים שאפשר להוסיף. כל התכונות זמינות לכל המשתמשים. אין רכישות מתוך האפליקציה.
|
||||
אפשר לעקוב אחר כמה הרגלים שרוצים. Loop לא מגבילה את כמות ההרגלים שאפשר להוסיף. כל התכונות זמינות לכל המשתמשים. אין רכישות מתוך היישום.
|
||||
|
||||
<b>נטול פרסומות במלואו ובקוד פתוח</b>
|
||||
אין שום פרסומות, התראות מעצבנות או הרשאות פולשניות ביישום הזה, ולעולם לא יהיו. הקוד של היישום הזה פתוח במלואו (GPLv3).
|
||||
<b>היישום נטול פרסומות במלואו וקוד המקור שלו פתוח</b>
|
||||
אין שום פרסומות, התראות מעצבנות או הרשאות פולשניות ביישום הזה, ולעולם לא יהיו. קוד היישום הזה פתוח לחלוטין (GPLv3).
|
||||
|
||||
<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>
|
||||
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.
|
||||
|
||||
<b>Geen beperkingen</b>
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
Трекер привычек Loop помогает вам создавать и поддерживать долгосрочные позитивные привычки в своей жизни. Подробные графики и статистика дадут вам чёткое представление о том, как ваши привычки улучшились с течением времени. Приложение полностью без рекламы, с открытым исходным кодом и с уважением к вашей конфиденциальности.
|
||||
|
||||
<b>Красивый, минималистичный и лёгкий интерфейс</b>
|
||||
У Loop изящный и минималистичный интерфейс, который очень прост в использовании даже для начинающих пользователей. Высокооптимизированное для скорости, приложение хорошо работает даже на старых телефонах.
|
||||
У Loop изящный и минималистичный интерфейс, который очень прост в использовании даже для начинающих пользователей. Оптимизированное по скорости приложение хорошо работает даже на старых телефонах.
|
||||
|
||||
<b>Показатель привычек</b>
|
||||
<b>Показатель устойчивости привычки</b>
|
||||
У Loop есть продвинутая формула для расчёта силы ваших привычек. Каждое повторение делает вашу привычку сильнее, а каждый пропущенный день - слабее. Однако несколько пропущенных дней после долгой полосы не погубят ваш прогресс в отличие от многих других приложений типа "не разрывай цепь".
|
||||
|
||||
<b>Гибкий график</b>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
Loop 习惯记录(以下简称“Loop”)可以帮助您建立好习惯且随着时间记录你的进步。 详细的图表和统计数据,可以使您更清楚地看到自己的进步。 该应用是完全无广告的开源软件,并且它尊重您的隐私。
|
||||
Loop 习惯记录(以下简称“Loop”)能帮你养成和长期保持好习惯。 详细的图表和统计数据能让您更清楚地看到自己的进步。 这是一个完全无广告的开源应用,它尊重您的隐私。
|
||||
|
||||
<b>优雅、简约、轻巧</b>
|
||||
Loop 具有优雅而简约的界面,即使对于初次使用的用户,也非常易于使用。 该应用针对速度进行了高度优化,即使在较旧的手机上也可以正常运行。
|
||||
@@ -12,7 +12,7 @@ Loop 有高级的公式来计算您习惯的强度。 多多重复会使你的
|
||||
<b>提醒</b>
|
||||
设定通知以提醒您完成习惯。 每一种习惯都有属于自己的通知,您可以选定当天的某个时间提醒该习惯。 同时从通知中轻松地检查或取消您的习惯。
|
||||
|
||||
<b>小部件</b>
|
||||
<b>微件</b>
|
||||
当您解锁手机时, 多彩的小部件可让您直接从主屏幕记录自己的习惯,而无需打开应用程序。
|
||||
|
||||
<b>掌控您的数据</b>
|
||||
@@ -22,7 +22,7 @@ Loop 有高级的公式来计算您习惯的强度。 多多重复会使你的
|
||||
想记录多少习惯都没问题! Loop 对您的习惯没有任何限制, 所有用户均可使用所有功能, 并且没有应用内购买。
|
||||
|
||||
<b>完全无广告的开源软件</b>
|
||||
此应用程序中永远没有任何广告,烦人的通知或侵入性权限, 应用程序是完全开源的,完整的代码在GPLv3。
|
||||
本应用永远都不会有广告和烦人的通知,也不会索取侵入性权限。 本应用是完全开源的(GPLv3)。
|
||||
|
||||
<b>脱机工作并尊重您的隐私</b>
|
||||
Loop 不需要网络连接或在线帐户注册。 您的用户数据永远不会发送给任何人, 包括开发人员和任何第三方都无法访问它。
|
||||
|
||||
@@ -1 +1 @@
|
||||
建立好习惯且随着时间记录你的进步(无广告)
|
||||
养成好习惯并随时记录你的进步(无广告)
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
2.0.3:
|
||||
* Bug fixes
|
||||
2.0:
|
||||
* Track numeric habits (e.g. how many pages did you read?)
|
||||
* Skip days without breaking your streak
|
||||
|
||||
@@ -30,9 +30,11 @@
|
||||
<TextView style="@style/About.Item" android:text="tat bz" />
|
||||
<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="Eilif Adelvice" />
|
||||
<TextView style="@style/About.Item" android:text="Iabin Arteaga" />
|
||||
<TextView style="@style/About.Item" android:text="Sebastian05067" />
|
||||
<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" android:text="4001982248998" />
|
||||
<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="Thibaut Girka" />
|
||||
<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.Language" android:text="Fārsi" />
|
||||
<TextView style="@style/About.Item" android:text="Behnood HRazy" />
|
||||
<TextView style="@style/About.Item" android:text="Eman" />
|
||||
<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" android:text="Ivan Krušlin" />
|
||||
<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="gapszi" />
|
||||
<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="Jelle den Butter" />
|
||||
<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.Language" android:text="Suomen kieli" />
|
||||
<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="Sofia Veijonen" />
|
||||
<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="Lương Vĩnh Khang" />
|
||||
<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.Language" android:text="Türkçe" />
|
||||
<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="Dmitriy Bogdanov" />
|
||||
<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" android:text="Oglaigh Rystard" />
|
||||
<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="Đorđe Vasiljević" />
|
||||
<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="Omry Cohen" />
|
||||
<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="Saeed Esmaili" />
|
||||
<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="reyhoon" />
|
||||
<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="Ting-Hua" />
|
||||
<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.Language" android:text="日本語" />
|
||||
<TextView style="@style/About.Item" android:text="Naofumi F" />
|
||||
|
||||
@@ -185,7 +185,7 @@
|
||||
style="@style/FormInput"
|
||||
android:id="@+id/targetInput"
|
||||
android:maxLines="1"
|
||||
android:inputType="number"
|
||||
android:inputType="numberDecimal"
|
||||
android:hint="@string/example_target"/>
|
||||
</LinearLayout>
|
||||
</FrameLayout>
|
||||
@@ -248,4 +248,4 @@
|
||||
</LinearLayout>
|
||||
</ScrollView>
|
||||
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
|
||||
@@ -31,19 +31,19 @@
|
||||
android:id="@+id/scoreRing"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_weight="1"
|
||||
android:layout_weight="0.9"
|
||||
habit:thickness="2"
|
||||
habit:textSize="16"
|
||||
habit:enableFontAwesome="true"
|
||||
android:layout_marginTop="8dp"
|
||||
android:layout_marginLeft="12dp"
|
||||
android:layout_marginRight="12dp"/>
|
||||
android:layout_marginLeft="4dp"
|
||||
android:layout_marginRight="4dp"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/label"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="0"
|
||||
android:layout_weight="0.1"
|
||||
android:textSize="12sp"
|
||||
android:textColor="@color/white"
|
||||
android:layout_marginLeft="6dp"
|
||||
|
||||
@@ -17,9 +17,7 @@
|
||||
~ You should have received a copy of the GNU General Public License along
|
||||
~ with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
-->
|
||||
|
||||
<!--Generated by crowdin.com-->
|
||||
<resources>
|
||||
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||
<string name="app_name">Loop - Gewoonte Boekhouer</string>
|
||||
<string name="main_activity_title">Gewoontes</string>
|
||||
<string name="action_settings">Instellings</string>
|
||||
@@ -30,12 +28,7 @@
|
||||
<string name="add_habit">Voeg gewoonte by</string>
|
||||
<string name="color_picker_default_title">Verander kleur</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>
|
||||
<!-- App introduction -->
|
||||
<string name="intro_title_1">Welkom</string>
|
||||
<string name="interval_15_minutes">15 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_24_hour">24 ure</string>
|
||||
<string name="settings">Instellings</string>
|
||||
<!-- Different types of habits -->
|
||||
<!-- Middle part of the sentence '1 time in xx days' -->
|
||||
</resources>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?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.
|
||||
~
|
||||
@@ -17,7 +17,7 @@
|
||||
~ You should have received a copy of the GNU General Public License along
|
||||
~ with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
-->
|
||||
<resources>
|
||||
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||
<string name="app_name">Loop Habit Tracker</string>
|
||||
<string name="main_activity_title">عادات</string>
|
||||
<string name="action_settings">إعدادات</string>
|
||||
@@ -28,19 +28,15 @@
|
||||
<string name="add_habit">إضافة عادة</string>
|
||||
<string name="color_picker_default_title">تغيير اللون</string>
|
||||
<string name="toast_habit_created">تم إنشاء عادة</string>
|
||||
<string name="toast_habit_deleted">تم حذف العادات</string>
|
||||
<string name="toast_habit_changed">تم تغيير عادة</string>
|
||||
<string name="toast_habit_archived">تم أرشفه العادات </string>
|
||||
<string name="toast_habit_unarchived">تم الغاء ارشفه العادات </string>
|
||||
<string name="overview">نظرة عامة</string>
|
||||
<string name="habit_strength">قوة العادة</string>
|
||||
<string name="history">السجل</string>
|
||||
<string name="clear">إزالة</string>
|
||||
<string name="days">أيام</string>
|
||||
<string name="reminder">تذكير</string>
|
||||
<string name="save">حفظ</string>
|
||||
<string name="streaks">الإنجازات </string>
|
||||
<string name="no_habits_found"> لا يوجد لديك عادات مفعله</string>
|
||||
<string name="no_habits_left_to_do">لقد أنهيت ألعمل لليوم</string>
|
||||
<string name="long_press_to_toggle">إلمس و إستمر لتحقق أو ازل. </string>
|
||||
<string name="reminder_off">إيقاف</string>
|
||||
<string name="create_habit">انشاء العادة</string>
|
||||
@@ -64,20 +60,16 @@
|
||||
<string name="interval_custom">مخصص... </string>
|
||||
<string name="pref_toggle_title">تبديل وضعية العادة بضغطة قصيرة </string>
|
||||
<string name="pref_toggle_description">وضع علامات الاختيار الموجودة بنقرة واحدة بدلاً من الصحافة وعقد. أكثر ملاءمة، ولكن قد يتسبب في تبديل عرضي. </string>
|
||||
<string name="pref_snooze_interval_title">فترتي الغفوى على التذكير </string>
|
||||
<string name="pref_rate_this_app">تقييم هذا التطبيق على جوجل بلاي </string>
|
||||
<string name="pref_send_feedback">أرسل الملاحظات إلى المطور </string>
|
||||
<string name="pref_view_source_code">إفحص التعليمات البرمجية على GitHub </string>
|
||||
<string name="links">روابط </string>
|
||||
<string name="name">اسم </string>
|
||||
<string name="settings">إعدادات</string>
|
||||
<string name="snooze_interval">فترتي الغفوه </string>
|
||||
<string name="select_snooze_delay">حدد تأخير الغفوة </string>
|
||||
<string name="hint_title">هل كنت تعلم؟ </string>
|
||||
<string name="hint_drag">لإعادة ترتيب القوائم، أضغط اسم من هذه العادة، ثم اسحبه إلى المكان الصحيح. </string>
|
||||
<string name="hint_landscape">يمكنك ان ترى المزيد أيام عن طريق وضع الهاتف في وضع أفقي. </string>
|
||||
<string name="delete_habits">حذف عادات </string>
|
||||
<string name="delete_habits_message">سيتم حذف عادات بشكل دائم. هذا العمل لا يمكن التراجع عنه. </string>
|
||||
<string name="habit_not_found">العادة حذفت/لم يتم العثور عليها </string>
|
||||
<string name="weekends">عطلة نهاية الأسبوع </string>
|
||||
<string name="any_weekday">أيام الأسبوع. </string>
|
||||
@@ -111,7 +103,7 @@
|
||||
<string name="generate_bug_report">توليد تقرير الاعطال. </string>
|
||||
<string name="troubleshooting">استكشاف الأخطاء وإصلاحها. </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="pure_black_description">يستبدل خلفيات رمادية مع أسود نقي في الوضع الليلي. يقلل من استهلاك البطارية في الهواتف مع شاشة AMOLED. .</string>
|
||||
<string name="interface_preferences">السطح البيني. </string>
|
||||
@@ -147,6 +139,7 @@
|
||||
<string name="by_name">حسب الإسم </string>
|
||||
<string name="by_color">حسب اللون </string>
|
||||
<string name="by_score">حسب النقاط </string>
|
||||
<string name="by_status">حسب الحالة</string>
|
||||
<string name="export">استخراج </string>
|
||||
<string name="long_press_to_edit">اضغط مع الاستمرار لتغيرالقيمه</string>
|
||||
<string name="change_value">تغيير القيمة </string>
|
||||
@@ -170,16 +163,29 @@
|
||||
<string name="example_notes">(اختياري)</string>
|
||||
<string name="yes_or_no_example">مثلا: هل استيقظت باكرا اليوم؟ هل مارست الرياضة؟ هل لعبت الشطرنج؟</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_month">%d مرة في الشهر</string>
|
||||
<string name="yes_or_no_short_example">مثال: التمرين</string>
|
||||
<string name="color">اللون</string>
|
||||
<string name="example_target">مثال: 15</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_units_example" comment="Feel free to replace by "km" if that is more common in your country">مثلا: كيلومترات</string>
|
||||
<string name="measurable_question_example">مثلا: كم كيلومترًا جريته اليوم؟</string>
|
||||
<string name="measurable_units_example">مثلا: كيلومترات</string>
|
||||
<string name="every_month">كل شهر</string>
|
||||
<string name="validation_cannot_be_blank">لا يمكن أن يكون الإسم فارغًا</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>
|
||||
|
||||
@@ -17,9 +17,7 @@
|
||||
~ You should have received a copy of the GNU General Public License along
|
||||
~ with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
-->
|
||||
|
||||
<!--Generated by crowdin.com-->
|
||||
<resources>
|
||||
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||
<string name="app_name">Loop Следене на навици</string>
|
||||
<string name="main_activity_title">Навици</string>
|
||||
<string name="action_settings">Настройки</string>
|
||||
@@ -30,16 +28,10 @@
|
||||
<string name="add_habit">Добавяне на навик</string>
|
||||
<string name="color_picker_default_title">Промяна на цвят</string>
|
||||
<string name="toast_habit_created">Навикът е създаден</string>
|
||||
<string name="toast_habit_deleted">Навиците са изтрити</string>
|
||||
<string name="toast_habit_changed">Навикът е променен</string>
|
||||
<string name="toast_habit_archived">Навиците са архивирани</string>
|
||||
<string name="toast_habit_unarchived">Навиците са разархивирани</string>
|
||||
<string name="overview">Обзор</string>
|
||||
<string name="habit_strength">Сила на навика</string>
|
||||
<string name="history">История</string>
|
||||
<string name="clear">Изчистване</string>
|
||||
<string name="times_every">пъти в период от</string>
|
||||
<string name="days">дни</string>
|
||||
<string name="reminder">Напомняне</string>
|
||||
<string name="save">Запазване</string>
|
||||
<string name="streaks">Поредици</string>
|
||||
@@ -50,7 +42,6 @@
|
||||
<string name="edit_habit">Редактиране на навик</string>
|
||||
<string name="check">Поставяне на отметка</string>
|
||||
<string name="snooze">По-късно</string>
|
||||
<!-- App introduction -->
|
||||
<string name="intro_title_1">Добре дошли</string>
|
||||
<string name="intro_description_1">Loop Следене на навици ви помага да създавате и поддържате добри навици.</string>
|
||||
<string name="intro_title_2">Създайте нови навици</string>
|
||||
@@ -75,8 +66,6 @@
|
||||
<string name="hint_title">Знаете ли че?</string>
|
||||
<string name="hint_drag">За да пренаредите записите, натиснете и задръжте върху името на навика и го придърпайте до правилното място.</string>
|
||||
<string name="hint_landscape">Може да виждате повече дни като обърнете телефона си в хоризонтално положение.</string>
|
||||
<string name="delete_habits">Изтриване на навици</string>
|
||||
<string name="delete_habits_message">Навиците ще се изтрият перманентно. Това действие не може да бъде отменено.</string>
|
||||
<string name="habit_not_found">Навикът е изтрит / не е намерен</string>
|
||||
<string name="weekends">Събота и неделя</string>
|
||||
<string name="any_weekday">От понеделник до петък</string>
|
||||
@@ -110,7 +99,7 @@
|
||||
<string name="generate_bug_report">Генериране на доклад за грешки</string>
|
||||
<string name="troubleshooting">Отстраняване на проблеми</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="pure_black_description">Заменя сивите фонове с чисто черни при нощен режим. Намаля разхода на батерията при телефони с AMOLED дисплеи.</string>
|
||||
<string name="interface_preferences">Интерфейс</string>
|
||||
@@ -122,8 +111,6 @@
|
||||
<string name="quarter">Тримесечие</string>
|
||||
<string name="year">Година</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_weeks">На всеки %d седмици</string>
|
||||
<string name="score">Сила</string>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?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.
|
||||
~
|
||||
@@ -17,7 +17,7 @@
|
||||
~ You should have received a copy of the GNU General Public License along
|
||||
~ with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
-->
|
||||
<resources>
|
||||
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||
<string name="app_name">Loop - Hàbit Rastrejador</string>
|
||||
<string name="main_activity_title">Hàbits</string>
|
||||
<string name="action_settings">Configuració</string>
|
||||
@@ -28,19 +28,23 @@
|
||||
<string name="add_habit">Afegir hàbit</string>
|
||||
<string name="color_picker_default_title">Canviar color</string>
|
||||
<string name="toast_habit_created">Hàbit creat.</string>
|
||||
<string name="toast_habit_deleted">Hàbits esborrats.</string>
|
||||
<string name="toast_habit_changed">Hàbit modificat.</string>
|
||||
<string name="toast_habit_archived">Hàbits arxivats.</string>
|
||||
<string name="toast_habit_unarchived">Hàbits trets de l\'arxiu.</string>
|
||||
<plurals name="toast_habits_changed">
|
||||
<item quantity="one">Hàbit modificat.</item>
|
||||
<item quantity="other">Hàbit modificat.</item>
|
||||
</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="habit_strength">Fortalesa de l\'hàbit</string>
|
||||
<string name="history">Història</string>
|
||||
<string name="clear">Netejar</string>
|
||||
<string name="days">dies</string>
|
||||
<string name="reminder">Recordatori</string>
|
||||
<string name="save">Desar</string>
|
||||
<string name="streaks">Ratxa</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="reminder_off">Desactivat</string>
|
||||
<string name="create_habit">Crear hàbit</string>
|
||||
@@ -64,20 +68,20 @@
|
||||
<string name="interval_custom">Personalitza...</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_snooze_interval_title">Interval d\'endarreriment en recordatoris</string>
|
||||
<string name="pref_rate_this_app">Valora aquesta app a Google Play</string>
|
||||
<string name="pref_send_feedback">Enviar resposta al desenvolupador</string>
|
||||
<string name="pref_view_source_code">Veure codi font a Github</string>
|
||||
<string name="links">Enllaços</string>
|
||||
<string name="name">Nom</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="hint_title">Ho sabies?</string>
|
||||
<string name="hint_drag">Per a ordenar les entrades, prem i mantè sobre el nom de l\'hàbit, després arrossega\'l al lloc correcte.</string>
|
||||
<string name="hint_landscape">Pots veure més dies posant el teu telèfon en orientació apaisada.</string>
|
||||
<string name="delete_habits">Esborrar hàbits</string>
|
||||
<string name="delete_habits_message">Els hàbits seran esborrats permanentment. Aquesta acció no es pot desfer.</string>
|
||||
<plurals name="delete_habits_title">
|
||||
<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="weekends">Caps de setmana</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="troubleshooting">Resolució de problemes</string>
|
||||
<string name="help_translate">Ajuda a traduïr aquesta app</string>
|
||||
<string name="night_mode">Mode nocturn</string>
|
||||
<string name="night_mode" comment="dark_theme">Mode nocturn</string>
|
||||
<string name="use_pure_black">Utilitzar negre pur en el mode nocturn</string>
|
||||
<string name="pure_black_description">Reemplaça fons grisos per negre pur en el mode nocturn. Redueix consum de bateria en telèfons amb pantalla AMOLED.</string>
|
||||
<string name="interface_preferences">Interfície</string>
|
||||
@@ -147,6 +151,7 @@
|
||||
<string name="by_name">Per nom</string>
|
||||
<string name="by_color">Pel color</string>
|
||||
<string name="by_score">Per marcador</string>
|
||||
<string name="by_status">Per estat</string>
|
||||
<string name="export">Exportar</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>
|
||||
@@ -170,15 +175,14 @@
|
||||
<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="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_month">%d vegades al mes</string>
|
||||
<string name="yes_or_no_short_example">Ex. Exercici</string>
|
||||
<string name="color">Color</string>
|
||||
<string name="example_target">ex. 15</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_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_question_example">Per exemple, quants quilòmetres heu recorregut avui?</string>
|
||||
<string name="measurable_units_example">per exemple, quilòmetres</string>
|
||||
<string name="every_month">Cada mes</string>
|
||||
<string name="validation_cannot_be_blank">No es pot deixar en blanc</string>
|
||||
<string name="today">Avui</string>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?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.
|
||||
~
|
||||
@@ -17,7 +17,7 @@
|
||||
~ You should have received a copy of the GNU General Public License along
|
||||
~ with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
-->
|
||||
<resources>
|
||||
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||
<string name="app_name">Loop Habit Tracker</string>
|
||||
<string name="main_activity_title">Zvyky</string>
|
||||
<string name="action_settings">Nastavení</string>
|
||||
@@ -28,15 +28,10 @@
|
||||
<string name="add_habit">Přidat zvyk</string>
|
||||
<string name="color_picker_default_title">Změnit barvu</string>
|
||||
<string name="toast_habit_created">Zvyk vytvořen.</string>
|
||||
<string name="toast_habit_deleted">Zvyky smazány.</string>
|
||||
<string name="toast_habit_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="habit_strength">Síla zvyku</string>
|
||||
<string name="history">Historie</string>
|
||||
<string name="clear">Smazat</string>
|
||||
<string name="days">dní</string>
|
||||
<string name="reminder">Připomenutí</string>
|
||||
<string name="save">Uložit</string>
|
||||
<string name="streaks">Série</string>
|
||||
@@ -64,20 +59,16 @@
|
||||
<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_description">Praktičtější, ale může způsobit nechtěné označení.</string>
|
||||
<string name="pref_snooze_interval_title">Doba odložení upomínky</string>
|
||||
<string name="pref_rate_this_app">Ohodnoťte nás v Google Play</string>
|
||||
<string name="pref_send_feedback">Zpětná vazba vývojáři</string>
|
||||
<string name="pref_view_source_code">Zobrazit zdroj. kód na GitHub</string>
|
||||
<string name="links">Odkazy</string>
|
||||
<string name="name">Jméno</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="hint_title">Věděli jste?</string>
|
||||
<string name="hint_drag">Přeřazení záznamů proveď stisknutím a podržením názvu zvyku a poté přesunutím na správné místo.</string>
|
||||
<string name="hint_landscape">Můžeš vidět více dnů otočením telefonu na šířku.</string>
|
||||
<string name="delete_habits">Smazat zvyky</string>
|
||||
<string name="delete_habits_message">Označené zvyky budou navždy odstraněny. Toto nelze vzít zpět.</string>
|
||||
<string name="habit_not_found">Zvyk smazán / nenalezen</string>
|
||||
<string name="weekends">Víkendy</string>
|
||||
<string name="any_weekday">Pondělí až pátek</string>
|
||||
@@ -111,7 +102,7 @@
|
||||
<string name="generate_bug_report">Generovat výpis chyb</string>
|
||||
<string name="troubleshooting">Řešení problémů</string>
|
||||
<string name="help_translate">Pomozte s překladem aplikace</string>
|
||||
<string name="night_mode">Noční téma</string>
|
||||
<string name="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="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>
|
||||
@@ -170,16 +161,16 @@
|
||||
<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="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_month">%d krát za měsíc</string>
|
||||
<string name="yes_or_no_short_example">např. Cvičení</string>
|
||||
<string name="color">Barva</string>
|
||||
<string name="example_target">např. 15</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_units_example" comment="Feel free to replace by "km" if that is more common in your country">např. míle</string>
|
||||
<string name="measurable_question_example">Např. kolik mil jste dnes uběhl?</string>
|
||||
<string name="measurable_units_example">např. míle</string>
|
||||
<string name="every_month">Každý měsíc</string>
|
||||
<string name="validation_cannot_be_blank">Musíte vyplnit</string>
|
||||
<string name="today">Dnes</string>
|
||||
<string name="you_are_now_a_developer">Nyní jste vývojář</string>
|
||||
</resources>
|
||||
|
||||
@@ -17,9 +17,7 @@
|
||||
~ You should have received a copy of the GNU General Public License along
|
||||
~ with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
-->
|
||||
|
||||
<!--Generated by crowdin.com-->
|
||||
<resources>
|
||||
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||
<string name="app_name">Loop Vane Tracker</string>
|
||||
<string name="main_activity_title">Vaner</string>
|
||||
<string name="action_settings">Indstillinger</string>
|
||||
@@ -30,27 +28,37 @@
|
||||
<string name="add_habit">Tilføj vane</string>
|
||||
<string name="color_picker_default_title">Skift farve</string>
|
||||
<string name="toast_habit_created">Vanen er skabt.</string>
|
||||
<string name="toast_habit_deleted">Vaner slettet</string>
|
||||
<string name="toast_habit_changed">Vanen er ændret</string>
|
||||
<string name="toast_habit_archived">Vanerne er arkiveret</string>
|
||||
<string name="toast_habit_unarchived">Vanerne er fjernet fra arkivet</string>
|
||||
<plurals name="toast_habits_changed">
|
||||
<item quantity="one">Vanen er ændret</item>
|
||||
<item quantity="other">Vanerne er ændret</item>
|
||||
</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="habit_strength">Vanestyrke</string>
|
||||
<string name="history">Historie</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="save">Gem</string>
|
||||
<string name="streaks">Streaks</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="reminder_off">Fra</string>
|
||||
<string name="create_habit">Opret vane</string>
|
||||
<string name="edit_habit">Rediger vane</string>
|
||||
<string name="check">Afkryds</string>
|
||||
<string name="snooze">Senere</string>
|
||||
<!-- App introduction -->
|
||||
<string name="intro_title_1">Velkommen</string>
|
||||
<string name="intro_description_1">Loop Habit Tracker hjælper dig med at holde gode vaner.</string>
|
||||
<string name="intro_title_2">Skab nogle nye vaner</string>
|
||||
@@ -64,6 +72,8 @@
|
||||
<string name="interval_4_hour">4 timer</string>
|
||||
<string name="interval_8_hour">8 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_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>
|
||||
@@ -72,11 +82,18 @@
|
||||
<string name="links">Henvisninger</string>
|
||||
<string name="name">Navn</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_drag">For at omarrangere poster, tryk og hold på navnet på den vane, og træk den til det korrekte sted.</string>
|
||||
<string name="hint_landscape">Du kan se flere dage ved at sætte telefonen i liggende tilstand.</string>
|
||||
<string name="delete_habits">Slet vaner</string>
|
||||
<string name="delete_habits_message">Vanerne vil blive slettet permanent. Denne handling kan ikke fortrydes.</string>
|
||||
<plurals name="delete_habits_title">
|
||||
<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="weekends">Weekender</string>
|
||||
<string name="any_weekday">Mandag til Fredag</string>
|
||||
@@ -87,13 +104,22 @@
|
||||
<string name="clear_label">Fjern</string>
|
||||
<string name="select_hours">Vælg timer</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="translators">Oversættere</string>
|
||||
<string name="developers">Udviklere</string>
|
||||
<string name="version_n">Version %s</string>
|
||||
<string name="frequency">Hyppighed</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_week">Hver uge</string>
|
||||
<string name="help">Hjælp & FAQ</string>
|
||||
@@ -110,7 +136,7 @@
|
||||
<string name="generate_bug_report">Generer fejlrapport</string>
|
||||
<string name="troubleshooting">Fejlfinding</string>
|
||||
<string name="help_translate">Hjælpe med at oversætte denne app</string>
|
||||
<string name="night_mode">Nat-tilstand</string>
|
||||
<string name="night_mode" comment="dark_theme">Nat-tilstand</string>
|
||||
<string name="use_pure_black">Brug ren sort i nat-tilstand</string>
|
||||
<string name="pure_black_description">Erstatter grå baggrunde med ren sort i nat-tilstand. Reducerer batteriforbruget i telefoner med AMOLED skærm.</string>
|
||||
<string name="interface_preferences">Grænseflade</string>
|
||||
@@ -122,8 +148,7 @@
|
||||
<string name="quarter">Kvartal</string>
|
||||
<string name="year">År</string>
|
||||
<string name="total">I alt</string>
|
||||
<!-- Different types of habits -->
|
||||
<!-- Middle part of the sentence '1 time in xx days' -->
|
||||
<string name="yes_or_no">Ja eller nej</string>
|
||||
<string name="every_x_days">Hver %d dage</string>
|
||||
<string name="every_x_weeks">Hver %d uger</string>
|
||||
<string name="score">Point</string>
|
||||
@@ -134,6 +159,8 @@
|
||||
<string name="hide_archived">Skjul arkiverede</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="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="database_repaired">Database repareret.</string>
|
||||
<string name="uncheck">Fjern afkrydsning</string>
|
||||
@@ -145,5 +172,54 @@
|
||||
<string name="by_name">Efter navn</string>
|
||||
<string name="by_color">Efter farve</string>
|
||||
<string name="by_score">Efter score</string>
|
||||
<string name="by_status">Efter status</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>
|
||||
|
||||
@@ -99,7 +99,7 @@
|
||||
<string name="any_weekday">Montag bis Freitag</string>
|
||||
<string name="any_day">Jeden Tag</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="clear_label">Löschen</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="file_not_recognized">Datei nicht erkannt.</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="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_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="generate_bug_report">Erstelle einen Fehlerbericht</string>
|
||||
<string name="troubleshooting">Fehlerbehebung</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="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="reverse_days">Kehre die Tagesreihenfolge um</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="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="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>
|
||||
</resources>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?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.
|
||||
~
|
||||
@@ -17,7 +17,7 @@
|
||||
~ You should have received a copy of the GNU General Public License along
|
||||
~ with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
-->
|
||||
<resources>
|
||||
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||
<string name="app_name">Loop - Καταγραφή Συνηθειών</string>
|
||||
<string name="main_activity_title">Συνήθειες</string>
|
||||
<string name="action_settings">Ρυθμίσεις</string>
|
||||
@@ -28,15 +28,10 @@
|
||||
<string name="add_habit">Νέα συνήθεια</string>
|
||||
<string name="color_picker_default_title">Αλλαγή χρώματος</string>
|
||||
<string name="toast_habit_created">Η συνήθεια δημιουργήθηκε</string>
|
||||
<string name="toast_habit_deleted">Οι συνήθειες διαγράφηκαν</string>
|
||||
<string name="toast_habit_changed">Η συνήθεια άλλαξε</string>
|
||||
<string name="toast_habit_archived">Η συνήθεια αρχειοθετήθηκε.</string>
|
||||
<string name="toast_habit_unarchived">Έγινε αφαίρεση αρχειοθέτησης.</string>
|
||||
<string name="overview">Επισκόπηση</string>
|
||||
<string name="habit_strength">Δύναμη συνήθειας</string>
|
||||
<string name="history">Ιστορικό</string>
|
||||
<string name="clear">Εκκαθάριση</string>
|
||||
<string name="days">ημέρες</string>
|
||||
<string name="reminder">Υπενθύμιση</string>
|
||||
<string name="save">Αποθήκευση</string>
|
||||
<string name="streaks">Σερί</string>
|
||||
@@ -64,20 +59,16 @@
|
||||
<string name="interval_custom">Προσαρμογή</string>
|
||||
<string name="pref_toggle_title">Κάντε εναλλαγή των επαναλήψεων με σύντομο πάτημα</string>
|
||||
<string name="pref_toggle_description">Βολικότερο, αλλά ίσως προκαλέσει ακούσιες εναλλαγές.</string>
|
||||
<string name="pref_snooze_interval_title">Διάστημα αναβολής υπενθυμίσεων</string>
|
||||
<string name="pref_rate_this_app">Βαθμολογήστε αυτή την εφαρμογή στο Google Play</string>
|
||||
<string name="pref_send_feedback">Στείλετε σχόλια</string>
|
||||
<string name="pref_view_source_code">Δείτε τον πηγαίο κώδικα στο GitHub</string>
|
||||
<string name="links">Σύνδεσμοι</string>
|
||||
<string name="name">Όνομα</string>
|
||||
<string name="settings">Ρυθμίσεις</string>
|
||||
<string name="snooze_interval">Διάστημα αναβολής</string>
|
||||
<string name="select_snooze_delay">Επιλογή καθυστέρησης αναβολής</string>
|
||||
<string name="hint_title">Γνωρίζατε;</string>
|
||||
<string name="hint_drag">Αναδιατάξετε τις συνήθειες πατώντας παρατεταμένα στο όνομα και σύροντας στην σωστή θέση.</string>
|
||||
<string name="hint_landscape">Μπορείτε να δείτε περισσότερες ημέρες στην οριζόντια προβολή.</string>
|
||||
<string name="delete_habits">Διαγραφή συνηθειών</string>
|
||||
<string name="delete_habits_message">Οι συνήθειες θα διαγραφτούν οριστικά. Αυτό δεν μπορεί να αναιρεθεί.</string>
|
||||
<string name="habit_not_found">Η συνήθεια διαγράφηκε / δεν βρέθηκε</string>
|
||||
<string name="weekends">Σαββατοκύριακα</string>
|
||||
<string name="any_weekday">Δευτέρα μέχρι Παρασκευή</string>
|
||||
@@ -111,7 +102,7 @@
|
||||
<string name="generate_bug_report">Παραγωγή αναφοράς bug.</string>
|
||||
<string name="troubleshooting">Αντιμετ.Προβλημάτων</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="pure_black_description">Αντικαθιστά τα γκρί υπόβαθρα με απόλυτα μαύρα σε νυχτ.λειτουργία. Μειώνει την κατανάλωση μπαταρίας σε συσκευές με οθόνη AMOLED.</string>
|
||||
<string name="interface_preferences">Διεπιφάνεια</string>
|
||||
@@ -170,15 +161,14 @@
|
||||
<string name="example_notes">(Προαιρετικό)</string>
|
||||
<string name="yes_or_no_example">π.χ. Ξύπνησες νωρίς σήμερα; Ασκήθηκες; Έπαιξες σκάκι;</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_month">%d φορές το μήνα</string>
|
||||
<string name="yes_or_no_short_example">π.χ. Σωματική άσκηση</string>
|
||||
<string name="color">Χρώμα</string>
|
||||
<string name="example_target">π.χ. 15</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_units_example" comment="Feel free to replace by "km" if that is more common in your country">π.χ. χιλιόμετρα</string>
|
||||
<string name="measurable_question_example">π.χ. Πόσα χιλιόμετρα έτρεξες σήμερα?</string>
|
||||
<string name="measurable_units_example">π.χ. χιλιόμετρα</string>
|
||||
<string name="every_month">Κάθε μήνα</string>
|
||||
<string name="validation_cannot_be_blank">Δεν μπορεί να είναι κενό</string>
|
||||
<string name="today">Σήμερα</string>
|
||||
|
||||
@@ -17,9 +17,7 @@
|
||||
~ You should have received a copy of the GNU General Public License along
|
||||
~ with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
-->
|
||||
|
||||
<!--Generated by crowdin.com-->
|
||||
<resources>
|
||||
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||
<string name="app_name">Loop Habit Tracker</string>
|
||||
<string name="main_activity_title">Kutimoj</string>
|
||||
<string name="action_settings">Agordoj</string>
|
||||
@@ -29,27 +27,56 @@
|
||||
<string name="unarchive">Elarĥivigi</string>
|
||||
<string name="add_habit">Aldonu kutimon</string>
|
||||
<string name="color_picker_default_title">Ŝanĝi koloron</string>
|
||||
<string name="toast_habit_changed">Kutimo ŝanĝita</string>
|
||||
<string name="toast_habit_archived">Kutimo arĥivita</string>
|
||||
<string name="toast_habit_created">Kutimo kreita</string>
|
||||
<string name="overview">Generala vidado</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="save">Konservi</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="create_habit">Krei kutimon</string>
|
||||
<string name="edit_habit">Eldoni kutimon</string>
|
||||
<string name="check">Kontrolu</string>
|
||||
<string name="snooze">Poste</string>
|
||||
<!-- App introduction -->
|
||||
<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_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="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="any_weekday">Lundo al vendredo</string>
|
||||
<string name="any_day">Io semajntago</string>
|
||||
<string name="select_weekdays">Elekti tagojn</string>
|
||||
<string name="export_to_csv">Eksporti kiel CSV</string>
|
||||
<string name="done_label">Farite</string>
|
||||
<string name="clear_label">Liberigi</string>
|
||||
<string name="select_hours">Elekti horojn</string>
|
||||
<string name="select_minutes">Elekti minutojn</string>
|
||||
<string name="about">Pri programo</string>
|
||||
@@ -57,29 +84,73 @@
|
||||
<string name="developers">Evoluigantoj</string>
|
||||
<string name="version_n">Versio %s</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_week">Ĉiu semajno</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="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="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="week">Semajno</string>
|
||||
<string name="month">Monato</string>
|
||||
<string name="quarter">Jarkvarono</string>
|
||||
<string name="year">Jaro</string>
|
||||
<!-- Different types of habits -->
|
||||
<!-- Middle part of the sentence '1 time in xx days' -->
|
||||
<string name="total">Totalo</string>
|
||||
<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="filter">Filtrilo</string>
|
||||
<string name="hide_completed">Kaŝi kompletajn</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="database_repaired">Datumbazon riparita.</string>
|
||||
<string name="uncheck">Malmarku</string>
|
||||
<string name="toggle">Ŝalti</string>
|
||||
<string name="action">Ago</string>
|
||||
<string name="habit">Kutimo</string>
|
||||
<string name="sort">Enkursigi</string>
|
||||
<string name="manually">Mane</string>
|
||||
<string name="by_name">Laŭ nomo</string>
|
||||
<string name="by_color">Laŭ koloro</string>
|
||||
<string name="by_score">Laŭ poentaro</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>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?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.
|
||||
~
|
||||
@@ -17,7 +17,7 @@
|
||||
~ You should have received a copy of the GNU General Public License along
|
||||
~ with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
-->
|
||||
<resources>
|
||||
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||
<string name="app_name">Loop Analizador de Hábitos</string>
|
||||
<string name="main_activity_title">Hábitos</string>
|
||||
<string name="action_settings">Configuración</string>
|
||||
@@ -28,19 +28,31 @@
|
||||
<string name="add_habit">Agregar hábito</string>
|
||||
<string name="color_picker_default_title">Cambiar color</string>
|
||||
<string name="toast_habit_created">Hábito creado</string>
|
||||
<string name="toast_habit_deleted">Hábitos eliminados</string>
|
||||
<string name="toast_habit_changed">Hábito cambiado</string>
|
||||
<string name="toast_habit_archived">Hábitos archivados</string>
|
||||
<string name="toast_habit_unarchived">Hábitos desarchivados</string>
|
||||
<plurals name="toast_habits_changed">
|
||||
<item quantity="one">Hábito cambiado</item>
|
||||
<item quantity="other">Hábitos cambiados</item>
|
||||
</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="habit_strength">Fuerza del hábito</string>
|
||||
<string name="history">Historial</string>
|
||||
<string name="clear">Borrar</string>
|
||||
<string name="days">días</string>
|
||||
<string name="reminder">Recordatorio</string>
|
||||
<string name="save">Guardar</string>
|
||||
<string name="streaks">Rachas</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="reminder_off">Apagado</string>
|
||||
<string name="create_habit">Crear hábito</string>
|
||||
@@ -64,20 +76,24 @@
|
||||
<string name="interval_custom">Personalizar...</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_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_send_feedback">Enviar sugerencias al desarrollador</string>
|
||||
<string name="pref_view_source_code">Ver código fuente en GitHub</string>
|
||||
<string name="links">Enlaces</string>
|
||||
<string name="name">Nombre</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="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_landscape">Puedes ver más días al poner tu teléfono en modo horizontal.</string>
|
||||
<string name="delete_habits">Eliminar Hábitos</string>
|
||||
<string name="delete_habits_message">Los hábitos serán eliminados permanentemente. Esta acción no se puede deshacer.</string>
|
||||
<plurals name="delete_habits_title">
|
||||
<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="weekends">Fines de semana</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="troubleshooting">Solución de problemas</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="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>
|
||||
@@ -147,6 +163,7 @@
|
||||
<string name="by_name">Por nombre</string>
|
||||
<string name="by_color">Por color</string>
|
||||
<string name="by_score">Por puntuación</string>
|
||||
<string name="by_status">Por estado</string>
|
||||
<string name="export">Exportar</string>
|
||||
<string name="long_press_to_edit">Mantenga presionado para cambiar el valor</string>
|
||||
<string name="change_value">Cambiar valor</string>
|
||||
@@ -170,16 +187,30 @@
|
||||
<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="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_month">%d veces al mes</string>
|
||||
<string name="yes_or_no_short_example">ej. Ejercicio</string>
|
||||
<string name="color">Color</string>
|
||||
<string name="example_target">ej. 15</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_units_example" comment="Feel free to replace by "km" if that is more common in your country">ej. millas</string>
|
||||
<string name="measurable_question_example">ej. ¿Cuántos quilómetros has corrido hoy?</string>
|
||||
<string name="measurable_units_example">ej. millas</string>
|
||||
<string name="every_month">Cada mes</string>
|
||||
<string name="validation_cannot_be_blank">No puede estar en blanco</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>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?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.
|
||||
~
|
||||
@@ -17,7 +17,7 @@
|
||||
~ You should have received a copy of the GNU General Public License along
|
||||
~ with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
-->
|
||||
<resources>
|
||||
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||
<string name="app_name">Loop Habit Tracker</string>
|
||||
<string name="main_activity_title">Ohiturak</string>
|
||||
<string name="action_settings">Ezarpenak</string>
|
||||
@@ -28,15 +28,10 @@
|
||||
<string name="add_habit">Gehitu ohitura</string>
|
||||
<string name="color_picker_default_title">Kolorea aldatu</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="habit_strength">Ohituraren indarra</string>
|
||||
<string name="history">Historia</string>
|
||||
<string name="clear">Garbitu</string>
|
||||
<string name="days">egunetan</string>
|
||||
<string name="reminder">Oroigarria</string>
|
||||
<string name="save">Gorde</string>
|
||||
<string name="streaks">Boladak</string>
|
||||
@@ -64,20 +59,16 @@
|
||||
<string name="interval_custom">Pertsonalizatua...</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_snooze_interval_title">Atzeratze tartea oroigarrietan</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_view_source_code">Iturburu kodea GitHuben ikusi</string>
|
||||
<string name="links">Loturak</string>
|
||||
<string name="name">Izena</string>
|
||||
<string name="settings">Ezarpenak</string>
|
||||
<string name="snooze_interval">Atzeratze tartea</string>
|
||||
<string name="select_snooze_delay">Aukeratu atzerapen denbora</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_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="weekends">Asteburuak</string>
|
||||
<string name="any_weekday">Astelehenetik ostiralera</string>
|
||||
@@ -111,7 +102,7 @@
|
||||
<string name="generate_bug_report">Akats txostena sortu</string>
|
||||
<string name="troubleshooting">Arazoen konponketa</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="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>
|
||||
@@ -170,15 +161,14 @@
|
||||
<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="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_month">Hilean %d aldiz</string>
|
||||
<string name="yes_or_no_short_example">adib. Ariketa</string>
|
||||
<string name="color">Kolorea</string>
|
||||
<string name="example_target">adib. 15</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_units_example" comment="Feel free to replace by "km" if that is more common in your country">adib. Kilometroak</string>
|
||||
<string name="measurable_question_example">adib. Zenbat kilometro egin dituzu korrika gaur?</string>
|
||||
<string name="measurable_units_example">adib. Kilometroak</string>
|
||||
<string name="every_month">Hilabetero</string>
|
||||
<string name="validation_cannot_be_blank">Ezin da hutsik egon</string>
|
||||
<string name="today">Gaur</string>
|
||||
|
||||