Compare commits

...

334 Commits

Author SHA1 Message Date
Sylvia van Os
36e7ea5b20 Release Catima 2.21.2 2023-01-27 18:36:24 +01:00
Sylvia van Os
85d53ae3c7 Merge pull request #1194 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-01-27 18:07:26 +01:00
Sylvia van Os
e9b6b5682e Translated using Weblate (Dutch)
Currently translated at 100.0% (275 of 275 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2023-01-27 18:01:46 +01:00
SC
0abc583d10 Translated using Weblate (Portuguese)
Currently translated at 100.0% (115 of 115 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt/
2023-01-27 17:56:35 +01:00
SC
8c91d30b4c Translated using Weblate (Portuguese)
Currently translated at 100.0% (275 of 275 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt/
2023-01-27 17:56:31 +01:00
Oğuz Ersen
76e8715ab2 Translated using Weblate (Turkish)
Currently translated at 100.0% (275 of 275 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2023-01-27 17:56:31 +01:00
Quentin PAGÈS
f5f2edca75 Translated using Weblate (Occitan)
Currently translated at 0.8% (1 of 115 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/oc/
2023-01-27 17:56:31 +01:00
109247019824
e648e22ecc Translated using Weblate (Bulgarian)
Currently translated at 100.0% (275 of 275 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2023-01-27 17:56:31 +01:00
HudobniVolk
02b020e9e5 Translated using Weblate (Slovenian)
Currently translated at 21.7% (25 of 115 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/sl/
2023-01-27 17:56:31 +01:00
Slávek Banko
e7dc3cd511 Translated using Weblate (Czech)
Currently translated at 100.0% (115 of 115 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2023-01-27 17:56:30 +01:00
Michael Moroni
eb3ac53e46 Translated using Weblate (Italian)
Currently translated at 56.5% (65 of 115 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/it/
2023-01-27 17:56:26 +01:00
Dan
dd683b4a8c Translated using Weblate (Ukrainian)
Currently translated at 100.0% (275 of 275 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/uk/
2023-01-27 17:56:24 +01:00
solokot
e90ba5d2db Translated using Weblate (Russian)
Currently translated at 100.0% (275 of 275 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2023-01-27 17:56:24 +01:00
Heimen Stoffels
07cff7eac4 Translated using Weblate (Dutch)
Currently translated at 100.0% (275 of 275 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2023-01-27 17:56:24 +01:00
Michael Moroni
3eea18fc82 Translated using Weblate (Italian)
Currently translated at 100.0% (275 of 275 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2023-01-27 17:56:23 +01:00
gallegonovato
5d3ceb6d49 Translated using Weblate (Spanish)
Currently translated at 100.0% (275 of 275 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/es/
2023-01-27 17:56:23 +01:00
Slávek Banko
3dc7a25d88 Translated using Weblate (Czech)
Currently translated at 100.0% (275 of 275 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2023-01-27 17:56:23 +01:00
Sylvia van Os
95e02d1646 Merge pull request #1191 from CatimaLoyalty/dependabot/gradle/net.lingala.zip4j-zip4j-2.11.3
Bump zip4j from 2.11.2 to 2.11.3
2023-01-26 19:15:58 +01:00
Sylvia van Os
81ecf8ba92 Merge pull request #1193 from CatimaLoyalty/security/gradle_wrapper_verification
Add Gradle wrapper verification
2023-01-26 19:10:13 +01:00
Sylvia van Os
bf0e1a2e77 Add Gradle wrapper verification 2023-01-26 19:02:04 +01:00
Sylvia van Os
4d1c9244fd Merge pull request #1192 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-01-26 18:48:57 +01:00
HudobniVolk
1f1e523100 Translated using Weblate (Slovenian)
Currently translated at 20.1% (23 of 114 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/sl/
2023-01-26 17:55:06 +01:00
HudobniVolk
cb32cf9e52 Translated using Weblate (Slovenian)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sl/
2023-01-26 17:55:06 +01:00
dependabot[bot]
af812d8cda Bump zip4j from 2.11.2 to 2.11.3
Bumps [zip4j](https://github.com/srikanth-lingala/zip4j) from 2.11.2 to 2.11.3.
- [Release notes](https://github.com/srikanth-lingala/zip4j/releases)
- [Commits](https://github.com/srikanth-lingala/zip4j/compare/v2.11.2...v2.11.3)

---
updated-dependencies:
- dependency-name: net.lingala.zip4j:zip4j
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-26 02:03:45 +00:00
Sylvia van Os
c8a7addc52 Merge pull request #1190 from CatimaLoyalty/create-pull-request/patch-1674683901
Update Fastlane changelogs
2023-01-25 22:58:43 +01:00
TheLastProject
3e64d7c5ad Update Fastlane changelogs 2023-01-25 21:58:21 +00:00
Sylvia van Os
277462a939 Update CHANGELOG 2023-01-25 22:58:03 +01:00
Sylvia van Os
24623d5c58 Merge pull request #1189 from CatimaLoyalty/sdk/33
Update targetSdk to 33
2023-01-25 22:57:34 +01:00
Sylvia van Os
4b25b7ad39 Update targetSdk to 33 2023-01-25 19:59:08 +01:00
Sylvia van Os
4016d5499b Merge pull request #1188 from CatimaLoyalty/sdk/32
Update targetSdk to 32
2023-01-25 19:40:53 +01:00
Sylvia van Os
d8b96a8c5f Update targetSdk to 32 2023-01-25 19:36:09 +01:00
Sylvia van Os
614753303f Fix crash when permissionRequestResult gets cancelled 2023-01-25 18:30:47 +01:00
Sylvia van Os
50a344b97f Merge branch 'main' of github.com:TheLastProject/loyalty-card-locker 2023-01-25 18:23:54 +01:00
Sylvia van Os
2cd6da6ffc Fix crash on invalid import URI 2023-01-25 18:13:58 +01:00
Sylvia van Os
c03fba133f Merge pull request #1187 from CatimaLoyalty/create-pull-request/patch-1674662809
Update Fastlane changelogs
2023-01-25 17:32:55 +01:00
TheLastProject
f3cba588f6 Update Fastlane changelogs 2023-01-25 16:06:48 +00:00
Sylvia van Os
ad364ad0ac Merge branch 'main' of github.com:TheLastProject/loyalty-card-locker 2023-01-25 17:06:19 +01:00
Sylvia van Os
f4cff85d93 Document permission change 2023-01-25 17:06:08 +01:00
Sylvia van Os
cbc86ff131 Merge pull request #1185 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-01-24 23:31:38 +01:00
Sylvia van Os
5f733474a9 Merge pull request #1186 from CatimaLoyalty/fix/permissionRefactor
Refactor permission code
2023-01-24 23:28:38 +01:00
Sylvia van Os
89a13cecf5 Create extra result function to work around onPermissionResult not existing on Android 5 2023-01-24 23:14:57 +01:00
Sylvia van Os
fd2400eaf5 Refactor permission code
- Remove write permission (was never needed)
- Only use read permission for Android 5 and 6
- Simplify logic by mocking a valid permission result if permission
  already granted
2023-01-24 20:44:17 +01:00
Sylvia van Os
9598f2f4ff Translated using Weblate (Slovenian)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sl/
2023-01-24 07:53:22 +01:00
IllusiveMan196
acca53787c Translated using Weblate (Ukrainian)
Currently translated at 100.0% (114 of 114 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2023-01-23 02:12:44 +01:00
HudobniVolk
060e360344 Translated using Weblate (Slovenian)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sl/
2023-01-23 02:12:44 +01:00
Sylvia van Os
9ef014e05c Fix main rename breaking github scripts 2023-01-22 13:12:25 +01:00
Sylvia van Os
4cb27d3bd5 Merge pull request #1182 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-01-20 17:00:24 +01:00
stone wow
95e21cc112 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hans/
2023-01-20 16:09:32 +01:00
Sylvia van Os
d5f915a290 Merge pull request #1181 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-01-18 22:03:04 +01:00
HudobniVolk
42e89bb5cc Translated using Weblate (Slovenian)
Currently translated at 19.2% (22 of 114 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/sl/
2023-01-18 21:51:11 +01:00
Sylvia van Os
048fb48300 Fix reproducible build script 2023-01-16 20:32:42 +01:00
Sylvia van Os
b1c82dbae0 Merge pull request #1159 from CatimaLoyalty/feature/rb
Add script to build reproducibly
2023-01-16 19:48:56 +01:00
Sylvia van Os
ea8c6f96f7 Merge pull request #1180 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-01-16 19:05:26 +01:00
HudobniVolk
201ec78694 Translated using Weblate (Slovenian)
Currently translated at 7.0% (8 of 114 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/sl/
2023-01-16 18:53:07 +01:00
Dan
05a03455c1 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/uk/
2023-01-16 18:53:07 +01:00
HudobniVolk
63f4cbb8ca Translated using Weblate (Slovenian)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sl/
2023-01-16 18:53:07 +01:00
Sylvia van Os
a444607476 Merge pull request #1178 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-01-14 23:58:58 +01:00
Giovanni Donisi
89102ad0bf Translated using Weblate (Italian)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2023-01-14 23:12:40 +01:00
Sylvia van Os
d2623b8690 Merge pull request #1177 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-01-13 23:08:03 +01:00
Jiri Grönroos
80ddd48184 Translated using Weblate (Finnish)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fi/
2023-01-13 18:50:22 +01:00
Sylvia van Os
410a619a70 Merge pull request #1175 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-01-08 12:04:45 +01:00
Jiri Grönroos
1771f42860 Translated using Weblate (Finnish)
Currently translated at 95.9% (263 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fi/
2023-01-08 11:51:01 +01:00
Sylvia van Os
1e7af7ab4e Merge pull request #1174 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-01-06 13:59:27 +01:00
Piotr Strebski
f4c5af04e3 Translated using Weblate (Polish)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pl/
2023-01-06 13:51:24 +01:00
Sylvia van Os
5bcd2cdc32 Merge pull request #1171 from CatimaLoyalty/dependabot/gradle/org.robolectric-robolectric-4.9.2
Bump robolectric from 4.9.1 to 4.9.2
2022-12-28 06:48:50 +00:00
dependabot[bot]
c69a5ae4d2 Bump robolectric from 4.9.1 to 4.9.2
Bumps [robolectric](https://github.com/robolectric/robolectric) from 4.9.1 to 4.9.2.
- [Release notes](https://github.com/robolectric/robolectric/releases)
- [Commits](https://github.com/robolectric/robolectric/compare/robolectric-4.9.1...robolectric-4.9.2)

---
updated-dependencies:
- dependency-name: org.robolectric:robolectric
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-28 02:04:26 +00:00
Sylvia van Os
6bd750a60b Add script to build reproducibly 2022-12-22 22:57:55 +01:00
Sylvia van Os
8d77cc3565 Merge pull request #1169 from CatimaLoyalty/dependabot/gradle/org.robolectric-robolectric-4.9.1
Bump robolectric from 4.9 to 4.9.1
2022-12-21 12:25:35 +00:00
Sylvia van Os
7a99e0056d Merge pull request #1170 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-12-20 22:14:48 +00:00
Shailendra Maurya
03e07bc48d Translated using Weblate (Hindi)
Currently translated at 61.6% (169 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/hi/
2022-12-20 22:43:29 +01:00
dependabot[bot]
460d6c2b71 Bump robolectric from 4.9 to 4.9.1
Bumps [robolectric](https://github.com/robolectric/robolectric) from 4.9 to 4.9.1.
- [Release notes](https://github.com/robolectric/robolectric/releases)
- [Commits](https://github.com/robolectric/robolectric/compare/robolectric-4.9...robolectric-4.9.1)

---
updated-dependencies:
- dependency-name: org.robolectric:robolectric
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-20 02:04:38 +00:00
Sylvia van Os
9f946094db Merge pull request #1168 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-12-18 21:06:09 +00:00
wmilan 17
4e92f82176 Translated using Weblate (Hungarian)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/hu/
2022-12-18 21:48:04 +01:00
Sylvia van Os
7b905ac120 Translated using Weblate (English)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/en/
2022-12-17 11:46:57 +01:00
Tomasz Cukier
55c5ec929c Translated using Weblate (English)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/en/
2022-12-17 11:46:57 +01:00
Sylvia van Os
5441231f03 Merge pull request #1165 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-12-14 22:55:09 +01:00
ssantos
1818d24bc0 Translated using Weblate (Portuguese)
Currently translated at 100.0% (114 of 114 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt/
2022-12-14 22:50:15 +01:00
Sylvia van Os
ca88c070c3 Merge pull request #1163 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-12-13 23:19:14 +01:00
gallegonovato
1be387c4ec Translated using Weblate (Spanish)
Currently translated at 11.4% (13 of 114 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/es/
2022-12-13 20:50:09 +01:00
Sylvia van Os
fa3a956d69 Merge pull request #1162 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-12-12 17:07:13 +01:00
gallegonovato
8fd244e3a3 Translated using Weblate (Spanish)
Currently translated at 8.7% (10 of 114 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/es/
2022-12-12 15:51:47 +01:00
Sylvia van Os
a0e2fe11dd Merge pull request #1160 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-12-11 15:50:06 +01:00
gallegonovato
893f34e72a Translated using Weblate (Spanish)
Currently translated at 7.0% (8 of 114 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/es/
2022-12-11 14:49:57 +01:00
Sylvia van Os
cf13a9fc60 Merge pull request #1158 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-12-09 22:00:23 +01:00
IllusiveMan196
c6e6d96313 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (114 of 114 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2022-12-09 21:50:03 +01:00
Sylvia van Os
20ed9cac88 Update Google Play badge
See https://github.com/cvzi/play
2022-12-06 19:34:51 +01:00
Sylvia van Os
ae6bd937a9 Move to main 2022-12-06 19:33:04 +01:00
Sylvia van Os
e4b69e5cc5 Release Catima 2.21.1 2022-12-06 19:13:02 +01:00
Sylvia van Os
5b1062b8d1 Merge pull request #1155 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-12-06 18:41:27 +01:00
Slávek Banko
e06009852e Translated using Weblate (Czech)
Currently translated at 100.0% (114 of 114 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2022-12-06 18:35:01 +01:00
Sylvia van Os
50268f6bd1 Merge pull request #1154 from CatimaLoyalty/create-pull-request/patch-1670271647
Update Fastlane changelogs
2022-12-05 21:21:13 +01:00
TheLastProject
a85e28d46d Update Fastlane changelogs 2022-12-05 20:20:47 +00:00
Sylvia van Os
78b6be911f Merge pull request #1153 from CatimaLoyalty/fix/localeQuickSpend
Fix/locale quick spend
2022-12-05 21:20:32 +01:00
Sylvia van Os
bb80478650 Update CHANGELOG 2022-12-05 21:14:07 +01:00
Sylvia van Os
e0c06cc480 Fix locale separator in quick spend dialog 2022-12-05 21:14:00 +01:00
Sylvia van Os
b8a508649c Merge pull request #1151 from CatimaLoyalty/create-pull-request/patch-1670133932
Update contributors
2022-12-04 09:38:51 +01:00
TheLastProject
a8ce37d936 Update contributors 2022-12-04 06:05:31 +00:00
Sylvia van Os
43015abbad Merge pull request #1147 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-12-02 08:09:44 +01:00
Mario M. Viscovich
47c8dff52d Translated using Weblate (Croatian)
Currently translated at 38.3% (105 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/hr/
2022-12-02 03:47:15 +01:00
Sylvia van Os
436cf7a068 Merge pull request #1146 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-11-29 20:53:31 +01:00
IllusiveMan196
31cc3cd5d0 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (113 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2022-11-29 20:47:20 +01:00
gallegonovato
3c11c2ef1e Translated using Weblate (Spanish)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/es/
2022-11-29 20:47:15 +01:00
Sylvia van Os
fac70f0210 Merge pull request #1145 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-11-28 07:41:24 +01:00
IllusiveMan196
6e99a29312 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (113 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2022-11-28 02:49:19 +01:00
IllusiveMan196
5b67ecf157 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/uk/
2022-11-28 02:49:19 +01:00
Sylvia van Os
312470cf20 Merge pull request #1144 from CatimaLoyalty/create-pull-request/patch-1669529773
Update contributors
2022-11-27 09:34:00 +01:00
TheLastProject
4371f46ff8 Update contributors 2022-11-27 06:16:12 +00:00
Sylvia van Os
5468415b04 Merge pull request #1143 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-11-26 16:40:26 +01:00
CherryMonster222
6a68ad5d19 Translated using Weblate (Arabic)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ar/
2022-11-26 15:48:38 +01:00
IllusiveMan196
7576505044 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (113 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2022-11-26 15:48:38 +01:00
Sylvia van Os
b34a43902a Merge pull request #1141 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-11-24 18:34:31 +01:00
안재범
d3524a50a3 Translated using Weblate (Korean)
Currently translated at 38.6% (106 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ko/
2022-11-24 16:46:55 +01:00
Sylvia van Os
6508a6d5f7 Merge pull request #1116 from pfaffenrodt/feature/pick-image-file
Add support to pick image from content provider
2022-11-22 19:04:48 +01:00
Sylvia van Os
49a6cf8ae3 Merge pull request #1140 from CatimaLoyalty/create-pull-request/patch-1668925172
Update contributors
2022-11-20 10:21:12 +01:00
TheLastProject
b4238e0072 Update contributors 2022-11-20 06:19:31 +00:00
Sylvia van Os
374170bf05 Merge pull request #1139 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-11-19 23:17:41 +01:00
Jacek
ab11345c3d Translated using Weblate (Polish)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pl/
2022-11-19 21:47:02 +01:00
Sylvia van Os
10498ce1a4 Prevent NullPointerException in onBackPressed
This crash seems to somehow only happen on Huawei and Xiaomi devices.
While fairly rare, it is the most common Catima crash currently logged
on Google Play Console (8 crashes over the last 28 days).

While I don't understand how this would happen, I think it should be
relatively safe to assume that if the searchview is null the user isn't
currently searching so running the normal back code should always be the
expected behaviour.
2022-11-16 21:42:52 +01:00
Sylvia van Os
28901487ff Merge pull request #1138 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-11-15 23:17:53 +01:00
Sylvia van Os
8414f51ee8 Translated using Weblate (Polish)
Currently translated at 39.8% (45 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pl/
2022-11-15 21:48:36 +01:00
Slávek Banko
94f8adb6d7 Translated using Weblate (Czech)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2022-11-15 21:48:35 +01:00
Sylvia van Os
844a921a1a Merge pull request #1134 from CatimaLoyalty/create-pull-request/patch-1668320636
Update contributors
2022-11-14 19:47:10 +01:00
Sylvia van Os
ae8be3eda8 Merge pull request #1135 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-11-14 06:27:25 +01:00
gallegonovato
c4c15dbef8 Translated using Weblate (Spanish)
Currently translated at 3.5% (4 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/es/
2022-11-13 23:48:54 +01:00
Evgeniy Khramov
ac72035500 Translated using Weblate (Russian)
Currently translated at 32.7% (37 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2022-11-13 23:48:54 +01:00
Freddo espresso
abff3bcd39 Translated using Weblate (Greek)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/el/
2022-11-13 23:48:54 +01:00
TheLastProject
05aea28602 Update contributors 2022-11-13 06:23:55 +00:00
Sylvia van Os
e4c4dbf5a0 Merge pull request #1133 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-11-11 23:02:41 +01:00
Sylvia van Os
bb2393b6c6 Translated using Weblate (Polish)
Currently translated at 99.2% (272 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pl/
2022-11-11 22:49:16 +01:00
Gediminas Murauskas
fb330d16b5 Translated using Weblate (Lithuanian)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lt/
2022-11-11 22:49:16 +01:00
Slávek Banko
c8f1b986ec Translated using Weblate (Czech)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2022-11-11 22:49:15 +01:00
Євгеній Нешта
49a2c93d28 Translated using Weblate (Ukrainian)
Currently translated at 99.1% (112 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2022-11-09 20:48:23 +01:00
Євгеній Нешта
0992ac4099 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/uk/
2022-11-09 20:48:23 +01:00
truestorybaby
9ff29af616 Translated using Weblate (Polish)
Currently translated at 99.2% (272 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pl/
2022-11-09 20:48:23 +01:00
Sylvia van Os
fbc696047b Merge pull request #1124 from CatimaLoyalty/dependabot/gradle/com.google.zxing-core-3.5.1
Bump core from 3.5.0 to 3.5.1
2022-11-06 11:21:30 +01:00
Sylvia van Os
08a4d4b114 Release Catima 2.21.0 2022-11-06 11:16:07 +01:00
Sylvia van Os
329056301b Add Hindi to language picker 2022-11-06 10:53:39 +01:00
Sylvia van Os
fac8da69e7 Merge pull request #1127 from CatimaLoyalty/create-pull-request/patch-1667715884
Update contributors
2022-11-06 08:33:33 +01:00
TheLastProject
fad9eed43e Update contributors 2022-11-06 06:24:44 +00:00
Sylvia van Os
58a18bdd7b Merge pull request #1126 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-11-05 11:35:49 +01:00
Eric
90cb524560 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hans/
2022-11-05 11:05:28 +01:00
Sylvia van Os
ef4c57ce29 Merge pull request #1125 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-11-04 08:21:51 +01:00
Jean Mareilles
8872fad73e Translated using Weblate (French)
Currently translated at 99.1% (112 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2022-11-04 06:12:38 +01:00
dependabot[bot]
63c3330571 Bump core from 3.5.0 to 3.5.1
Bumps [core](https://github.com/zxing/zxing) from 3.5.0 to 3.5.1.
- [Release notes](https://github.com/zxing/zxing/releases)
- [Changelog](https://github.com/zxing/zxing/blob/master/CHANGES)
- [Commits](https://github.com/zxing/zxing/compare/zxing-3.5.0...zxing-3.5.1)

---
updated-dependencies:
- dependency-name: com.google.zxing:core
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-03 02:03:03 +00:00
Sylvia van Os
37d1bb9477 Merge pull request #1118 from pfaffenrodt/feature/clean-about
Cleaning code in about page
2022-11-01 22:00:55 +01:00
Pfaffenrodt
8a67d1d02b Rename open to openBrowser 2022-11-01 10:52:11 +01:00
Pfaffenrodt
6f777068ab Remove map from id to link. make link handler more solid 2022-10-30 21:04:35 +01:00
Sylvia van Os
8607e1c23c Merge pull request #1120 from CatimaLoyalty/create-pull-request/patch-1667112218
Update contributors
2022-10-30 11:17:13 +01:00
Sylvia van Os
04a319066c Merge pull request #1119 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-10-30 11:02:06 +01:00
Sylvia van Os
39f89ca943 Also replace "smart quotes" in broken translation 2022-10-30 10:33:03 +01:00
Sylvia van Os
1092d7a9ba Fix broken translation 2022-10-30 10:29:30 +01:00
TheLastProject
b54052182d Update contributors 2022-10-30 06:43:37 +00:00
SC
b971c392cf Translated using Weblate (Portuguese)
Currently translated at 100.0% (113 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt/
2022-10-29 21:01:09 +02:00
SC
cec9306387 Translated using Weblate (Portuguese)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt/
2022-10-29 21:01:09 +02:00
元气
f6a5cbbf80 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hans/
2022-10-29 21:01:09 +02:00
pfaffenrodt
4b55c414f3 Fix spacings in custom view of alert dialogs (#1117) 2022-10-29 15:12:45 +02:00
Pfaffenrodt
1aafcdc6ae Revert to reading file. Missing encoding 2022-10-29 14:44:02 +02:00
Pfaffenrodt
332e37b2eb Extract page title to about content 2022-10-29 14:19:36 +02:00
Pfaffenrodt
dff33d3bab Simplify reading contributors file 2022-10-29 14:19:36 +02:00
Pfaffenrodt
85ddc9689c Extract common html link of third party info 2022-10-29 14:19:36 +02:00
Pfaffenrodt
d91c207b60 Extract last about content 2022-10-29 14:19:36 +02:00
Pfaffenrodt
653606fae3 Extract show credits dialog. remove empty listener 2022-10-29 14:19:36 +02:00
Pfaffenrodt
f5a0c8f375 Extract about content 2022-10-29 14:19:36 +02:00
Pfaffenrodt
c71019951c Extract open link handler 2022-10-29 14:19:36 +02:00
Pfaffenrodt
ed7b79ce17 Refactor AboutActivity to avoid leaks that hold activity as reference 2022-10-29 14:19:36 +02:00
Pfaffenrodt
08cfb490d4 Remove redundant title
setTitle was called twice
2022-10-29 14:19:36 +02:00
Pfaffenrodt
7d284a85bc Extract about content from onCreate 2022-10-29 14:19:36 +02:00
Pfaffenrodt
77ef0a2833 Extract same logic to enable back button of toolbar
ManageGroupActivity setDisplayShowHomeEnabled was redundant
2022-10-29 14:19:34 +02:00
Pfaffenrodt
80130654ec Remove unused field properties 2022-10-29 14:18:50 +02:00
Pfaffenrodt
e97f7c8645 Add support to pick image from content provider 2022-10-28 23:46:40 +02:00
Sylvia van Os
e489ff6a22 Merge pull request #1115 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-10-28 17:31:58 +02:00
Jean-Luc Tibaux
de549d724c Translated using Weblate (German)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2022-10-28 09:05:42 +02:00
Sylvia van Os
5fb2dbd252 Merge pull request #1111 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-10-26 18:04:56 +02:00
Yusril A
20013cf7b7 Translated using Weblate (Indonesian)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/id/
2022-10-26 08:04:56 +02:00
J. Lavoie
78c3146c78 Translated using Weblate (French)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2022-10-26 08:04:56 +02:00
J. Lavoie
ddd7bb9968 Translated using Weblate (German)
Currently translated at 98.9% (271 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2022-10-26 08:04:56 +02:00
Tong Liu
68935f1489 Closes #1092 - Fixed contents cut off on smaller screen issue. (#1095) 2022-10-25 19:38:02 +02:00
Sylvia van Os
d9a25e1eb9 Merge pull request #1108 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-10-24 20:54:17 +02:00
Oğuz Ersen
73a837bab5 Translated using Weblate (Turkish)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2022-10-24 20:42:31 +02:00
109247019824
03be45f5a2 Translated using Weblate (Bulgarian)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2022-10-24 20:42:31 +02:00
Eric
692adafd8e Translated using Weblate (Chinese (Simplified))
Currently translated at 97.0% (266 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hans/
2022-10-24 20:42:31 +02:00
Slávek Banko
4ff9eb5219 Translated using Weblate (Czech)
Currently translated at 100.0% (113 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2022-10-24 20:42:31 +02:00
solokot
286e9fa315 Translated using Weblate (Russian)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2022-10-24 20:42:31 +02:00
Heimen Stoffels
e0b6773d2a Translated using Weblate (Dutch)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2022-10-24 20:42:31 +02:00
Allan Nordhøy
a7cb8a51a3 Translated using Weblate (Norwegian Bokmål)
Currently translated at 97.0% (266 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nb_NO/
2022-10-24 20:42:31 +02:00
Gediminas Murauskas
56c7ffa4df Translated using Weblate (Lithuanian)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lt/
2022-10-24 20:42:31 +02:00
Michael Moroni
1498f902c2 Translated using Weblate (Italian)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2022-10-24 20:42:31 +02:00
gallegonovato
eea0dd9081 Translated using Weblate (Spanish)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/es/
2022-10-24 20:42:31 +02:00
Slávek Banko
1a8c8c07aa Translated using Weblate (Czech)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2022-10-24 20:42:31 +02:00
Allan Nordhøy
3901172757 Translated using Weblate (English)
Currently translated at 99.2% (272 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/en/
2022-10-24 20:42:31 +02:00
Sylvia van Os
3c9507cb7f Merge pull request #1107 from vanogrid/fix/expiryFieldTextRemainingRed
Fix Expiry field text remaining red after the card is no longer expired
2022-10-24 19:13:53 +02:00
Alexander Ivanov
bfc38807c8 Fix Expiry field text remaining red after the card is no longer expired
Signed-off-by: Alexander Ivanov <vanogrid@gmail.com>
2022-10-24 02:14:43 +03:00
Sylvia van Os
6dc3a28026 Merge pull request #1105 from CatimaLoyalty/create-pull-request/patch-1666508787
Update contributors
2022-10-23 11:58:29 +02:00
Sylvia van Os
eeb507f04e Merge pull request #1104 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-10-23 11:58:08 +02:00
Sylvia van Os
2746547194 Merge pull request #1103 from vanogrid/fix/storingDateAt12pm
Fix DatePickerDialog sometimes storing dates at 12 PM instead of 12 AM
2022-10-23 11:55:25 +02:00
TheLastProject
c9a8e81047 Update contributors 2022-10-23 07:06:27 +00:00
huang ivan
d87b8ddd4b Translated using Weblate (Chinese (Simplified))
Currently translated at 97.0% (265 of 273 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hans/
2022-10-23 06:00:18 +02:00
Alexander Ivanov
7dfa7071e3 Fix DatePickerDialog sometimes storing dates at 12:00 PM instead of 12:00 AM 2022-10-22 20:46:22 +03:00
Sylvia van Os
92f0091b1d Merge pull request #1086 from recursiveribbons/refactor-importer
Refactor Importer to not read entire file as String
2022-10-22 18:13:38 +02:00
Tomer Ben-Rachel
54d8f30bf1 Offer import when users click on supported import files (#1096) 2022-10-22 12:13:06 +02:00
bors[bot]
f7ef13d594 Merge #1101
1101: Translations update from Hosted Weblate r=TheLastProject a=weblate

Translations update from [Hosted Weblate](https://hosted.weblate.org) for [Catima/Android](https://hosted.weblate.org/projects/catima/catima/).


It also includes following components:

* [Catima/Android (Fastlane)](https://hosted.weblate.org/projects/catima/fastlane/)



Current translation status:

![Weblate translation status](https://hosted.weblate.org/widgets/catima/-/catima/horizontal-auto.svg)

Co-authored-by: J. Lavoie <j.lavoie@net-c.ca>
Co-authored-by: Gediminas Murauskas <muziejusinfo@gmail.com>
Co-authored-by: Mindaugas <mindaugasjurgelenas1997@gmail.com>
Co-authored-by: Angela Enogieru <angys1may@gmail.com>
Co-authored-by: SKULD <ala20031028@163.com>
Co-authored-by: AnimeshChatterjee1 <animesh.chatterjee02@gmail.com>
Co-authored-by: Rishi Agarwal <rishiagarwal130903@gmail.com>
Co-authored-by: Sylvia van Os <sylvia@hackerchick.me>
2022-10-21 18:02:41 +00:00
Rishi Agarwal
2a1157256b Translated using Weblate (Hindi)
Currently translated at 54.5% (149 of 273 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/hi/
2022-10-21 19:57:29 +02:00
Sylvia van Os
213ef5060f Translated using Weblate (Slovak)
Currently translated at 74.7% (204 of 273 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sk/
2022-10-21 19:57:28 +02:00
Gediminas Murauskas
bc24e263b9 Translated using Weblate (Lithuanian)
Currently translated at 100.0% (273 of 273 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lt/
2022-10-21 19:57:28 +02:00
Gediminas Murauskas
8da70c41b2 Translated using Weblate (Lithuanian)
Currently translated at 100.0% (273 of 273 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lt/
2022-10-21 16:36:01 +02:00
Rishi Agarwal
4d81846fe0 Translated using Weblate (Hindi)
Currently translated at 44.3% (121 of 273 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/hi/
2022-10-21 16:36:01 +02:00
AnimeshChatterjee1
2afdedd0b6 Translated using Weblate (Hindi)
Currently translated at 44.3% (121 of 273 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/hi/
2022-10-21 16:36:01 +02:00
SKULD
8d944cbb24 Translated using Weblate (Chinese (Simplified))
Currently translated at 97.0% (265 of 273 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hans/
2022-10-21 16:36:01 +02:00
Angela Enogieru
3ffec94b47 Translated using Weblate (Slovak)
Currently translated at 75.0% (205 of 273 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sk/
2022-10-21 16:36:01 +02:00
Mindaugas
9176dc98ee Translated using Weblate (Lithuanian)
Currently translated at 100.0% (273 of 273 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lt/
2022-10-21 16:36:01 +02:00
Gediminas Murauskas
9881854d13 Translated using Weblate (Lithuanian)
Currently translated at 100.0% (273 of 273 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lt/
2022-10-21 16:36:01 +02:00
J. Lavoie
2e4d1fa448 Translated using Weblate (Italian)
Currently translated at 100.0% (273 of 273 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2022-10-21 16:36:01 +02:00
J. Lavoie
97ca1440b0 Translated using Weblate (French)
Currently translated at 100.0% (273 of 273 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2022-10-21 16:36:01 +02:00
J. Lavoie
a4688c4450 Translated using Weblate (German)
Currently translated at 98.9% (270 of 273 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2022-10-21 16:36:01 +02:00
Sylvia van Os
a7ae2a333a Merge pull request #1100 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-10-20 19:03:44 +02:00
Laura Ferraz
823e99bd90 Translated using Weblate (Portuguese)
Currently translated at 97.8% (267 of 273 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt/
2022-10-20 16:06:34 +02:00
Oğuz Ersen
e32fccc694 Translated using Weblate (Turkish)
Currently translated at 100.0% (273 of 273 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2022-10-20 16:06:34 +02:00
109247019824
dd568ab51d Translated using Weblate (Bulgarian)
Currently translated at 100.0% (273 of 273 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2022-10-20 16:06:34 +02:00
Max
17f55e577b Translated using Weblate (Polish)
Currently translated at 39.8% (45 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pl/
2022-10-20 16:06:33 +02:00
solokot
3f77223e65 Translated using Weblate (Russian)
Currently translated at 100.0% (273 of 273 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2022-10-20 16:06:33 +02:00
Max
28aad933c5 Translated using Weblate (Polish)
Currently translated at 100.0% (273 of 273 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pl/
2022-10-20 16:06:33 +02:00
Heimen Stoffels
52ca8396db Translated using Weblate (Dutch)
Currently translated at 99.6% (272 of 273 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2022-10-20 16:06:33 +02:00
Michael Moroni
bc941544ae Translated using Weblate (Italian)
Currently translated at 100.0% (273 of 273 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2022-10-20 16:06:33 +02:00
gallegonovato
e3c3b176eb Translated using Weblate (Spanish)
Currently translated at 100.0% (273 of 273 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/es/
2022-10-20 16:06:33 +02:00
Max
3b0b92b954 Translated using Weblate (English)
Currently translated at 99.2% (271 of 273 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/en/
2022-10-20 16:06:33 +02:00
diksha-2911
bfcae03420 Translated using Weblate (Hindi)
Currently translated at 34.9% (93 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/hi/
2022-10-20 16:06:33 +02:00
Md. Al-Amin
ad4db1ef37 Translated using Weblate (Bengali)
Currently translated at 33.4% (89 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bn/
2022-10-20 16:06:33 +02:00
Ágata Leuck
fa1a7fd2f1 Translated using Weblate (Portuguese)
Currently translated at 100.0% (113 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt/
2022-10-20 16:06:33 +02:00
Gediminas Murauskas
7eac08d0a1 Translated using Weblate (Lithuanian)
Currently translated at 80.0% (213 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lt/
2022-10-20 16:06:33 +02:00
Ágata Leuck
dab984b0d4 Translated using Weblate (Portuguese)
Currently translated at 95.5% (108 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt/
2022-10-20 16:06:33 +02:00
Arnis Jaundzeikars
66361dede2 Translated using Weblate (Latvian)
Currently translated at 1.7% (2 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/lv/
2022-10-20 16:06:33 +02:00
Arnis Jaundzeikars
628c62fd4b Translated using Weblate (Latvian)
Currently translated at 100.0% (266 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lv/
2022-10-20 16:06:33 +02:00
Nicolas
84a7e95856 Translated using Weblate (French)
Currently translated at 99.1% (112 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2022-10-20 16:06:33 +02:00
Sylvia van Os
fc256d2c4a Merge pull request #1097 from pfaffenrodt/feature/security-maven-repos
Add limitation for jitpack maven repository
2022-10-19 18:34:57 +02:00
Pfaffenrodt
7f81ceeb7e Add limitation for jitpack maven repository 2022-10-18 21:11:50 +02:00
Tong Liu
3179644fbc Issue #1084 - adding text for permission denial. (#1085) 2022-10-16 19:58:29 +02:00
Sylvia van Os
274a58bcb0 Merge pull request #1093 from CatimaLoyalty/create-pull-request/patch-1665923209
Update Fastlane changelogs
2022-10-16 14:27:21 +02:00
TheLastProject
dc7f42b0b6 Update Fastlane changelogs 2022-10-16 12:26:48 +00:00
Sylvia van Os
f859627d7f Document quick spend feature 2022-10-16 14:26:34 +02:00
polarhun
ccf12bf028 #1044 - Automatic Balance Update (#1073) 2022-10-16 14:25:26 +02:00
Sylvia van Os
c34e2fdd70 Merge pull request #1091 from CatimaLoyalty/fix/crashCancelScanActivity
Fix crash on cancelling ScanActivity
2022-10-16 11:41:58 +02:00
Sylvia van Os
ea482c6fad Fix crash on cancelling ScanActivity
Introduced in https://github.com/CatimaLoyalty/Android/pull/1078
2022-10-16 11:07:40 +02:00
Sylvia van Os
54f223b5b0 Merge pull request #1090 from CatimaLoyalty/create-pull-request/patch-1665903989
Update contributors
2022-10-16 10:12:22 +02:00
TheLastProject
74e083bb62 Update contributors 2022-10-16 07:06:28 +00:00
Robin Syl
a9c36cd171 A more reliable and customizable method to parse version from an import file 2022-10-15 20:06:49 +02:00
Sylvia van Os
876b0beb2f Merge pull request #1088 from CatimaLoyalty/fix/cursorAdapterDRY
Reduce repeated code in LoyaltyCardCursorAdapter
2022-10-15 14:40:38 +02:00
Sylvia van Os
1f73beb895 Reduce repeated code in LoyaltyCardCursorAdapter
This also more explicitly sets the text colour to prevent RecyclerView
state bugs
2022-10-15 14:30:42 +02:00
Sylvia van Os
b13aaacdff Merge pull request #1087 from CatimaLoyalty/create-pull-request/patch-1665820428
Update Fastlane changelogs
2022-10-15 09:54:07 +02:00
TheLastProject
ba67c122fa Update Fastlane changelogs 2022-10-15 07:53:48 +00:00
Sylvia van Os
f16550aa9c Document new share intenet receiver in changelog 2022-10-15 09:53:28 +02:00
Robin Syl
ba57fbbf85 Close inputstream in importData 2022-10-14 21:36:02 +02:00
Simon Rusinov
ebedb43e72 issue-614 add receiver for share intent (#1078) 2022-10-14 21:33:59 +02:00
Robin Syl
c10f859919 Refactor Importer to not read entire file as String 2022-10-14 16:56:35 +02:00
Sylvia van Os
8e6e83dfc6 Merge pull request #1080 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-10-10 21:36:16 +02:00
Jen Kung-chih
326379d222 Translated using Weblate (Chinese (Traditional))
Currently translated at 99.6% (265 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hant/
2022-10-10 20:07:48 +02:00
Sylvia van Os
105e85cc63 Translated using Weblate (Spanish)
Currently translated at 2.6% (3 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/es/
2022-10-10 20:07:48 +02:00
Sylvia van Os
e21dbc85e8 Translated using Weblate (Romanian)
Currently translated at 2.6% (3 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ro/
2022-10-10 20:07:47 +02:00
Simon Rusinov
78348a6f9c issue-1054 handle all deprecation warnings (#1072) 2022-10-10 18:28:35 +02:00
Sneakyturtle22
f98b98b4f3 Translated using Weblate (Hindi)
Currently translated at 27.4% (73 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/hi/
2022-10-10 15:24:11 +02:00
Arnis Jaundzeikars
d362305a25 Translated using Weblate (Latvian)
Currently translated at 100.0% (266 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lv/
2022-10-10 15:24:11 +02:00
Sylvia van Os
623cfc671c Translated using Weblate (Indonesian)
Currently translated at 17.6% (20 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/id/
2022-10-10 15:24:11 +02:00
Magnitudee
456e2112b8 Translated using Weblate (Indonesian)
Currently translated at 98.8% (263 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/id/
2022-10-10 15:24:11 +02:00
gallegonovato
af2fbd1ce3 Translated using Weblate (Spanish)
Currently translated at 2.6% (3 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/es/
2022-10-10 15:24:11 +02:00
Sylvia van Os
91211f07cb Translated using Weblate (Polish)
Currently translated at 36.2% (41 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pl/
2022-10-10 15:24:11 +02:00
BootVirtual
9c183e84dd Translated using Weblate (Romanian)
Currently translated at 2.6% (3 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ro/
2022-10-10 15:24:11 +02:00
Thomas Cruveilher
5e3cebf4a1 Translated using Weblate (French)
Currently translated at 63.7% (72 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2022-10-10 15:24:11 +02:00
Piotr Zet
9437d23e6e Translated using Weblate (Polish)
Currently translated at 100.0% (266 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pl/
2022-10-10 15:24:11 +02:00
Sneakyturtle22
925a66a12a Added translation using Weblate (Hindi) 2022-10-10 15:24:11 +02:00
gallegonovato
5db8af72a1 Translated using Weblate (Spanish)
Currently translated at 2.6% (3 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/es/
2022-10-10 15:24:11 +02:00
Mawuena M. KODZO A
2b605eb193 Translated using Weblate (French)
Currently translated at 44.2% (50 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2022-10-10 15:24:11 +02:00
BootVirtual
f16d10995c Translated using Weblate (Romanian)
Currently translated at 51.1% (136 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ro/
2022-10-10 15:24:11 +02:00
Sylvia van Os
3ef17404b7 Merge pull request #1077 from CatimaLoyalty/fix/groupNameValidation
Improve group name validation flow
2022-10-09 17:19:20 +02:00
Sylvia van Os
1316ac731c Improve group name validation flow 2022-10-09 16:45:54 +02:00
Sylvia van Os
6283a90217 Merge pull request #1075 from CatimaLoyalty/create-pull-request/patch-1665298778
Update contributors
2022-10-09 10:42:13 +02:00
TheLastProject
84e8857067 Update contributors 2022-10-09 06:59:37 +00:00
Sylvia van Os
05a53d7985 Add missing languages to language chooser 2022-10-07 19:41:35 +02:00
Sylvia van Os
94b13b7145 Merge pull request #1071 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-10-07 19:09:23 +02:00
Mohamed A. Salah
3e55a147c7 Translated using Weblate (Arabic)
Currently translated at 99.2% (264 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ar/
2022-10-07 17:20:03 +02:00
109247019824
f05ed2571f Translated using Weblate (Bulgarian)
Currently translated at 12.3% (14 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/bg/
2022-10-07 17:20:03 +02:00
Sylvia van Os
c1a37eb2a4 Translated using Weblate (Spanish)
Currently translated at 1.7% (2 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/es/
2022-10-07 17:20:02 +02:00
Katarzyna
4d8d863780 Translated using Weblate (Polish)
Currently translated at 36.2% (41 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pl/
2022-10-07 17:20:02 +02:00
Slávek Banko
d56eec4ba9 Translated using Weblate (Czech)
Currently translated at 100.0% (113 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2022-10-07 17:20:00 +02:00
Thomas Cruveilher
a05356d0e1 Translated using Weblate (French)
Currently translated at 43.3% (49 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2022-10-07 17:19:56 +02:00
TenTraicion
4eea6f7f53 Translated using Weblate (Bengali)
Currently translated at 25.5% (68 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bn/
2022-10-06 22:43:18 +02:00
Tapu
24e19cc5f8 Translated using Weblate (Bengali)
Currently translated at 25.5% (68 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bn/
2022-10-06 22:43:18 +02:00
gallegonovato
cd7631451b Translated using Weblate (Spanish)
Currently translated at 1.7% (2 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/es/
2022-10-06 22:43:18 +02:00
이정희
d140130b0d Translated using Weblate (Korean)
Currently translated at 39.8% (106 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ko/
2022-10-06 22:43:18 +02:00
BMN
f0453943da Translated using Weblate (German)
Currently translated at 100.0% (113 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2022-10-06 22:43:18 +02:00
Mawuena M. KODZO A
42152ccbb5 Translated using Weblate (French)
Currently translated at 32.7% (37 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2022-10-06 22:43:18 +02:00
Mohamed A. Salah
27f8647243 Added translation using Weblate (Arabic (Najdi)) 2022-10-06 22:43:18 +02:00
Sylvia van Os
b7d520ded6 Merge pull request #1069 from CatimaLoyalty/create-pull-request/patch-1665000141
Update Fastlane changelogs
2022-10-05 22:03:15 +02:00
TheLastProject
04088ff366 Update Fastlane changelogs 2022-10-05 20:02:21 +00:00
Sylvia van Os
d4dcec1a9b Document switch to MaterialAlertDialog 2022-10-05 22:01:56 +02:00
Sylvia van Os
c8306616e3 Merge pull request #1067 from theimpulson/alertDialogImprovements
Alert dialog improvements
2022-10-05 22:01:13 +02:00
Sylvia van Os
b34bdebb5c Merge pull request #1068 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-10-05 10:42:25 +02:00
Lucas da Costa
9643cb9f94 Translated using Weblate (Portuguese)
Currently translated at 100.0% (266 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt/
2022-10-05 07:58:58 +02:00
Tapu
645b29226e Translated using Weblate (Bengali (India))
Currently translated at 48.8% (130 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bn_IN/
2022-10-05 07:58:58 +02:00
Tarik Dzambic
c56faba922 Translated using Weblate (Bosnian)
Currently translated at 17.6% (20 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/bs/
2022-10-05 07:58:58 +02:00
Tarik Dzambic
55a19eacc9 Translated using Weblate (Bosnian)
Currently translated at 53.3% (142 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bs/
2022-10-05 07:58:58 +02:00
Katarzyna
464a2350ae Translated using Weblate (Polish)
Currently translated at 36.2% (41 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pl/
2022-10-05 07:58:58 +02:00
Lisa
c44f737c99 Translated using Weblate (Italian)
Currently translated at 57.5% (65 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/it/
2022-10-05 07:58:58 +02:00
Mawuena M. KODZO A
a8794ce60c Translated using Weblate (French)
Currently translated at 25.6% (29 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2022-10-05 07:58:58 +02:00
gallegonovato
11329ba786 Translated using Weblate (Spanish)
Currently translated at 100.0% (266 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/es/
2022-10-05 07:58:58 +02:00
Tapu
e568bd1af9 Added translation using Weblate (Bengali) 2022-10-05 07:58:58 +02:00
Aayush Gupta
b3fbfdbf9d ManageGroupsActivity: Add spacing between EditText and AlertDialog bounds
Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
2022-10-05 11:04:40 +05:30
Aayush Gupta
aec4292203 Catima: Migrate to MaterialAlertDialogBuilder everywhere
This follows Material theme and looks much better compared to AlertDialog

Ref: https://developer.android.com/reference/com/google/android/material/dialog/MaterialAlertDialogBuilder

Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
2022-10-05 10:37:03 +05:30
Sylvia van Os
82733ca414 Merge pull request #1053 from theimpulson/gradle-improvements
Misc Gradle improvements
2022-10-04 21:03:31 +02:00
Aayush Gupta
887424af80 spotbugs: Exclude gradle generated view binding classes
Spot bugs complains about EI_EXPOSE_REP and BC_UNCONFIRMED_CAST bugs in these
classes but they are being generated by Gradle and are out of our control if
we want to use view binding to interact with the views.

Ref: https://developer.android.com/topic/libraries/view-binding

Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
2022-10-05 00:20:31 +05:30
Aayush Gupta
f63a25f582 gradle: Move lint params to specific config
Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
2022-10-05 00:20:31 +05:30
Aayush Gupta
635ec748b3 Catima: Migrate to view binding
Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
2022-10-05 00:20:31 +05:30
Aayush Gupta
fa510e3ffa gradle: Switch to new Int only SDK version properties
Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
2022-10-05 00:20:31 +05:30
Aayush Gupta
24a5efd5f8 gradle: Migrate to new plugins and dependency management system
Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
2022-10-05 00:20:31 +05:30
Aayush Gupta
547dd55240 gradle: Drop buildToolsVersion
Not required as the latest one is always used

Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
2022-10-05 00:20:31 +05:30
bors[bot]
774705d9ad Merge #1065
1065: Remove CodeQL r=TheLastProject a=TheLastProject

It's getting in the way of #1053 and in a year of usage has not once given any type of alert

Co-authored-by: Sylvia van Os <sylvia@hackerchick.me>
2022-10-04 18:40:08 +00:00
Sylvia van Os
3d756e271c Remove CodeQL
It's getting in the way of #1053 and in a year of usage has not once given any type of alert
2022-10-04 20:39:39 +02:00
Sylvia van Os
2da9a9c1a8 Merge pull request #1064 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-10-03 22:05:32 +02:00
Lisa
cd67d3c919 Translated using Weblate (Italian)
Currently translated at 18.5% (21 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/it/
2022-10-03 19:48:19 +02:00
Aya Elsaadany
c080fdb244 Translated using Weblate (Arabic)
Currently translated at 99.2% (264 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ar/
2022-10-03 19:48:19 +02:00
Arnis Jaundzeikars
9ee61812b8 Translated using Weblate (Latvian)
Currently translated at 94.7% (252 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lv/
2022-10-03 19:48:19 +02:00
Oğuz Ersen
bccf0a656b Translated using Weblate (Turkish)
Currently translated at 100.0% (266 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2022-10-03 19:48:19 +02:00
109247019824
47ca66e9c7 Translated using Weblate (Bulgarian)
Currently translated at 100.0% (266 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2022-10-03 19:48:19 +02:00
Eric
972315ad00 Translated using Weblate (Chinese (Simplified))
Currently translated at 98.8% (263 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hans/
2022-10-03 19:48:19 +02:00
Katarzyna
0aa8b63c0c Translated using Weblate (Polish)
Currently translated at 15.9% (18 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pl/
2022-10-03 19:48:18 +02:00
Slávek Banko
e77cf403eb Translated using Weblate (Czech)
Currently translated at 100.0% (113 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2022-10-03 19:48:18 +02:00
Jacopo Gennaro Esposito
df89ab29eb Translated using Weblate (Italian)
Currently translated at 17.6% (20 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/it/
2022-10-03 19:48:18 +02:00
IllusiveMan196
6c6829bfd5 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (266 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/uk/
2022-10-03 19:48:18 +02:00
solokot
fa531dce81 Translated using Weblate (Russian)
Currently translated at 100.0% (266 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2022-10-03 19:48:18 +02:00
Katarzyna
61bc7ad24a Translated using Weblate (Polish)
Currently translated at 99.6% (265 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pl/
2022-10-03 19:48:18 +02:00
Heimen Stoffels
ce0964e6a7 Translated using Weblate (Dutch)
Currently translated at 100.0% (266 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2022-10-03 19:48:18 +02:00
Allan Nordhøy
4979ac9d34 Translated using Weblate (Norwegian Bokmål)
Currently translated at 97.7% (260 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nb_NO/
2022-10-03 19:48:18 +02:00
Michael Moroni
912bcdf7f7 Translated using Weblate (Italian)
Currently translated at 100.0% (266 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2022-10-03 19:48:18 +02:00
J. Lavoie
09174e646b Translated using Weblate (French)
Currently translated at 100.0% (266 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2022-10-03 19:48:18 +02:00
J. Lavoie
0c729cb092 Translated using Weblate (German)
Currently translated at 100.0% (266 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2022-10-03 19:48:18 +02:00
Slávek Banko
61faa4aa09 Translated using Weblate (Czech)
Currently translated at 100.0% (266 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2022-10-03 19:48:18 +02:00
544 changed files with 4041 additions and 1351 deletions

View File

@@ -3,12 +3,12 @@ name: Android CI
on:
push:
branches:
- master
- main
- staging
- trying
pull_request:
branches:
- master
- main
jobs:
build:

View File

@@ -1,8 +1,8 @@
name: Compress Images on Push to Master
name: Compress Images on Push to Main
on:
push:
branches:
- master
- main
paths:
- '**.jpg'
- '**.jpeg'

View File

@@ -2,7 +2,7 @@ name: Convert CHANGELOG to Fastlane
on:
push:
branches:
- master
- main
jobs:
convert_changelog_to_fastlane:

View File

@@ -1,73 +0,0 @@
# For most projects, this workflow file will not need changing; you simply need
# to commit it to your repository.
#
# You may wish to alter this file to override the set of languages analyzed,
# or to provide custom queries or build logic.
#
# ******** NOTE ********
# We have attempted to detect the languages in your repository. Please check
# the `language` matrix defined below to confirm you have the correct set of
# supported CodeQL languages.
#
name: "CodeQL"
on:
push:
branches:
- master
pull_request:
# The branches below must be a subset of the branches above
branches:
- master
schedule:
- cron: '33 1 * * 4'
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: [ 'java' ]
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ]
# Learn more:
# https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed
steps:
- name: Checkout repository
uses: actions/checkout@v2
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v1
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# queries: ./path/to/local/query, your-org/your-repo/queries@main
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@v1
# Command-line programs to run using the OS shell.
# 📚 https://git.io/JvXDl
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
# and modify them (or add more) to build your code if your project
# uses a compiled language
#- run: |
# make bootstrap
# make release
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v1

View File

@@ -6,7 +6,7 @@ on:
jobs:
contributors_to_file:
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/master'
if: github.ref == 'refs/heads/main'
name: Write contributors to file
steps:
- name: Checkout repo

View File

@@ -0,0 +1,10 @@
name: "Validate Gradle Wrapper"
on: [push, pull_request]
jobs:
validation:
name: "Validation"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: gradle/wrapper-validation-action@v1

View File

@@ -1,8 +1,21 @@
# Changelog
## Unreleased - 115
## v2.21.2 - 117
- Remove unnecessary permissions
- Target Android 13
## v2.21.1 - 116
- Fix quick spend dialog not allowing , separator
- Support loading image from file manager
## v2.21.0 - 115
- Open image in gallery on long-press
- Apply Material style to dialogs
- Support creating card by sharing an image to Catima
- Add quick spend button to card screen
## v2.20.0 - 114

View File

@@ -100,5 +100,5 @@ your real name, saying:
Finally, you will need to submit your patches so that they can be reviewed
and potentially merged into the main Catima repository. The preferred
way to do this is to submit a Pull Request to the Catima project.
Changes need to apply cleanly onto the master branch and pass all
Changes need to apply cleanly onto the main branch and pass all
unit tests and produce no errors during static analysis.

View File

@@ -1,7 +1,9 @@
import com.github.spotbugs.snom.SpotBugsTask
apply plugin: 'com.android.application'
apply plugin: 'com.github.spotbugs'
plugins {
id 'com.android.application'
id 'com.github.spotbugs'
}
spotbugs {
ignoreFailures = false
@@ -11,15 +13,14 @@ spotbugs {
}
android {
compileSdkVersion 31
buildToolsVersion "31.0.0"
compileSdk 33
defaultConfig {
applicationId "me.hackerchick.catima"
minSdkVersion 21
targetSdkVersion 31
versionCode 114
versionName "2.20.0"
minSdk 21
targetSdk 33
versionCode 117
versionName "2.21.2"
vectorDrawables.useSupportLibrary true
multiDexEnabled true
@@ -37,6 +38,10 @@ android {
}
}
buildFeatures {
viewBinding true
}
bundle {
language {
enableSplit = false
@@ -54,8 +59,7 @@ android {
}
lintOptions {
disable "GoogleAppIndexingWarning", "ButtonStyle", "AlwaysShowAction",
"MissingTranslation", "MissingPrefix"
lintConfig file("lint.xml")
}
sourceSets {
@@ -94,11 +98,11 @@ dependencies {
// Third-party
implementation 'com.journeyapps:zxing-android-embedded:4.3.0@aar'
implementation 'com.google.zxing:core:3.5.0'
implementation 'com.google.zxing:core:3.5.1'
implementation 'org.apache.commons:commons-csv:1.9.0'
implementation 'com.jaredrummler:colorpicker:1.1.0'
implementation 'com.github.invissvenska:NumberPickerPreference:1.0.4'
implementation 'net.lingala.zip4j:zip4j:2.11.2'
implementation 'net.lingala.zip4j:zip4j:2.11.3'
// SpotBugs
implementation 'io.wcm.tooling.spotbugs:io.wcm.tooling.spotbugs.annotations:1.0.0'
@@ -106,7 +110,7 @@ dependencies {
// Testing
testImplementation 'androidx.test:core:1.4.0'
testImplementation 'junit:junit:4.13.2'
testImplementation 'org.robolectric:robolectric:4.9'
testImplementation 'org.robolectric:robolectric:4.9.2'
}
tasks.withType(SpotBugsTask) {

View File

@@ -6,5 +6,8 @@
<Match>
<Class name="~.*Manifest\$.*"/>
</Match>
<Match>
<Class name="~.*Binding" />
</Match>
</FindBugsFilter>

8
app/lint.xml Normal file
View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<lint>
<issue id="AlwaysShowAction" severity="ignore" />
<issue id="ButtonStyle" severity="ignore" />
<issue id="GoogleAppIndexingWarning" severity="ignore" />
<issue id="MissingTranslation" severity="ignore" />
<issue id="MissingPrefix" severity="ignore" />
</lint>

View File

@@ -6,8 +6,7 @@
<uses-sdk tools:overrideLibrary="com.google.zxing.client.android" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="23" />
<uses-feature
android:name="android.hardware.camera"
@@ -33,6 +32,12 @@
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="image/*" />
</intent-filter>
</activity>
<activity
android:name=".AboutActivity"
@@ -102,7 +107,39 @@
<activity
android:name=".ImportExportActivity"
android:label="@string/importExport"
android:theme="@style/AppTheme.NoActionBar" />
android:exported="true"
android:theme="@style/AppTheme.NoActionBar">
<!-- ZIP Intent Filter -->
<intent-filter
android:label="@string/importCards">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="application/zip" />
<data android:scheme="content"/>
<data android:host="*"/>
</intent-filter>
<!-- JSON Intent Filter -->
<intent-filter
android:label="@string/importCards">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="application/json" />
<data android:scheme="content"/>
<data android:host="*"/>
</intent-filter>
<!-- CSV Intent Filter -->
<intent-filter
android:label="@string/importCards">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="content"/>
<data android:host="*" />
<data android:mimeType="text/comma-separated-values" />
</intent-filter>
</activity>
<activity
android:name=".CardShortcutConfigure"
android:exported="true"

View File

@@ -1,138 +1,46 @@
package protect.card_locker;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.widget.Toolbar;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.core.text.HtmlCompat;
public class AboutActivity extends CatimaAppCompatActivity implements View.OnClickListener {
import protect.card_locker.databinding.AboutActivityBinding;
public class AboutActivity extends CatimaAppCompatActivity {
private static final String TAG = "Catima";
ConstraintLayout version_history, translate, license, repo, privacy, error, credits, rate;
private AboutActivityBinding binding;
private AboutContent content;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTitle(R.string.about);
setContentView(R.layout.about_activity);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
}
binding = AboutActivityBinding.inflate(getLayoutInflater());
content = new AboutContent(this);
setTitle(content.getPageTitle());
setContentView(binding.getRoot());
setSupportActionBar(binding.toolbar);
enableToolbarBackButton();
StringBuilder contributors = new StringBuilder().append("<br/>");
TextView copyright = binding.creditsSub;
copyright.setText(content.getCopyright());
TextView versionHistory = binding.versionHistorySub;
versionHistory.setText(content.getVersionHistory());
BufferedReader reader = new BufferedReader(new InputStreamReader(getResources().openRawResource(R.raw.contributors), StandardCharsets.UTF_8));
binding.versionHistory.setTag("https://catima.app/changelog/");
binding.translate.setTag("https://hosted.weblate.org/engage/catima/");
binding.license.setTag("https://github.com/CatimaLoyalty/Android/blob/main/LICENSE");
binding.repo.setTag("https://github.com/CatimaLoyalty/Android/");
binding.privacy.setTag("https://catima.app/privacy-policy/");
binding.reportError.setTag("https://github.com/CatimaLoyalty/Android/issues");
binding.rate.setTag("https://play.google.com/store/apps/details?id=me.hackerchick.catima");
try {
while (true) {
String tmp = reader.readLine();
if (tmp == null || tmp.isEmpty()) {
reader.close();
break;
}
contributors.append("<br/>");
contributors.append(tmp);
}
} catch (IOException ignored) {
}
final List<ThirdPartyInfo> USED_LIBRARIES = new ArrayList<>();
USED_LIBRARIES.add(new ThirdPartyInfo("Color Picker", "https://github.com/jaredrummler/ColorPicker", "Apache 2.0"));
USED_LIBRARIES.add(new ThirdPartyInfo("Commons CSV", "https://commons.apache.org/proper/commons-csv/", "Apache 2.0"));
USED_LIBRARIES.add(new ThirdPartyInfo("NumberPickerPreference", "https://github.com/invissvenska/NumberPickerPreference", "GNU LGPL 3.0"));
USED_LIBRARIES.add(new ThirdPartyInfo("uCrop", "https://github.com/Yalantis/uCrop", "Apache 2.0"));
USED_LIBRARIES.add(new ThirdPartyInfo("Zip4j", "https://github.com/srikanth-lingala/zip4j", "Apache 2.0"));
USED_LIBRARIES.add(new ThirdPartyInfo("ZXing", "https://github.com/zxing/zxing", "Apache 2.0"));
USED_LIBRARIES.add(new ThirdPartyInfo("ZXing Android Embedded", "https://github.com/journeyapps/zxing-android-embedded", "Apache 2.0"));
final List<ThirdPartyInfo> USED_ASSETS = new ArrayList<>();
USED_ASSETS.add(new ThirdPartyInfo("Android icons", "https://fonts.google.com/icons?selected=Material+Icons", "Apache 2.0"));
StringBuilder libs = new StringBuilder().append("<br/>");
for (ThirdPartyInfo entry : USED_LIBRARIES) {
libs.append("<br/><a href=\"").append(entry.url()).append("\">").append(entry.name()).append("</a> (").append(entry.license()).append(")");
}
StringBuilder resources = new StringBuilder().append("<br/>");
for (ThirdPartyInfo entry : USED_ASSETS) {
resources.append("<br/><a href=\"").append(entry.url()).append("\">").append(entry.name()).append("</a> (").append(entry.license()).append(")");
}
String appName = getString(R.string.app_name);
int year = Calendar.getInstance().get(Calendar.YEAR);
String version = "?";
try {
PackageInfo pi = getPackageManager().getPackageInfo(getPackageName(), 0);
version = pi.versionName;
} catch (PackageManager.NameNotFoundException e) {
Log.w(TAG, "Package name not found", e);
}
TextView copyright = findViewById(R.id.credits_sub);
copyright.setText(String.format(getString(R.string.app_copyright_fmt), year));
TextView vHistory = findViewById(R.id.version_history_sub);
vHistory.setText(String.format(getString(R.string.debug_version_fmt), version));
setTitle(String.format(getString(R.string.about_title_fmt), appName));
version_history = findViewById(R.id.version_history);
translate = findViewById(R.id.translate);
license = findViewById(R.id.license);
repo = findViewById(R.id.repo);
privacy = findViewById(R.id.privacy);
error = findViewById(R.id.report_error);
credits = findViewById(R.id.credits);
rate = findViewById(R.id.rate);
version_history.setOnClickListener(this);
translate.setOnClickListener(this);
license.setOnClickListener(this);
repo.setOnClickListener(this);
privacy.setOnClickListener(this);
error.setOnClickListener(this);
rate.setOnClickListener(this);
StringBuilder contributorInfo = new StringBuilder();
contributorInfo.append(HtmlCompat.fromHtml(String.format(getString(R.string.app_contributors), contributors.toString()), HtmlCompat.FROM_HTML_MODE_COMPACT));
contributorInfo.append("\n\n");
contributorInfo.append(getString(R.string.app_copyright_old));
contributorInfo.append("\n\n");
contributorInfo.append(HtmlCompat.fromHtml(String.format(getString(R.string.app_libraries), libs.toString()), HtmlCompat.FROM_HTML_MODE_COMPACT));
contributorInfo.append("\n\n");
contributorInfo.append(HtmlCompat.fromHtml(String.format(getString(R.string.app_resources), resources.toString()), HtmlCompat.FROM_HTML_MODE_COMPACT));
credits.setOnClickListener(view -> new AlertDialog.Builder(this)
.setTitle(R.string.credits)
.setMessage(contributorInfo.toString())
.setPositiveButton(R.string.ok, (dialogInterface, i) -> {
})
.show());
bindClickListeners();
}
@Override
@@ -145,36 +53,47 @@ public class AboutActivity extends CatimaAppCompatActivity implements View.OnCli
}
@Override
public void onClick(View view) {
int id = view.getId();
String url;
if (id == R.id.version_history) {
url = "https://catima.app/changelog/";
} else if (id == R.id.translate) {
url = "https://hosted.weblate.org/engage/catima/";
} else if (id == R.id.license) {
url = "https://github.com/CatimaLoyalty/Android/blob/master/LICENSE";
} else if (id == R.id.repo) {
url = "https://github.com/CatimaLoyalty/Android/";
} else if (id == R.id.privacy) {
url = "https://catima.app/privacy-policy/";
} else if (id == R.id.report_error) {
url = "https://github.com/CatimaLoyalty/Android/issues";
} else if (id == R.id.rate) {
url = "https://play.google.com/store/apps/details?id=me.hackerchick.catima";
} else {
return;
}
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
try {
startActivity(intent);
} catch (ActivityNotFoundException e) {
Toast.makeText(this, R.string.failedToOpenUrl, Toast.LENGTH_LONG).show();
Log.e(TAG, "No activity found to handle intent", e);
}
protected void onDestroy() {
super.onDestroy();
content.destroy();
clearClickListeners();
binding = null;
}
private void bindClickListeners() {
View.OnClickListener openExternalBrowser = view -> {
Object tag = view.getTag();
if (tag instanceof String && ((String) tag).startsWith("https://")) {
(new OpenWebLinkHandler()).openBrowser(this, (String) tag);
}
};
binding.versionHistory.setOnClickListener(openExternalBrowser);
binding.translate.setOnClickListener(openExternalBrowser);
binding.license.setOnClickListener(openExternalBrowser);
binding.repo.setOnClickListener(openExternalBrowser);
binding.privacy.setOnClickListener(openExternalBrowser);
binding.reportError.setOnClickListener(openExternalBrowser);
binding.rate.setOnClickListener(openExternalBrowser);
binding.credits.setOnClickListener(view -> showCredits());
}
private void clearClickListeners() {
binding.versionHistory.setOnClickListener(null);
binding.translate.setOnClickListener(null);
binding.license.setOnClickListener(null);
binding.repo.setOnClickListener(null);
binding.privacy.setOnClickListener(null);
binding.reportError.setOnClickListener(null);
binding.rate.setOnClickListener(null);
binding.credits.setOnClickListener(null);
}
private void showCredits() {
new MaterialAlertDialogBuilder(this)
.setTitle(R.string.credits)
.setMessage(content.getContributorInfo())
.setPositiveButton(R.string.ok, null)
.show();
}
}

View File

@@ -0,0 +1,111 @@
package protect.card_locker;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.util.Log;
import androidx.core.text.HtmlCompat;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
public class AboutContent {
public static final String TAG = "Catima";
public Context context;
public AboutContent(Context context) {
this.context = context;
}
public void destroy() {
this.context = null;
}
public String getPageTitle() {
return String.format(context.getString(R.string.about_title_fmt), context.getString(R.string.app_name));
}
public String getAppVersion() {
String version = "?";
try {
PackageInfo pi = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
version = pi.versionName;
} catch (PackageManager.NameNotFoundException e) {
Log.w(TAG, "Package name not found", e);
}
return version;
}
public int getCurrentYear() {
return Calendar.getInstance().get(Calendar.YEAR);
}
public String getCopyright() {
return String.format(context.getString(R.string.app_copyright_fmt), getCurrentYear());
}
public String getContributors() {
String contributors;
try {
contributors = "<br/>" + Utils.readTextFile(context, R.raw.contributors);
} catch (IOException ignored) {
return "";
}
return contributors.replace("\n", "<br />");
}
public String getThirdPartyLibraries() {
final List<ThirdPartyInfo> usedLibraries = new ArrayList<>();
usedLibraries.add(new ThirdPartyInfo("Color Picker", "https://github.com/jaredrummler/ColorPicker", "Apache 2.0"));
usedLibraries.add(new ThirdPartyInfo("Commons CSV", "https://commons.apache.org/proper/commons-csv/", "Apache 2.0"));
usedLibraries.add(new ThirdPartyInfo("NumberPickerPreference", "https://github.com/invissvenska/NumberPickerPreference", "GNU LGPL 3.0"));
usedLibraries.add(new ThirdPartyInfo("uCrop", "https://github.com/Yalantis/uCrop", "Apache 2.0"));
usedLibraries.add(new ThirdPartyInfo("Zip4j", "https://github.com/srikanth-lingala/zip4j", "Apache 2.0"));
usedLibraries.add(new ThirdPartyInfo("ZXing", "https://github.com/zxing/zxing", "Apache 2.0"));
usedLibraries.add(new ThirdPartyInfo("ZXing Android Embedded", "https://github.com/journeyapps/zxing-android-embedded", "Apache 2.0"));
StringBuilder result = new StringBuilder("<br/>");
for (ThirdPartyInfo entry : usedLibraries) {
result.append("<br/>")
.append(entry.toHtml());
}
return result.toString();
}
public String getUsedThirdPartyAssets() {
final List<ThirdPartyInfo> usedAssets = new ArrayList<>();
usedAssets.add(new ThirdPartyInfo("Android icons", "https://fonts.google.com/icons?selected=Material+Icons", "Apache 2.0"));
StringBuilder result = new StringBuilder().append("<br/>");
for (ThirdPartyInfo entry : usedAssets) {
result.append("<br/>")
.append(entry.toHtml());
}
return result.toString();
}
public String getContributorInfo() {
StringBuilder contributorInfo = new StringBuilder();
contributorInfo.append(HtmlCompat.fromHtml(String.format(context.getString(R.string.app_contributors), getContributors()), HtmlCompat.FROM_HTML_MODE_COMPACT));
contributorInfo.append("\n\n");
contributorInfo.append(context.getString(R.string.app_copyright_old));
contributorInfo.append("\n\n");
contributorInfo.append(HtmlCompat.fromHtml(String.format(context.getString(R.string.app_libraries), getThirdPartyLibraries()), HtmlCompat.FROM_HTML_MODE_COMPACT));
contributorInfo.append("\n\n");
contributorInfo.append(HtmlCompat.fromHtml(String.format(context.getString(R.string.app_resources), getUsedThirdPartyAssets()), HtmlCompat.FROM_HTML_MODE_COMPACT));
return contributorInfo.toString();
}
public String getVersionHistory() {
return String.format(context.getString(R.string.debug_version_fmt), getAppVersion());
}
}

View File

@@ -19,6 +19,8 @@ import java.util.ArrayList;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.widget.Toolbar;
import protect.card_locker.databinding.BarcodeSelectorActivityBinding;
/**
* This activity is callable and will allow a user to enter
* barcode data and generate all barcodes possible for
@@ -26,6 +28,7 @@ import androidx.appcompat.widget.Toolbar;
* data and type will be returned to the caller.
*/
public class BarcodeSelectorActivity extends CatimaAppCompatActivity implements BarcodeSelectorAdapter.BarcodeSelectorListener {
private BarcodeSelectorActivityBinding binding;
private static final String TAG = "Catima";
// Result this activity will return
@@ -40,17 +43,15 @@ public class BarcodeSelectorActivity extends CatimaAppCompatActivity implements
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = BarcodeSelectorActivityBinding.inflate(getLayoutInflater());
setTitle(R.string.selectBarcodeTitle);
setContentView(R.layout.barcode_selector_activity);
Toolbar toolbar = findViewById(R.id.toolbar);
setContentView(binding.getRoot());
Toolbar toolbar = binding.toolbar;
setSupportActionBar(toolbar);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
}
enableToolbarBackButton();
EditText cardId = findViewById(R.id.cardId);
ListView mBarcodeList = findViewById(R.id.barcodes);
EditText cardId = binding.cardId;
ListView mBarcodeList = binding.barcodes;
mAdapter = new BarcodeSelectorAdapter(this, new ArrayList<>(), this);
mBarcodeList.setAdapter(mAdapter);
@@ -66,7 +67,7 @@ public class BarcodeSelectorActivity extends CatimaAppCompatActivity implements
runOnUiThread(() -> {
generateBarcodes(s.toString());
View noBarcodeButtonView = findViewById(R.id.noBarcode);
View noBarcodeButtonView = binding.noBarcode;
setButtonListener(noBarcodeButtonView, s.toString());
noBarcodeButtonView.setEnabled(s.length() > 0);
});

View File

@@ -13,6 +13,7 @@ import android.widget.TextView;
import java.util.ArrayList;
import protect.card_locker.async.TaskHandler;
import protect.card_locker.databinding.BarcodeLayoutBinding;
public class BarcodeSelectorAdapter extends ArrayAdapter<CatimaBarcodeWithValue> {
private static final String TAG = "Catima";
@@ -51,9 +52,10 @@ public class BarcodeSelectorAdapter extends ArrayAdapter<CatimaBarcodeWithValue>
if (convertView == null) {
viewHolder = new ViewHolder();
LayoutInflater inflater = LayoutInflater.from(getContext());
convertView = inflater.inflate(R.layout.barcode_layout, parent, false);
viewHolder.image = convertView.findViewById(R.id.barcodeImage);
viewHolder.text = convertView.findViewById(R.id.barcodeName);
BarcodeLayoutBinding barcodeLayoutBinding = BarcodeLayoutBinding.inflate(inflater, parent, false);
convertView = barcodeLayoutBinding.getRoot();
viewHolder.image = barcodeLayoutBinding.barcodeImage;
viewHolder.text = barcodeLayoutBinding.barcodeName;
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();

View File

@@ -14,10 +14,13 @@ import androidx.core.content.pm.ShortcutManagerCompat;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import protect.card_locker.databinding.SimpleToolbarListActivityBinding;
/**
* The configuration screen for creating a shortcut.
*/
public class CardShortcutConfigure extends CatimaAppCompatActivity implements LoyaltyCardCursorAdapter.CardAdapterListener {
private SimpleToolbarListActivityBinding binding;
static final String TAG = "Catima";
private SQLiteDatabase mDatabase;
private LoyaltyCardCursorAdapter mAdapter;
@@ -25,15 +28,15 @@ public class CardShortcutConfigure extends CatimaAppCompatActivity implements Lo
@Override
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
binding = SimpleToolbarListActivityBinding.inflate(getLayoutInflater());
mDatabase = new DBHelper(this).getReadableDatabase();
// Set the result to CANCELED. This will cause nothing to happen if the
// aback button is pressed.
setResult(RESULT_CANCELED);
setContentView(R.layout.simple_toolbar_list_activity);
Toolbar toolbar = findViewById(R.id.toolbar);
setContentView(binding.getRoot());
Toolbar toolbar = binding.toolbar;
toolbar.setTitle(R.string.shortcutSelectCard);
setSupportActionBar(toolbar);
@@ -50,7 +53,7 @@ public class CardShortcutConfigure extends CatimaAppCompatActivity implements Lo
finish();
}
final RecyclerView cardList = findViewById(R.id.list);
final RecyclerView cardList = binding.list;
GridLayoutManager layoutManager = (GridLayoutManager) cardList.getLayoutManager();
if (layoutManager != null) {
layoutManager.setSpanCount(getResources().getInteger(R.integer.main_view_card_columns));

View File

@@ -137,7 +137,7 @@ public class CardsOnPowerScreenService extends ControlsProviderService {
closePowerScreenOnAndroid11();
}
@SuppressLint({"MissingPermission", "deprecation"})
@SuppressWarnings({"MissingPermission", "deprecation"})
private void closePowerScreenOnAndroid11() {
// Android 12 will auto-close the power screen, but earlier versions won't
// Lint complains about this but on Android 11 the permission is not needed

View File

@@ -6,8 +6,11 @@ import android.os.Build;
import android.os.Bundle;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.view.WindowInsetsControllerCompat;
public class CatimaAppCompatActivity extends AppCompatActivity {
@Override
@@ -29,8 +32,10 @@ public class CatimaAppCompatActivity extends AppCompatActivity {
// XXX changing this in onCreate causes issues with the splash screen activity, so doing this here
boolean darkMode = Utils.isDarkModeEnabled(this);
if (Build.VERSION.SDK_INT >= 23) {
View decorView = getWindow().getDecorView();
WindowInsetsControllerCompat wic = new WindowInsetsControllerCompat(getWindow(), decorView);
wic.setAppearanceLightStatusBars(!darkMode);
getWindow().setStatusBarColor(Color.TRANSPARENT);
getWindow().getDecorView().setSystemUiVisibility(darkMode ? 0 : View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
} else {
// icons are always white back then
getWindow().setStatusBarColor(darkMode ? Color.TRANSPARENT : Color.argb(127, 0, 0, 0));
@@ -38,4 +43,14 @@ public class CatimaAppCompatActivity extends AppCompatActivity {
// XXX android 9 and below has a nasty rendering bug if the theme was patched earlier
Utils.postPatchColors(this);
}
protected void enableToolbarBackButton() {
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
}
}
public void onMockedRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
}
}

View File

@@ -494,6 +494,15 @@ public class DBHelper extends SQLiteOpenHelper {
return (rowsUpdated == 1);
}
public static boolean updateLoyaltyCardBalance(SQLiteDatabase database, final int id, final BigDecimal newBalance) {
ContentValues contentValues = new ContentValues();
contentValues.put(LoyaltyCardDbIds.BALANCE, newBalance.toString());
int rowsUpdated = database.update(LoyaltyCardDbIds.TABLE, contentValues,
whereAttrs(LoyaltyCardDbIds.ID),
withArgs(id));
return (rowsUpdated == 1);
}
public static LoyaltyCard getLoyaltyCard(SQLiteDatabase database, final int id) {
Cursor data = database.query(LoyaltyCardDbIds.TABLE, null, whereAttrs(LoyaltyCardDbIds.ID), withArgs(id), null, null, null);

View File

@@ -7,11 +7,13 @@ import android.database.sqlite.SQLiteDatabase;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.widget.AppCompatImageButton;
import androidx.recyclerview.widget.RecyclerView;
import protect.card_locker.databinding.GroupLayoutBinding;
import protect.card_locker.preferences.Settings;
public class GroupCursorAdapter extends BaseCursorAdapter<GroupCursorAdapter.GroupListItemViewHolder> {
@@ -33,9 +35,14 @@ public class GroupCursorAdapter extends BaseCursorAdapter<GroupCursorAdapter.Gro
@NonNull
@Override
public GroupCursorAdapter.GroupListItemViewHolder onCreateViewHolder(ViewGroup inputParent, int inputViewType) {
View itemView = LayoutInflater.from(inputParent.getContext()).inflate(R.layout.group_layout, inputParent, false);
return new GroupListItemViewHolder(itemView);
public GroupCursorAdapter.GroupListItemViewHolder onCreateViewHolder(@NonNull ViewGroup inputParent, int inputViewType) {
return new GroupListItemViewHolder(
GroupLayoutBinding.inflate(
LayoutInflater.from(inputParent.getContext()),
inputParent,
false
)
);
}
public void onBindViewHolder(GroupListItemViewHolder inputHolder, Cursor inputCursor) {
@@ -81,16 +88,16 @@ public class GroupCursorAdapter extends BaseCursorAdapter<GroupCursorAdapter.Gro
public static class GroupListItemViewHolder extends RecyclerView.ViewHolder {
public TextView mName, mCardCount;
public AppCompatImageButton mMoveUp, mMoveDown, mEdit, mDelete;
public ImageButton mMoveUp, mMoveDown, mEdit, mDelete;
public GroupListItemViewHolder(View inputView) {
super(inputView);
mName = inputView.findViewById(R.id.name);
mCardCount = inputView.findViewById(R.id.cardCount);
mMoveUp = inputView.findViewById(R.id.moveUp);
mMoveDown = inputView.findViewById(R.id.moveDown);
mEdit = inputView.findViewById(R.id.edit);
mDelete = inputView.findViewById(R.id.delete);
public GroupListItemViewHolder(GroupLayoutBinding groupLayoutBinding) {
super(groupLayoutBinding.getRoot());
mName = groupLayoutBinding.name;
mCardCount = groupLayoutBinding.cardCount;
mMoveUp = groupLayoutBinding.moveUp;
mMoveDown = groupLayoutBinding.moveDown;
mEdit = groupLayoutBinding.edit;
mDelete = groupLayoutBinding.delete;
}
}
}

View File

@@ -24,21 +24,25 @@ import java.util.List;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.widget.Toolbar;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import protect.card_locker.async.TaskHandler;
import protect.card_locker.databinding.ImportExportActivityBinding;
import protect.card_locker.importexport.DataFormat;
import protect.card_locker.importexport.ImportExportResult;
import protect.card_locker.importexport.ImportExportResultType;
public class ImportExportActivity extends CatimaAppCompatActivity {
private ImportExportActivityBinding binding;
private static final String TAG = "Catima";
private static final int PERMISSIONS_EXTERNAL_STORAGE = 1;
private ImportExportTask importExporter;
private String importAlertTitle;
@@ -55,26 +59,16 @@ public class ImportExportActivity extends CatimaAppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ImportExportActivityBinding.inflate(getLayoutInflater());
setTitle(R.string.importExport);
setContentView(R.layout.import_export_activity);
Toolbar toolbar = findViewById(R.id.toolbar);
setContentView(binding.getRoot());
Toolbar toolbar = binding.toolbar;
setSupportActionBar(toolbar);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
}
enableToolbarBackButton();
// If the application does not have permissions to external
// storage, ask for it now
if (ContextCompat.checkSelfPermission(ImportExportActivity.this,
Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED ||
ContextCompat.checkSelfPermission(ImportExportActivity.this,
Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(ImportExportActivity.this,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE},
PERMISSIONS_EXTERNAL_STORAGE);
Intent fileIntent = getIntent();
if (fileIntent != null && fileIntent.getType() != null) {
chooseImportType(false, fileIntent.getData());
}
// would use ActivityResultContracts.CreateDocument() but mime type cannot be set
@@ -126,9 +120,9 @@ public class ImportExportActivity extends CatimaAppCompatActivity {
intentCreateDocumentAction.setType("application/zip");
intentCreateDocumentAction.putExtra(Intent.EXTRA_TITLE, "catima.zip");
Button exportButton = findViewById(R.id.exportButton);
Button exportButton = binding.exportButton;
exportButton.setOnClickListener(v -> {
AlertDialog.Builder builder = new AlertDialog.Builder(ImportExportActivity.this);
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(ImportExportActivity.this);
builder.setTitle(R.string.exportPassword);
FrameLayout container = new FrameLayout(ImportExportActivity.this);
@@ -158,12 +152,12 @@ public class ImportExportActivity extends CatimaAppCompatActivity {
});
// Check that there is a file manager available
Button importFilesystem = findViewById(R.id.importOptionFilesystemButton);
importFilesystem.setOnClickListener(v -> chooseImportType(false));
Button importFilesystem = binding.importOptionFilesystemButton;
importFilesystem.setOnClickListener(v -> chooseImportType(false, null));
// Check that there is an app that data can be imported from
Button importApplication = findViewById(R.id.importOptionApplicationButton);
importApplication.setOnClickListener(v -> chooseImportType(true));
Button importApplication = binding.importOptionApplicationButton;
importApplication.setOnClickListener(v -> chooseImportType(true, null));
}
private void openFileForImport(Uri uri, char[] password) {
@@ -177,7 +171,9 @@ public class ImportExportActivity extends CatimaAppCompatActivity {
}
}
private void chooseImportType(boolean choosePicker) {
private void chooseImportType(boolean choosePicker,
@Nullable Uri fileData) {
List<CharSequence> betaImportOptions = new ArrayList<>();
betaImportOptions.add("Fidme");
betaImportOptions.add("Stocard");
@@ -191,7 +187,7 @@ public class ImportExportActivity extends CatimaAppCompatActivity {
importOptions.add(importOption);
}
AlertDialog.Builder builder = new AlertDialog.Builder(this);
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(this);
builder.setTitle(R.string.chooseImportType)
.setItems(importOptions.toArray(new CharSequence[importOptions.size()]), (dialog, which) -> {
switch (which) {
@@ -229,7 +225,12 @@ public class ImportExportActivity extends CatimaAppCompatActivity {
throw new IllegalArgumentException("Unknown DataFormat");
}
new AlertDialog.Builder(this)
if (fileData != null) {
openFileForImport(fileData, null);
return;
}
new MaterialAlertDialogBuilder(this)
.setTitle(importAlertTitle)
.setMessage(importAlertMessage)
.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
@@ -296,30 +297,6 @@ public class ImportExportActivity extends CatimaAppCompatActivity {
mTasks.executeTask(TaskHandler.TYPE.EXPORT, importExporter);
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == PERMISSIONS_EXTERNAL_STORAGE) {
// If request is cancelled, the result arrays are empty.
boolean success = grantResults.length > 0;
for (int grant : grantResults) {
if (grant != PackageManager.PERMISSION_GRANTED) {
success = false;
}
}
if (!success) {
// External storage permission rejected, inform user that
// import/export is prevented
Toast.makeText(getApplicationContext(), R.string.noExternalStoragePermissionError,
Toast.LENGTH_LONG).show();
}
}
}
@Override
protected void onDestroy() {
mTasks.flushTaskList(TaskHandler.TYPE.IMPORT, true, false, false);
@@ -340,7 +317,7 @@ public class ImportExportActivity extends CatimaAppCompatActivity {
}
private void retryWithPassword(DataFormat dataFormat, Uri uri) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(this);
builder.setTitle(R.string.passwordRequired);
final EditText input = new EditText(this);
@@ -383,7 +360,7 @@ public class ImportExportActivity extends CatimaAppCompatActivity {
return;
}
AlertDialog.Builder builder = new AlertDialog.Builder(this);
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(this);
builder.setTitle(resultType == ImportExportResultType.Success ? R.string.importSuccessfulTitle : R.string.importFailedTitle);
builder.setMessage(buildResultDialogMessage(result, true));
builder.setNeutralButton(R.string.ok, (dialog, which) -> dialog.dismiss());
@@ -394,7 +371,7 @@ public class ImportExportActivity extends CatimaAppCompatActivity {
private void onExportComplete(ImportExportResult result, final Uri path) {
ImportExportResultType resultType = result.resultType();
AlertDialog.Builder builder = new AlertDialog.Builder(this);
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(this);
builder.setTitle(resultType == ImportExportResultType.Success ? R.string.exportSuccessfulTitle : R.string.exportFailedTitle);
builder.setMessage(buildResultDialogMessage(result, false));
builder.setNeutralButton(R.string.ok, (dialog, which) -> dialog.dismiss());

View File

@@ -117,7 +117,7 @@ public class ImportURIHelper {
}
return new LoyaltyCard(-1, store, note, expiry, balance, balanceType, cardId, barcodeId, barcodeType, headerColor, 0, Utils.getUnixTime(), 100,0);
} catch (NullPointerException | NumberFormatException | UnsupportedEncodingException ex) {
} catch (NullPointerException | NumberFormatException | UnsupportedEncodingException | ArrayIndexOutOfBoundsException ex) {
throw new InvalidObjectException("Not a valid import URI");
}
}

View File

@@ -17,17 +17,20 @@ import android.widget.ImageView;
import android.widget.TextView;
import com.google.android.material.card.MaterialCardView;
import com.google.android.material.color.MaterialColors;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Currency;
import java.util.Date;
import androidx.annotation.NonNull;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.core.content.ContextCompat;
import androidx.core.graphics.BlendModeColorFilterCompat;
import androidx.core.graphics.BlendModeCompat;
import androidx.recyclerview.widget.RecyclerView;
import protect.card_locker.databinding.LoyaltyCardLayoutBinding;
import protect.card_locker.preferences.Settings;
public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCursorAdapter.LoyaltyCardListItemViewHolder> {
@@ -82,10 +85,15 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
return mShowDetails;
}
@NonNull
@Override
public LoyaltyCardListItemViewHolder onCreateViewHolder(ViewGroup inputParent, int inputViewType) {
View itemView = LayoutInflater.from(inputParent.getContext()).inflate(R.layout.loyalty_card_layout, inputParent, false);
return new LoyaltyCardListItemViewHolder(itemView, mListener);
public LoyaltyCardListItemViewHolder onCreateViewHolder(@NonNull ViewGroup inputParent, int inputViewType) {
LoyaltyCardLayoutBinding loyaltyCardLayoutBinding = LoyaltyCardLayoutBinding.inflate(
LayoutInflater.from(inputParent.getContext()),
inputParent,
false
);
return new LoyaltyCardListItemViewHolder(loyaltyCardLayoutBinding, mListener);
}
public LoyaltyCard getCard(int position) {
@@ -107,15 +115,15 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
}
if (mShowDetails && !loyaltyCard.balance.equals(new BigDecimal("0"))) {
inputHolder.setBalanceField(loyaltyCard.balance, loyaltyCard.balanceType);
inputHolder.setExtraField(inputHolder.mBalanceField, Utils.formatBalance(mContext, loyaltyCard.balance, loyaltyCard.balanceType), null);
} else {
inputHolder.setBalanceField(null, null);
inputHolder.setExtraField(inputHolder.mBalanceField, null, null);
}
if (mShowDetails && loyaltyCard.expiry != null) {
inputHolder.setExpiryField(loyaltyCard.expiry);
inputHolder.setExtraField(inputHolder.mExpiryField, DateFormat.getDateInstance(DateFormat.LONG).format(loyaltyCard.expiry), Utils.hasExpired(loyaltyCard.expiry) ? Color.RED : null);
} else {
inputHolder.setExpiryField(null);
inputHolder.setExtraField(inputHolder.mExpiryField, null, null);
}
setHeaderHeight(inputHolder, mShowDetails);
@@ -237,22 +245,23 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
protected LoyaltyCardListItemViewHolder(View inputView, CardAdapterListener inputListener) {
super(inputView);
mRow = inputView.findViewById(R.id.row);
mDivider = inputView.findViewById(R.id.info_divider);
mStoreField = inputView.findViewById(R.id.store);
mNoteField = inputView.findViewById(R.id.note);
mBalanceField = inputView.findViewById(R.id.balance);
mExpiryField = inputView.findViewById(R.id.expiry);
mIconLayout = inputView.findViewById(R.id.icon_layout);
mCardIcon = inputView.findViewById(R.id.thumbnail);
mStar = inputView.findViewById(R.id.star);
mStarBackground = inputView.findViewById(R.id.star_background);
mStarBorder = inputView.findViewById(R.id.star_border);
mArchived = inputView.findViewById(R.id.archivedIcon);
mArchivedBackground = inputView.findViewById(R.id.archive_background);
mTickIcon = inputView.findViewById(R.id.selected_thumbnail);
protected LoyaltyCardListItemViewHolder(LoyaltyCardLayoutBinding loyaltyCardLayoutBinding, CardAdapterListener inputListener) {
super(loyaltyCardLayoutBinding.getRoot());
View inputView = loyaltyCardLayoutBinding.getRoot();
mRow = loyaltyCardLayoutBinding.row;
mDivider = loyaltyCardLayoutBinding.infoDivider;
mStoreField = loyaltyCardLayoutBinding.store;
mNoteField = loyaltyCardLayoutBinding.note;
mBalanceField = loyaltyCardLayoutBinding.balance;
mExpiryField = loyaltyCardLayoutBinding.expiry;
mIconLayout = loyaltyCardLayoutBinding.iconLayout;
mCardIcon = loyaltyCardLayoutBinding.thumbnail;
mStar = loyaltyCardLayoutBinding.star;
mStarBackground = loyaltyCardLayoutBinding.starBackground;
mStarBorder = loyaltyCardLayoutBinding.starBorder;
mArchived = loyaltyCardLayoutBinding.archivedIcon;
mArchivedBackground = loyaltyCardLayoutBinding.archiveBackground;
mTickIcon = loyaltyCardLayoutBinding.selectedThumbnail;
inputView.setOnLongClickListener(view -> {
inputListener.onRowClicked(getAdapterPosition());
inputView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);
@@ -260,6 +269,41 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
});
}
private void setExtraField(TextView field, String text, Integer color) {
// If text is null, hide the field
// If iconColor is null, use the default text and icon color based on theme
if (text == null) {
field.setVisibility(View.GONE);
field.requestLayout();
return;
}
int size = mSettings.getFontSizeMax(mSettings.getSmallFont());
field.setVisibility(View.VISIBLE);
field.setText(text);
field.setTextSize(size);
field.setTextColor(color != null ? color : MaterialColors.getColor(mContext, R.attr.colorSecondary, ContextCompat.getColor(mContext, mDarkModeEnabled ? R.color.md_theme_dark_secondary : R.color.md_theme_light_secondary)));
int drawableSize = dpToPx((size * 24) / 14, mContext);
mDivider.setVisibility(View.VISIBLE);
field.setVisibility(View.VISIBLE);
Drawable icon = field.getCompoundDrawables()[0];
if (icon != null) {
icon.mutate();
icon.setBounds(0, 0, drawableSize, drawableSize);
field.setCompoundDrawablesRelative(icon, null, null, null);
if (color != null) {
icon.setColorFilter(BlendModeColorFilterCompat.createBlendModeColorFilterCompat(color, BlendModeCompat.SRC_ATOP));
} else {
icon.setColorFilter(BlendModeColorFilterCompat.createBlendModeColorFilterCompat(mDarkModeEnabled ? Color.WHITE : Color.BLACK, BlendModeCompat.SRC_ATOP));
}
}
field.requestLayout();
}
public void setStoreField(String text) {
mStoreField.setText(text);
mStoreField.setTextSize(mSettings.getFontSizeMax(mSettings.getMediumFont()));
@@ -277,55 +321,6 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
mNoteField.requestLayout();
}
public void setBalanceField(BigDecimal balance, Currency balanceType) {
if (balance == null) {
mBalanceField.setVisibility(View.GONE);
} else {
int size = mSettings.getFontSizeMax(mSettings.getSmallFont());
int drawableSize = dpToPx((size * 24) / 14, mContext);
mDivider.setVisibility(View.VISIBLE);
mBalanceField.setVisibility(View.VISIBLE);
Drawable balanceIcon = mBalanceField.getCompoundDrawables()[0];
if (balanceIcon != null) {
balanceIcon.setBounds(0, 0, drawableSize, drawableSize);
mBalanceField.setCompoundDrawablesRelative(balanceIcon, null, null, null);
if (mDarkModeEnabled) {
balanceIcon.setColorFilter(BlendModeColorFilterCompat.createBlendModeColorFilterCompat(Color.WHITE, BlendModeCompat.SRC_ATOP));
}
}
mBalanceField.setText(Utils.formatBalance(mContext, balance, balanceType));
mBalanceField.setTextSize(size);
}
mBalanceField.requestLayout();
}
public void setExpiryField(Date expiry) {
if (expiry == null) {
mExpiryField.setVisibility(View.GONE);
} else {
int size = mSettings.getFontSizeMax(mSettings.getSmallFont());
int drawableSize = dpToPx((size * 24) / 14, mContext);
mDivider.setVisibility(View.VISIBLE);
mExpiryField.setVisibility(View.VISIBLE);
Drawable expiryIcon = mExpiryField.getCompoundDrawables()[0];
if (expiryIcon != null) {
expiryIcon.setBounds(0, 0, drawableSize, drawableSize);
mExpiryField.setCompoundDrawablesRelative(expiryIcon, null, null, null);
if (Utils.hasExpired(expiry)) {
expiryIcon.setColorFilter(BlendModeColorFilterCompat.createBlendModeColorFilterCompat(Color.RED, BlendModeCompat.SRC_ATOP));
} else if (mDarkModeEnabled) {
expiryIcon.setColorFilter(BlendModeColorFilterCompat.createBlendModeColorFilterCompat(Color.WHITE, BlendModeCompat.SRC_ATOP));
}
}
mExpiryField.setText(DateFormat.getDateInstance(DateFormat.LONG).format(expiry));
if (Utils.hasExpired(expiry)) {
mExpiryField.setTextColor(Color.RED);
}
mExpiryField.setTextSize(size);
}
mExpiryField.requestLayout();
}
public void toggleCardStateIcon(boolean enableStar, boolean enableArchive, boolean colorByTheme) {
/* the below code does not work in android 5! hence the change of drawable instead
boolean needDarkForeground = Utils.needsDarkForeground(mIconBackgroundColor);

View File

@@ -20,6 +20,7 @@ import android.os.LocaleList;
import android.text.Editable;
import android.text.InputType;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
@@ -37,6 +38,7 @@ import android.widget.Toast;
import com.google.android.material.chip.Chip;
import com.google.android.material.chip.ChipGroup;
import com.google.android.material.color.MaterialColors;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;
import com.google.android.material.tabs.TabLayout;
@@ -57,6 +59,7 @@ import java.util.Calendar;
import java.util.Collections;
import java.util.Currency;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
@@ -77,8 +80,11 @@ import androidx.core.content.FileProvider;
import androidx.exifinterface.media.ExifInterface;
import androidx.fragment.app.DialogFragment;
import protect.card_locker.async.TaskHandler;
import protect.card_locker.databinding.LayoutChipChoiceBinding;
import protect.card_locker.databinding.LoyaltyCardEditActivityBinding;
public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
private LoyaltyCardEditActivityBinding binding;
private static final String TAG = "Catima";
private final String STATE_TAB_INDEX = "savedTab";
@@ -105,6 +111,9 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
private static final int PERMISSION_REQUEST_CAMERA_IMAGE_FRONT = 100;
private static final int PERMISSION_REQUEST_CAMERA_IMAGE_BACK = 101;
private static final int PERMISSION_REQUEST_CAMERA_IMAGE_ICON = 102;
private static final int PERMISSION_REQUEST_STORAGE_IMAGE_FRONT = 103;
private static final int PERMISSION_REQUEST_STORAGE_IMAGE_BACK = 104;
private static final int PERMISSION_REQUEST_STORAGE_IMAGE_ICON = 105;
public static final String BUNDLE_ID = "id";
public static final String BUNDLE_DUPLICATE_ID = "duplicateId";
@@ -244,7 +253,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
@Override
public void onSaveInstanceState(@NonNull Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
tabs = findViewById(R.id.tabs);
tabs = binding.tabs;
savedInstanceState.putInt(STATE_TAB_INDEX, tabs.getSelectedTabPosition());
savedInstanceState.putParcelable(STATE_TEMP_CARD, tempLoyaltyCard);
savedInstanceState.putInt(STATE_REQUESTED_IMAGE, mRequestedImage);
@@ -281,7 +290,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
public void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
tempLoyaltyCard = savedInstanceState.getParcelable(STATE_TEMP_CARD);
super.onRestoreInstanceState(savedInstanceState);
tabs = findViewById(R.id.tabs);
tabs = binding.tabs;
tabs.selectTab(tabs.getTabAt(savedInstanceState.getInt(STATE_TAB_INDEX)));
mRequestedImage = savedInstanceState.getInt(STATE_REQUESTED_IMAGE);
mFrontImageUnsaved = savedInstanceState.getInt(STATE_FRONT_IMAGE_UNSAVED) == 1;
@@ -297,14 +306,11 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.loyalty_card_edit_activity);
toolbar = findViewById(R.id.toolbar);
binding = LoyaltyCardEditActivityBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
toolbar = binding.toolbar;
setSupportActionBar(toolbar);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
}
enableToolbarBackButton();
mDatabase = new DBHelper(this).getWritableDatabase();
@@ -316,28 +322,28 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
currencies.put(currency.getSymbol(), currency);
}
tabs = findViewById(R.id.tabs);
thumbnail = findViewById(R.id.thumbnail);
thumbnailEditIcon = findViewById(R.id.thumbnailEditIcon);
storeFieldEdit = findViewById(R.id.storeNameEdit);
noteFieldEdit = findViewById(R.id.noteEdit);
groupsChips = findViewById(R.id.groupChips);
expiryField = findViewById(R.id.expiryField);
balanceField = findViewById(R.id.balanceField);
balanceCurrencyField = findViewById(R.id.balanceCurrencyField);
cardIdFieldView = findViewById(R.id.cardIdView);
barcodeIdField = findViewById(R.id.barcodeIdField);
barcodeTypeField = findViewById(R.id.barcodeTypeField);
barcodeImage = findViewById(R.id.barcode);
tabs = binding.tabs;
thumbnail = binding.thumbnail;
thumbnailEditIcon = binding.thumbnailEditIcon;
storeFieldEdit = binding.storeNameEdit;
noteFieldEdit = binding.noteEdit;
groupsChips = binding.groupChips;
expiryField = binding.expiryField;
balanceField = binding.balanceField;
balanceCurrencyField = binding.balanceCurrencyField;
cardIdFieldView = binding.cardIdView;
barcodeIdField = binding.barcodeIdField;
barcodeTypeField = binding.barcodeTypeField;
barcodeImage = binding.barcode;
barcodeImage.setClipToOutline(true);
barcodeImageLayout = findViewById(R.id.barcodeLayout);
barcodeCaptureLayout = findViewById(R.id.barcodeCaptureLayout);
cardImageFrontHolder = findViewById(R.id.frontImageHolder);
cardImageBackHolder = findViewById(R.id.backImageHolder);
cardImageFront = findViewById(R.id.frontImage);
cardImageBack = findViewById(R.id.backImage);
barcodeImageLayout = binding.barcodeLayout;
barcodeCaptureLayout = binding.barcodeCaptureLayout;
cardImageFrontHolder = binding.frontImageHolder;
cardImageBackHolder = binding.backImageHolder;
cardImageFront = binding.frontImage;
cardImageBack = binding.backImage;
enterButton = findViewById(R.id.enterButton);
enterButton = binding.enterButton;
barcodeImageGenerationFinishedCallback = () -> {
if (!(boolean) barcodeImage.getTag()) {
@@ -509,7 +515,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
barcodeIdField.setText(lastValue);
}
AlertDialog.Builder builder = new AlertDialog.Builder(LoyaltyCardEditActivity.this);
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(LoyaltyCardEditActivity.this);
builder.setTitle(R.string.setBarcodeId);
final EditText input = new EditText(LoyaltyCardEditActivity.this);
input.setInputType(InputType.TYPE_CLASS_TEXT);
@@ -834,7 +840,9 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
}
for (Group group : DBHelper.getGroups(mDatabase)) {
Chip chip = (Chip) getLayoutInflater().inflate(R.layout.layout_chip_choice, groupsChips, false);
LayoutChipChoiceBinding chipChoiceBinding = LayoutChipChoiceBinding
.inflate(LayoutInflater.from(groupsChips.getContext()), groupsChips, false);
Chip chip = chipChoiceBinding.getRoot();
chip.setText(group._id);
chip.setTag(group);
@@ -906,7 +914,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
cardImageFrontHolder.setOnClickListener(new ChooseCardImage());
cardImageBackHolder.setOnClickListener(new ChooseCardImage());
FloatingActionButton saveButton = findViewById(R.id.fabSave);
FloatingActionButton saveButton = binding.fabSave;
saveButton.setOnClickListener(v -> doSave());
saveButton.bringToFront();
@@ -976,14 +984,59 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
if (requestCode == PERMISSION_REQUEST_CAMERA_IMAGE_FRONT) {
onMockedRequestPermissionsResult(requestCode, permissions, grantResults);
}
public void onMockedRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
boolean granted = grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED;
Integer failureReason = null;
if (requestCode == PERMISSION_REQUEST_CAMERA_IMAGE_FRONT) {
if (granted) {
takePhotoForCard(Utils.CARD_IMAGE_FROM_CAMERA_FRONT);
} else if (requestCode == PERMISSION_REQUEST_CAMERA_IMAGE_BACK) {
takePhotoForCard(Utils.CARD_IMAGE_FROM_CAMERA_BACK);
} else if (requestCode == PERMISSION_REQUEST_CAMERA_IMAGE_ICON) {
takePhotoForCard(Utils.CARD_IMAGE_FROM_CAMERA_ICON);
return;
}
failureReason = R.string.cameraPermissionRequired;
} else if (requestCode == PERMISSION_REQUEST_CAMERA_IMAGE_BACK) {
if (granted) {
takePhotoForCard(Utils.CARD_IMAGE_FROM_CAMERA_BACK);
return;
}
failureReason = R.string.cameraPermissionRequired;
} else if (requestCode == PERMISSION_REQUEST_CAMERA_IMAGE_ICON) {
if (granted) {
takePhotoForCard(Utils.CARD_IMAGE_FROM_CAMERA_ICON);
return;
}
failureReason = R.string.cameraPermissionRequired;
} else if (requestCode == PERMISSION_REQUEST_STORAGE_IMAGE_FRONT) {
if (granted) {
selectImageFromGallery(Utils.CARD_IMAGE_FROM_FILE_FRONT);
return;
}
failureReason = R.string.storageReadPermissionRequired;
} else if (requestCode == PERMISSION_REQUEST_STORAGE_IMAGE_BACK) {
if (granted) {
selectImageFromGallery(Utils.CARD_IMAGE_FROM_FILE_BACK);
return;
}
failureReason = R.string.storageReadPermissionRequired;
} else if (requestCode == PERMISSION_REQUEST_STORAGE_IMAGE_ICON) {
if (granted) {
selectImageFromGallery(Utils.CARD_IMAGE_FROM_FILE_ICON);
return;
}
failureReason = R.string.storageReadPermissionRequired;
}
if (failureReason != null) {
Toast.makeText(this, failureReason, Toast.LENGTH_LONG).show();
}
}
@@ -1000,7 +1053,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
return;
}
new AlertDialog.Builder(this)
new MaterialAlertDialogBuilder(this)
.setTitle(R.string.updateBarcodeQuestionTitle)
.setMessage(R.string.updateBarcodeQuestionText)
.setPositiveButton(R.string.yes, (dialog, which) -> {
@@ -1034,7 +1087,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
}
if (confirmExitDialog == null) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(this);
builder.setTitle(R.string.leaveWithoutSaveTitle);
builder.setMessage(R.string.leaveWithoutSaveConfirmation);
builder.setPositiveButton(R.string.confirm, (dialog, which) -> {
@@ -1055,6 +1108,24 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
mPhotoTakerLauncher.launch(photoURI);
}
private void selectImageFromGallery(int type) {
mRequestedImage = type;
Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
photoPickerIntent.setType("image/*");
Intent contentIntent = new Intent(Intent.ACTION_GET_CONTENT);
contentIntent.setType("image/*");
Intent chooserIntent = Intent.createChooser(photoPickerIntent, getString(R.string.addFromImage));
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { contentIntent });
try {
mPhotoPickerLauncher.launch(chooserIntent);
} catch (ActivityNotFoundException e) {
Toast.makeText(getApplicationContext(), R.string.failedLaunchingPhotoPicker, Toast.LENGTH_LONG).show();
Log.e(TAG, "No activity found to handle intent", e);
}
}
class EditCardIdAndBarcode implements View.OnClickListener {
@Override
public void onClick(View v) {
@@ -1136,59 +1207,38 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
}
cardOptions.put(getString(R.string.takePhoto), () -> {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
int permissionRequestType;
int permissionRequestType;
if (v.getId() == R.id.frontImageHolder) {
permissionRequestType = PERMISSION_REQUEST_CAMERA_IMAGE_FRONT;
} else if (v.getId() == R.id.backImageHolder) {
permissionRequestType = PERMISSION_REQUEST_CAMERA_IMAGE_BACK;
} else if (v.getId() == R.id.thumbnail) {
permissionRequestType = PERMISSION_REQUEST_CAMERA_IMAGE_ICON;
} else {
throw new IllegalArgumentException("Unknown ID type " + v.getId());
}
requestPermissions(new String[]{Manifest.permission.CAMERA}, permissionRequestType);
} else {
int cardImageType;
if (v.getId() == R.id.frontImageHolder) {
cardImageType = Utils.CARD_IMAGE_FROM_CAMERA_FRONT;
} else if (v.getId() == R.id.backImageHolder) {
cardImageType = Utils.CARD_IMAGE_FROM_CAMERA_BACK;
} else if (v.getId() == R.id.thumbnail) {
cardImageType = Utils.CARD_IMAGE_FROM_CAMERA_ICON;
} else {
throw new IllegalArgumentException("Unknown ID type " + v.getId());
}
takePhotoForCard(cardImageType);
}
return null;
});
cardOptions.put(getString(R.string.addFromImage), () -> {
if (v.getId() == R.id.frontImageHolder) {
mRequestedImage = Utils.CARD_IMAGE_FROM_FILE_FRONT;
permissionRequestType = PERMISSION_REQUEST_CAMERA_IMAGE_FRONT;
} else if (v.getId() == R.id.backImageHolder) {
mRequestedImage = Utils.CARD_IMAGE_FROM_FILE_BACK;
permissionRequestType = PERMISSION_REQUEST_CAMERA_IMAGE_BACK;
} else if (v.getId() == R.id.thumbnail) {
mRequestedImage = Utils.CARD_IMAGE_FROM_FILE_ICON;
permissionRequestType = PERMISSION_REQUEST_CAMERA_IMAGE_ICON;
} else {
throw new IllegalArgumentException("Unknown ID type " + v.getId());
}
Intent i = new Intent(Intent.ACTION_PICK);
i.setType("image/*");
PermissionUtils.requestCameraPermission(LoyaltyCardEditActivity.this, permissionRequestType);
try {
mPhotoPickerLauncher.launch(i);
} catch (ActivityNotFoundException e) {
Toast.makeText(getApplicationContext(), R.string.failedLaunchingPhotoPicker, Toast.LENGTH_LONG).show();
Log.e(TAG, "No activity found to handle intent", e);
return null;
});
cardOptions.put(getString(R.string.addFromImage), () -> {
int permissionRequestType;
if (v.getId() == R.id.frontImageHolder) {
permissionRequestType = PERMISSION_REQUEST_STORAGE_IMAGE_FRONT;
} else if (v.getId() == R.id.backImageHolder) {
permissionRequestType = PERMISSION_REQUEST_STORAGE_IMAGE_BACK;
} else if (v.getId() == R.id.thumbnail) {
permissionRequestType = PERMISSION_REQUEST_STORAGE_IMAGE_ICON;
} else {
throw new IllegalArgumentException("Unknown ID type " + v.getId());
}
PermissionUtils.requestStorageReadPermission(LoyaltyCardEditActivity.this, permissionRequestType);
return null;
});
@@ -1204,7 +1254,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
throw new IllegalArgumentException("Unknown ID type " + v.getId());
}
new AlertDialog.Builder(LoyaltyCardEditActivity.this)
new MaterialAlertDialogBuilder(LoyaltyCardEditActivity.this)
.setTitle(getString(titleResource))
.setItems(cardOptions.keySet().toArray(new CharSequence[cardOptions.size()]), (dialog, which) -> {
Iterator<Callable<Void>> callables = cardOptions.values().iterator();
@@ -1268,11 +1318,11 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
}
public void onDateSet(DatePicker view, int year, int month, int day) {
Calendar c = Calendar.getInstance();
Calendar c = new GregorianCalendar();
c.set(Calendar.YEAR, year);
c.set(Calendar.MONTH, month);
c.set(Calendar.DAY_OF_MONTH, day);
c.set(Calendar.HOUR, 0);
c.set(Calendar.HOUR_OF_DAY, 0);
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
c.set(Calendar.MILLISECOND, 0);
@@ -1498,9 +1548,9 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
return;
}
View cardPart = findViewById(R.id.cardPart);
View optionsPart = findViewById(R.id.optionsPart);
View picturesPart = findViewById(R.id.picturesPart);
View cardPart = binding.cardPart;
View optionsPart = binding.optionsPart;
View picturesPart = binding.picturesPart;
if (getString(R.string.card).equals(part)) {
cardPart.setVisibility(View.VISIBLE);

View File

@@ -1,6 +1,7 @@
package protect.card_locker;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.res.ColorStateList;
@@ -13,9 +14,11 @@ import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle;
import android.text.InputType;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.TextUtils;
import android.text.method.DigitsKeyListener;
import android.text.style.ForegroundColorSpan;
import android.text.util.Linkify;
import android.util.Log;
@@ -25,10 +28,14 @@ import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewOutlineProvider;
import android.view.ViewTreeObserver;
import android.view.Window;
import android.view.WindowInsets;
import android.view.WindowInsetsController;
import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
@@ -49,24 +56,31 @@ import androidx.core.graphics.BlendModeColorFilterCompat;
import androidx.core.graphics.BlendModeCompat;
import androidx.core.graphics.ColorUtils;
import androidx.core.graphics.drawable.DrawableCompat;
import androidx.core.view.WindowInsetsControllerCompat;
import androidx.core.widget.TextViewCompat;
import com.google.android.material.appbar.AppBarLayout;
import com.google.android.material.bottomappbar.BottomAppBar;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.textfield.TextInputEditText;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Currency;
import java.util.List;
import protect.card_locker.async.TaskHandler;
import protect.card_locker.databinding.LoyaltyCardViewLayoutBinding;
import protect.card_locker.preferences.Settings;
public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements GestureDetector.OnGestureListener {
private LoyaltyCardViewLayoutBinding binding;
private static final String TAG = "Catima";
private GestureDetector mGestureDetector;
@@ -78,6 +92,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
ImageButton bottomAppBarInfoButton;
ImageButton bottomAppBarPreviousButton;
ImageButton bottomAppBarNextButton;
ImageButton bottomAppBarUpdateBalanceButton;
AppCompatTextView storeName;
ImageButton maximizeButton;
ImageView mainImage;
@@ -186,8 +201,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
.setDataAndType(FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID, file), "image/*")
.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(intent);
}
catch (ActivityNotFoundException e) {
} catch (ActivityNotFoundException e) {
// Display a toast message if an image viewer is not installed on device
Toast.makeText(this, R.string.failedLaunchingPhotoPicker, Toast.LENGTH_SHORT).show();
e.printStackTrace();
@@ -311,6 +325,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
}
super.onCreate(savedInstanceState);
binding = LoyaltyCardViewLayoutBinding.inflate(getLayoutInflater());
settings = new Settings(this);
@@ -332,30 +347,31 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
extractIntentFields(getIntent());
setContentView(R.layout.loyalty_card_view_layout);
setContentView(binding.getRoot());
database = new DBHelper(this).getWritableDatabase();
importURIHelper = new ImportURIHelper(this);
coordinatorLayout = findViewById(R.id.coordinator_layout);
mainLayout = findViewById(R.id.mainLayout);
cardIdFieldView = findViewById(R.id.cardIdView);
storeName = findViewById(R.id.storeName);
maximizeButton = findViewById(R.id.maximizeButton);
mainImage = findViewById(R.id.mainImage);
coordinatorLayout = binding.coordinatorLayout;
mainLayout = binding.mainLayout;
cardIdFieldView = binding.cardIdView;
storeName = binding.storeName;
maximizeButton = binding.maximizeButton;
mainImage = binding.mainImage;
mainImage.setClipToOutline(true);
dotIndicator = findViewById(R.id.dotIndicator);
minimizeButton = findViewById(R.id.minimizeButton);
collapsingToolbarLayout = findViewById(R.id.collapsingToolbarLayout);
appBarLayout = findViewById(R.id.app_bar_layout);
bottomAppBar = findViewById(R.id.bottom_app_bar);
iconImage = findViewById(R.id.icon_image);
portraitToolbar = findViewById(R.id.toolbar);
landscapeToolbar = findViewById(R.id.toolbar_landscape);
dotIndicator = binding.dotIndicator;
minimizeButton = binding.minimizeButton;
collapsingToolbarLayout = binding.collapsingToolbarLayout;
appBarLayout = binding.appBarLayout;
bottomAppBar = binding.bottomAppBar;
iconImage = binding.iconImage;
portraitToolbar = binding.toolbar;
landscapeToolbar = binding.toolbarLandscape;
bottomAppBarInfoButton = findViewById(R.id.button_show_info);
bottomAppBarPreviousButton = findViewById(R.id.button_previous);
bottomAppBarNextButton = findViewById(R.id.button_next);
bottomAppBarInfoButton = binding.buttonShowInfo;
bottomAppBarPreviousButton = binding.buttonPrevious;
bottomAppBarNextButton = binding.buttonNext;
bottomAppBarUpdateBalanceButton = binding.buttonUpdateBalance;
barcodeImageGenerationFinishedCallback = () -> {
if (!(boolean) mainImage.getTag()) {
@@ -370,8 +386,8 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
}
};
centerGuideline = findViewById(R.id.centerGuideline);
barcodeScaler = findViewById(R.id.barcodeScaler);
centerGuideline = binding.centerGuideline;
barcodeScaler = binding.barcodeScaler;
barcodeScaler.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
@@ -409,7 +425,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
maximizeButton.setOnClickListener(v -> setFullscreen(true));
minimizeButton.setOnClickListener(v -> setFullscreen(false));
editButton = findViewById(R.id.fabEdit);
editButton = binding.fabEdit;
editButton.setOnClickListener(v -> {
Intent intent = new Intent(getApplicationContext(), LoyaltyCardEditActivity.class);
Bundle bundle = new Bundle();
@@ -432,6 +448,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
bottomAppBarInfoButton.setOnClickListener(view -> showInfoDialog());
bottomAppBarPreviousButton.setOnClickListener(view -> prevNextCard(false));
bottomAppBarNextButton.setOnClickListener(view -> prevNextCard(true));
bottomAppBarUpdateBalanceButton.setOnClickListener(view -> showBalanceUpdateDialog());
mGestureDetector = new GestureDetector(this, this);
View.OnTouchListener gestureTouchListener = (v, event) -> mGestureDetector.onTouchEvent(event);
@@ -446,6 +463,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
iconImage.setClipBounds(new Rect(left, top, right, bottom));
}
});
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
}
private SpannableStringBuilder padSpannableString(SpannableStringBuilder spannableStringBuilder) {
@@ -461,17 +479,29 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
}
private void showInfoDialog() {
AlertDialog.Builder infoDialog = new AlertDialog.Builder(this);
AlertDialog.Builder infoDialog = new MaterialAlertDialogBuilder(this);
int dialogContentPadding = getResources().getDimensionPixelSize(R.dimen.alert_dialog_content_padding);
int dialogTitlePadding = getResources().getDimensionPixelSize(R.dimen.alert_dialog_title_padding);
TextView infoTitleView = new TextView(this);
infoTitleView.setPadding(20, 20, 20, 20);
infoTitleView.setPadding(
dialogContentPadding,
dialogContentPadding,
dialogContentPadding,
dialogTitlePadding
);
infoTitleView.setTextSize(settings.getFontSizeMax(settings.getMediumFont()));
infoTitleView.setText(loyaltyCard.store);
infoDialog.setCustomTitle(infoTitleView);
infoDialog.setTitle(loyaltyCard.store);
TextView infoTextview = new TextView(this);
infoTextview.setPadding(20, 0, 20, 0);
infoTextview.setPadding(
dialogContentPadding,
0,
dialogContentPadding,
0
);
infoTextview.setAutoLinkMask(Linkify.ALL);
infoTextview.setTextIsSelectable(true);
@@ -516,6 +546,80 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
infoDialog.create().show();
}
private void showBalanceUpdateDialog() {
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(this);
builder.setTitle(R.string.updateBalanceTitle);
FrameLayout container = new FrameLayout(this);
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
);
int contentPadding = getResources().getDimensionPixelSize(R.dimen.alert_dialog_content_padding);
params.leftMargin = contentPadding;
params.rightMargin = contentPadding;
LinearLayout layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
TextView currentTextview = new TextView(this);
currentTextview.setText(getString(R.string.currentBalanceSentence, Utils.formatBalance(this, loyaltyCard.balance, loyaltyCard.balanceType)));
layout.addView(currentTextview);
TextView updateTextView = new TextView(this);
updateTextView.setText(getString(R.string.newBalanceSentence, Utils.formatBalance(this, loyaltyCard.balance, loyaltyCard.balanceType)));
layout.addView(updateTextView);
final TextInputEditText input = new TextInputEditText(this);
Context dialogContext = this;
input.setInputType(InputType.TYPE_CLASS_NUMBER);
input.setKeyListener(DigitsKeyListener.getInstance("0123456789,."));
input.setHint(R.string.updateBalanceHint);
input.addTextChangedListener(new SimpleTextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
BigDecimal newBalance;
try {
newBalance = calculateNewBalance(loyaltyCard.balance, loyaltyCard.balanceType, s.toString());
} catch (ParseException e) {
input.setTag(null);
updateTextView.setText(getString(R.string.newBalanceSentence, Utils.formatBalance(dialogContext, loyaltyCard.balance, loyaltyCard.balanceType)));
return;
}
// Save new balance into this element
input.setTag(newBalance);
updateTextView.setText(getString(R.string.newBalanceSentence, Utils.formatBalance(dialogContext, newBalance, loyaltyCard.balanceType)));
}
});
layout.addView(input);
layout.setLayoutParams(params);
container.addView(layout);
builder.setView(container);
builder.setPositiveButton(R.string.ok, (dialogInterface, i) -> {
// Grab calculated balance from input field
BigDecimal newBalance = (BigDecimal) input.getTag();
if (newBalance == null) {
return;
}
// Actually update balance
DBHelper.updateLoyaltyCardBalance(database, loyaltyCardId, newBalance);
// Reload UI
this.onResume();
});
builder.setNegativeButton(getString(R.string.cancel), (dialog, which) -> dialog.cancel());
AlertDialog dialog = builder.create();
dialog.show();
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
input.requestFocus();
}
private BigDecimal calculateNewBalance(BigDecimal currentBalance, Currency currency, String unparsedSubtraction) throws ParseException {
BigDecimal subtraction = Utils.parseBalance(unparsedSubtraction, currency);
return currentBalance.subtract(subtraction).max(new BigDecimal(0));
}
private void setBottomAppBarButtonState() {
if (!loyaltyCard.note.isEmpty() || !loyaltyCardGroups.isEmpty() || hasBalance(loyaltyCard) || loyaltyCard.expiry != null) {
bottomAppBarInfoButton.setVisibility(View.VISIBLE);
@@ -530,6 +634,8 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
bottomAppBarPreviousButton.setVisibility(View.VISIBLE);
bottomAppBarNextButton.setVisibility(View.VISIBLE);
}
bottomAppBarUpdateBalanceButton.setVisibility(hasBalance(loyaltyCard) ? View.VISIBLE : View.GONE);
}
private void prevNextCard(boolean next) {
@@ -606,8 +712,11 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
}
if (settings.getDisableLockscreenWhileViewingCard()) {
window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
setShowWhenLocked(true);
} else {
showWhenLockedSdkLessThan27(window);
}
}
window.setAttributes(attributes);
@@ -699,11 +808,14 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
fixImageButtonColor(bottomAppBarInfoButton);
fixImageButtonColor(bottomAppBarPreviousButton);
fixImageButtonColor(bottomAppBarNextButton);
fixImageButtonColor(bottomAppBarUpdateBalanceButton);
setBottomAppBarButtonState();
// Make notification area light if dark icons are needed
if (Build.VERSION.SDK_INT >= 23) {
window.getDecorView().setSystemUiVisibility(backgroundNeedsDarkIcons ? View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR : 0);
View decorView = getWindow().getDecorView();
WindowInsetsControllerCompat wic = new WindowInsetsControllerCompat(getWindow(), decorView);
wic.setAppearanceLightStatusBars(backgroundNeedsDarkIcons);
window.setStatusBarColor(Color.TRANSPARENT);
} else {
// Darken statusbar if icons won't be visible otherwise
@@ -744,6 +856,12 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
DBHelper.updateLoyaltyCardLastUsed(database, loyaltyCard.id);
}
@SuppressWarnings("deprecation")
private void showWhenLockedSdkLessThan27(Window window) {
window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
}
private void fixImageButtonColor(ImageButton imageButton) {
imageButton.setColorFilter(BlendModeColorFilterCompat.createBlendModeColorFilterCompat(backgroundNeedsDarkIcons ? Color.BLACK : Color.WHITE, BlendModeCompat.SRC_ATOP));
}
@@ -840,7 +958,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
return true;
} else if (id == R.id.action_delete) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(this);
builder.setTitle(R.string.deleteTitle);
builder.setMessage(R.string.deleteConfirmation);
builder.setPositiveButton(R.string.confirm, (dialog, which) -> {
@@ -886,10 +1004,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
setSupportActionBar(portraitToolbar);
}
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
}
enableToolbarBackButton();
}
private void drawBarcode(boolean addPadding) {
@@ -1043,11 +1158,15 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
editButton.setVisibility(View.GONE);
// Set Android to fullscreen mode
getWindow().getDecorView().setSystemUiVisibility(
getWindow().getDecorView().getSystemUiVisibility()
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
| View.SYSTEM_UI_FLAG_FULLSCREEN
);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
getWindow().setDecorFitsSystemWindows(false);
if (getWindow().getInsetsController() != null) {
getWindow().getInsetsController().hide(WindowInsets.Type.statusBars() | WindowInsets.Type.navigationBars());
getWindow().getInsetsController().setSystemBarsBehavior(WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE);
}
} else {
setFullscreenModeSdkLessThan30();
}
} else {
Log.d(TAG, "Move out of fullscreen");
@@ -1078,13 +1197,34 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
bottomAppBar.setVisibility(View.VISIBLE);
// Unset fullscreen mode
getWindow().getDecorView().setSystemUiVisibility(
getWindow().getDecorView().getSystemUiVisibility()
& ~View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
& ~View.SYSTEM_UI_FLAG_FULLSCREEN
);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
getWindow().setDecorFitsSystemWindows(true);
if (getWindow().getInsetsController() != null) {
getWindow().getInsetsController().show(WindowInsets.Type.statusBars() | WindowInsets.Type.navigationBars());
}
} else {
unsetFullscreenModeSdkLessThan30();
}
}
Log.d("setFullScreen", "Is full screen enabled? " + enabled + " Zoom Level = " + barcodeScaler.getProgress());
}
@SuppressWarnings("deprecation")
private void unsetFullscreenModeSdkLessThan30() {
getWindow().getDecorView().setSystemUiVisibility(
getWindow().getDecorView().getSystemUiVisibility()
& ~View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
& ~View.SYSTEM_UI_FLAG_FULLSCREEN
);
}
@SuppressWarnings("deprecation")
private void setFullscreenModeSdkLessThan30() {
getWindow().getDecorView().setSystemUiVisibility(
getWindow().getDecorView().getSystemUiVisibility()
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
| View.SYSTEM_UI_FLAG_FULLSCREEN
);
}
}

View File

@@ -9,50 +9,56 @@ import android.content.Intent;
import android.content.SharedPreferences;
import android.database.CursorIndexOutOfBoundsException;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.util.TypedValue;
import android.view.GestureDetector;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.widget.CheckBox;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.tabs.TabLayout;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.view.ActionMode;
import androidx.appcompat.widget.SearchView;
import androidx.appcompat.widget.Toolbar;
import androidx.core.splashscreen.SplashScreen;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.tabs.TabLayout;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import protect.card_locker.databinding.ArchiveActivityBinding;
import protect.card_locker.databinding.ContentMainBinding;
import protect.card_locker.databinding.MainActivityBinding;
import protect.card_locker.databinding.SortingOptionBinding;
import protect.card_locker.preferences.SettingsActivity;
public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCardCursorAdapter.CardAdapterListener, GestureDetector.OnGestureListener {
private MainActivityBinding binding;
private ArchiveActivityBinding archiveActivityBinding;
private ContentMainBinding contentMainBinding;
private static final String TAG = "Catima";
public static final String RESTART_ACTIVITY_INTENT = "restart_activity_intent";
private static final int MEDIUM_SCALE_FACTOR_DIP = 460;
private SQLiteDatabase mDatabase;
private LoyaltyCardCursorAdapter mAdapter;
private ActionMode mCurrentActionMode;
@@ -68,6 +74,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
private View mHelpSection;
private View mNoMatchingCardsText;
private View mNoGroupCardsText;
private TabLayout groupsTabLayout;
private boolean mArchiveMode;
public static final String BUNDLE_ARCHIVE_MODE = "archiveMode";
@@ -141,7 +148,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
inputMode.finish();
return true;
} else if (inputItem.getItemId() == R.id.action_delete) {
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(MainActivity.this);
// The following may seem weird, but it is necessary to give translators enough flexibility.
// For example, in Russian, Android's plural quantity "one" actually refers to "any number ending on 1 but not ending in 11".
// So while in English the extra non-plural form seems unnecessary duplication, it is necessary to give translators enough flexibility.
@@ -163,7 +170,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
ShortcutHelper.removeShortcut(MainActivity.this, loyaltyCard.id);
}
TabLayout.Tab tab = ((TabLayout) findViewById(R.id.groups)).getTabAt(selectedTab);
TabLayout.Tab tab = groupsTabLayout.getTabAt(selectedTab);
mGroup = tab != null ? tab.getTag() : null;
updateLoyaltyCardList(true);
@@ -175,28 +182,25 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
dialog.show();
return true;
}
else if(inputItem.getItemId() == R.id.action_archive){
} else if (inputItem.getItemId() == R.id.action_archive) {
for (LoyaltyCard loyaltyCard : mAdapter.getSelectedItems()) {
Log.d(TAG, "Archiving card: " + loyaltyCard.id);
DBHelper.updateLoyaltyCardArchiveStatus(mDatabase, loyaltyCard.id,1);
DBHelper.updateLoyaltyCardArchiveStatus(mDatabase, loyaltyCard.id, 1);
updateLoyaltyCardList(false);
inputMode.finish();
invalidateOptionsMenu();
}
return true;
}
else if(inputItem.getItemId() == R.id.action_unarchive){
} else if (inputItem.getItemId() == R.id.action_unarchive) {
for (LoyaltyCard loyaltyCard : mAdapter.getSelectedItems()) {
Log.d(TAG, "Unarchiving card: " + loyaltyCard.id);
DBHelper.updateLoyaltyCardArchiveStatus(mDatabase, loyaltyCard.id,0);
DBHelper.updateLoyaltyCardArchiveStatus(mDatabase, loyaltyCard.id, 0);
updateLoyaltyCardList(false);
inputMode.finish();
invalidateOptionsMenu();
}
return true;
}
else if(inputItem.getItemId() == R.id.action_star){
} else if (inputItem.getItemId() == R.id.action_star) {
for (LoyaltyCard loyaltyCard : mAdapter.getSelectedItems()) {
Log.d(TAG, "Starring card: " + loyaltyCard.id);
DBHelper.updateLoyaltyCardStarStatus(mDatabase, loyaltyCard.id, 1);
@@ -204,8 +208,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
inputMode.finish();
}
return true;
}
else if(inputItem.getItemId() == R.id.action_unstar){
} else if (inputItem.getItemId() == R.id.action_unstar) {
for (LoyaltyCard loyaltyCard : mAdapter.getSelectedItems()) {
Log.d(TAG, "Unstarring card: " + loyaltyCard.id);
DBHelper.updateLoyaltyCardStarStatus(mDatabase, loyaltyCard.id, 0);
@@ -230,28 +233,28 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
extractIntentFields(getIntent());
SplashScreen.installSplashScreen(this);
super.onCreate(inputSavedInstanceState);
if(!mArchiveMode) {
if (!mArchiveMode) {
binding = MainActivityBinding.inflate(getLayoutInflater());
setTitle(R.string.app_name);
setContentView(R.layout.main_activity);
}
else{
setContentView(binding.getRoot());
setSupportActionBar(binding.toolbar);
groupsTabLayout = binding.groups;
contentMainBinding = ContentMainBinding.bind(binding.include.getRoot());
} else {
archiveActivityBinding = ArchiveActivityBinding.inflate(getLayoutInflater());
setTitle(R.string.archiveList);
setContentView(R.layout.archive_activity);
setContentView(archiveActivityBinding.getRoot());
setSupportActionBar(archiveActivityBinding.toolbar);
groupsTabLayout = archiveActivityBinding.groups;
contentMainBinding = ContentMainBinding.bind(archiveActivityBinding.include.getRoot());
}
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
if(mArchiveMode){
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
}
if(mArchiveMode) {
enableToolbarBackButton();
}
mDatabase = new DBHelper(this).getWritableDatabase();
TabLayout groupsTabLayout = findViewById(R.id.groups);
groupsTabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
@@ -283,10 +286,10 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
View.OnTouchListener gestureTouchListener = (v, event) -> mGestureDetector.onTouchEvent(event);
mHelpSection = findViewById(R.id.helpSection);
mNoMatchingCardsText = findViewById(R.id.noMatchingCardsText);
mNoGroupCardsText = findViewById(R.id.noGroupCardsText);
mCardList = findViewById(R.id.list);
mHelpSection = contentMainBinding.helpSection;
mNoMatchingCardsText = contentMainBinding.noMatchingCardsText;
mNoGroupCardsText = contentMainBinding.noGroupCardsText;
mCardList = contentMainBinding.list;
mNoMatchingCardsText.setOnTouchListener(gestureTouchListener);
mCardList.setOnTouchListener(gestureTouchListener);
@@ -331,21 +334,17 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
*/
mBarcodeScannerLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
// Exit early if the user cancelled the scan (pressed back/home)
if (result.getResultCode() != RESULT_OK) {
return;
}
Intent intent = result.getData();
BarcodeValues barcodeValues = Utils.parseSetBarcodeActivityResult(Utils.BARCODE_SCAN, result.getResultCode(), intent, this);
if (!barcodeValues.isEmpty()) {
Intent newIntent = new Intent(getApplicationContext(), LoyaltyCardEditActivity.class);
Bundle newBundle = new Bundle();
newBundle.putString(LoyaltyCardEditActivity.BUNDLE_BARCODETYPE, barcodeValues.format());
newBundle.putString(LoyaltyCardEditActivity.BUNDLE_CARDID, barcodeValues.content());
Bundle inputBundle = intent.getExtras();
if (inputBundle != null && inputBundle.getString(LoyaltyCardEditActivity.BUNDLE_ADDGROUP) != null) {
newBundle.putString(LoyaltyCardEditActivity.BUNDLE_ADDGROUP, inputBundle.getString(LoyaltyCardEditActivity.BUNDLE_ADDGROUP));
}
newIntent.putExtras(newBundle);
startActivity(newIntent);
}
Bundle inputBundle = intent.getExtras();
String group = inputBundle != null ? inputBundle.getString(LoyaltyCardEditActivity.BUNDLE_ADDGROUP) : null;
processBarcodeValues(barcodeValues, group);
});
mSettingsLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
@@ -374,7 +373,6 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
}
// Start of active tab logic
TabLayout groupsTabLayout = findViewById(R.id.groups);
updateTabGroups(groupsTabLayout);
// Restore settings from Shared Preference
@@ -402,12 +400,15 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
groupsTabLayout.selectTab(tab);
assert tab != null;
mGroup = tab.getTag();
} else if (!mArchiveMode) {
scaleScreen();
}
updateLoyaltyCardList(true);
// End of active tab logic
if (!mArchiveMode) {
FloatingActionButton addButton = findViewById(R.id.fabAdd);
FloatingActionButton addButton = binding.fabAdd;
addButton.setOnClickListener(v -> {
Intent intent = new Intent(getApplicationContext(), ScanActivity.class);
@@ -424,8 +425,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
@Override
public void onBackPressed() {
if (!mSearchView.isIconified()) {
if (mSearchView != null && !mSearchView.isIconified()) {
mSearchView.setIconified(true);
return;
}
@@ -498,9 +498,67 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
}
}
private void processBarcodeValues(BarcodeValues barcodeValues, String group) {
if (barcodeValues.isEmpty()) {
throw new IllegalArgumentException("barcodesValues may not be empty");
}
Intent newIntent = new Intent(getApplicationContext(), LoyaltyCardEditActivity.class);
Bundle newBundle = new Bundle();
newBundle.putString(LoyaltyCardEditActivity.BUNDLE_BARCODETYPE, barcodeValues.format());
newBundle.putString(LoyaltyCardEditActivity.BUNDLE_CARDID, barcodeValues.content());
if (group != null) {
newBundle.putString(LoyaltyCardEditActivity.BUNDLE_ADDGROUP, group);
}
newIntent.putExtras(newBundle);
startActivity(newIntent);
}
private void onSharedIntent(Intent intent) {
String receivedAction = intent.getAction();
String receivedType = intent.getType();
// Check if an image was shared to us
if (Intent.ACTION_SEND.equals(receivedAction)) {
if (receivedType.startsWith("image/")) {
BarcodeValues barcodeValues;
try {
Bitmap bitmap;
try {
Uri data = intent.getParcelableExtra(Intent.EXTRA_STREAM);
bitmap = Utils.retrieveImageFromUri(this, data);
} catch (IOException e) {
Log.e(TAG, "Error getting data from image file");
e.printStackTrace();
Toast.makeText(this, R.string.errorReadingImage, Toast.LENGTH_LONG).show();
finish();
return;
}
barcodeValues = Utils.getBarcodeFromBitmap(bitmap);
if (barcodeValues.isEmpty()) {
Log.i(TAG, "No barcode found in image file");
Toast.makeText(this, R.string.noBarcodeFound, Toast.LENGTH_LONG).show();
finish();
return;
}
} catch (NullPointerException e) {
Toast.makeText(this, R.string.errorReadingImage, Toast.LENGTH_LONG).show();
finish();
return;
}
processBarcodeValues(barcodeValues, null);
} else {
Log.e(TAG, "Wrong mime-type");
}
}
}
private void extractIntentFields(Intent intent) {
final Bundle b = intent.getExtras();
mArchiveMode = b != null && b.getBoolean(BUNDLE_ARCHIVE_MODE, false);
onSharedIntent(intent);
}
public void updateTabGroups(TabLayout groupsTabLayout) {
@@ -532,9 +590,9 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
@Override
public boolean onCreateOptionsMenu(Menu inputMenu) {
if(!mArchiveMode)
if (!mArchiveMode) {
getMenuInflater().inflate(R.menu.main_menu, inputMenu);
else{
} else {
getMenuInflater().inflate(R.menu.archive_menu, inputMenu);
}
@@ -562,7 +620,6 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
public boolean onQueryTextChange(String newText) {
mFilter = newText;
TabLayout groupsTabLayout = findViewById(R.id.groups);
TabLayout.Tab currentTab = groupsTabLayout.getTabAt(groupsTabLayout.getSelectedTabPosition());
mGroup = currentTab != null ? currentTab.getTag() : null;
@@ -573,7 +630,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
});
}
if(!mArchiveMode) {
if (!mArchiveMode) {
if (DBHelper.getArchivedCardsCount(mDatabase) == 0) {
inputMenu.findItem(R.id.action_archived).setVisible(false);
} else {
@@ -609,13 +666,15 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
}
}
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(MainActivity.this);
builder.setTitle(R.string.sort_by);
final View customLayout = getLayoutInflater().inflate(R.layout.sorting_option, null);
SortingOptionBinding sortingOptionBinding = SortingOptionBinding
.inflate(LayoutInflater.from(MainActivity.this), null, false);
final View customLayout = sortingOptionBinding.getRoot();
builder.setView(customLayout);
CheckBox showReversed = (CheckBox) customLayout.findViewById(R.id.checkBox_reverse);
CheckBox showReversed = sortingOptionBinding.checkBoxReverse;
showReversed.setChecked(mOrderDirection == DBHelper.LoyaltyCardOrderDirection.Descending);
@@ -736,7 +795,6 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
return false;
}
TabLayout groupsTabLayout = findViewById(R.id.groups);
if (groupsTabLayout.getTabCount() < 2) {
return false;
}
@@ -786,6 +844,16 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
toggleSelection(inputPosition);
}
private void scaleScreen() {
DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int screenHeight = displayMetrics.heightPixels;
float mediumSizePx = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,MEDIUM_SCALE_FACTOR_DIP,getResources().getDisplayMetrics());
boolean shouldScaleSmaller = screenHeight < mediumSizePx;
binding.include.welcomeIcon.setVisibility(shouldScaleSmaller ? View.GONE : View.VISIBLE);
}
private void toggleSelection(int inputPosition) {
mAdapter.toggleSelection(inputPosition);
int count = mAdapter.getSelectedItemCount();
@@ -804,11 +872,10 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
boolean hasStarred = false;
boolean hasUnstarred = false;
if(!mArchiveMode) {
if (!mArchiveMode) {
unarchiveItem.setVisible(false);
archiveItem.setVisible(true);
}
else{
} else {
unarchiveItem.setVisible(true);
archiveItem.setVisible(false);
}

View File

@@ -13,6 +13,7 @@ import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import java.util.ArrayList;
@@ -25,8 +26,11 @@ import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.widget.Toolbar;
import androidx.recyclerview.widget.RecyclerView;
import protect.card_locker.databinding.ActivityManageGroupBinding;
public class ManageGroupActivity extends CatimaAppCompatActivity implements ManageGroupCursorAdapter.CardAdapterListener {
private ActivityManageGroupBinding binding;
private SQLiteDatabase mDatabase;
private ManageGroupCursorAdapter mAdapter;
@@ -43,17 +47,18 @@ public class ManageGroupActivity extends CatimaAppCompatActivity implements Mana
@Override
protected void onCreate(Bundle inputSavedInstanceState) {
super.onCreate(inputSavedInstanceState);
setContentView(R.layout.activity_manage_group);
Toolbar toolbar = findViewById(R.id.toolbar);
binding = ActivityManageGroupBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
Toolbar toolbar = binding.toolbar;
setSupportActionBar(toolbar);
mDatabase = new DBHelper(this).getWritableDatabase();
noGroupCardsText = findViewById(R.id.noGroupCardsText);
mCardList = findViewById(R.id.list);
FloatingActionButton saveButton = findViewById(R.id.fabSave);
noGroupCardsText = binding.include.noGroupCardsText;
mCardList = binding.include.list;
FloatingActionButton saveButton = binding.fabSave;
mGroupNameText = findViewById(R.id.editTextGroupName);
mGroupNameText = binding.editTextGroupName;
mGroupNameText.addTextChangedListener(new TextWatcher() {
@Override
@@ -105,12 +110,7 @@ public class ManageGroupActivity extends CatimaAppCompatActivity implements Mana
mGroupNameText.setText(inputSavedInstanceState.getString(SAVE_INSTANCE_CURRENT_GROUP_NAME));
}
ActionBar actionBar = getSupportActionBar();
if (actionBar == null) {
throw (new RuntimeException("mActionBar is not expected to be null here"));
}
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setDisplayShowHomeEnabled(true);
enableToolbarBackButton();
saveButton.setOnClickListener(v -> {
String currentGroupName = mGroupNameText.getText().toString().trim();
@@ -200,7 +200,7 @@ public class ManageGroupActivity extends CatimaAppCompatActivity implements Mana
private void leaveWithoutSaving() {
if (hasChanged()) {
AlertDialog.Builder builder = new AlertDialog.Builder(ManageGroupActivity.this);
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(ManageGroupActivity.this);
builder.setTitle(R.string.leaveWithoutSaveTitle);
builder.setMessage(R.string.leaveWithoutSaveConfirmation);
builder.setPositiveButton(R.string.confirm, (dialog, which) -> finish());

View File

@@ -8,11 +8,14 @@ import android.os.Bundle;
import android.text.InputType;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import java.util.List;
@@ -24,7 +27,10 @@ import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import protect.card_locker.databinding.ManageGroupsActivityBinding;
public class ManageGroupsActivity extends CatimaAppCompatActivity implements GroupCursorAdapter.GroupAdapterListener {
private ManageGroupsActivityBinding binding;
private static final String TAG = "Catima";
private SQLiteDatabase mDatabase;
@@ -35,14 +41,12 @@ public class ManageGroupsActivity extends CatimaAppCompatActivity implements Gro
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ManageGroupsActivityBinding.inflate(getLayoutInflater());
setTitle(R.string.groups);
setContentView(R.layout.manage_groups_activity);
Toolbar toolbar = findViewById(R.id.toolbar);
setContentView(binding.getRoot());
Toolbar toolbar = binding.toolbar;
setSupportActionBar(toolbar);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
}
enableToolbarBackButton();
mDatabase = new DBHelper(this).getWritableDatabase();
}
@@ -51,12 +55,12 @@ public class ManageGroupsActivity extends CatimaAppCompatActivity implements Gro
protected void onResume() {
super.onResume();
FloatingActionButton addButton = findViewById(R.id.fabAdd);
FloatingActionButton addButton = binding.fabAdd;
addButton.setOnClickListener(v -> createGroup());
addButton.bringToFront();
mGroupList = findViewById(R.id.list);
mHelpText = findViewById(R.id.helpText);
mGroupList = binding.include.list;
mHelpText = binding.include.helpText;
// Init group list
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
@@ -108,24 +112,60 @@ public class ManageGroupsActivity extends CatimaAppCompatActivity implements Gro
return super.onOptionsItemSelected(item);
}
private void setGroupNameError(EditText input) {
String string = sanitizeAddGroupNameField(input.getText());
if (string.length() == 0) {
input.setError(getString(R.string.group_name_is_empty));
return;
}
if (DBHelper.getGroup(mDatabase, string) != null) {
input.setError(getString(R.string.group_name_already_in_use));
return;
}
input.setError(null);
}
private String sanitizeAddGroupNameField(CharSequence s) {
return s.toString().trim();
}
private void createGroup() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(this);
builder.setTitle(R.string.enter_group_name);
final EditText input = new EditText(this);
input.setInputType(InputType.TYPE_CLASS_TEXT);
builder.setView(input);
input.addTextChangedListener(new SimpleTextWatcher() {
public void onTextChanged(CharSequence s, int start, int before, int count) {
setGroupNameError(input);
}
});
setGroupNameError(input);
// Add spacing to EditText
FrameLayout container = new FrameLayout(this);
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
);
params.leftMargin = 50;
params.rightMargin = 50;
input.setLayoutParams(params);
container.addView(input);
builder.setView(container);
builder.setPositiveButton(getString(R.string.ok), (dialog, which) -> {
String inputString = input.getText().toString().trim();
if (inputString.length() == 0) {
Toast.makeText(getApplicationContext(), R.string.group_name_is_empty, Toast.LENGTH_SHORT).show();
CharSequence error = input.getError();
if (error != null) {
Toast.makeText(getApplicationContext(), error.toString(), Toast.LENGTH_SHORT).show();
return;
}
if (DBHelper.getGroup(mDatabase, inputString) != null) {
Toast.makeText(getApplicationContext(), R.string.group_name_already_in_use, Toast.LENGTH_SHORT).show();
return;
}
DBHelper.insertGroup(mDatabase, inputString);
DBHelper.insertGroup(mDatabase, sanitizeAddGroupNameField(input.getText()));
updateGroupList();
});
builder.setNegativeButton(getString(R.string.cancel), (dialog, which) -> dialog.cancel());
@@ -193,7 +233,7 @@ public class ManageGroupsActivity extends CatimaAppCompatActivity implements Gro
public void onDeleteButtonClicked(View view) {
final String groupName = getGroupName(view);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(this);
builder.setTitle(R.string.deleteConfirmationGroup);
builder.setMessage(groupName);

View File

@@ -0,0 +1,29 @@
package protect.card_locker;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.net.Uri;
import android.util.Log;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
public class OpenWebLinkHandler {
private static final String TAG = "Catima";
public void openBrowser(AppCompatActivity activity, String url) {
if (url == null) {
return;
}
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
try {
activity.startActivity(intent);
} catch (ActivityNotFoundException e) {
Toast.makeText(activity, R.string.failedToOpenUrl, Toast.LENGTH_LONG).show();
Log.e(TAG, "No activity found to handle intent", e);
}
}
}

View File

@@ -0,0 +1,94 @@
package protect.card_locker;
import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.os.Build;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
public class PermissionUtils {
/**
* Check if storage read permission is needed.
*
* This is only necessary on Android 6.0 (Marshmallow) and below. See
* https://github.com/CatimaLoyalty/Android/issues/979 for more info.
*
* @param activity
* @return
*/
private static boolean needsStorageReadPermission(Activity activity) {
// Testing showed this permission wasn't needed for anything Catima did past Marshmallow
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
return false;
}
return ContextCompat.checkSelfPermission(activity, android.Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED;
}
/**
* Check if camera permission is needed.
*
* @param activity
* @return
*/
public static boolean needsCameraPermission(Activity activity) {
// Android only introduced the runtime permission system in Marshmallow (Android 6.0)
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
return false;
}
return ContextCompat.checkSelfPermission(activity, android.Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED;
}
/**
* Call onRequestPermissionsResult after storage read permission was granted.
* Mocks a successful grant if a grant is not necessary.
*
* @param activity
* @param requestCode
*/
public static void requestStorageReadPermission(CatimaAppCompatActivity activity, int requestCode) {
String[] permissions = new String[]{ android.Manifest.permission.READ_EXTERNAL_STORAGE };
int[] mockedResults = new int[]{ PackageManager.PERMISSION_GRANTED };
if (needsStorageReadPermission(activity)) {
ActivityCompat.requestPermissions(activity, permissions, requestCode);
} else {
// FIXME: This points to onMockedRequestPermissionResult instead of to
// onRequestPermissionResult because onRequestPermissionResult was only introduced in
// Android 6.0 (SDK 23) and we and to support Android 5.0 (SDK 21) too.
//
// When minSdk becomes 23, this should point to onRequestPermissionResult directly and
// the activity input variable should be changed from CatimaAppCompatActivity to
// Activity.
activity.onMockedRequestPermissionsResult(requestCode, permissions, mockedResults);
}
}
/**
* Call onRequestPermissionsResult after camera permission was granted.
* Mocks a successful grant if a grant is not necessary.
*
* @param activity
* @param requestCode
*/
public static void requestCameraPermission(CatimaAppCompatActivity activity, int requestCode) {
String[] permissions = new String[]{ Manifest.permission.CAMERA };
int[] mockedResults = new int[]{ PackageManager.PERMISSION_GRANTED };
if (needsCameraPermission(activity)) {
ActivityCompat.requestPermissions(activity, permissions, requestCode);
} else {
// FIXME: This points to onMockedRequestPermissionResult instead of to
// onRequestPermissionResult because onRequestPermissionResult was only introduced in
// Android 6.0 (SDK 23) and we and to support Android 5.0 (SDK 21) too.
//
// When minSdk becomes 23, this should point to onRequestPermissionResult directly and
// the activity input variable should be changed from CatimaAppCompatActivity to
// Activity.
activity.onMockedRequestPermissionsResult(requestCode, permissions, mockedResults);
}
}
}

View File

@@ -1,17 +1,31 @@
package protect.card_locker;
import android.Manifest;
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Settings;
import android.util.DisplayMetrics;
import android.util.Log;
import android.util.TypedValue;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.ContextCompat;
import com.google.zxing.ResultPoint;
import com.google.zxing.client.android.Intents;
import com.journeyapps.barcodescanner.BarcodeCallback;
@@ -21,10 +35,8 @@ import com.journeyapps.barcodescanner.DecoratedBarcodeView;
import java.util.List;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.widget.Toolbar;
import protect.card_locker.databinding.CustomBarcodeScannerBinding;
import protect.card_locker.databinding.ScanActivityBinding;
/**
* Custom Scannner Activity extending from Activity to display a custom layout form scanner view.
@@ -33,8 +45,16 @@ import androidx.appcompat.widget.Toolbar;
* originally licensed under Apache 2.0
*/
public class ScanActivity extends CatimaAppCompatActivity {
private ScanActivityBinding binding;
private CustomBarcodeScannerBinding customBarcodeScannerBinding;
private static final String TAG = "Catima";
private static final int MEDIUM_SCALE_FACTOR_DIP = 460;
private static final int COMPAT_SCALE_FACTOR_DIP = 320;
private static final int PERMISSION_SCAN_ADD_FROM_IMAGE = 100;
private CaptureManager capture;
private DecoratedBarcodeView barcodeScannerView;
@@ -56,23 +76,22 @@ public class ScanActivity extends CatimaAppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ScanActivityBinding.inflate(getLayoutInflater());
customBarcodeScannerBinding = CustomBarcodeScannerBinding.bind(binding.zxingBarcodeScanner);
setTitle(R.string.scanCardBarcode);
setContentView(R.layout.scan_activity);
Toolbar toolbar = findViewById(R.id.toolbar);
setContentView(binding.getRoot());
Toolbar toolbar = binding.toolbar;
setSupportActionBar(toolbar);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
}
enableToolbarBackButton();
extractIntentFields(getIntent());
manualAddLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> handleActivityResult(Utils.SELECT_BARCODE_REQUEST, result.getResultCode(), result.getData()));
photoPickerLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> handleActivityResult(Utils.BARCODE_IMPORT_FROM_IMAGE_FILE, result.getResultCode(), result.getData()));
findViewById(R.id.add_from_image).setOnClickListener(this::addFromImage);
findViewById(R.id.add_manually).setOnClickListener(this::addManually);
customBarcodeScannerBinding.addFromImage.setOnClickListener(this::addFromImage);
customBarcodeScannerBinding.addManually.setOnClickListener(this::addManually);
barcodeScannerView = findViewById(R.id.zxing_barcode_scanner);
barcodeScannerView = binding.zxingBarcodeScanner;
// Even though we do the actual decoding with the barcodeScannerView
// CaptureManager needs to be running to show the camera and scanning bar
@@ -109,6 +128,10 @@ public class ScanActivity extends CatimaAppCompatActivity {
protected void onResume() {
super.onResume();
capture.onResume();
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
showCameraPermissionMissingText(false);
}
scaleScreen();
}
@Override
@@ -205,13 +228,74 @@ public class ScanActivity extends CatimaAppCompatActivity {
}
public void addFromImage(View view) {
PermissionUtils.requestStorageReadPermission(this, PERMISSION_SCAN_ADD_FROM_IMAGE);
}
private void addFromImageAfterPermission() {
Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
photoPickerIntent.setType("image/*");
Intent contentIntent = new Intent(Intent.ACTION_GET_CONTENT);
contentIntent.setType("image/*");
Intent chooserIntent = Intent.createChooser(photoPickerIntent, getString(R.string.addFromImage));
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { contentIntent });
try {
photoPickerLauncher.launch(photoPickerIntent);
photoPickerLauncher.launch(chooserIntent);
} catch (ActivityNotFoundException e) {
Toast.makeText(getApplicationContext(), R.string.failedLaunchingPhotoPicker, Toast.LENGTH_LONG).show();
Log.e(TAG, "No activity found to handle intent", e);
}
}
private void showCameraPermissionMissingText(boolean show) {
customBarcodeScannerBinding.cameraPermissionDeniedLayout.cameraPermissionDeniedClickableArea.setOnClickListener(show ? v -> {
navigateToSystemPermissionSetting();
} : null);
customBarcodeScannerBinding.cardInputContainer.setBackgroundColor(show ? obtainThemeAttribute(R.attr.colorSurface) : Color.TRANSPARENT);
customBarcodeScannerBinding.cameraPermissionDeniedLayout.getRoot().setVisibility(show ? View.VISIBLE : View.GONE);
}
private void scaleScreen() {
DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int screenHeight = displayMetrics.heightPixels;
float mediumSizePx = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,MEDIUM_SCALE_FACTOR_DIP,getResources().getDisplayMetrics());
boolean shouldScaleSmaller = screenHeight < mediumSizePx;
customBarcodeScannerBinding.cameraPermissionDeniedLayout.cameraPermissionDeniedIcon.setVisibility(shouldScaleSmaller ? View.GONE : View.VISIBLE);
customBarcodeScannerBinding.cameraPermissionDeniedLayout.cameraPermissionDeniedTitle.setVisibility(shouldScaleSmaller ? View.GONE : View.VISIBLE);
}
private int obtainThemeAttribute(int attribute) {
TypedValue typedValue = new TypedValue();
getTheme().resolveAttribute(attribute, typedValue, true);
return typedValue.data;
}
private void navigateToSystemPermissionSetting() {
Intent permissionIntent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.fromParts("package", getPackageName(), null));
permissionIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(permissionIntent);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
onMockedRequestPermissionsResult(requestCode, permissions, grantResults);
}
public void onMockedRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
boolean granted = grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED;
if (requestCode == CaptureManager.getCameraPermissionReqCode()) {
showCameraPermissionMissingText(!granted);
} else if (requestCode == PERMISSION_SCAN_ADD_FROM_IMAGE) {
if (granted) {
addFromImageAfterPermission();
} else {
Toast.makeText(this, R.string.storageReadPermissionRequired, Toast.LENGTH_LONG).show();
}
}
}
}

View File

@@ -22,4 +22,8 @@ public class ThirdPartyInfo {
public String license() {
return mLicense;
}
public String toHtml() {
return String.format("<a href=\"%s\">%s</a> (%s)", url(), name(), license());
}
}

View File

@@ -18,6 +18,7 @@ import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatImageView;
import androidx.core.content.ContextCompat;
import androidx.core.graphics.ColorUtils;
import androidx.core.view.WindowInsetsControllerCompat;
public class UCropWrapper extends UCropActivity {
public static final String UCROP_TOOLBAR_TYPEFACE_STYLE = "ucop_toolbar_typeface_style";
@@ -28,7 +29,9 @@ public class UCropWrapper extends UCropActivity {
boolean darkMode = Utils.isDarkModeEnabled(this);
// setup status bar to look like the rest of the app
if (Build.VERSION.SDK_INT >= 23) {
getWindow().getDecorView().setSystemUiVisibility(darkMode ? 0 : View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
View decorView = getWindow().getDecorView();
WindowInsetsControllerCompat wic = new WindowInsetsControllerCompat(getWindow(), decorView);
wic.setAppearanceLightStatusBars(!darkMode);
} else {
// icons are always white back then
if (!darkMode) {

View File

@@ -11,6 +11,7 @@ import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.ImageDecoder;
import android.graphics.Matrix;
import android.net.Uri;
import android.os.Build;
import android.os.LocaleList;
import android.provider.MediaStore;
@@ -19,6 +20,13 @@ import android.util.TypedValue;
import android.view.MenuItem;
import android.widget.Toast;
import androidx.annotation.RawRes;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.app.AppCompatDelegate;
import androidx.core.graphics.ColorUtils;
import androidx.exifinterface.media.ExifInterface;
import androidx.palette.graphics.Palette;
import com.google.android.material.color.DynamicColors;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.LuminanceSource;
@@ -28,13 +36,18 @@ import com.google.zxing.RGBLuminanceSource;
import com.google.zxing.Result;
import com.google.zxing.common.HybridBinarizer;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringWriter;
import java.math.BigDecimal;
import java.nio.charset.StandardCharsets;
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Calendar;
@@ -44,11 +57,6 @@ import java.util.GregorianCalendar;
import java.util.Locale;
import java.util.Map;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.app.AppCompatDelegate;
import androidx.core.graphics.ColorUtils;
import androidx.exifinterface.media.ExifInterface;
import androidx.palette.graphics.Palette;
import protect.card_locker.preferences.Settings;
public class Utils {
@@ -118,12 +126,8 @@ public class Utils {
Bitmap bitmap;
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
ImageDecoder.Source image_source = ImageDecoder.createSource(context.getContentResolver(), intent.getData());
bitmap = ImageDecoder.decodeBitmap(image_source, (decoder, info, source) -> decoder.setMutableRequired(true));
} else {
bitmap = MediaStore.Images.Media.getBitmap(context.getContentResolver(), intent.getData());
}
Uri data = intent.getData();
bitmap = retrieveImageFromUri(context, data);
} catch (IOException e) {
Log.e(TAG, "Error getting data from image file");
e.printStackTrace();
@@ -163,6 +167,20 @@ public class Utils {
throw new UnsupportedOperationException("Unknown request code for parseSetBarcodeActivityResult");
}
static public Bitmap retrieveImageFromUri(Context context, Uri data) throws IOException {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
ImageDecoder.Source image_source = ImageDecoder.createSource(context.getContentResolver(), data);
return ImageDecoder.decodeBitmap(image_source, (decoder, info, source) -> decoder.setMutableRequired(true));
} else {
return getBitmapSdkLessThan29(data, context);
}
}
@SuppressWarnings("deprecation")
private static Bitmap getBitmapSdkLessThan29(Uri data, Context context) throws IOException {
return MediaStore.Images.Media.getBitmap(context.getContentResolver(), data);
}
static public BarcodeValues getBarcodeFromBitmap(Bitmap bitmap) {
// This function is vulnerable to OOM, so we try again with a smaller bitmap is we get OOM
for (int i = 0; i < 10; i++) {
@@ -205,6 +223,11 @@ public class Utils {
date.set(Calendar.SECOND, 0);
date.set(Calendar.MILLISECOND, 0);
// Note: In #1083 it was discovered that `DatePickerFragment` may sometimes store the expiryDate
// at 12:00 PM instead of 12:00 AM in the DB. While this has been fixed and the 12-hour difference
// is not a problem for the way the comparison currently works, it's good to keep in mind such
// dates may exist in the DB in case the comparison changes in the future and the new one relies
// on both dates being set at 12:00 AM.
return expiryDate.before(date.getTime());
}
@@ -396,8 +419,7 @@ public class Utils {
Resources res = context.getResources();
Configuration configuration = res.getConfiguration();
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
configuration.locale = chosenLocale != null ? chosenLocale : Locale.getDefault();
res.updateConfiguration(configuration, res.getDisplayMetrics());
setLocalesSdkLessThan24(chosenLocale, configuration, res);
return context;
}
@@ -407,6 +429,12 @@ public class Utils {
return context.createConfigurationContext(configuration);
}
@SuppressWarnings("deprecation")
private static void setLocalesSdkLessThan24(Locale chosenLocale, Configuration configuration, Resources res) {
configuration.locale = chosenLocale != null ? chosenLocale : Locale.getDefault();
res.updateConfiguration(configuration, res.getDisplayMetrics());
}
static public long getUnixTime() {
return System.currentTimeMillis() / 1000;
}
@@ -488,7 +516,7 @@ public class Utils {
} else {
// final catch all in case of invalid theme value from older versions
// also handles R.string.settings_key_system_theme
DynamicColors.applyIfAvailable(activity);
DynamicColors.applyToActivityIfAvailable(activity);
}
if (isDarkModeEnabled(activity) && settings.getOledDark()) {
@@ -528,4 +556,23 @@ public class Utils {
final int color = (int) (Math.random() * colors.length());
return colors.getColor(color, Color.BLACK);
}
public static String readTextFile(Context context, @RawRes int resourceId) throws IOException {
InputStream input = context.getResources().openRawResource(resourceId);
BufferedReader reader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8));
StringBuilder result = new StringBuilder();
while (true) {
String nextLine = reader.readLine();
if (nextLine == null || nextLine.isEmpty()) {
reader.close();
break;
}
result.append("\n");
result.append(nextLine);
}
return result.toString();
}
}

View File

@@ -15,7 +15,15 @@ import java.io.Reader;
import java.nio.charset.StandardCharsets;
public class ZipUtils {
static public String read(ZipInputStream zipInputStream) throws IOException {
public static Bitmap readImage(ZipInputStream zipInputStream) {
return BitmapFactory.decodeStream(zipInputStream);
}
public static JSONObject readJSON(ZipInputStream zipInputStream) throws IOException, JSONException {
return new JSONObject(read(zipInputStream));
}
private static String read(ZipInputStream zipInputStream) throws IOException {
StringBuilder stringBuilder = new StringBuilder();
Reader reader = new BufferedReader(new InputStreamReader(zipInputStream, StandardCharsets.UTF_8));
int c;
@@ -24,12 +32,4 @@ public class ZipUtils {
}
return stringBuilder.toString();
}
static public Bitmap readImage(ZipInputStream zipInputStream) {
return BitmapFactory.decodeStream(zipInputStream);
}
static public JSONObject readJSON(ZipInputStream zipInputStream) throws IOException, JSONException {
return new JSONObject(read(zipInputStream));
}
}

View File

@@ -13,7 +13,6 @@ import org.apache.commons.csv.CSVRecord;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
@@ -55,7 +54,7 @@ public class CatimaImporter implements Importer {
String fileName = Uri.parse(localFileHeader.getFileName()).getLastPathSegment();
if (fileName.equals("catima.csv")) {
importCSV(context, database, new ByteArrayInputStream(ZipUtils.read(zipInputStream).getBytes(StandardCharsets.UTF_8)));
importCSV(context, database, zipInputStream);
} else if (fileName.endsWith(".png")) {
Utils.saveCardImage(context, ZipUtils.readImage(zipInputStream), fileName);
} else {
@@ -68,23 +67,14 @@ public class CatimaImporter implements Importer {
bufferedInputStream.reset();
importCSV(context, database, bufferedInputStream);
}
input.close();
}
public void importCSV(Context context, SQLiteDatabase database, InputStream input) throws IOException, FormatException, InterruptedException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8));
bufferedReader.mark(100);
Integer version = 1;
try {
version = Integer.parseInt(bufferedReader.readLine());
} catch (NumberFormatException _e) {
// Assume version 1
}
bufferedReader.reset();
int version = parseVersion(bufferedReader);
switch (version) {
case 1:
parseV1(context, database, bufferedReader);
@@ -95,8 +85,6 @@ public class CatimaImporter implements Importer {
default:
throw new FormatException(String.format("No code to parse version %s", version));
}
bufferedReader.close();
}
public void parseV1(Context context, SQLiteDatabase database, BufferedReader input) throws IOException, FormatException, InterruptedException {
@@ -118,8 +106,8 @@ public class CatimaImporter implements Importer {
}
public void parseV2(Context context, SQLiteDatabase database, BufferedReader input) throws IOException, FormatException, InterruptedException {
Integer part = 0;
String stringPart = "";
int part = 0;
StringBuilder stringPart = new StringBuilder();
try {
while (true) {
@@ -135,7 +123,7 @@ public class CatimaImporter implements Importer {
break;
case 1:
try {
parseV2Groups(database, stringPart);
parseV2Groups(database, stringPart.toString());
sectionParsed = true;
} catch (FormatException e) {
// We may have a multiline field, try again
@@ -143,7 +131,7 @@ public class CatimaImporter implements Importer {
break;
case 2:
try {
parseV2Cards(context, database, stringPart);
parseV2Cards(context, database, stringPart.toString());
sectionParsed = true;
} catch (FormatException e) {
// We may have a multiline field, try again
@@ -151,7 +139,7 @@ public class CatimaImporter implements Importer {
break;
case 3:
try {
parseV2CardGroups(database, stringPart);
parseV2CardGroups(database, stringPart.toString());
sectionParsed = true;
} catch (FormatException e) {
// We may have a multiline field, try again
@@ -167,12 +155,12 @@ public class CatimaImporter implements Importer {
if (sectionParsed) {
part += 1;
stringPart = "";
stringPart = new StringBuilder();
} else {
stringPart += tmp + "\n";
stringPart.append(tmp).append('\n');
}
} else {
stringPart += tmp + "\n";
stringPart.append(tmp).append('\n');
}
}
} catch (FormatException e) {
@@ -255,6 +243,35 @@ public class CatimaImporter implements Importer {
}
}
/**
* Parse the version number of the import file
*
* @param reader the reader containing the import file
* @return the parsed version number, defaulting to 1 if none is found
* @throws IOException there was a problem reading the file
*/
private int parseVersion(BufferedReader reader) throws IOException {
reader.mark(10); // slightly over the search limit just to be sure
StringBuilder sb = new StringBuilder();
int searchLimit = 5; // gives you version numbers up to 99999
int codePoint;
// search until the next whitespace, indicating the end of the version
while (!Character.isWhitespace(codePoint = reader.read())) {
// we found something that isn't a digit, or we ran out of chars
if (!Character.isDigit(codePoint) || searchLimit <= 0) {
reader.reset();
return 1; // default value
}
sb.append((char) codePoint);
searchLimit--;
}
reader.reset();
if (sb.length() == 0) {
return 1;
}
return Integer.parseInt(sb.toString());
}
/**
* Import a single loyalty card into the database using the given
* session.
@@ -338,7 +355,7 @@ public class CatimaImporter implements Importer {
// We catch this exception so we can still import old backups
}
DBHelper.insertLoyaltyCard(database, id, store, note, expiry, balance, balanceType, cardId, barcodeId, barcodeType, headerColor, starStatus, lastUsed,archiveStatus);
DBHelper.insertLoyaltyCard(database, id, store, note, expiry, balance, balanceType, cardId, barcodeId, barcodeType, headerColor, starStatus, lastUsed, archiveStatus);
}
/**

View File

@@ -17,32 +17,35 @@ import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatDelegate;
import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.FragmentResultListener;
import androidx.preference.ListPreference;
import androidx.preference.Preference;
import androidx.preference.PreferenceFragmentCompat;
import kotlin.Suppress;
import nl.invissvenska.numberpickerpreference.NumberDialogPreference;
import nl.invissvenska.numberpickerpreference.NumberPickerPreferenceDialogFragment;
import protect.card_locker.CatimaAppCompatActivity;
import protect.card_locker.MainActivity;
import protect.card_locker.R;
import protect.card_locker.Utils;
import protect.card_locker.databinding.SettingsActivityBinding;
public class SettingsActivity extends CatimaAppCompatActivity {
private SettingsActivityBinding binding;
private final static String RELOAD_MAIN_STATE = "mReloadMain";
private SettingsFragment fragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = SettingsActivityBinding.inflate(getLayoutInflater());
setTitle(R.string.settings);
setContentView(R.layout.settings_activity);
Toolbar toolbar = findViewById(R.id.toolbar);
setContentView(binding.getRoot());
Toolbar toolbar = binding.toolbar;
setSupportActionBar(toolbar);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
}
enableToolbarBackButton();
// Display the fragment as the main content.
fragment = new SettingsFragment();
@@ -163,6 +166,11 @@ public class SettingsActivity extends CatimaAppCompatActivity {
}
@Override
@SuppressWarnings("deprecation") // setTargetFragment
// androidx.preference.PreferenceDialogFragmentCompat uses the deprecated method
// `getTargetFragment()`, which throws if `setTargetFragment()` isn't used before.
// While this isn't fixed on upstream, suppress the deprecation warning
// https://issuetracker.google.com/issues/181793702
public void onDisplayPreferenceDialog(Preference preference) {
if (preference instanceof NumberDialogPreference) {
NumberDialogPreference dialogPreference = (NumberDialogPreference) preference;

View File

@@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#BD0000"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M10.94,8.12L7.48,4.66L9,3h6l1.83,2H20c1.1,0 2,0.9 2,2v12c0,0.05 -0.01,0.1 -0.02,0.16l-5.1,-5.1C16.96,13.71 17,13.36 17,13c0,-2.76 -2.24,-5 -5,-5C11.64,8 11.29,8.04 10.94,8.12zM20.49,23.31L18.17,21H4c-1.1,0 -2,-0.9 -2,-2V7c0,-0.59 0.27,-1.12 0.68,-1.49l-2,-2L2.1,2.1l19.8,19.8L20.49,23.31zM14.49,17.32l-1.5,-1.5C12.67,15.92 12.35,16 12,16c-1.66,0 -3,-1.34 -3,-3c0,-0.35 0.08,-0.67 0.19,-0.98l-1.5,-1.5C7.25,11.24 7,12.09 7,13c0,2.76 2.24,5 5,5C12.91,18 13.76,17.75 14.49,17.32z"/>
</vector>

View File

@@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="?attr/colorControlNormal"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M7,18c-1.1,0 -1.99,0.9 -1.99,2S5.9,22 7,22s2,-0.9 2,-2 -0.9,-2 -2,-2zM1,2v2h2l3.6,7.59 -1.35,2.45c-0.16,0.28 -0.25,0.61 -0.25,0.96 0,1.1 0.9,2 2,2h12v-2L7.42,15c-0.14,0 -0.25,-0.11 -0.25,-0.25l0.03,-0.12 0.9,-1.63h7.45c0.75,0 1.41,-0.41 1.75,-1.03l3.58,-6.49c0.08,-0.14 0.12,-0.31 0.12,-0.48 0,-0.55 -0.45,-1 -1,-1L5.21,4l-0.94,-2L1,2zM17,18c-1.1,0 -1.99,0.9 -1.99,2s0.89,2 1.99,2 2,-0.9 2,-2 -0.9,-2 -2,-2z"/>
</vector>

View File

@@ -27,6 +27,8 @@
</com.google.android.material.appbar.AppBarLayout>
<include layout="@layout/content_main"/>
<include
android:id="@+id/include"
layout="@layout/content_main" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="protect.card_locker.MainActivity"
tools:showIn="@layout/custom_barcode_scanner">
<LinearLayout
android:id="@+id/camera_permission_denied_clickable_area"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:id="@+id/camera_permission_denied_icon"
android:layout_width="match_parent"
android:layout_height="84dp"
android:scaleType="fitCenter"
android:src="@drawable/camera_permission_denied" />
<TextView
android:id="@+id/camera_permission_denied_title"
style="@style/TextAppearance.Material3.HeadlineLarge"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="@string/cameraPermissionDeniedTitle" />
<TextView
android:id="@+id/camera_permission_denied_message"
style="@style/AppTheme.TextView.NoData"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="@string/noCameraPermissionDirectToSystemSetting" />
</LinearLayout>
</RelativeLayout>

View File

@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
@@ -10,19 +9,21 @@
tools:showIn="@layout/main_activity">
<LinearLayout
android:visibility="gone"
android:id="@+id/helpSection"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:visibility="gone">
android:orientation="vertical">
<ImageView
android:id="@+id/welcome_icon"
android:layout_width="match_parent"
android:layout_height="184dp"
android:scaleType="fitCenter"
android:src="@drawable/ic_launcher_foreground" />
<TextView
android:id="@+id/welcome_text"
style="@style/TextAppearance.Material3.HeadlineLarge"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -30,40 +31,40 @@
android:text="@string/welcome" />
<TextView
android:id="@+id/add_card_instruction"
style="@style/AppTheme.TextView.NoData"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="@string/noGiftCards"/>
android:text="@string/noGiftCards" />
</LinearLayout>
<TextView
style="@style/AppTheme.TextView.NoData"
android:id="@+id/noMatchingCardsText"
style="@style/AppTheme.TextView.NoData"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center"
android:text="@string/noMatchingGiftCards"
android:visibility="gone"/>
android:visibility="gone" />
<TextView
style="@style/AppTheme.TextView.NoData"
android:id="@+id/noGroupCardsText"
style="@style/AppTheme.TextView.NoData"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center"
android:text="@string/noGroupCards"
android:visibility="gone"/>
android:visibility="gone" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/list"
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
app:spanCount="@integer/main_view_card_columns"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="80dp"
android:clipToPadding="false"
android:paddingBottom="80dp"
android:scrollbars="vertical"
android:visibility="gone"/>
android:visibility="gone"
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
app:spanCount="@integer/main_view_card_columns" />
</RelativeLayout>

View File

@@ -1,41 +1,57 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Based on https://github.com/journeyapps/zxing-android-embedded/blob/0fdfbce9fb3285e985bad9971c5f7c0a7a334e7b/sample/src/main/res/layout/custom_barcode_scanner.xml originally released under Apache 2.0 -->
<?xml version="1.0" encoding="utf-8"?><!-- Based on https://github.com/journeyapps/zxing-android-embedded/blob/0fdfbce9fb3285e985bad9971c5f7c0a7a334e7b/sample/src/main/res/layout/custom_barcode_scanner.xml originally released under Apache 2.0 -->
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<com.journeyapps.barcodescanner.BarcodeView
android:id="@+id/zxing_barcode_surface"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/zxing_barcode_surface"
app:zxing_framing_rect_width="250dp"
app:zxing_framing_rect_height="250dp"/>
app:zxing_framing_rect_height="250dp"
app:zxing_framing_rect_width="250dp" />
<com.journeyapps.barcodescanner.ViewfinderView
android:id="@+id/zxing_viewfinder_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/zxing_viewfinder_view"
app:zxing_possible_result_points="@color/zxing_custom_possible_result_points"
app:zxing_result_view="@color/zxing_custom_result_view"
app:zxing_viewfinder_laser="@color/zxing_custom_viewfinder_laser"
app:zxing_viewfinder_mask="@color/zxing_custom_viewfinder_mask"/>
app:zxing_viewfinder_mask="@color/zxing_custom_viewfinder_mask" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|center_horizontal"
android:gravity="center_horizontal"
android:orientation="vertical">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/card_input_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="@dimen/activity_scanner_padding">
<include
android:id="@+id/camera_permission_denied_layout"
layout="@layout/camera_permission_failed_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/add_from_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/addFromImage" />
android:text="@string/addFromImage"
app:layout_constraintBottom_toTopOf="@+id/add_manually"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/camera_permission_denied_layout"
app:layout_constraintVertical_bias="1.0" />
<Button
android:id="@+id/add_manually"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/addManually" />
</LinearLayout>
android:text="@string/addManually"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</merge>

View File

@@ -288,7 +288,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="numberDecimal"
android:digits="0123456789.,$" />
android:digits="0123456789,." />
</com.google.android.material.textfield.TextInputLayout>

View File

@@ -8,6 +8,7 @@
android:layout_height="fill_parent"
android:fitsSystemWindows="true">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/app_bar_layout"
android:layout_width="fill_parent"
@@ -264,6 +265,18 @@
android:tooltipText="@string/nextCard"
android:visibility="gone" />
<ImageButton
android:id="@+id/button_update_balance"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="end"
android:background="@android:color/transparent"
android:paddingStart="12dp"
android:paddingEnd="12dp"
android:src="@drawable/ic_baseline_shopping_cart_24"
android:tooltipText="@string/updateBalance"
android:visibility="gone" />
</com.google.android.material.bottomappbar.BottomAppBar>
<com.google.android.material.floatingactionbutton.FloatingActionButton

View File

@@ -36,6 +36,8 @@
</com.google.android.material.appbar.AppBarLayout>
<include layout="@layout/content_main"/>
<include
android:id="@+id/include"
layout="@layout/content_main" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@@ -29,6 +29,8 @@
</com.google.android.material.appbar.AppBarLayout>
<include layout="@layout/group_main"/>
<include
android:id="@+id/include"
layout="@layout/group_main" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@@ -8,39 +8,51 @@ Oğuz Ersen
Katharine Chui
mondstern
IllusiveMan196
Altonss
StoyanDimitrov
Petr Novák
Joel A
Michael Moroni
Taco
Altonss
SlavekB
Gediminas Murauskas
Petr Novák
Michael Moroni
Joel A
Taco
pfaffenrodt
Nyatsuki
Samantaz Fox
laralem
Samantaz Fox
arno-github
Ankit Tiwari
Sergio Paredes
Aayush Gupta
gallegonovato
huuhaa
arshbeerSingh
Freddo espresso
Quentin PAGÈS
Miha Frangež
Arnis Jaundzeikars
sr093906
Freddo espresso
mdvhimself
Katarzyna
Maciej Błędkowski
Magnitudee
Olivia (Zoe)
betsythefc
Silvério Santos
waffshappen
Robin
Eric
Alexander Ivanov
ati3
Giovanni
Jane Kong
K. Herbert
Magnitudee
Lisa A.
Mawuena M. KODZO A.
Max
Still Hsu
String E. Fighter
Tapu
Yurical
rr-vesp
alajemba-vik
@@ -50,87 +62,118 @@ Alessandro Mandelli
KovalevArtem
Artem M.
Astrohops1
BMN
BootVirtual
Clonewayx
D. Domig
Diego
Evgeniy Khramov
Fede Pujol
Jean-Luc Tibaux
Lukas Grassauer
Marnick L'Eau
Michalis
Michał
Mohamed A. Salah
Neko Nekowazarashi
Rishi Agarwal
Rosdyana Kusuma
umoenks
Simon Rusinov
Mritunjay
Tarik Dzambic
Thomas Bertels
Thomas Cruveilher
Tong Liu
Wanath
Runner
ce i moa
inesre
lgasp
phlostically
Ágata Leuck
BmBKun
Aditya Das
Asier
Kevin Sicong Jiang
Tomer Ben-Rachel
tfuxu
Ahmed Saleh
Airat
Alexander Ivanov
sNiXx
Angela Enogieru
AnimeshChatterjee1
Ashish Yadav
BMN
Aya Elsaadany
Biren
Booc Sylvan
CherryMonster222
Colgrave
Csaba
Mylou53
danieluhrinyi
Kasina Dheeraj
Donno
Eric
Evgeniy Khramov
Flav
Franciszek Stefan
Grzegorz
HowITsDone
Izzy
Jacek
Jacopo Gennaro Esposito
Jean Mareilles
Jean-Baptiste
Jean-Luc Tibaux
人工知能
krkk
Lisa
Laura Ferraz
Lucas da Costa
bittin
Manan Jhaveri
Marco
Mario M. Viscovich
Mattia
Md. Al-Amin
Michael Gangolf
3DN1M
Moi Toi
DivideEtImpera
Nicolas
pbeckmann
Peer Beckmann
Piotr Zet
Quang Nguyen
Ratnesh
Reza
Rohan Babbar
Ronak Upadhyay
Rose Liverman
SKULD
Samarth Asthan
Simone Dotto
Subhashish Anand
TenTraicion
Titas Pažereckas
Tom Sawyer
Tomer Ben-Rachel
Tony C
Tymofii Lytvynenko
Vancha March
Yevgeny M
Yusril A
Avik Kundu
diksha-2911
gbonaspetti
huang ivan
mtrmirez
opsik
polarhun
pooyanazari
psa-jforestier
Robin
sergio
Marcus
techwebpd
Truestorybaby
tygyh
unstartdev
luoyang3
JaeBeom An
JungHee Lee

View File

@@ -2,8 +2,8 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
<string name="action_search">بحث</string>
<string name="action_add">اضف</string>
<string name="noGiftCards">اضغط علي زر + لاضافة بطاقة, او استورد بعض منهم من قائمة ال ⋮.</string>
<string name="noMatchingGiftCards">لا نتائج. حاول تغيير بحثك.</string>
<string name="noGiftCards">اضغط على + الزر الإضافي لاضافة بطاقة, او استورد من ⋮ القائمة.</string>
<string name="noMatchingGiftCards">لا نتائج. حاول تغيير كلمات البحث.</string>
<string name="storeName">اسم</string>
<string name="note">مذكرة</string>
<string name="cardId">بطاقة شخصية</string>
@@ -12,17 +12,17 @@
<string name="noBarcode">لا يوجد باركود</string>
<string name="star">اضف الي المفضلة</string>
<string name="unstar">حذف من المفضلة</string>
<string name="cancel">الغاء</string>
<string name="cancel">إلغاء</string>
<string name="save">حفظ</string>
<string name="edit">تعديل</string>
<string name="delete">مسح</string>
<string name="confirm">تأكيد</string>
<string name="deleteConfirmation">مسح هذة البطاقة نهائيا؟</string>
<string name="ok">حسنا</string>
<string name="copy_to_clipboard">نسخ البطاقة الشخصية الي الحافظة</string>
<string name="copy_to_clipboard">نسخ البطاقة الشخصية الى الحافظة</string>
<string name="share">شارك</string>
<string name="sendLabel">ارسل…</string>
<string name="editCardTitle">عدل بطاقة</string>
<string name="editCardTitle">عدل البطاقة</string>
<string name="addCardTitle">اضف بطاقة</string>
<string name="scanCardBarcode">مسح باركود</string>
<string name="cardShortcut">اختصار البطاقة</string>
@@ -31,15 +31,14 @@
<string name="barcodeImageDescriptionWithType">صورة <xliff:g>%s</xliff:g> باركود</string>
<string name="noStoreError">لا يوجد اسم مدخل</string>
<string name="noCardIdError">لا يوجد بطاقة شخصية مدخلة</string>
<string name="noCardExistsError">لا يمكن العثور علي هذه البطاقة</string>
<string name="noCardExistsError">لا يمكن العثور على هذه البطاقة</string>
<string name="failedParsingImportUriError">لا يمكن تحليل الرابط المستورد</string>
<string name="importExport">استيراد/تصدير</string>
<string name="importExportHelp">عمل نسخ احتطياتي لبياناتك يسمح نقلها لجهاز اخر.</string>
<string name="importFailed">لا يمكن عمل الاستيراد</string>
<string name="importExportHelp">دعم بياناتك يسمح بنقلها إلى جهاز آخر.</string>
<string name="importFailed">تعذر إجراء الاستيراد</string>
<string name="exportSuccessfulTitle">متصدر</string>
<string name="exportFailedTitle">فشل التصدير</string>
<string name="exportFailed">لا يمكن عمل التصدير</string>
<string name="noExternalStoragePermissionError">امنح التخزين الخارجي اذن لاستيراد وتصدير البيانات</string>
<string name="exportOptionExplanation">ستتم كتابة البيانات في الموقع الذي تختاره.</string>
<string name="importOptionFilesystemButton">من نظام الملفات</string>
<string name="importOptionApplicationTitle">استخدم تطبيقًا آخر</string>
@@ -85,7 +84,7 @@
<string name="points">نقاط</string>
<string name="parsingBalanceFailed"><xliff:g>%s</xliff:g> لا يبدو أنه رصيد صالح.</string>
<string name="chooseImportType">استيراد البيانات من</string>
<string name="app_loyalty_card_keychain">Loyalty Card Keychain</string>
<string name="app_loyalty_card_keychain">سلسلة مفاتيح بطاقة الولاء</string>
<string name="privacy_policy">سياسة الخصوصية</string>
<string name="accept">قبول</string>
<string name="importCatima">الاستيراد من Catima</string>
@@ -138,7 +137,7 @@
<string name="sort">فرز</string>
<string name="showMoreInfo">اظهر المعلومات</string>
<string name="hideMoreInfo">إخفاء المعلومات</string>
<string name="swipeToSwitchImages">اسحب أو اضغط لفترة طويلة لتبديل الصور</string>
<string name="swipeToSwitchImages">امسح لتبديل الصور, اضغط لفترة طويلة لفتح الصورة في تطبيق المعرض</string>
<string name="sort_by_balance">الرصيد</string>
<string name="reverse">... بترتيب معكوس</string>
<string name="sort_by">صنف حسب</string>
@@ -160,7 +159,7 @@
<string name="unarchived">البطاقة غير مؤرشفة</string>
<string name="archiveList">أرشيف</string>
<string name="failedLaunchingPhotoPicker">تعذر العثور على تطبيق معرض مدعوم</string>
<string name="noGiftCardsGroup">انشئ بعض من البطاقات, و عيينهم لهذة المجموعة.</string>
<string name="noGiftCardsGroup">انشئ بعض من البطاقات, و عيينهم لهذه المجموعة.</string>
<string name="deleteTitle">مسح بطاقة</string>
<plurals name="selectedCardCount">
<item quantity="zero"><xliff:g>%d</xliff:g> محدد</item>
@@ -174,7 +173,7 @@
<string name="exportName">تصدير</string>
<string name="exporting">جار التصدير…</string>
<string name="importSuccessfulTitle">مستورد</string>
<string name="importFailedTitle">فشل الاستيراد</string>
<string name="importFailedTitle">فشل بالاستيراد</string>
<string name="sort_by_most_recently_used">الأكثر أستعمالا مؤخرا</string>
<string name="license">رخصة</string>
<string name="sort_by_name">اسم</string>
@@ -191,18 +190,18 @@
<plurals name="deleteCardsTitle">
<item quantity="zero">مسح <xliff:g>%d</xliff:g> بطاقة</item>
<item quantity="one">مسح <xliff:g>%d</xliff:g> بطاقة</item>
<item quantity="two">مسح <xliff:g>%d</xliff:g> بطاقة</item>
<item quantity="two">مسح <xliff:g>%d</xliff:g> بطاقتين</item>
<item quantity="few">مسح <xliff:g>%d</xliff:g> بطاقات</item>
<item quantity="many">مسح <xliff:g>%d</xliff:g> بطاقات</item>
<item quantity="other">مسح <xliff:g>%d</xliff:g> بطاقات</item>
</plurals>
<plurals name="deleteCardsConfirmation">
<item quantity="zero">مسح هذه <xliff:g>%d</xliff:g> بطاقة نهائيا؟</item>
<item quantity="one">مسح هذه <xliff:g>%d</xliff:g> بطاقة نهائيا؟</item>
<item quantity="two">مسح هذه <xliff:g>%d</xliff:g> بطاقة نهائيا؟</item>
<item quantity="few">مسح هذه <xliff:g>%d</xliff:g> بطاقات نهائيا؟</item>
<item quantity="many">مسح هذه <xliff:g>%d</xliff:g> بطاقات نهائيا؟</item>
<item quantity="other">مسح هذه <xliff:g>%d</xliff:g> بطاقات نهائيا؟</item>
<item quantity="zero">مسح هذه <xliff:g>%d</xliff:g> البطاقة نهائيا؟</item>
<item quantity="one">مسح هذه <xliff:g>%d</xliff:g> البطاقة نهائيا؟</item>
<item quantity="two">مسح هذه <xliff:g>%d</xliff:g> البطاقتين نهائيا؟</item>
<item quantity="few">مسح هذه <xliff:g>%d</xliff:g> البطاقات نهائيا؟</item>
<item quantity="many">مسح هذه <xliff:g>%d</xliff:g> البطاقات نهائيا؟</item>
<item quantity="other">مسح هذه <xliff:g>%d</xliff:g> البطاقات نهائيا؟</item>
</plurals>
<string name="importOptionFilesystemTitle">الاستيراد من نظام الملفات</string>
<string name="importOptionFilesystemExplanation">اختر ملفًا محددًا من نظام الملفات.</string>
@@ -271,4 +270,24 @@
<string name="settings_theme_color">لون المظهر</string>
<string name="previousCard">السابق</string>
<string name="nextCard">التالي</string>
<string name="failedToRetrieveImageFile">فشل في استخراج ملف الصورة</string>
<string name="barcodeLongPressMessage">يمكن فتح صور فقط في تطبيق معرض الصور</string>
<string name="failedToOpenUrl">ثبت متصفح ويب أولاً</string>
<string name="welcome">مرحبا بك في كاتيما</string>
<string name="updateBalanceTitle">كم أنفقت؟</string>
<string name="currentBalanceSentence">الرصيد الحالي: <xliff:g> %s </xliff:g></string>
<plurals name="viewArchivedCardsWithCount">
<item quantity="zero">عرض الأرشيف (<xliff:g>%1$d</xliff:g> بطاقة)</item>
<item quantity="one">عرض الأرشيف (<xliff:g>%1$d</xliff:g> بطاقة)</item>
<item quantity="two">عرض الأرشيف (<xliff:g>%1$d</xliff:g> بطاقتين)</item>
<item quantity="few">عرض الأرشيف (<xliff:g>%1$d</xliff:g> بطاقات)</item>
<item quantity="many">عرض الأرشيف (<xliff:g>%1$d</xliff:g> بطاقات)</item>
<item quantity="other">عرض الأرشيف (<xliff:g>%1$d</xliff:g> بطاقات)</item>
</plurals>
<string name="importCards">استيراد البطاقات</string>
<string name="newBalanceSentence">الرصيد الجديد: <xliff:g>%s</xliff:g></string>
<string name="cameraPermissionDeniedTitle">تعذر الوصول إلى الكاميرا</string>
<string name="noCameraPermissionDirectToSystemSetting">لمسح الباركود، ستحتاج Catima إلى الوصول إلى الكاميرا. اضغط هنا لتغيير إعدادات الأذونات.</string>
<string name="updateBalance">تحديث الرصيد</string>
<string name="updateBalanceHint">أدخل المبلغ</string>
</resources>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>

View File

@@ -34,7 +34,6 @@
<string name="setFrontImage">Снимка на предната страна</string>
<string name="photos">Снимки</string>
<string name="importOptionApplicationExplanation">Изберете файл на друго приложение.</string>
<string name="noExternalStoragePermissionError">Разрешете достъп до хранилището, за да работи внасянето и изнасянето</string>
<string name="noCardExistsError">Картата не е намерена</string>
<string name="updateBarcodeQuestionText">Идентификаторът е променен. Желаете ли с неговата стойност да бъде променен и щрихкодът\?</string>
<string name="updateBarcodeQuestionTitle">Обновяване на щрихкода\?</string>
@@ -184,7 +183,7 @@
<string name="settings_locale">Език</string>
<string name="noGroupCards">Групата е празна</string>
<string name="barcodeImageDescriptionWithType">Изображение на щрихкод от вид <xliff:g>%s</xliff:g></string>
<string name="swipeToSwitchImages">Плъзване или задържане за смяна на изображения</string>
<string name="swipeToSwitchImages">За да размените изображенията - плъзнете, а за да ги отворите в галерията - задръжте</string>
<string name="sort_by">Сортиране по</string>
<string name="reverse">…в обратен ред</string>
<string name="sort_by_balance">Наличност</string>
@@ -240,7 +239,7 @@
<string name="unarchived">Карта е извадена от архива</string>
<string name="archiveList">Архив</string>
<string name="noUnarchivedCardsMessage">Няма карти извън архива</string>
<string name="failedLaunchingPhotoPicker">Не е намерено поддържано приложение за галерия.</string>
<string name="failedLaunchingPhotoPicker">Не е намерено поддържано приложение за галерия</string>
<plurals name="groupCardCountWithArchived">
<item quantity="one"><xliff:g>%1$d</xliff:g> карта (<xliff:g id="archivedCount">%2$d</xliff:g> архивирана)</item>
<item quantity="other"><xliff:g>%1$d</xliff:g> карти (<xliff:g id="archivedCount">%2$d</xliff:g> архивирани)</item>
@@ -253,4 +252,16 @@
<item quantity="one">Преглед на архива (<xliff:g>%1$d</xliff:g> карта)</item>
<item quantity="other">Преглед на архива (<xliff:g>%1$d</xliff:g> карти)</item>
</plurals>
<string name="barcodeLongPressMessage">В приложението галерия могат да бъдат отваряни само изображения</string>
<string name="failedToRetrieveImageFile">Не е възможно извличане на изображение</string>
<string name="noCameraPermissionDirectToSystemSetting">За да сканирате щрихкодове с Catima е необходим достъп до камерата. За да промените разрешението докоснете тук.</string>
<string name="updateBalanceTitle">Каква е промяната\?</string>
<string name="updateBalanceHint">Въведете стойност</string>
<string name="newBalanceSentence">Нов баланс: <xliff:g>%s</xliff:g></string>
<string name="cameraPermissionDeniedTitle">Камерата е недостъпна</string>
<string name="currentBalanceSentence">Текущ баланс: <xliff:g>%s</xliff:g></string>
<string name="updateBalance">Обновяване на баланса</string>
<string name="importCards">Внасяне на карти</string>
<string name="storageReadPermissionRequired">За това действие е необходимо разрешение за четене на хранилището…</string>
<string name="cameraPermissionRequired">За това действие е необходимо разрешение за достъп до камерата…</string>
</resources>

View File

@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="save">সংরক্ষণ</string>
<string name="cancel">বাতিল</string>
<string name="unstar">তারা মুক্ত</string>
<string name="star">তারা</string>
<string name="barcodeNoBarcode">বারকোড না বারকোড</string>
<string name="barcodeNoBarcode">কোনো বারকোড নেই</string>
<string name="barcodeType">বারকোড ধরন</string>
<string name="note">বিঃদ্রঃ</string>
<string name="storeName">দোকানের নাম</string>
@@ -38,8 +38,8 @@
<string name="wrongValueForBarcodeType">বারকোড টাইপের জন্য ভুল মান</string>
<string name="copy_to_clipboard_multiple_toast">ক্লিপবোর্ড একাধিক টোস্টে অনুলিপি করুন</string>
<string name="intent_import_card_from_url_share_multiple_text">url থেকে ইন্টেন্ট ইম্পোর্ট কার্ড একাধিক টেক্সট শেয়ার করে</string>
<string name="frontImageDescription">সামনের চিত্রের বর্ণনা</string>
<string name="backImageDescription">পিছনের চিত্রের বর্ণনা</string>
<string name="frontImageDescription">সামনের চিত্র</string>
<string name="backImageDescription">পিছনের চিত্র</string>
<string name="photos">ছবি</string>
<string name="setFrontImage">সদর ছবি স্থাপন</string>
<string name="setBackImage">পিছনের ছবি স্থাপন</string>
@@ -71,17 +71,34 @@
<string name="sort_by_expiry">মেয়াদ শেষ করে সাজান</string>
<string name="reverse">বিপরীত</string>
<string name="sort_by">ক্রমানুসার</string>
<string name="noCardExistsError">োন কার্ড নেই ত্রুটি</string>
<string name="noCardExistsError">ার্ডটি পাওয়া যায়নি</string>
<string name="noStoreError">স্টোরেজ ত্রুটি নেই</string>
<string name="card_ids_copied">কার্ড আইডি কপি করা হয়েছে</string>
<string name="card_ids_copied">আইডি কপি করা হয়েছে</string>
<string name="noCardsMessage">কোন কার্ড বার্তা নেই</string>
<string name="addCardTitle">কার্ডের শিরোনাম যোগ করুন</string>
<string name="editCardTitle">কার্ডের শিরোনাম সম্পাদনা করুন</string>
<string name="sendLabel">লেবেল পাঠান</string>
<string name="sendLabel">পাঠান</string>
<string name="share">ভাগ</string>
<string name="copy_to_clipboard">নকল করুন ক্লিপবোর্ড এ</string>
<string name="deleteConfirmation">নিশ্চিতকরণ মুছে দিন</string>
<string name="confirm">নিশ্চিত করুন</string>
<string name="delete">মুছে ফেলুন</string>
<string name="edit">সম্পাদনা</string>
<string name="action_search">খুঁজুন</string>
<string name="card">কার্ড</string>
<string name="currency">মুদ্রা</string>
<string name="cardId">কার্ড আইডি</string>
<string name="noBarcode">বারকোড নেই</string>
<string name="deleteTitle">কার্ড ডিলিট করুন</string>
<string name="ok">ঠিক আছে</string>
<string name="about">সম্পর্কিত</string>
<string name="debug_version_fmt">সংস্করণ:
\n<xliff:g id="version">
\n%s</xliff:g></string>
<string name="importOptionApplicationButton">অন্য অ্যাপ ব্যাবহার করুন</string>
<string name="moveUp">উপরে উঠান</string>
<string name="moveDown">নিচে নামান</string>
<string name="barcode">বারকোড</string>
<string name="expiryDate">মেয়াদোত্তীর্ণ তারিখ</string>
<string name="noBarcodeFound">কোনো বারকোড পাওয়া যায়নি</string>
</resources>

View File

@@ -0,0 +1,55 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settings_locale">ভাষা</string>
<string name="action_search">খুঁজুন</string>
<string name="settings_pink_theme">গুলাপি</string>
<string name="settings_blue_theme">নীল</string>
<string name="settings_green_theme">সবুজ</string>
<string name="settings_brown_theme">বাদামি</string>
<string name="save">সংরক্ষণ</string>
<string name="cardId">কার্ড আইডি</string>
<string name="barcodeType">বারকোডের ধরন</string>
<string name="about">সম্পর্কিত</string>
<string name="card">কার্ড</string>
<string name="yes">হ্যাঁ</string>
<string name="settings_grey_theme">ধূসর</string>
<string name="ok">ঠিক আছে</string>
<string name="sendLabel">পাঠান…</string>
<string name="sort_by_name">নাম</string>
<string name="previousCard">পূর্ববর্তী</string>
<string name="all">সকল</string>
<string name="barcode">বারকোড</string>
<string name="never">কখনো না</string>
<string name="currency">মুদ্রা</string>
<string name="settings_violet_theme">বেগুনি</string>
<string name="no">না</string>
<string name="nextCard">পরবর্তী</string>
<string name="action_add">যুক্ত করুন</string>
<string name="noGiftCardsGroup">কিছু কার্ড তৈরি করুন এবং তারপর সেগুলিকে এখানে গ্রুপে বরাদ্দ করুন।</string>
<string name="noMatchingGiftCards">কোন ফলাফল নেই. আপনার অনুসন্ধান পরিবর্তন করার চেষ্টা করুন.</string>
<string name="storeName">নাম</string>
<string name="note">বিঃদ্রঃ</string>
<string name="star">ফেভারিটে যোগ করুন</string>
<string name="barcodeNoBarcode">কোন বারকোড নেই</string>
<string name="noBarcode">বারকোড নেই</string>
<string name="unstar">পছন্দের তালিকা থেকে অপসারণ</string>
<string name="cancel">বাতিল করুন</string>
<string name="edit">সম্পাদনা করুন</string>
<string name="delete">মুছে ফেলা</string>
<string name="confirm">নিশ্চিত করুন</string>
<string name="deleteConfirmation">এই কার্ডটি স্থায়ীভাবে মুছবেন\?</string>
<plurals name="deleteCardsConfirmation">
<item quantity="one">এই <xliff:g>%d</xliff:g> কার্ডটি স্থায়ীভাবে মুছবেন\?</item>
<item quantity="other">এই <xliff:g>%d</xliff:g> কার্ডগুলিকে স্থায়ীভাবে মুছবেন\?</item>
</plurals>
<string name="copy_to_clipboard">ক্লিপবোর্ডে আইডি কপি করুন</string>
<string name="share">শেয়ার করুন</string>
<string name="editCardTitle">কার্ড সম্পাদনা করুন</string>
<string name="addCardTitle">কার্ড যোগ করুন</string>
<string name="scanCardBarcode">বারকোড স্ক্যান করুন</string>
<plurals name="deleteCardsTitle">
<item quantity="one"><xliff:g>%d</xliff:g> কার্ড মুছুন</item>
<item quantity="other"><xliff:g>%d</xliff:g> কার্ডগুলো মুছুন</item>
</plurals>
<string name="deleteTitle">কার্ড মুছুন</string>
</resources>

View File

@@ -4,11 +4,11 @@
<string name="cancel">Odustani</string>
<string name="unstar">Ukloni sve omiljene</string>
<string name="star">Omiljene</string>
<string name="barcodeNoBarcode">Ova kartica nema barkode</string>
<string name="barcodeNoBarcode">Ne postoji barkod</string>
<string name="barcodeType">Barcode tip</string>
<string name="note">Bilježnica</string>
<string name="storeName">Ime</string>
<string name="noMatchingGiftCards">Nisam našao ništa. Pokušaj promijeniti pretragu.</string>
<string name="noMatchingGiftCards">Nema rezultata. Pokušaj promijeniti pretragu.</string>
<string name="noGiftCards">Kliknite + Plus dugme da dodate kartu ili uvozite nešto iz menija prvo.</string>
<string name="action_add">Dodaj</string>
<string name="all">Sve</string>
@@ -71,9 +71,9 @@
<string name="sort_by_expiry">Sajam</string>
<string name="reverse">Rikverc</string>
<string name="sort_by">Sortiraj</string>
<string name="noCardExistsError">Nisam mogao pronaći karticu</string>
<string name="noCardExistsError">Nisam mogao pronaći tu karticu</string>
<string name="noStoreError">Nije uneseno ime</string>
<string name="card_ids_copied">Kopiran ID kartice(s)</string>
<string name="card_ids_copied">Kopiran ID/ovi</string>
<string name="noCardsMessage">Dodaj prvo kartu</string>
<string name="addCardTitle">Dodaj Kartu</string>
<string name="editCardTitle">Izmijeni Karticu</string>
@@ -84,4 +84,33 @@
<string name="confirm">Potvrdi</string>
<string name="delete">Obriši</string>
<string name="edit">Izmijeni</string>
<string name="action_search">Traži</string>
<string name="ok">OK</string>
<string name="cardId">ID kartice</string>
<string name="exportFailed">Nisam uspio izvršiti izvoz</string>
<string name="app_copyright_old">Bazirano na Loyalty Card privjesku
\ncopyright © 2016-2020 Branden Archer</string>
<string name="noGiftCardsGroup">Kreirajte kartice, i dodajte ih ovdje u grupu.</string>
<string name="importExportHelp">Backupovanje vaših podataka omogućava njihov prenos na drugi uređaj.</string>
<string name="importSuccessfulTitle">Uvezeno</string>
<string name="exportFailedTitle">Izvoz neuspješan</string>
<string name="scanCardBarcode">Skeniraj barkod</string>
<string name="cardShortcut">Prečica kartice</string>
<string name="noCardIdError">ID nije unesen</string>
<string name="failedParsingImportUriError">Nisam uspio parsirati URI za uvoz</string>
<string name="importExport">Uvoz/Izvoz</string>
<string name="exportName">Izvoz</string>
<string name="importFailedTitle">Uvoz neuspješan</string>
<string name="importFailed">Nisam uspio odraditi uvoz</string>
<string name="exportSuccessfulTitle">Izvezeno</string>
<string name="importing">Uvozim…</string>
<string name="exporting">Izvozim…</string>
<string name="exportOptionExplanation">Ovi podaci će biti zapisani na lokaciju po Vašoj želji.</string>
<string name="importOptionFilesystemTitle">Uvoz iz file sistema</string>
<string name="importOptionFilesystemExplanation">Izaberite specifični file iz file sistema.</string>
<string name="importOptionFilesystemButton">Iz file sistema</string>
<string name="importOptionApplicationTitle">Koristi drugu aplikaciju</string>
<string name="importOptionApplicationExplanation">Koristi bilo koju aplikaciju ili Vašu omiljenu aplikaciju da bi otvorili file.</string>
<string name="importOptionApplicationButton">Koristi drugu aplikaciju</string>
<string name="about">O</string>
</resources>

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
<string name="action_add">Přidat</string>
<string name="noGiftCards">Klepnutím na tlačítko + plus přidáte kartu nebo ji nejprve importujete z nabídky ⋮.</string>
<string name="noGiftCards">Klepněte na tlačítko + plus pro přidá karty nebo naimportujete karty z nabídky ⋮.</string>
<string name="storeName">Název</string>
<string name="note">Poznámka</string>
<string name="cardId">ID karty</string>
@@ -29,15 +29,14 @@
<string name="exportFailed">Export nelze provést</string>
<string name="importing">Importuji…</string>
<string name="exporting">Exportuji…</string>
<string name="noExternalStoragePermissionError">Udělit oprávnění přístupu k externímu úložišti pro import nebo export dat</string>
<string name="importOptionFilesystemTitle">Import ze souborového systému</string>
<string name="importOptionFilesystemExplanation">Vyberte konkrétní soubor v úložišti.</string>
<string name="importOptionFilesystemButton">Ze souborového systému</string>
<string name="importOptionApplicationTitle">Použitím jiné aplikace</string>
<string name="importOptionApplicationExplanation">K otevření souboru použijte libovolnou aplikaci nebo svého oblíbeného správce souborů.</string>
<string name="importOptionApplicationExplanation">K otevření souboru použijte libovolnou aplikaci nebo svého oblíbeného správce souborů.</string>
<string name="importOptionApplicationButton">Použít jinou aplikaci</string>
<string name="about">O aplikaci</string>
<string name="app_license">Copyleftovaný svobodný software s licencí GPLv3+</string>
<string name="app_license">Copyleftovaný svobodný software s licencí GPLv3+</string>
<string name="about_title_fmt">O aplikaci <xliff:g id="app_name">%s</xliff:g></string>
<string name="debug_version_fmt">Verze: <xliff:g id="version">%s</xliff:g></string>
<string name="app_revision_fmt">Informace o revizi: <xliff:g id="app_revision_url">%s</xliff:g></string>
@@ -49,20 +48,20 @@
<string name="moveBarcodeToTopOfScreen">Přesunout čárový kód do horní části obrazovky</string>
<string name="chooseExpiryDate">Zvolte datum vypršení platnosti</string>
<string name="never">Nikdy</string>
<string name="expiryDate">Platnost</string>
<string name="expiryDate">Vypršení platnosti</string>
<string name="editBarcode">Upravit čárový kód</string>
<string name="barcode">Kód</string>
<string name="app_resources">Svobodné zdroje třetích stran: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="app_libraries">Svobodné knihovny třetích stran: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="app_copyright_old">Na základě Loyalty Card Keychain
<string name="app_copyright_old">Založeno na Loyalty Card Keychain
\ncopyright © 20162020 Branden Archer</string>
<string name="exportOptionExplanation">Data budou zapsána na místo podle vašeho výběru.</string>
<string name="failedParsingImportUriError">Nelze analyzovat import URI</string>
<string name="failedParsingImportUriError">Nelze analyzovat importovanou URI</string>
<string name="noCardExistsError">Takovou kartu nelze najít</string>
<string name="noCardsMessage">Nejprve přidejte kartu</string>
<string name="cardShortcut">Zástupce karty</string>
<string name="share">Podíl</string>
<string name="unstar">Odebrat z oblíbených</string>
<string name="share">Sdílet</string>
<string name="unstar">Odebrat z oblíbených</string>
<string name="star">Přidat do oblíbených</string>
<string name="noBarcode">Žádný čárový kód</string>
<string name="barcodeNoBarcode">Tato karta nemá čárový kód</string>
@@ -72,9 +71,9 @@
<string name="thumbnailDescription">Miniatura</string>
<string name="card_ids_copied">ID zkopírováno</string>
<plurals name="deleteCardsConfirmation">
<item quantity="one">Opravdu chcete <xliff:g>%d</xliff:g> kartu trvale odstranit\?</item>
<item quantity="few">Opravdu chcete <xliff:g>%d</xliff:g> karty trvale odstranit\?</item>
<item quantity="other">Opravdu chcete <xliff:g>%d</xliff:g> karet trvale odstranit\?</item>
<item quantity="one">Opravdu chcete trvale odstranit <xliff:g>%d</xliff:g> kartu\?</item>
<item quantity="few">Opravdu chcete trvale odstranit <xliff:g>%d</xliff:g> karty\?</item>
<item quantity="other">Opravdu chcete trvale odstranit <xliff:g>%d</xliff:g> karet\?</item>
</plurals>
<plurals name="deleteCardsTitle">
<item quantity="one">Odstranit <xliff:g>%d</xliff:g> kartu</item>
@@ -82,7 +81,7 @@
<item quantity="other">Odstranit <xliff:g>%d</xliff:g> karet</item>
</plurals>
<string name="importSuccessful">Data importována</string>
<string name="intent_import_card_from_url_share_text">Chci s Vámi sdílet kartu</string>
<string name="intent_import_card_from_url_share_text">Chci s Vámi sdílet kartu</string>
<string name="settings_disable_lockscreen_while_viewing_card">Bránit uzamykání obrazovky</string>
<string name="settings_keep_screen_on">Udržovat obrazovku zapnutou</string>
<string name="settings_max_font_size_scale">Maximální velikost písma</string>
@@ -113,7 +112,7 @@
<string name="settings_locale">Jazyk</string>
<string name="turn_flashlight_off">Vypnout světlo</string>
<string name="turn_flashlight_on">Zapnout světlo</string>
<string name="failedGeneratingShareURL">Nepodařilo se vygenerovat sdílenou adresu URL. Nahlaste to prosím.</string>
<string name="failedGeneratingShareURL">Nepodařilo se vygenerovat adresu URL pro sdílení. Nahlaste to prosím.</string>
<string name="passwordRequired">Zadejte prosím heslo</string>
<string name="no">Ne</string>
<string name="yes">Ano</string>
@@ -133,23 +132,23 @@
<string name="barcodeId">Hodnota čárového kódu</string>
<string name="setBarcodeId">Nastavení hodnoty čárového kódu</string>
<string name="sameAsCardId">Stejné jako ID</string>
<string name="importVoucherVaultMessage">Vyberte svůj <i>vouchervault.json</i> exportovaný z Voucher Vault, který chcete importovat.
<string name="importVoucherVaultMessage">Vyberte k importu svůj <i>vouchervault.json</i> exportovaný z Voucher Vault.
\nVytvoříte jej tak, že nejprve stisknete tlačítko Exportovat v aplikaci Voucher Vault.</string>
<string name="importVoucherVault">Import z Voucher Vault</string>
<string name="importStocardMessage">Vyberte svůj <i>***-sync.zip</i> exportovaný z aplikace Stocard, který chcete importovat.
<string name="importVoucherVault">Import z Voucher Vault</string>
<string name="importStocardMessage">Vyberte k importu svůj <i>***-sync.zip</i> exportovaný z aplikace Stocard.
\nZískejte ji zasláním e-mailu na adresu support@stocardapp.com s žádostí o export vašich dat.</string>
<string name="importStocard">Import ze Stocard</string>
<string name="importLoyaltyCardKeychainMessage">Vyberte <i>LoyaltyCardKeychain.csv</i> exportovaný z Loyalty Card Keychain, který chcete importovat.
<string name="importLoyaltyCardKeychainMessage">Vyberte k importu <i>LoyaltyCardKeychain.csv</i> exportovaný z Loyalty Card Keychain.
\nVytvoříte jej z nabídky Import/Export v Loyalty Card Keychain tak, že tam nejprve stisknete tlačítko Exportovat.</string>
<string name="importLoyaltyCardKeychain">Import z Loyalty Card Keychain</string>
<string name="importFidmeMessage">Vyberte svůj <i>fidme-export-request-xxxxxx.zip</i> exportovaný z FidMe k importu a poté vyberte typy čárových kódů ručně.
<string name="importLoyaltyCardKeychain">Import z Loyalty Card Keychain</string>
<string name="importFidmeMessage">Vyberte k importu svůj <i>fidme-export-request-xxxxxx.zip</i> exportovaný z FidMe a poté vyberte typy čárových kódů ručně.
\nVytvoříte jej ze svého profilu FidMe tak, že nejprve zvolíte možnost Ochrana dat a poté stisknete tlačítko Extrahovat moje data.</string>
<string name="importFidme">Import z FidMe</string>
<string name="importFidme">Import z FidMe</string>
<string name="importCatimaMessage">Vyberte <i>catima.zip</i> exportovaný z aplikace Catima, který chcete importovat.
\nVytvoříte jej z nabídky Import/Export jiné aplikace Catima tak, že v ní nejprve stisknete tlačítko Exportovat.</string>
<string name="importCatima">Import z Catima</string>
<string name="importCatima">Import z Catima</string>
<string name="accept">Přijmout</string>
<string name="privacy_policy_popup_text">Oznámení o zásadách ochrany osobních údajů (vyžadováno některými obchody s aplikacemi):
<string name="privacy_policy_popup_text">Oznámení o zásadách ochrany osobních údajů (vyžadováno některými obchody s aplikacemi):
\n
\nNejsou shromažďovány žádné údaje, což může potvrdit každý, protože naše aplikace je svobodný software.</string>
<string name="privacy_policy">Zásady soukromí</string>
@@ -162,7 +161,7 @@
<string name="errorReadingImage">Obrázek se nepodařilo přečíst</string>
<string name="noBarcodeFound">Čárový kód nenalezen</string>
<string name="groupsList">Skupiny: <xliff:g>%s</xliff:g></string>
<string name="addFromImage">Výběr obrázku z galerie</string>
<string name="addFromImage">Výběr obrázku z galerie</string>
<string name="addManually">Ruční zadání ID</string>
<string name="leaveWithoutSaveConfirmation">Ukončit bez uložení\?</string>
<string name="leaveWithoutSaveTitle">Ukončit</string>
@@ -194,7 +193,7 @@
<string name="sort_by_expiry">Vypršení</string>
<string name="sort_by_most_recently_used">Naposledy použité</string>
<string name="sort_by_name">Název</string>
<string name="swipeToSwitchImages">Přejetím nebo dlouhým stisknutím přepínáte obrázky</string>
<string name="swipeToSwitchImages">Přejetím přepínáte obrázky, dlouhým stisknutím otevřete obrázek v aplikaci pro galerii</string>
<string name="sort">Seřadit</string>
<string name="barcodeImageDescriptionWithType">Obrázek čárového kódu <xliff:g>%s</xliff:g></string>
<string name="version_history">Historie verzí</string>
@@ -204,7 +203,7 @@
<string name="on_github">na GitHubu</string>
<string name="source_repository">Úložiště zdrojů</string>
<string name="license">Licence</string>
<string name="help_translate_this_app">Pomozte s překladem této aplikace</string>
<string name="help_translate_this_app">Pomozte s překladem této aplikace</string>
<string name="report_error">Nahlásit chybu</string>
<string name="on_google_play">na Google Play</string>
<string name="exportPassword">Nastavení hesla pro ochranu exportu (volitelné)</string>
@@ -216,14 +215,14 @@
<string name="group_name_is_empty">Název skupiny nemůže být prázdný</string>
<string name="group_updated">Skupina aktualizována</string>
<string name="editGroup">Úprava skupiny: <xliff:g>%s</xliff:g></string>
<string name="noGiftCardsGroup">Zatím nemáte žádné věrnostní karty. Jakmile nějaké přidáte, můžete je přiřadit do skupiny zde.</string>
<string name="noGiftCardsGroup">Zatím nemáte žádné věrnostní karty. Jakmile nějaké přidáte, můžete je zde přiřadit do skupiny.</string>
<string name="shortcutSelectCard">Vybrat kartu</string>
<string name="action_show_details">Zobrazit detaily</string>
<string name="action_hide_details">Skrýt detaily</string>
<string name="translate_platform">na Weblate</string>
<string name="showMoreInfo">Zobrazit podrobnosti</string>
<string name="hideMoreInfo">Skrýt podrobnosti</string>
<string name="starred">S hvězdičkou</string>
<string name="starred">S hvězdičkou</string>
<string name="set_scale">Nastavení měřítka</string>
<string name="options">Volby</string>
<plurals name="balancePoints">
@@ -238,7 +237,7 @@
<string name="settings_lock_on_opening_orientation">Zamknout podle orientace použité při otevření karty</string>
<string name="archive">Archivovat</string>
<string name="unarchive">Vrátit z archivu</string>
<string name="archiveList">Archivovat</string>
<string name="archiveList">Archiv</string>
<string name="noUnarchivedCardsMessage">Nejsou žádné karty vrácené z archivu</string>
<string name="unarchived">Karta vrácena z archivu</string>
<string name="settings_card_orientation">Orientace čárového kódu</string>
@@ -260,4 +259,16 @@
<item quantity="few">Zobrazit archiv (<xliff:g>%1$d</xliff:g> karty)</item>
<item quantity="other">Zobrazit archiv (<xliff:g>%1$d</xliff:g> karet)</item>
</plurals>
<string name="barcodeLongPressMessage">V aplikaci pro galerii mohou být otevírány pouze obrázky</string>
<string name="failedToRetrieveImageFile">Nepodařilo se získat soubor obrázku</string>
<string name="cameraPermissionDeniedTitle">Nelze získat přístup k fotoaparátu</string>
<string name="importCards">Importovat karty</string>
<string name="updateBalance">Aktualizovat zůstatek</string>
<string name="currentBalanceSentence">Současný zůstatek: <xliff:g>%s</xliff:g></string>
<string name="noCameraPermissionDirectToSystemSetting">Pro skenování čárových kódů bude Catima potřebovat přístup k fotoaparátu. Klepněte zde pro změnu nastavení oprávnění.</string>
<string name="updateBalanceTitle">Kolik jste utratil\?</string>
<string name="updateBalanceHint">Zadejte výši</string>
<string name="newBalanceSentence">Nový zůstatek: <xliff:g>%s</xliff:g></string>
<string name="storageReadPermissionRequired">Pro tuto akci je potřeba oprávnění ke čtení úložiště…</string>
<string name="cameraPermissionRequired">Pro tuto akci je potřeba oprávnění k přístupu k fotoaparátu…</string>
</resources>

View File

@@ -67,7 +67,6 @@
<string name="importOptionFilesystemExplanation">Vælg en bestemt fil fra filsystemet.</string>
<string name="importOptionFilesystemTitle">Import fra filsystem</string>
<string name="exportOptionExplanation">Dataene skrives til en placering efter eget valg.</string>
<string name="noExternalStoragePermissionError">Giv først tilladelse til ekstern lagring til at importere eller eksportere kort</string>
<string name="failedParsingImportUriError">Kunne ikke analysere import-URI\'en</string>
<string name="noCardExistsError">Kunne ikke finde kort</string>
<string name="noCardIdError">Der er ikke angivet noget kort-ID</string>

View File

@@ -36,7 +36,6 @@
<string name="exportFailed">Export konnte nicht durchgeführt werden</string>
<string name="importing">Importiere…</string>
<string name="exporting">Exportiere…</string>
<string name="noExternalStoragePermissionError">Berechtigung für den externen Speicher zum Importieren oder Exportieren von Daten erteilen</string>
<string name="importOptionFilesystemTitle">Importiere aus dem Dateisystem</string>
<string name="importOptionFilesystemExplanation">Wähle eine Datei vom Dateisystem aus.</string>
<string name="importOptionFilesystemButton">Wähle vom Dateisystem</string>
@@ -185,7 +184,7 @@
<string name="settings_theme_color">Designfarbe</string>
<string name="app_contributors">Ermöglicht durch: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="barcodeImageDescriptionWithType">Bild <xliff:g>%s</xliff:g> Barcode</string>
<string name="swipeToSwitchImages">Wischen oder langes Drücken zum Wechseln der Bilder</string>
<string name="swipeToSwitchImages">Wischen zum Wechseln der Bilder, Halten zum Öffnen des Bildes in der Galerie</string>
<string name="sort_by">Sortieren nach</string>
<string name="sort_by_balance">Kontostand</string>
<string name="sort_by_expiry">Ablaufdatum</string>
@@ -253,4 +252,14 @@
<item quantity="other">Archiv ansehen (<xliff:g>%1$d</xliff:g> Karten)</item>
</plurals>
<string name="welcome">Willkommen bei Catima</string>
<string name="barcodeLongPressMessage">In der Galerie können nur Bilder geöffnet werden</string>
<string name="failedToRetrieveImageFile">Bilddatei konnte nicht abgerufen werden</string>
<string name="updateBalanceTitle">Wie viel haben Sie ausgegeben\?</string>
<string name="cameraPermissionDeniedTitle">Kein Zugriff auf die Kamera möglich</string>
<string name="noCameraPermissionDirectToSystemSetting">Um Strichcodes zu scannen, benötigt Catima Zugriff auf Ihre Kamera. Tippen Sie hier, um Ihre Berechtigungseinstellungen zu ändern.</string>
<string name="updateBalanceHint">Betrag eingeben</string>
<string name="importCards">Karten importieren</string>
<string name="currentBalanceSentence">Aktuelles Guthaben: <xliff:g>%s</xliff:g></string>
<string name="newBalanceSentence">Neues Guthaben: <xliff:g>%s</xliff:g></string>
<string name="updateBalance">Guthaben aktualisieren</string>
</resources>

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
<string name="action_add">Προσθήκη</string>
<string name="noGiftCards">Κάντε κλικ στο + κουμπί για να προσθέσετε μία κάρτα ή εισάγετε κάρτες από το ⋮ μενού.</string>
<string name="noGiftCards">Κάντε κλικ στο + κουμπί για να προσθέσετε μία κάρτα ή προσθέστε από το ⋮ μενού.</string>
<string name="storeName">Όνομα</string>
<string name="note">Σημείωση</string>
<string name="cardId">Κωδικός Κάρτας</string>
@@ -32,7 +32,6 @@
<string name="exportFailed">Δεν ήταν δυνατή η εξαγωγή</string>
<string name="importing">Γίνεται εισαγωγή του…</string>
<string name="exporting">Γίνεται εξαγωγή του…</string>
<string name="noExternalStoragePermissionError">Εγκρίνετε την άδεια εξωτερικής αποθήκευσης για να εισάγετε ή εξάγετε δεδομένα</string>
<string name="importOptionFilesystemTitle">Εισαγωγή από το σύστημα αρχείων</string>
<string name="importOptionFilesystemExplanation">Επιλέξτε ένα συγκεκριμένο αρχείο από το σύστημα αρχείων.</string>
<string name="importOptionFilesystemButton">Από το σύστημα αρχείων</string>
@@ -85,7 +84,7 @@
<string name="expiryDate">Ημερομηνία λήξης</string>
<string name="settings_keep_screen_on">Κράτα την οθόνη ανοιχτή</string>
<string name="leaveWithoutSaveTitle">Έξοδος</string>
<string name="swipeToSwitchImages">Σύρετε ή πατήστε παρατεταμένα για να αλλάξετε εικόνες</string>
<string name="swipeToSwitchImages">Σύρετε για να αλλάξετε εικόνες, κρατήστε για να ανοίξετε μια εικόνα στην συλλογή</string>
<string name="sort_by_balance">Υπόλοιπο</string>
<string name="reverse">... σε αντίθετη σειρά</string>
<string name="version_history">Ιστορικό έκδοσης</string>
@@ -245,4 +244,22 @@
<string name="unarchive">Αφαίρεση από το αρχείο</string>
<string name="archiveList">Αρχείο</string>
<string name="noUnarchivedCardsMessage">Δεν υπάρχουν αρχειοθετημένες κάρτες</string>
<string name="updateBalanceTitle">Πόσα ξοδέψατε;</string>
<string name="cameraPermissionDeniedTitle">Αδύνατη η πρόσβαση στην κάμερα</string>
<string name="failedToRetrieveImageFile">Αποτυχία ανάκτησης αρχείου εικόνας</string>
<string name="previousCard">Προηγούμενη</string>
<string name="nextCard">Επόμενη</string>
<string name="updateBalance">Ενημέρωση υπολοίπου</string>
<string name="barcodeLongPressMessage">Μόνο εικόνες μπορούν να ανοιχτούν στην εφαρμογή φωτογραφιών</string>
<string name="noCameraPermissionDirectToSystemSetting">Για να σκανάρετε γραμμοκώδικες, θα χρειαστεί πρόσβαση στην κάμερα από το Catima. Πατήστε εδώ για να δώσετε πρόσβαση.</string>
<plurals name="viewArchivedCardsWithCount">
<item quantity="one">Προβολή αρχείου (<xliff:g>%1$d</xliff:g> κάρτας)</item>
<item quantity="other">Προβολή αρχείου (<xliff:g>%1$d</xliff:g> καρτών)</item>
</plurals>
<string name="importCards">Εισαγωγή καρτών</string>
<string name="updateBalanceHint">Εισάγετε ποσό</string>
<string name="currentBalanceSentence">Τωρινό υπόλοιπο <xliff:g>%s</xliff:g></string>
<string name="newBalanceSentence">Νέο υπόλοιπο: <xliff:g>%s</xliff:g></string>
<string name="failedToOpenUrl">Εγκαταστήστε έναν περιηγητή πρώτα</string>
<string name="welcome">Καλώς ήρθατε στο Catima</string>
</resources>

View File

@@ -63,7 +63,6 @@
<string name="importOptionApplicationTitle">Uzi alian app</string>
<string name="importOptionFilesystemExplanation">Elektu specifa dosiero de la dosiersistemo.</string>
<string name="exportOptionExplanation">La datumoj estos skribita al loko de via elekto.</string>
<string name="noExternalStoragePermissionError">Grant ekstera stokado permeso de importado aŭ eksportado kartoj unua</string>
<string name="exportFailed">Ne povis eksporti kartoj</string>
<string name="importFailed">Ne povis importi kartoj</string>
<string name="importExportHelp">Subtenanta supre vian kartoj permesas vin movi ilin al alia aparato.</string>

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
<string name="action_add">Añadir</string>
<string name="noGiftCards">Pulse el botón «+» para añadir una tarjeta, o importe algunas del menú ⋮.</string>
<string name="noGiftCards">Haz clic en el botón + para añadir una tarjeta, o importa desde el menú ⋮.</string>
<string name="storeName">Nombre</string>
<string name="note">Nota</string>
<string name="cardId">ID. de tarjeta</string>
@@ -32,7 +32,6 @@
<string name="exportFailed">No se han podido exportar</string>
<string name="importing">Importando…</string>
<string name="exporting">Exportando…</string>
<string name="noExternalStoragePermissionError">Otorgar permiso de almacenamiento para importar o exportar datos</string>
<string name="importOptionFilesystemTitle">Importar desde el sistema de archivos</string>
<string name="importOptionFilesystemExplanation">Elegir un archivo concreto del sistema de archivos.</string>
<string name="importOptionFilesystemButton">Desde el sistema de archivos</string>
@@ -146,7 +145,7 @@
\n
\nNINGÚN DATO SE RECOPILA, cualquiera puede confirmar ya que nuestra aplicación es software libre.</string>
<string name="privacy_policy">Política de privacidad</string>
<string name="app_loyalty_card_keychain">Loyalty Card Keychain</string>
<string name="app_loyalty_card_keychain">Llavero con tarjeta de fidelización</string>
<string name="chooseImportType">Importar datos de</string>
<string name="parsingBalanceFailed"><xliff:g>%s</xliff:g> no tendría un saldo válido.</string>
<string name="currency">Moneda</string>
@@ -158,8 +157,9 @@
<string name="settings_disable_lockscreen_while_viewing_card">Evitar el bloqueo de pantalla</string>
<string name="settings_keep_screen_on">Mantener pantalla encendida</string>
<plurals name="selectedCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> tarjeta seleccionada</item>
<item quantity="other"><xliff:g>%d</xliff:g> tarjetas seleccionadas</item>
<item quantity="one"><xliff:g>%d</xliff:g> seleccionada</item>
<item quantity="many"><xliff:g>%d</xliff:g> seleccionadas</item>
<item quantity="other"><xliff:g>%d</xliff:g> seleccionadas</item>
</plurals>
<string name="deleteTitle">Eliminar la tarjeta</string>
<string name="deleteConfirmation">¿Quiere eliminar permanentemente esta tarjeta\?</string>
@@ -225,7 +225,7 @@
<string name="selectColor">Seleccione el color</string>
<string name="setIcon">Establecer icono</string>
<string name="sort">Ordenar</string>
<string name="swipeToSwitchImages">Desliza el dedo o haz una pulsación larga para cambiar de imagen</string>
<string name="swipeToSwitchImages">Desliza para cambiar de imagen, mantén presionado para abrir la imagen en la aplicación de la galería</string>
<string name="sort_by">Ordenar por</string>
<string name="rate_this_app">Califica esta aplicación</string>
<string name="options">Opciones</string>
@@ -258,4 +258,17 @@
<item quantity="many"><xliff:g>%1$d</xliff:g> tarjetas (archivadas)<xliff:g id="archivedCount">%2$d</xliff:g></item>
<item quantity="other"><xliff:g>%1$d</xliff:g> tarjetas (archivadas)<xliff:g id="archivedCount">%2$d</xliff:g></item>
</plurals>
<string name="starred">Estrellado</string>
<string name="failedToRetrieveImageFile">No se pudo recuperar el archivo de imagen</string>
<string name="barcodeLongPressMessage">Solo se pueden abrir imágenes en la aplicación de galería</string>
<string name="updateBalanceTitle">¿Cuánto has gastado\?</string>
<string name="currentBalanceSentence">Saldo actual: <xliff:g>%s</xliff:g></string>
<string name="noCameraPermissionDirectToSystemSetting">Para escanear códigos de barras, Catima necesitará acceso a su cámara. Toque aquí para cambiar la configuración de sus permisos.</string>
<string name="updateBalanceHint">Introduzca el importe</string>
<string name="newBalanceSentence">Nuevo balance: <xliff:g>%s</xliff:g></string>
<string name="cameraPermissionDeniedTitle">No se pudo acceder a la cámara</string>
<string name="updateBalance">Actualizar el balance</string>
<string name="importCards">Importar tarjetas</string>
<string name="storageReadPermissionRequired">Se necesita permiso para leer el almacenamiento para esta acción…</string>
<string name="cameraPermissionRequired">Se necesita permiso para acceder a la cámara para esta acción…</string>
</resources>

View File

@@ -1,10 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
<string name="noExternalStoragePermissionError">Salli käyttöoikeus ulkoisen tallennustilan käyttöön voidaksesi tuoda tai viedä tietoja</string>
<string name="no">Ei</string>
<string name="yes">Kyllä</string>
<string name="updateBarcodeQuestionText">Vaihdoit ID-tunnuksen. Haluatko päivittää myös viivakoodin käyttämään samaa arvoa\?</string>
<string name="updateBarcodeQuestionTitle">Päivitä viivakoodin arvo\?</string>
<string name="updateBarcodeQuestionTitle">Päivitetäänkö viivakoodin arvo\?</string>
<string name="intent_import_card_from_url_share_multiple_text">Haluan jakaa joitain kortteja kanssasi</string>
<string name="copy_to_clipboard_multiple_toast">ID-tunnukset kopioitu leikepöydälle</string>
<string name="wrongValueForBarcodeType">Arvo ei ole kelvollinen valitulle viivakoodityypille</string>
@@ -14,15 +13,15 @@
<string name="barcodeId">Viivakoodin arvo</string>
<string name="importVoucherVaultMessage">Valitse tuotava <i>vouchervault.json</i>-vienti Voucher Vaultista.
\nLuo se painamalla ensin Vie Voucher Vaultissa.</string>
<string name="importVoucherVault">Tuo Voucher Vault varmuuskopiotiedostosta</string>
<string name="importVoucherVault">Tuo Voucher Vault -varmuuskopiotiedostosta</string>
<string name="importLoyaltyCardKeychainMessage">Valitse tuotava <i>LoyaltyCardKeychain.csv</i>-vientitiedostosi Loyalty Card Keychainista.
\nTai luo se Loyalty Card Keychainin Import/Export-valikosta painamalla ensin Export (Vie).</string>
<string name="importLoyaltyCardKeychain">Tuo Loyalty Card Keychain varmuuskopiotiedostosta</string>
<string name="importFidmeMessage">Valitse tuotava <i>fidme-export-request-xxxxxxxx.zip</i>-vientitiedostosi FidMe:stä ja valitse viivakoodityypit manuaalisesti sen jälkeen.
\nLuo se FidMe-profiilistasi valitsemalla Tietosuoja ja painamalla ensin Extract my data.</string>
<string name="importFidme">Tuo FidMe varmuuskopiotiedostosta</string>
<string name="importFidme">Tuo FidMe-varmuuskopiotiedostosta</string>
<string name="importCatimaMessage">Valitse tuotava <i>catima.zip</i>-vientitiedostosi Catimasta.
\nLuo se Catima-sovelluksen Tuo/Vie-valikosta painamalla siellä ensin Vie.</string>
\nLuo se Catima-sovelluksen Tuo/vie-valikosta painamalla siellä ensin Vie.</string>
<string name="importCatima">Tuo Catima varmuuskopiotiedostosta</string>
<string name="accept">Hyväksy</string>
<string name="privacy_policy_popup_text">Tietosuojaseloste (joidenkin sovelluskauppojen vaatimus):
@@ -51,18 +50,18 @@
<string name="groupsList">Ryhmät: <xliff:g>%s</xliff:g></string>
<string name="addFromImage">Valitse kuva galleriasta</string>
<string name="addManually">Anna ID-tunnus manuaalisesti</string>
<string name="leaveWithoutSaveConfirmation">Poistu tallentamatta\?</string>
<string name="leaveWithoutSaveConfirmation">Poistutaanko tallentamatta\?</string>
<string name="leaveWithoutSaveTitle">Poistu</string>
<string name="moveDown">Siirrä alaspäin</string>
<string name="moveUp">Siirrä ylöspäin</string>
<string name="failedOpeningFileManager">Asenna ensin tiedostonhallintaohjelma.</string>
<string name="deleteConfirmationGroup">Poista ryhmä\?</string>
<string name="deleteConfirmationGroup">Poistetaanko ryhmä\?</string>
<string name="all">Kaikki</string>
<plurals name="groupCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> kortti</item>
<item quantity="other"><xliff:g>%d</xliff:g> kortit</item>
<item quantity="other"><xliff:g>%d</xliff:g> korttia</item>
</plurals>
<string name="noGroups">Napsauta + plus-painiketta lisätäksesi ryhmät luokittelua varten.</string>
<string name="noGroups">Napsauta plus-painiketta (+) lisätäksesi ryhmät luokittelua varten.</string>
<string name="groups">Ryhmät</string>
<string name="enter_group_name">Anna ryhmän nimi</string>
<string name="exportSuccessful">Tiedot viety</string>
@@ -78,18 +77,18 @@
<string name="settings_theme">Teema</string>
<string name="settings_category_title_ui">Käyttöliittymä</string>
<string name="settings">Asetukset</string>
<string name="starImage">Suosikki tähti</string>
<string name="starImage">Suosikkitähti</string>
<string name="thumbnailDescription">Pienoiskuva</string>
<string name="copy_to_clipboard_toast">ID-tunnus kopioitu leikepöydälle</string>
<string name="enterBarcodeInstructions">Syötä ID-tunnus ja valitse sen viivakoodityyppi, tai valitse \"Ei viivakoodia\".</string>
<string name="selectBarcodeTitle">Valitse viivakoodi</string>
<string name="app_resources">Vapaat kolmannen osapuolen resurssit: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="app_libraries">Kolmannen osapuolen Libre-kirjastot: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="app_libraries">Vapaat kolmannen osapuolen kirjastot: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="app_revision_fmt">Muutostiedot: <xliff:g id="app_revision_url">%s</xliff:g></string>
<string name="debug_version_fmt">Versio: <xliff:g id="version">%s</xliff:g></string>
<string name="about_title_fmt">Tietoja <xliff:g id="app_name">%s</xliff:g></string>
<string name="app_license">Copyleft (käyttäjänoikeus) - vapaa ohjelmisto, lisenssi GPLv3+</string>
<string name="app_copyright_old">Perustuu Loyalty Card Keychain sovellukseen
<string name="app_copyright_old">Perustuu Loyalty Card Keychain -sovellukseen
\ntekijänoikeus © 20162020 Branden Archer</string>
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Tekijänoikeus © 2019<xliff:g>%d</xliff:g> Sylvia van Os</string>
<string name="about">Tietoja</string>
@@ -110,7 +109,7 @@
<string name="importSuccessfulTitle">Tuonti valmis</string>
<string name="importExportHelp">Tietojesi varmuuskopiointi mahdollistaa niiden siirtämisen toiseen laitteeseen.</string>
<string name="exportName">Vie</string>
<string name="importExport">Tuo/Vie</string>
<string name="importExport">Tuo/vie</string>
<string name="failedParsingImportUriError">Tuonnin URI: n jäsentäminen epäonnistui</string>
<string name="noCardExistsError">Tätä korttia ei löytynyt</string>
<string name="noCardIdError">ID-tunnusta ei annettu</string>
@@ -139,7 +138,7 @@
<string name="note">Lisätieto</string>
<string name="storeName">Nimi</string>
<string name="noMatchingGiftCards">Ei hakutuloksia, kokeile toisella hakutermillä.</string>
<string name="noGiftCards">Lisää kortti napsauttamalla + plus-painiketta, tai mene ⋮ valikkoon tuodaksesi varmuuskopiosta.</string>
<string name="noGiftCards">Lisää kortti napsauttamalla plus-painiketta (+), tai mene ⋮-valikkoon tuodaksesi.</string>
<string name="action_add">Lisää</string>
<string name="action_search">Hae</string>
<string name="takePhoto">Ota valokuva</string>
@@ -149,32 +148,32 @@
<string name="photos">Valokuvat</string>
<string name="backImageDescription">Takakuva</string>
<string name="frontImageDescription">Etukuva</string>
<string name="deleteConfirmation">Poista tämä kortti\?</string>
<string name="deleteConfirmation">Poistetaanko tämä kortti\?</string>
<string name="deleteTitle">Poista kortti</string>
<plurals name="deleteCardsConfirmation">
<item quantity="one">Poista tämä <xliff:g>%d</xliff:g> kortti pysyvästi\?</item>
<item quantity="other">Poista tämä <xliff:g>%d</xliff:g> kortit pysyvästi\?</item>
<item quantity="one">Poistetaanko tämä <xliff:g>%d</xliff:g> kortti pysyvästi\?</item>
<item quantity="other">Poistetaanko nämä <xliff:g>%d</xliff:g> korttia pysyvästi\?</item>
</plurals>
<plurals name="deleteCardsTitle">
<item quantity="one">Poista <xliff:g>%d</xliff:g>kortti</item>
<item quantity="other">Poista <xliff:g>%d</xliff:g>kortit</item>
<item quantity="other">Poista <xliff:g>%d</xliff:g>korttia</item>
</plurals>
<plurals name="selectedCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> valittu</item>
<item quantity="other"><xliff:g>%d</xliff:g> valitut</item>
<item quantity="other"><xliff:g>%d</xliff:g> valittu</item>
</plurals>
<string name="importStocard">Tuo Stocardista</string>
<string name="importStocardMessage">Valitse tuotava <i>***-sync.zip</i>-vienti Stocardista.
\nHanki se lähettämällä sähköpostia osoitteeseen support@stocardapp.com ja pyytämällä tietojesi vientiä.</string>
<string name="passwordRequired">Ole hyvä ja syötä salasana</string>
<string name="failedGeneratingShareURL">Ei pystynyt luomaan jaettavaa URL-osoitetta. Ilmoita tästä.</string>
<string name="turn_flashlight_on">Sytytä taskulamppu</string>
<string name="failedGeneratingShareURL">Jaettavaa URL-osoitetta ei voitu luoda. Ilmoita tästä.</string>
<string name="turn_flashlight_on">ytä taskulamppua</string>
<string name="turn_flashlight_off">Sammuta salamavalo</string>
<string name="app_contributors">Mahdollistanut: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="settings_brown_theme">Ruskea</string>
<string name="settings_grey_theme">Harmaa</string>
<string name="settings_green_theme">Vihreä</string>
<string name="settings_sky_blue_theme">Taivaan sininen</string>
<string name="settings_sky_blue_theme">Taivaansininen</string>
<string name="settings_blue_theme">Siniset</string>
<string name="settings_violet_theme">Violetti</string>
<string name="settings_magenta_theme">Magenta</string>
@@ -195,7 +194,7 @@
</plurals>
<string name="settings_oled_dark">Musta tausta tummalle teemalle</string>
<string name="setIcon">Aseta kuvake</string>
<string name="swipeToSwitchImages">Vaihda kuvia pyyhkäisemällä tai painamalla pitkään</string>
<string name="swipeToSwitchImages">Vaihda kuvia pyyhkäisemällä, paina kuvaa pitkään avataksesi galleriasovelluksessa</string>
<string name="sort_by_name">Nimi</string>
<string name="sort_by_most_recently_used">Viimeksi käytetyt</string>
<string name="sort_by_expiry">Viimeinen voimassaoloaika</string>
@@ -227,10 +226,10 @@
<string name="selectColor">Valitse väri</string>
<string name="rate_this_app">Arvostele tämä sovellus</string>
<string name="noGiftCardsGroup">Lisää kortteja ja lisää ne ryhmään täällä.</string>
<string name="barcodeImageDescriptionWithType">Image <xliff:g>%s</xliff:g> viivakoodi</string>
<string name="barcodeImageDescriptionWithType">Kuva <xliff:g>%s</xliff:g> viivakoodi</string>
<string name="settings_follow_system_orientation">Seuraa järjestelmää</string>
<string name="settings_portrait_orientation">Muotokuva</string>
<string name="settings_landscape_orientation">Maisema</string>
<string name="settings_portrait_orientation">Pysty</string>
<string name="settings_landscape_orientation">Vaaka</string>
<string name="unarchived">Kortti on poistettu arkistosta</string>
<string name="noUnarchivedCardsMessage">Arkistoimattomia kortteja ei ole olemassa</string>
<string name="unarchive">Poista arkistosta</string>
@@ -242,7 +241,7 @@
<item quantity="one"><xliff:g>%1$d</xliff:g> kortti (<xliff:g id="archivedCount">%2$d</xliff:g> arkistoitu)</item>
<item quantity="other"><xliff:g>%1$d</xliff:g> korttia (<xliff:g id="archivedCount">%2$d</xliff:g> arkistoitu)</item>
</plurals>
<string name="duplicateCard">Duplikaatti</string>
<string name="duplicateCard">Kaksoiskappale</string>
<string name="previousCard">Edellinen</string>
<string name="nextCard">Seuraava</string>
<string name="failedToOpenUrl">Asenna ensin verkkoselain</string>
@@ -251,4 +250,16 @@
<item quantity="one">Näytä arkisto (<xliff:g>%1$d</xliff:g> kortti)</item>
<item quantity="other">Näytä arkisto (<xliff:g>%1$d</xliff:g> korttia)</item>
</plurals>
<string name="updateBalanceTitle">Kuinka paljon kulutit\?</string>
<string name="updateBalanceHint">Syötä summa</string>
<string name="barcodeLongPressMessage">Vain kuvia on mahdollista avata galleriasovelluksessa</string>
<string name="archive">Arkistoi</string>
<string name="importCards">Tuo kortteja</string>
<string name="failedToRetrieveImageFile">Kuvatiedoston noutaminen epäonnistui</string>
<string name="currentBalanceSentence">Nykyinen saldo: <xliff:g>%s</xliff:g></string>
<string name="newBalanceSentence">Uusi saldo: <xliff:g>%s</xliff:g></string>
<string name="cameraPermissionDeniedTitle">Ei pääsyä kameraan</string>
<string name="settings_lock_on_opening_orientation">Lukitse suunta, kun korttia avataan</string>
<string name="noCameraPermissionDirectToSystemSetting">Viivakoodien lukeminen vaatii, että Catimalla on käyttöoikeus kameraan. Napauta tästä muuttaaksesi oikeuksia.</string>
<string name="updateBalance">Päivitä saldo</string>
</resources>

View File

@@ -32,7 +32,6 @@
<string name="exportFailed">Impossible deffectuer lexportation</string>
<string name="importing">Import …</string>
<string name="exporting">Export …</string>
<string name="noExternalStoragePermissionError">Accorder au stockage externe lautorisation dimporter ou dexporter des données</string>
<string name="importOptionFilesystemTitle">Importer depuis le système de fichiers</string>
<string name="importOptionFilesystemExplanation">Choisissez le fichier à importer.</string>
<string name="importOptionFilesystemButton">Système de fichiers</string>
@@ -189,7 +188,7 @@
<string name="app_contributors">Rendu possible par : <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="noGroupCards">Ce groupe est vide</string>
<string name="barcodeImageDescriptionWithType">Image <xliff:g>%s</xliff:g> code-barres</string>
<string name="swipeToSwitchImages">Balayez ou appuyez longuement pour changer dimage</string>
<string name="swipeToSwitchImages">Balayez pour changer dimage, maintenez appuyé pour ouvrir limage dans la galerie</string>
<string name="sort">Trier</string>
<string name="sort_by">Trier par</string>
<string name="reverse"> dans lordre inverse</string>
@@ -260,4 +259,14 @@
<item quantity="other">Voir les archives (<xliff:g>%1$d</xliff:g> cartes)</item>
</plurals>
<string name="welcome">Bienvenue dans Catima</string>
<string name="barcodeLongPressMessage">Seules les images peuvent être ouvertes dans lapplication galerie</string>
<string name="failedToRetrieveImageFile">Impossible de récupérer le fichier image</string>
<string name="currentBalanceSentence">Solde actuel : <xliff:g>%s</xliff:g></string>
<string name="updateBalanceHint">Entrez le montant</string>
<string name="cameraPermissionDeniedTitle">Impossible d\'accéder à la caméra</string>
<string name="noCameraPermissionDirectToSystemSetting">Pour scanner les codes-barres, Catima doit avoir accès à votre caméra. Tapez ici pour modifier vos paramètres d\'autorisation.</string>
<string name="updateBalance">Mettre à jour le solde</string>
<string name="updateBalanceTitle">Combien avez-vous dépensé \?</string>
<string name="newBalanceSentence">Nouveau solde : <xliff:g>%s</xliff:g></string>
<string name="importCards">Importer des cartes</string>
</resources>

View File

@@ -0,0 +1,153 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
<string name="storeName">नाम</string>
<string name="note">नोट</string>
<string name="cardId">कार्ड आईडी</string>
<string name="star">पसंदीदा में जोड़ें</string>
<string name="unstar">पसंदीदा से निकाले</string>
<string name="cancel">रद्द करना</string>
<string name="save">बचाना</string>
<string name="delete">मिटाना</string>
<string name="deleteConfirmation">इस कार्ड को स्थायी रूप से हटाएं\?</string>
<plurals name="deleteCardsConfirmation">
<item quantity="one">इस <xliff:g>%d</xliff:g> कार्ड को स्थायी रूप से हटाएं\?</item>
<item quantity="other">ये <xliff:g>%d</xliff:g> कार्ड स्थायी रूप से हटाएं\?</item>
</plurals>
<string name="ok">ठीक</string>
<string name="share">बाँटें</string>
<string name="sendLabel">भेजें…</string>
<string name="editCardTitle">कार्ड संपादित करें</string>
<string name="addCardTitle">कार्ड जोड़ें</string>
<string name="noCardsMessage">पहले एक कार्ड जोड़ें</string>
<string name="card_ids_copied">कॉपी की गई आईडी</string>
<string name="noStoreError">कोई नाम दर्ज नहीं</string>
<string name="noCardIdError">कोई पहचान पत्र (आईडी दर्ज नहीं) की गई</string>
<string name="noCardExistsError">वह कार्ड नहीं मिला</string>
<string name="importExport">आयात / निर्यात</string>
<string name="exportName">निर्यात</string>
<string name="importSuccessfulTitle">आयातित</string>
<string name="importFailed">आयात नहीं कर सका</string>
<string name="action_search">खोज</string>
<string name="noGiftCardsGroup">कुछ कार्ड बनाएँ, और फिर उन्हें यहाँ समूह करें।</string>
<string name="noMatchingGiftCards">कोई परिणाम नहीं। अपनी खोज बदलने का प्रयास करें।</string>
<string name="deleteTitle">कार्ड हटाएं</string>
<plurals name="deleteCardsTitle">
<item quantity="one">कार्ड <xliff:g>%d</xliff:g> हटाएं</item>
<item quantity="other"><xliff:g>%d</xliff:g> इन कार्डों को हटाएं</item>
</plurals>
<string name="importFailedTitle">आयात विफल</string>
<string name="exportOptionExplanation">डाटा आपके मनचाहे स्थान पर लिखा जाएगा.</string>
<string name="importOptionFilesystemExplanation">फाईल सिस्टम से एक फाईल चुनें.</string>
<string name="app_copyright_old">लोयलटी कार्ड कीचैंन पर आधारित
\nकौपीराईट © 20162020 ब्रांडन आर्चर</string>
<string name="action_add">जोड़</string>
<string name="edit">बदलें</string>
<string name="confirm">पक्का करें</string>
<string name="failedParsingImportUriError">दी गई URL का विक्ष्लेषण नही हो सका</string>
<string name="exportSuccessfulTitle">निर्यात सफल</string>
<string name="exportFailedTitle">निर्यात असफल</string>
<string name="exportFailed">निर्यात नही हो सका</string>
<string name="importing">आयात चल रहा है…</string>
<string name="exporting">निर्यात चल रहा है…</string>
<string name="importOptionFilesystemTitle">फाईल सिस्टम से आयात करें</string>
<string name="importOptionFilesystemButton">फाईल सिस्टम से</string>
<string name="importOptionApplicationTitle">दूसरा एप्प इस्तमाल करें</string>
<string name="importOptionApplicationButton">दूसरा एप्प इस्तमाल करें</string>
<string name="about">बारे में</string>
<string name="starImage">पसंदीदा स्टार</string>
<string name="settings_light_theme">उजालित</string>
<string name="settings_dark_theme">अँधेरा</string>
<string name="settings">व्यवस्थाएं (सेटिंगें)</string>
<string name="settings_system_theme">तंत्र</string>
<string name="settings_card_orientation">बारकोड का अनुकूलन(ओरिएंटेशन)</string>
<string name="settings_landscape_orientation">आयत रूप(लैंडस्केप)</string>
<string name="settings_follow_system_orientation">सिस्टम का पालन करें</string>
<string name="settings_portrait_orientation">पोट्रैट</string>
<string name="settings_max_font_size_scale">अक्षर का अधिकतम नाप</string>
<string name="settings_display_barcode_max_brightness">बारकोड का दृश्य उजालित(ब्राइट) करें</string>
<string name="settings_keep_screen_on">स्क्रीन को चालू रखें</string>
<string name="cameraPermissionDeniedTitle">हम कैमरा तक पहुँच नहीं सकते</string>
<string name="noCameraPermissionDirectToSystemSetting">बारकोड स्कैन करने के लिए,को आपके कैमरा का इस्तेमाल करना होगा। इजाज़त कि व्यवस्था (सेटिंग) बदलने के लिए यहाँ दबायें।</string>
<string name="importOptionApplicationExplanation">फाइल खोलने के लिए कोई भी ऐप या अपना पसंदिता फाइल मैनेजर का इस्तेमाल करे।</string>
<string name="settings_category_title_ui">उपयोक्‍ता अंतरापृष्‍ठ (यूजर इंटरफ़ेस)</string>
<string name="settings_theme">विषय</string>
<string name="barcodeType">बारकोड का प्रकार</string>
<string name="barcodeNoBarcode">कोई बारकोड नहीं है</string>
<string name="noBarcode">बारकोड नहीं है</string>
<string name="copy_to_clipboard">पहचान पत्र(आई डी) को क्लिपबोर्ड में कॉपी करें</string>
<string name="scanCardBarcode">बारकोड स्कैन करें</string>
<string name="cardShortcut">कार्ड का सरल उपाय (शॉर्टकट)</string>
<string name="noGiftCards">\"+\" बटन दबाके कार्ड जोड़ें वा मेन्यू से कार्ड आयात करें</string>
<string name="importExportHelp">तथ्य (डाटा) को बैकअप करना हमें उसे दूसरे डिवाइस में भेजने देता है|</string>
<string name="barcodeImageDescriptionWithType"><xliff:g>%s</xliff:g> का बारकोड</string>
<string name="settings_disable_lockscreen_while_viewing_card">स्क्रीन को लॉक होने से रोकें</string>
<string name="enterBarcodeInstructions">अपनी आई डी लिखें तथा या तो बारकोड प्रकार चुनें, या फिर कोई बारकोड नहीं है चुनें|</string>
<string name="settings_lock_on_opening_orientation">कार्ड खोलते समय प्रयोग करि गयी अवस्था को प्रतिबन्ध करें</string>
<string name="intent_import_card_from_url_share_text">मैं तुम्हें एक कार्ड भेजना चाहता हूँ</string>
<string name="selectBarcodeTitle">बारकोड चुनें</string>
<string name="thumbnailDescription">छोटा चित्र</string>
<string name="noGroups">+ दबा कर समूहों को भागीकरण के लिए चुनें|</string>
<string name="sameAsCardId">आई डी से निरंतर</string>
<string name="intent_import_card_from_url_share_multiple_text">में तुम्हें कुछ कार्ड्स भेजना चाहता हूँ</string>
<string name="importSuccessful">जानकारी प्राप्त हुई</string>
<string name="enter_group_name">समूह का नाम लिखें</string>
<string name="group_edit">समूह बदलें</string>
<string name="noGroupCards">यह समूह खाली है</string>
<string name="group_name_already_in_use">समूह का नाम पहले ही प्रयोग में है</string>
<string name="group_name_is_empty">समूह का नाम खाली नहीं हो सकता</string>
<string name="all">सब</string>
<string name="deleteConfirmationGroup">समूह को मिटा दिया जाए\?</string>
<string name="moveUp">ऊपर की और बढ़ें</string>
<string name="moveDown">नीचे की और बढ़ें</string>
<string name="leaveWithoutSaveTitle">निकास करें</string>
<string name="addFromImage">गैलरी से चित्र चुनें</string>
<string name="card">कार्ड</string>
<string name="barcode">बारकोड</string>
<string name="editBarcode">बारकोड में बदलाव करें</string>
<string name="expiryDate">समाप्ति दिन</string>
<string name="never">कभी नहीं</string>
<string name="chooseExpiryDate">समाप्ति दिन चुनें</string>
<string name="moveBarcodeToTopOfScreen">बार कोड को स्क्रीन के ऊपरी भाग पर लाएं</string>
<string name="moveBarcodeToCenterOfScreen">बार कोड को स्क्रीन के बीच में लाएं</string>
<string name="noBarcodeFound">कोई बारकोड नहीं पाया गया</string>
<string name="errorReadingImage">चित्र को पढ़ना संभव नहीं हुआ</string>
<string name="balance">संतुलन</string>
<string name="currency">मुद्रा</string>
<string name="accept">स्वीकार</string>
<string name="exportSuccessful">डेटा निर्यात किया गया</string>
<string name="groupsList">समूह: <xliff:g>%s</xliff:g></string>
<plurals name="balancePoints">
<item quantity="one"><xliff:g>%s</xliff:g> अंक</item>
<item quantity="other"><xliff:g>%s</xliff:g> अंक</item>
</plurals>
<string name="privacy_policy_popup_text">निजता नीति नोटिस (कुछ ऐप स्टोर के लिए आवश्यक):
\n
\nकोई भी डेटा एकत्र नहीं किया जाता है, जिसकी पुष्टि कोई भी कर सकता है क्योंकि हमारा ऐप मुफ्त सॉफ्टवेयर है।</string>
<string name="importCatimaMessage">आयात करने के लिए, <i>catima.zip</i> फाइल को चुने जो की Catima से निर्यात किया गया था.
\nदूसरे Catima ऍप के आयात/निर्यात मेनू से निर्यात बटन दबाकर, पहले catima.zip फाइल को बनाये.</string>
<plurals name="selectedCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> चयनित</item>
<item quantity="other"><xliff:g>%d</xliff:g> चयनित.</item>
</plurals>
<string name="groups">समूहों</string>
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">कॉपीराइट © 2019<xliff:g>%d</xliff:g> Sylvia van Os</string>
<plurals name="groupCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> कार्ड</item>
<item quantity="other"><xliff:g>%d</xliff:g> कार्डों</item>
</plurals>
<string name="group_updated">समूह अपडेट किया गया</string>
<string name="failedOpeningFileManager">पहले एक फाइल मैनेजर इनस्टॉल करें.</string>
<string name="leaveWithoutSaveConfirmation">बिना सुरक्षित किये छोड़े\?</string>
<string name="addManually">मैन्युअली आई डी दर्ज करें</string>
<string name="editGroup">समूह संपादन: <xliff:g>%s</xliff:g></string>
<string name="points">अंक</string>
<string name="parsingBalanceFailed"><xliff:g>%s</xliff:g> एक वैध शेष राशि नहीं है.</string>
<string name="chooseImportType">यहाँ से डेटा का आयात करें</string>
<string name="privacy_policy">निजता नीति</string>
<string name="importCatima">कैटिमा से आयात करें</string>
<string name="app_license">कॉपीलेफ्ट लिबर सॉफ्टवेयर, GPLv3+ लाइसेंस प्राप्त</string>
<string name="about_title_fmt"><xliff:g id="app_name">%s</xliff:g> के बारे में</string>
<string name="debug_version_fmt">संस्करण: <xliff:g id="version">%s</xliff:g></string>
<string name="app_revision_fmt"><xliff:g id="app_revision_url">%s</xliff:g> संशोधन के बारे में</string>
<string name="copy_to_clipboard_toast">आई डी क्लिपबोर्ड पर कॉपी किया गया</string>
</resources>

View File

@@ -22,7 +22,7 @@
<string name="action_add">Dodaj</string>
<string name="storeName">Ime</string>
<string name="note">Napomena</string>
<string name="noMatchingGiftCards">Ništa nisam našao. Pokušajte promijeniti pretraživanje.</string>
<string name="noMatchingGiftCards">Nema rezultata. Pokušajte promijeniti pretraživanje.</string>
<string name="cardId">ID kartice</string>
<string name="barcodeType">Vrsta crtičnog koda</string>
<string name="barcodeNoBarcode">Na ovoj kartici nema crtičnog koda</string>
@@ -44,7 +44,6 @@
<string name="exportOptionExplanation">Podaci će biti zabilježeni na odabranom mjestu.</string>
<string name="exportFailedTitle">Izvoz nije uspio</string>
<string name="exporting">Opskrba…</string>
<string name="noExternalStoragePermissionError">Najprije odobrite dopuštenje za vanjsku pohranu za uvoz ili izvoz kartica</string>
<string name="importOptionFilesystemExplanation">Odaberite određenu datoteku iz datotečnog sustava.</string>
<string name="importOptionApplicationTitle">Koristite drugu aplikaciju</string>
<string name="settings">Postavke</string>
@@ -80,4 +79,5 @@
<string name="leaveWithoutSaveTitle">Izlaz</string>
<string name="card">Karta</string>
<string name="leaveWithoutSaveConfirmation">Otići bez očuvanja\?</string>
<string name="noGiftCardsGroup">Izradite neke kartice, a zatim ih dodijelite grupi ovdje.</string>
</resources>

View File

@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
<string name="noGiftCards">Nyomja meg a + jelet a kártya hozzáadásához, vagy importáljon a ⋮ menüvel.</string>
<string name="noGiftCards">Kattintson a + plusz gombra egy kártya hozzáadásához, vagy importáljon a ⋮ menül.</string>
<string name="action_add">Hozzáadás</string>
<string name="action_search">Keresés</string>
<plurals name="selectedCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> kiválasztva</item>
<item quantity="other"><xliff:g>%d</xliff:g> kiválasztva</item>
<item quantity="one"><xliff:g>%d</xliff:g> kiválasztott</item>
<item quantity="other"><xliff:g>%d</xliff:g> kiválasztottak</item>
</plurals>
<string name="noCardsMessage">Először adjon hozzá egy kártyát</string>
<string name="noGiftCardsGroup">Hozzon létre kártyákat, és rendelje hozzá a megfelelő csoporthoz.</string>
@@ -24,8 +24,8 @@
<string name="delete">Törlés</string>
<string name="confirm">Alkalmaz</string>
<plurals name="deleteCardsTitle">
<item quantity="one"><xliff:g>%d</xliff:g> törlése</item>
<item quantity="other"><xliff:g>%d</xliff:g> törlése</item>
<item quantity="one">Törölje az <xliff:g>%d</xliff:g> kártyát</item>
<item quantity="other">Törölje az <xliff:g>%d</xliff:g> kártyákat</item>
</plurals>
<string name="deleteConfirmation">Véglegesen törli a kártyát\?</string>
<string name="ok">Rendben</string>
@@ -81,7 +81,6 @@
<string name="exportFailed">Exportálás sikertelen</string>
<string name="importing">Importálás…</string>
<string name="exporting">Exportálás…</string>
<string name="noExternalStoragePermissionError">Külső háttértárhoz való hozzáférés engedélyezése adat import vagy export miatt</string>
<string name="exportOptionExplanation">Az adatokat a kiválasztott helyre fogjuk menteni.</string>
<string name="importOptionFilesystemTitle">Importálás fájlrendszerből</string>
<string name="importOptionFilesystemButton">A fájlrendszerből</string>
@@ -137,7 +136,7 @@
<string name="currency">Valuta</string>
<string name="points">Pontok</string>
<string name="parsingBalanceFailed">A <xliff:g>%s</xliff:g> nem tűnik valós egyenlegnek.</string>
<string name="app_loyalty_card_keychain">Loyalty Card Keychain</string>
<string name="app_loyalty_card_keychain">Hűségkártya kulcstartó</string>
<string name="privacy_policy">Adatvédelmi Szabályzat</string>
<string name="accept">Elfogad</string>
<string name="importCatima">Importálás Catimából</string>
@@ -179,7 +178,7 @@
<string name="app_contributors">Lehetővé tette: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="showMoreInfo">Infó mutatása</string>
<string name="hideMoreInfo">Infó elrejtése</string>
<string name="swipeToSwitchImages">Húzza oldalra vagy tartsa nyomva a kép megváltoztatásáért</string>
<string name="swipeToSwitchImages">Csúsztassa ujját a képek váltásához, tartsa lenyomva a kép megnyitásához a Galéria alkalmazásban</string>
<string name="sort_by_balance">Egyenleg</string>
<string name="reverse">...fordított sorrendben</string>
<string name="sort_by">Rendezés mint</string>
@@ -200,7 +199,7 @@
</plurals>
<plurals name="balancePoints">
<item quantity="one"><xliff:g>%s</xliff:g> pont</item>
<item quantity="other"><xliff:g>%s</xliff:g> pont</item>
<item quantity="other"><xliff:g>%s</xliff:g> pontok</item>
</plurals>
<string name="chooseImportType">Adat importálása innen</string>
<string name="thumbnailDescription">Előkép</string>
@@ -247,4 +246,20 @@
<string name="archived">Kártya archiválása</string>
<string name="archiveList">Archivál</string>
<string name="duplicateCard">Másolat</string>
<string name="currentBalanceSentence">Jelenlegi egyenleg: <xliff:g>%s</xliff:g></string>
<string name="updateBalanceHint">Adja meg az összeget</string>
<string name="importCards">Kártyák importálása</string>
<string name="updateBalanceTitle">Mennyit költöttél\?</string>
<string name="newBalanceSentence">Új egyenleg: <xliff:g>%s</xliff:g></string>
<string name="cameraPermissionDeniedTitle">Nem sikerült hozzáférni a kamerához</string>
<string name="failedToRetrieveImageFile">Nem sikerült lekérni a képfájlt</string>
<string name="barcodeLongPressMessage">Csak képek nyithatók meg a galéria alkalmazásban</string>
<string name="unarchived">Archiválatlan kártya</string>
<string name="welcome">Üdvözöljük Catimában</string>
<plurals name="viewArchivedCardsWithCount">
<item quantity="one">Archívum megtekintése (<xliff:g>%1$d</xliff:g> kártya)</item>
<item quantity="other">Archívum megtekintése (<xliff:g>%1$d</xliff:g> kártyák)</item>
</plurals>
<string name="updateBalance">Egyenleg frissítése</string>
<string name="noCameraPermissionDirectToSystemSetting">A vonalkódok beolvasásához a Catimának hozzá kell férnie a kamerához. Koppintson ide az engedélybeállítások módosításához.</string>
</resources>

View File

@@ -7,8 +7,8 @@
<string name="edit">Ubah</string>
<string name="save">Simpan</string>
<string name="deleteTitle">Hapus kartu</string>
<string name="cardId">Kartu ID</string>
<string name="barcodeType">Tipe barcode</string>
<string name="cardId">ID Kartu</string>
<string name="barcodeType">Jenis barcode</string>
<string name="star">Tambahkan ke favorit</string>
<string name="unstar">Hapus dari favorit</string>
<string name="action_add">Tambah</string>
@@ -30,7 +30,7 @@
<string name="scanCardBarcode">Pindai Barcode</string>
<string name="barcodeNoBarcode">Tidak ada barcode</string>
<string name="cancel">Batalkan</string>
<string name="importExport">Import/Ekspor</string>
<string name="importExport">Impor/Ekspor</string>
<string name="settings_category_title_ui">Tampilan Pengguna</string>
<string name="settings_theme">Tema</string>
<string name="all">Semua</string>
@@ -76,17 +76,17 @@
<string name="removeImage">Hapus gambar</string>
<string name="setBackImage">Atur gambar bagian belakang</string>
<string name="intent_import_card_from_url_share_multiple_text">Saya ingin berbagi kartu dengan Anda</string>
<string name="noGiftCards">Klik tanda + tombol tambah untuk menambahkan kartu, atau mengimpor beberapa kartu melalui menu.</string>
<string name="noMatchingGiftCards">Tidak menemukan apapun. Coba untuk mengubah pencarian anda.</string>
<string name="noGiftCards">Tap tanda tombol plus ( + ) untuk menambahkan kartu, atau mengimpor nya melalui menu ( ⋮ ).</string>
<string name="noMatchingGiftCards">Tidak menemukan apapun. Cobalah untuk mengubah pencarian anda.</string>
<string name="noBarcode">Bukan barcode</string>
<string name="confirm">Konfirmasi</string>
<string name="copy_to_clipboard">Salin ID ke papan klip</string>
<string name="sendLabel">Kirim…</string>
<string name="noCardsMessage">Tambah kartu terlebih dahulu</string>
<string name="noStoreError">Nama masih kosong</string>
<string name="noCardIdError">Kartu ID masih kosong</string>
<string name="noCardIdError">Tidak ada ID yang dimasukkan</string>
<string name="noCardExistsError">Tidak dapat menemukan kartu</string>
<string name="failedParsingImportUriError">Tidak dapat menguraikan alamat impor situs web</string>
<string name="failedParsingImportUriError">Tidak dapat memparsing impor URI</string>
<string name="exportName">Ekspor</string>
<string name="importSuccessfulTitle">Sudah diimpor</string>
<string name="importFailedTitle">Impor gagal</string>
@@ -94,13 +94,12 @@
<string name="exportSuccessfulTitle">Sudah diekspor</string>
<string name="exportFailedTitle">Ekspor gagal</string>
<string name="exportFailed">Tidak dapat mengekspor</string>
<string name="importing">Mengimpor…</string>
<string name="exporting">Mengekspor…</string>
<string name="noExternalStoragePermissionError">Berikan izin penyimpanan eksternal untuk mengimpor atau mengekspor data</string>
<string name="importing">Sedang mengimpor…</string>
<string name="exporting">Sedang mengekspor…</string>
<string name="exportOptionExplanation">Data akan ditulis ke lokasi pilihan Anda.</string>
<string name="importOptionFilesystemTitle">Impor dari sistem</string>
<string name="importOptionFilesystemExplanation">Pilih file dari sistem.</string>
<string name="importOptionFilesystemButton">Dari sistem</string>
<string name="importOptionFilesystemTitle">Impor dari pengelola file bawaan</string>
<string name="importOptionFilesystemExplanation">Pilih file dari pengelola file bawaan.</string>
<string name="importOptionFilesystemButton">Dari pengelola file bawaan</string>
<string name="importOptionApplicationTitle">Gunakan aplikasi lain</string>
<string name="importOptionApplicationExplanation">Gunakan aplikasi lain atau pengelola file favorit anda untuk membuka file.</string>
<string name="importOptionApplicationButton">Gunakan aplikasi lain</string>
@@ -123,7 +122,7 @@
<string name="settings_max_font_size_scale">Ukuran maksimal huruf</string>
<string name="settings_display_barcode_max_brightness">Terangkan tampilan barcode</string>
<string name="settings_keep_screen_on">Biarkan layar menyala</string>
<string name="settings_disable_lockscreen_while_viewing_card">Mencegah layar menyala</string>
<string name="settings_disable_lockscreen_while_viewing_card">Cegah kunci layar</string>
<string name="intent_import_card_from_url_share_text">Saya ingin berbagi kartu dengan anda</string>
<string name="importSuccessful">Data terimpor</string>
<string name="exportSuccessful">Data terekspor</string>
@@ -178,18 +177,18 @@
<string name="exportPassword">Tetapkan kata sandi untuk melindungi ekspor anda (opsional)</string>
<string name="failedGeneratingShareURL">Tidak dapat membuat alamat berbagi. Mohon laporkan ini.</string>
<string name="app_contributors">Pengembangan dibantu oleh: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="swipeToSwitchImages">Geser atau tekan yang lama untuk mengganti gambar</string>
<string name="reverse">Ubah urutan</string>
<string name="swipeToSwitchImages">Geser untuk beralih gambar, tahan untuk membuka gambar di aplikasi galeri</string>
<string name="reverse">…dalam urutan terbalik</string>
<string name="version_history">Riwayat Versi</string>
<string name="help_translate_this_app">Bantu terjemahkan aplikasi ini</string>
<string name="source_repository">Sumber Repositori</string>
<string name="on_github">di GitHub</string>
<string name="and_data_usage">dan penggunaan data</string>
<string name="on_google_play">di Google Play</string>
<string name="cardShortcut">Pintasan kartu</string>
<string name="card_ids_copied">ID kartu yang tersalin</string>
<string name="cardShortcut">Pintasan Kartu</string>
<string name="card_ids_copied">ID(s) yang disalin</string>
<string name="barcodeImageDescriptionWithType">Gambar <xliff:g>%s</xliff:g> barcode</string>
<string name="importExportHelp">Mencadangkan data anda memungkinkan memindahkannya ke perangkat lain.</string>
<string name="importExportHelp">Mencadangkan data anda akan memungkinkan memindahkannya ke perangkat lain.</string>
<plurals name="selectedCardCount">
<item quantity="other"><xliff:g>%d</xliff:g> kartu dipilih</item>
</plurals>
@@ -242,4 +241,19 @@
<string name="archive">Arsip</string>
<string name="archived">Kartu diarsipkan</string>
<string name="archiveList">Arsip</string>
</resources>
<string name="failedToRetrieveImageFile">Gagal mengambil file gambar</string>
<string name="barcodeLongPressMessage">Hanya gambar yang dapat dibuka di aplikasi galeri</string>
<string name="unarchive">Ekstrak</string>
<string name="unarchived">Kartu tidak diarsipkan</string>
<string name="noUnarchivedCardsMessage">Tidak ada kartu yang diekstrak</string>
<string name="options">Opsi</string>
<string name="starred">Berbintang</string>
<string name="importCards">Import kartu</string>
<string name="newBalanceSentence">Saldo baru: <xliff:g>%s</xliff:g></string>
<string name="cameraPermissionDeniedTitle">Tidak dapat mengakses kamera</string>
<string name="updateBalance">Perbarui saldo</string>
<string name="updateBalanceHint">Masukkan jumlah</string>
<string name="currentBalanceSentence">Saldo saat ini: <xliff:g>%s</xliff:g></string>
<string name="updateBalanceTitle">Berapa banyak yang telah kamu habiskan \?</string>
<string name="noCameraPermissionDirectToSystemSetting">Untuk memindai barcode, Catima membutuhkan akses ke kamera mu. Tap disini untuk mengganti pengaturan perizinan mu.</string>
</resources>

View File

@@ -33,7 +33,6 @@
<string name="importExportHelp">Stuðningur upp spil gerir þér kleift að færa þá til annar tæki.</string>
<string name="importSuccessfulTitle">Flutt</string>
<string name="importFailedTitle">Innflutningur mistókst</string>
<string name="noExternalStoragePermissionError">Grant ytri geymslu leyfi til að flytja eða flytja spil fyrstu</string>
<string name="exportOptionExplanation">Gögnum verður skrifað á stað af eigin vali.</string>
<string name="importOptionFilesystemTitle">Innflutningur frá möppuna</string>
<string name="importOptionFilesystemExplanation">Velja ákveðna skrá frá möppuna.</string>

View File

@@ -2,7 +2,7 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
<string name="action_search">Cerca</string>
<string name="action_add">Aggiungi</string>
<string name="noGiftCards">Premi il pulsante + per aggiungere una carta oppure importane alcune dal menù ⋮.</string>
<string name="noGiftCards">Premi il pulsante + per aggiungere una carta oppure importala dal menù ⋮.</string>
<string name="noMatchingGiftCards">Nessun risultato. Prova a cambiare la tua ricerca.</string>
<string name="storeName">Nome</string>
<string name="note">Note</string>
@@ -37,7 +37,6 @@
<string name="exportFailed">Impossibile eseguire l\'esportazione</string>
<string name="importing">Importazione in corso…</string>
<string name="exporting">Esportazione in corso…</string>
<string name="noExternalStoragePermissionError">Concedi il permesso di archiviazione esterna per importare o esportare dati</string>
<string name="importOptionFilesystemTitle">Importa dall\'archivio</string>
<string name="importOptionFilesystemExplanation">Scegli un file dall\'archivio.</string>
<string name="importOptionFilesystemButton">Dall\'archivio</string>
@@ -189,7 +188,7 @@
<string name="app_contributors">Reso possibile da: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="noGroupCards">Questo gruppo è vuoto</string>
<string name="barcodeImageDescriptionWithType">Immagine del codice a barre in formato <xliff:g>%s</xliff:g></string>
<string name="swipeToSwitchImages">Scorri o premi a lungo per cambiare immagine</string>
<string name="swipeToSwitchImages">Scorri per cambiare immagine, tieni premuto per aprire l\'immagine nella galleria</string>
<string name="sort_by">Ordina per</string>
<string name="reverse">…in ordine inverso</string>
<string name="sort_by_balance">Saldo</string>
@@ -260,4 +259,16 @@
<item quantity="many">Visualizza archivio (<xliff:g>%1$d</xliff:g> carta)</item>
<item quantity="other">Visualizza archivio (<xliff:g>%1$d</xliff:g> carte)</item>
</plurals>
<string name="failedToRetrieveImageFile">Impossibile ottenere il file dell\'immagine</string>
<string name="barcodeLongPressMessage">Si possono aprire solo immagini dell\'app della galleria</string>
<string name="cameraPermissionDeniedTitle">È impossibile accedere alla fotocamera</string>
<string name="noCameraPermissionDirectToSystemSetting">Per poter scansionare i codici a barre, Catima ha bisogno di accedere alla tua fotocamera. Premi qui per poter cambiare le impostazioni dei permessi.</string>
<string name="updateBalance">Aggiorna bilancio</string>
<string name="updateBalanceTitle">Quanto hai speso\?</string>
<string name="updateBalanceHint">Inserisci l\'importo</string>
<string name="currentBalanceSentence">Bilancio attuale: <xliff:g>%s</xliff:g></string>
<string name="newBalanceSentence">Nuovo bilancio: <xliff:g>%s</xliff:g></string>
<string name="importCards">Importa carte</string>
<string name="storageReadPermissionRequired">Per questa azione è necessario il permesso per accedere alla memoria del dispositivo…</string>
<string name="cameraPermissionRequired">Per questa azione è necessario il permesso ad accedere alla fotocamera…</string>
</resources>

View File

@@ -87,7 +87,6 @@
<string name="importOptionFilesystemExplanation">ストレージからファイルを選択してください。</string>
<string name="importOptionFilesystemTitle">ストレージからインポート</string>
<string name="exportOptionExplanation">選択した場所にデータを出力します。</string>
<string name="noExternalStoragePermissionError">データをインポート/エクスポートするために外部ストレージへのアクセスを許可してください</string>
<string name="exporting">エクスポート中…</string>
<string name="importing">インポート中…</string>
<string name="exportFailed">カードをエクスポートできませんでした</string>

View File

@@ -1,29 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="addManually">직접 카드 ID 입력</string>
<string name="groupsList">그룹: <xliff:g xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">%s</xliff:g></string>
<string name="groupsList">그룹: <xliff:g>%s</xliff:g></string>
<string name="all">모두</string>
<string name="groups">그룹</string>
<string name="enter_group_name">그룹 이름 입력</string>
<string name="settings_dark_theme">어두움</string>
<string name="settings_light_theme">밝음</string>
<string name="debug_version_fmt">버전: <xliff:g xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" id="version">%s</xliff:g></string>
<string name="about_title_fmt"><xliff:g xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" id="app_name">%s</xliff:g> 정보</string>
<string name="debug_version_fmt">버전: <xliff:g id="version">%s</xliff:g></string>
<string name="about_title_fmt"><xliff:g id="app_name">%s</xliff:g> 정보</string>
<string name="settings_system_theme">시스템</string>
<string name="settings_theme">테마</string>
<string name="settings_category_title_ui">사용자 인터페이스</string>
<string name="settings">설정</string>
<string name="enterBarcodeInstructions">카드 ID를 입력하고 카드에서 사용하는 바코드 이미지를 선택하세요. 바코드를 사용하지 않는 경우 “이 카드는 바코드가 없음”을 선택하세요.</string>
<string name="app_revision_fmt">리비전 정보: <xliff:g xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" id="app_revision_url">%s</xliff:g></string>
<string name="app_revision_fmt">리비전 정보: <xliff:g id="app_revision_url">%s</xliff:g></string>
<string name="selectBarcodeTitle">바코드 선택</string>
<string name="about">정보</string>
<string name="exporting">내보내는 중…</string>
<string name="importing">가져오는 중…</string>
<string name="importExportHelp">카드를 백업하면 다른 장치로 옮길 수 있습니다.</string>
<string name="importExportHelp">데이터를 백업하면 다른 장치로 이동할 수 있습니다.</string>
<string name="exportName">내보내기</string>
<string name="importExport">가져오기/내보내기</string>
<string name="cardShortcut">카드 바로 가기</string>
<string name="scanCardBarcode">카드 바코드 스캔</string>
<string name="scanCardBarcode">바코드 스캔</string>
<string name="addCardTitle">카드 추가</string>
<string name="editCardTitle">카드 편집</string>
<string name="sendLabel">보내기…</string>
@@ -38,7 +38,7 @@
<string name="unstar">즐겨찾기에서 제거</string>
<string name="star">즐겨찾기에 추가</string>
<string name="noBarcode">바코드 없음</string>
<string name="barcodeNoBarcode">이 카드는 바코드가 없</string>
<string name="barcodeNoBarcode">바코드가 없습니다</string>
<string name="barcodeType">바코드 형식</string>
<string name="cardId">카드 ID</string>
<string name="note">노트</string>
@@ -49,22 +49,22 @@
<string name="action_add">추가</string>
<string name="action_search">검색</string>
<string name="copy_to_clipboard_toast">카드 ID를 클립보드에 복사함</string>
<string name="importOptionApplicationTitle">외부 앱 사용</string>
<string name="importOptionApplicationTitle">다른 앱 사용</string>
<string name="importOptionFilesystemExplanation">파일 시스템에서 파일을 선택합니다.</string>
<string name="importOptionFilesystemTitle">파일 시스템에서 가져오기</string>
<string name="exportFailed">카드를 내보낼 수 없</string>
<string name="exportFailed">내보내기를 수행할 수 없습니다</string>
<string name="importOptionApplicationExplanation">다른 파일 관리자 또는 앱을 사용하여 파일을 엽니다.</string>
<string name="exportFailedTitle">내보내기 실패</string>
<string name="exportSuccessfulTitle">내보내기 완료</string>
<string name="importFailed">카드를 가져올 수 없</string>
<string name="importFailed">가져오기를 수행할 수 없습니다</string>
<string name="importFailedTitle">가져오기 실패</string>
<string name="importSuccessfulTitle">가져오기 완료</string>
<string name="noCardIdError">카드 ID를 입력하지 않</string>
<string name="noCardIdError">ID를 입력하지 않았습니다</string>
<string name="storeName">이름</string>
<string name="thumbnailDescription">카드 섬네일</string>
<string name="importOptionApplicationButton">외부 앱 사용</string>
<string name="importOptionApplicationButton">다른 앱 사용</string>
<string name="failedParsingImportUriError">가져온 URI를 분석할 수 없음</string>
<string name="noCardExistsError">카드를 찾을 수 없</string>
<string name="noCardExistsError">해당 카드를 찾을 수 없습니다</string>
<string name="moveUp">목록에서 위로 옮기기</string>
<string name="leaveWithoutSaveTitle">저장하지 않고 종료</string>
<string name="moveDown">목록에서 아래로 옮기기</string>
@@ -73,5 +73,8 @@
<string name="settings_display_barcode_max_brightness">바코드를 표시할 때 화면 밝기 높이기</string>
<string name="barcode">바코드</string>
<string name="deleteConfirmation">정말 이 카드를 삭제하시겠습니까\?</string>
<string name="deleteTitle">카드 제</string>
<string name="deleteTitle">카드 </string>
<plurals name="deleteCardsTitle">
<item quantity="other">카드 <xliff:g>%d</xliff:g> 제거</item>
</plurals>
</resources>

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
<string name="action_add">Pridėti</string>
<string name="noGiftCards">Norėdami pridėti kortelę, spustelėkite mygtuką + plius arba pirmiausia importuokite kortelę iš ⋮ meniu.</string>
<string name="noGiftCards">Norėdami pridėti kortelę, spustelėkite mygtuką + arba importuokite kortelę iš ⋮ meniu.</string>
<string name="storeName">Pavadinimas</string>
<string name="note">Užrašas</string>
<string name="cardId">Kortelės ID</string>
@@ -14,32 +14,31 @@
<string name="copy_to_clipboard">Nukopijuoti ID į iškarpinę</string>
<string name="editCardTitle">Redaguoti lojalumo kortelę</string>
<string name="addCardTitle">Pridėti lojalumo kortelę</string>
<string name="scanCardBarcode">Skenuoti kortelės brūkšninį kodą</string>
<string name="scanCardBarcode">Nuskaityti brūkšninį kodą</string>
<string name="noStoreError">Neįvestas pavadinimas</string>
<string name="noCardIdError">Neįvestas kortelės ID</string>
<string name="noCardIdError">Neįvestas ID</string>
<string name="importExport">Importuoti/Exportuoti</string>
<string name="exportName">Exportuoti</string>
<string name="importFailed">Nepavyko importuoti kortelių</string>
<string name="exportFailed">Nepavyko eksportuoti kortelių</string>
<string name="importFailed">Nepavyko importuoti</string>
<string name="exportFailed">Nepavyko eksportuoti</string>
<string name="importing">Importuoja…</string>
<string name="exporting">Eksportuoja…</string>
<string name="noExternalStoragePermissionError">Pirmiausia suteikite išorinės saugyklos leidimą, kad galėtumėte importuoti arba eksportuoti korteles</string>
<string name="about">Apie</string>
<string name="app_license">Copylefted laisvoji programinė įranga, licencijuota GPLv3+</string>
<string name="about_title_fmt">Apie <xliff:g id="app_name">%s</xliff:g></string>
<string name="debug_version_fmt">Versija: <xliff:g id="version">%s</xliff:g></string>
<string name="app_revision_fmt">Revizijos info: <xliff:g id="app_revision_url">%s</xliff:g></string>
<string name="selectBarcodeTitle">Pasirinkite brūkšninį kodą</string>
<string name="copy_to_clipboard_toast">Kortelės ID nukopijuota į iškarpinę</string>
<string name="card_ids_copied">Nukopijuotos kortelės ID</string>
<string name="copy_to_clipboard_toast">ID nukopijuota į iškarpinę</string>
<string name="card_ids_copied">Nukopijuoti ID</string>
<string name="noCardsMessage">Pirmiausia pridėkite kortelę</string>
<string name="sendLabel">Siųsti…</string>
<string name="unstar">Pašalinti iš mėgstamiausių</string>
<string name="star">Pridėti prie mėgstamiausių</string>
<string name="noBarcode">Nėra brūkšninio kodo</string>
<string name="barcodeNoBarcode">Ši kortelė neturi brūkšninio kodo</string>
<string name="barcodeNoBarcode">Brūkšninio kodo nėra</string>
<string name="barcodeType">Brūkšninio kodo tipas</string>
<string name="noMatchingGiftCards">Nieko nerasta. Pabandykite pakeisti paiešką.</string>
<string name="noMatchingGiftCards">Rezultatų nėra. Pabandykite pakeisti paiešką.</string>
<string name="action_search">Ieškoti</string>
<string name="cardShortcut">Kortelės sparčioji nuoroda</string>
<string name="importVoucherVaultMessage">Pasirinkite savo <i>vouchervault.json</i> eksportą iš Voucher Vault, kurį norite importuoti.
@@ -60,21 +59,21 @@
<string name="passwordRequired">Įveskite slaptažodį</string>
<string name="no">Ne</string>
<string name="yes">Taip</string>
<string name="updateBarcodeQuestionText">Pakeitėte kortelės ID. Ar norite atnaujinti ir brūkšninį kodą, kad būtų naudojama ta pati reikšmė\?</string>
<string name="updateBarcodeQuestionText">Pakeitėte ID. Ar norite atnaujinti ir brūkšninį kodą, kad būtų naudojama ta pati reikšmė\?</string>
<string name="updateBarcodeQuestionTitle">Atnaujinti brūkšninio kodo reikšmę\?</string>
<string name="takePhoto">Nufotografuoti</string>
<string name="removeImage">Pašalinti vaizdą</string>
<string name="setBackImage">Nustatyti galinį vaizdą</string>
<string name="setFrontImage">Nustatyti priekinį vaizdą</string>
<string name="photos">Nuotraukos</string>
<string name="backImageDescription">Kortelės galinis vaizdas</string>
<string name="frontImageDescription">Kortelės priekinis vaizdas</string>
<string name="backImageDescription">Galinis vaizdas</string>
<string name="frontImageDescription">Priekinis vaizdas</string>
<string name="intent_import_card_from_url_share_multiple_text">Noriu su jumis pasidalyti keliomis kortelėmis</string>
<string name="copy_to_clipboard_multiple_toast">Kortelės ID nukopijuotas į iškarpinę</string>
<string name="copy_to_clipboard_multiple_toast">ID nukopijuotas į iškarpinę</string>
<string name="wrongValueForBarcodeType">Vertė netinkama pasirinktam brūkšninio kodo tipui</string>
<string name="unsupportedBarcodeType">Šio brūkšninio kodo tipo dar negalima rodyti. Galbūt jis bus palaikomas vėlesnėje programėlės versijoje.</string>
<string name="setBarcodeId">Nustatyti brūkšninio kodo reikšmę</string>
<string name="sameAsCardId">Tokia pat kaip kortelės ID</string>
<string name="sameAsCardId">Tokia pat kaip ID</string>
<string name="barcodeId">Brūkšninio kodo reikšmė</string>
<string name="importStocardMessage">Pasirinkite <i>***-sync.zip</i> eksportą iš Stocard, kad galėtumėte importuoti.
\nGaukite susisiekę el. paštu support@stocardapp.com, prašydami eksportuoti jūsų duomenis.</string>
@@ -90,7 +89,7 @@
\n
\nJOKIE DUOMENYS NĖRA RENKAMI, o tai gali patvirtinti bet kas, nes mūsų programėlė yra laisvoji programinė įranga.</string>
<string name="privacy_policy">Privatumo politika</string>
<string name="chooseImportType">Importuoti duomenis iš\?</string>
<string name="chooseImportType">Importuoti duomenis iš</string>
<string name="points">Taškai</string>
<string name="currency">Valiuta</string>
<string name="balance">Balansas</string>
@@ -107,7 +106,7 @@
<string name="expiryStateSentence">Nustoja galioti: <xliff:g>%s</xliff:g></string>
<string name="groupsList">Grupės: <xliff:g> %s </xliff:g></string>
<string name="addFromImage">Pasirinkti vaizdą iš galerijos</string>
<string name="addManually">Rankiniu būdu įvesti kortelės ID</string>
<string name="addManually">Rankiniu būdu įvesti ID</string>
<string name="leaveWithoutSaveConfirmation">Išeiti neišsaugojus\?</string>
<string name="leaveWithoutSaveTitle">Išeiti</string>
<string name="moveDown">Judėti žemyn</string>
@@ -120,24 +119,24 @@
<item quantity="few"><xliff:g>%d</xliff:g> kortelės</item>
<item quantity="other"><xliff:g>%d</xliff:g> kortelių</item>
</plurals>
<string name="noGroups">Spustelėkite + pliuso mygtuką, kad pirmiausia pridėtumėte grupes kategorizavimui.</string>
<string name="noGroups">Spustelėkite mygtuką +, kad pridėtumėte grupes kategorizavimui.</string>
<string name="groups">Grupės</string>
<string name="enter_group_name">Įvesti grupės pavadinimą</string>
<string name="exportSuccessful">Kortelės duomenys eksportuoti</string>
<string name="importSuccessful">Kortelės duomenys importuoti</string>
<string name="exportSuccessful">Duomenys eksportuoti</string>
<string name="importSuccessful">Duomenys importuoti</string>
<string name="intent_import_card_from_url_share_text">Noriu pasidalyti su jumis kortele</string>
<string name="settings_disable_lockscreen_while_viewing_card">Neleisti užrakinti ekrano</string>
<string name="settings_keep_screen_on">Laikyti ekraną įjungtą</string>
<string name="settings_max_font_size_scale">Didžiausias šrifto dydis</string>
<string name="settings_dark_theme">Tamsi</string>
<string name="settings_light_theme">Šviesi</string>
<string name="settings_system_theme">Sistema</string>
<string name="settings_system_theme">Sistemos</string>
<string name="settings_theme">Tema</string>
<string name="settings_category_title_ui">Vartotojo sąsaja</string>
<string name="settings">Nustatymai</string>
<string name="starImage">Mėgstamiausia žvaigždė</string>
<string name="thumbnailDescription">Kortelės miniatiūra</string>
<string name="enterBarcodeInstructions">Įveskite kortelės ID ir toliau pasirinkite jos brūkšninio kodo tipą arba \"Ši kortelė neturi brūkšninio kodo\".</string>
<string name="thumbnailDescription">Miniatiūra</string>
<string name="enterBarcodeInstructions">Įveskite ID ir toliau pasirinkite brūkšninio kodo tipą arba \"Nėra brūkšninio kodo\".</string>
<string name="app_resources">Laisvosios trečiųjų šalių ištekliai: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="app_libraries">Laisvosios trečiųjų šalių bibliotekos: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="app_copyright_old">Paremta Loyalty Card Keychain
@@ -154,8 +153,8 @@
<string name="exportSuccessfulTitle">Eksportuota</string>
<string name="importFailedTitle">Importuoti nepavyko</string>
<string name="importSuccessfulTitle">Importuota</string>
<string name="importExportHelp">Atsarginių kopijų darymas leidžia perkelti korteles į kitą įrenginį.</string>
<string name="noCardExistsError">Nepavyko rasti kortelės</string>
<string name="importExportHelp">Duomenų atsarginių kopijų darymas leidžia perkelti juos į kitą įrenginį.</string>
<string name="noCardExistsError">Nepavyko rasti šios kortelės</string>
<string name="share">Dalintis</string>
<plurals name="selectedCardCount">
<item quantity="one">Pasirinkta: <xliff:g>%d</xliff:g> kortelė</item>
@@ -187,11 +186,11 @@
<string name="settings_catima_theme">Catima</string>
<string name="settings_theme_color">Temos spalva</string>
<string name="app_contributors">Tapo įmanoma su pagalba: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="noGroupCards">Šioje grupėje ra jokių kortelių</string>
<string name="barcodeImageDescriptionWithType"><xliff:g>%s</xliff:g> tipo kortelės brūkšninio kodo vaizdas</string>
<string name="swipeToSwitchImages">Perbraukite arba ilgai palaikykite paspaudę, kad perjungtumėte vaizdus</string>
<string name="noGroupCards">Grupėje yra tuščia</string>
<string name="barcodeImageDescriptionWithType"><xliff:g>%s</xliff:g> brūkšninio kodo vaizdas</string>
<string name="swipeToSwitchImages">Braukite, kad perjungtumėte vaizdus, palaikykite, kad atvertumėte vaizdą galerijos programėlėje</string>
<string name="sort_by">Rikiuoti pagal</string>
<string name="reverse">Atvirkštinis</string>
<string name="reverse">…atvirkštine tvarka</string>
<string name="sort_by_balance">Balansas</string>
<string name="sort_by_expiry">Galiojimo pabaiga</string>
<string name="sort_by_most_recently_used">Vėliausiai naudota</string>
@@ -214,10 +213,60 @@
<string name="editGroup">Redaguojama grupė: <xliff:g>%s</xliff:g></string>
<string name="group_updated">Grupė atnaujinta</string>
<string name="group_edit">Redaguoti grupę</string>
<string name="noGiftCardsGroup">Dar neturite jokių lojalumo kortelių. Kai kelias pridėsite, galėsite jas priskirti grupei čia.</string>
<string name="noGiftCardsGroup">Sukurkite keletą kortelių ir priskirkite jas grupei čia.</string>
<string name="setIcon">Nustatyti piktogramą</string>
<string name="selectColor">Pasirinkti spalvą</string>
<string name="action_hide_details">Paslėpti informaciją</string>
<string name="action_show_details">Rodyti išsamią informaciją</string>
<string name="settings_card_orientation">Brūkšninio kodo orientacija</string>
<string name="archiveList">Archyvas</string>
<string name="noUnarchivedCardsMessage">Nėra išarchyvuotų kortelių</string>
<string name="failedLaunchingPhotoPicker">Nepavyko rasti palaikomos galerijos programėlės</string>
<string name="previousCard">Ankstesnė</string>
<string name="nextCard">Kita</string>
<plurals name="viewArchivedCardsWithCount">
<item quantity="one">Peržiūrėti archyvą (<xliff:g>%1$d</xliff:g> kortelė)</item>
<item quantity="few">Peržiūrėti archyvą (<xliff:g>%1$d</xliff:g> kortelės)</item>
<item quantity="other">Peržiūrėti archyvą (<xliff:g>%1$d</xliff:g> kortelių)</item>
</plurals>
<plurals name="groupCardCountWithArchived">
<item quantity="one"><xliff:g>%1$d</xliff:g> kortelė ( archyvuota)<xliff:g id="archivedCount">%2$d</xliff:g></item>
<item quantity="few"><xliff:g>%1$d</xliff:g> kortelės ( archyvuotos)<xliff:g id="archivedCount">%2$d</xliff:g></item>
<item quantity="other"><xliff:g>%1$d</xliff:g> kortelių ( archyvuotų)<xliff:g id="archivedCount">%2$d</xliff:g></item>
</plurals>
<string name="set_scale">Nustatyti mastelį</string>
<string name="hideMoreInfo">Slėpti informaciją</string>
<string name="updateBalance">Atnaujinti balansą</string>
<string name="failedToRetrieveImageFile">Nepavyko gauti vaizdo failo</string>
<string name="barcodeLongPressMessage">Galerijos programėlėje galima atidaryti tik vaizdus</string>
<string name="translate_platform">Weblate svetainėje</string>
<string name="shortcutSelectCard">Pasirinkti kortelę</string>
<string name="options">Parinktys</string>
<string name="starred">Pažymėta žvaigždute</string>
<string name="include_if_asking_support">Jei norite prašyti pagalbos, įtraukite šią informaciją:</string>
<string name="archive">Archyvuoti</string>
<string name="duplicateCard">Dubliuoti</string>
<string name="unarchive">Išarchyvuoti</string>
<string name="archived">Kortelė archyvuota</string>
<string name="unarchived">Kortelė išarchyvuota</string>
<string name="updateBalanceTitle">Kiek išleidote\?</string>
<string name="updateBalanceHint">Įveskite sumą</string>
<string name="currentBalanceSentence">Dabartinis likutis: <xliff:g>%s</xliff:g></string>
<string name="newBalanceSentence">Naujas balansas: <xliff:g>%s</xliff:g></string>
<string name="failedToOpenUrl">Pirmiausia įdiekite žiniatinklio naršyklę</string>
<string name="welcome">Sveiki užėję į Catima</string>
<string name="showMoreInfo">Rodyti informaciją</string>
<string name="settings_oled_dark">Visiškai juodas fonas tamsiajai temai</string>
<string name="settings_follow_system_orientation">Sekti sistemą</string>
<string name="settings_portrait_orientation">Portretas</string>
<string name="settings_landscape_orientation">Gulsčias</string>
<string name="settings_lock_on_opening_orientation">Užfiksuoti padėtį, kuri naudojama atidarant kortelę</string>
<string name="cameraPermissionDeniedTitle">Nepavyko pasiekti kameros</string>
<string name="noCameraPermissionDirectToSystemSetting">Skanuoti brūkšniniams kodams Catima reikės gauti leidimo naudotis jūsų kamera. Spustelkite čia norėdami pakeisti leidimų nustatymus.</string>
<plurals name="balancePoints">
<item quantity="one"><xliff:g>%s</xliff:g> taškas</item>
<item quantity="few"><xliff:g>%s</xliff:g> taškai</item>
<item quantity="other"><xliff:g>%s</xliff:g> taškų</item>
</plurals>
<string name="importCards">Importuoti korteles</string>
</resources>

View File

@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="action_search">Meklēšana</string>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
<string name="action_search">Meklēt</string>
<string name="action_add">Pievienot</string>
<string name="noGiftCards">Noklikšķiniet uz pogas + plus, lai pievienotu karti, vai vispirms importējiet dažus no ⋮ izvēlnes.</string>
<string name="noMatchingGiftCards">Neko neatradu. Mēģiniet mainīt meklēšanu.</string>
<string name="noMatchingGiftCards">Nav rezultātu. Mēģiniet mainīt meklējamo tekstu.</string>
<string name="storeName">Nosaukums</string>
<string name="note">Piezīme</string>
<string name="barcodeType">Svītrkoda Tips</string>
<string name="barcodeNoBarcode">Šai kartei nav svītrkoda</string>
<string name="barcodeType">Svītrkoda tips</string>
<string name="barcodeNoBarcode">Bez svītrkoda</string>
<string name="noBarcode">Nav svītrkoda</string>
<string name="star">Pievienot izlasei</string>
<string name="unstar">Noņemt no izlases</string>
@@ -21,73 +21,239 @@
<string name="balance">Bilance</string>
<string name="noBarcodeFound">Svītrkods netika atrasts</string>
<string name="currency">Valūta</string>
<string name="points">Punkts</string>
<string name="chooseImportType">Importēt datus no\?</string>
<string name="points">Punkti</string>
<string name="chooseImportType">Importēt datus no</string>
<string name="sendLabel">Nosūtīt…</string>
<string name="editCardTitle">Rediģēt Karti</string>
<string name="share">Daļa</string>
<string name="editCardTitle">Rediģēt karti</string>
<string name="share">Kopīgot</string>
<string name="confirm">Apstiprināt</string>
<string name="deleteTitle">Dzēst karti</string>
<string name="deleteConfirmation">Dzēst šo karti pastāvīgi\?</string>
<string name="ok">LABI</string>
<string name="addCardTitle">Pievienot Karti</string>
<string name="scanCardBarcode">Skenēšanas Kartes Svītrkods</string>
<string name="cardShortcut">Kartes Saīsne</string>
<string name="deleteConfirmation">Neatgriezeniski dzēst šo karti\?</string>
<string name="ok">Labi</string>
<string name="addCardTitle">Pievienot karti</string>
<string name="scanCardBarcode">Skenēt svītrkodu</string>
<string name="cardShortcut">Kartes saīsne</string>
<string name="noCardsMessage">Vispirms pievienojiet karti</string>
<string name="noStoreError">Vārds nav ievadīts</string>
<string name="noCardExistsError">Nevarēja atrast karti</string>
<string name="failedParsingImportUriError">Nevarēja parsēt importa URI</string>
<string name="importExport">Imports/Eksports</string>
<string name="exportName">Eksports</string>
<string name="importExportHelp">Jūsu Karšu dublēšana ļauj pārvietot tās uz citu ierīci.</string>
<string name="importExportHelp">Dublējot Jūsu datus, tos var pārnest uz citu ierīci.</string>
<string name="importSuccessfulTitle">Importēts</string>
<string name="importFailedTitle">Neizdevās importēt</string>
<string name="importFailed">Nevarēja importēt kartes</string>
<string name="exportSuccessfulTitle">Eksports</string>
<string name="importFailedTitle">Imports neizdevās</string>
<string name="importFailed">Karšu importu nevarēja veikt</string>
<string name="exportSuccessfulTitle">Eksportēts</string>
<string name="exportFailedTitle">Eksports neizdevās</string>
<string name="exportFailed">Nevarēja eksportēt kartes</string>
<string name="importing">Imports</string>
<string name="exporting">Eksports</string>
<string name="noExternalStoragePermissionError">Piešķiriet ārējai atmiņai atļauju vispirms importēt vai eksportēt kartes</string>
<string name="exportOptionExplanation">Dati tiks rakstīts uz vietu, pēc jūsu izvēles.</string>
<string name="importOptionFilesystemTitle">Importēt no failu sistēmas</string>
<string name="exportFailed">Kartes neizdevās eksportēt</string>
<string name="importing">Importē</string>
<string name="exporting">Eksportē</string>
<string name="exportOptionExplanation">Dati tiks saglabāti Jūsu izvēlētajā vietā.</string>
<string name="importOptionFilesystemTitle">Imports no failu sistēmas</string>
<string name="importOptionFilesystemExplanation">Izvēlieties konkrētu failu no failu sistēmas.</string>
<string name="importOptionFilesystemButton">No failu sistēmas</string>
<string name="importOptionApplicationTitle">Izmantojiet citu lietotni</string>
<string name="importOptionApplicationTitle">Izmantojot citu lietotni</string>
<string name="importOptionApplicationExplanation">Izmantojiet jebkuru lietotni vai savu iecienītāko failu pārvaldnieku, lai atvērtu failu.</string>
<string name="importOptionApplicationButton">Izmantojiet citu lietotni</string>
<string name="importOptionApplicationButton">Ar citu lietotni</string>
<string name="about">Par</string>
<string name="app_license">Copylefted libre programmatūra, licencēta GPLv3+</string>
<string name="selectBarcodeTitle">Izvēlieties Svītrkodu</string>
<string name="copy_to_clipboard_toast">Kartes ID kopēts starpliktuvē</string>
<string name="thumbnailDescription">Sīktēls kartei</string>
<string name="starImage">Mīļākā zvaigzne</string>
<string name="settings">Iestatījums</string>
<string name="app_license">Copyleft brīva un atvērta programmatūra, licencēta GPLv3+</string>
<string name="selectBarcodeTitle">Izvēlieties svītrkodu</string>
<string name="copy_to_clipboard_toast">Numurs kopēts starpliktuvē</string>
<string name="thumbnailDescription">Sīktēls</string>
<string name="starImage">Izlases zvaigzne</string>
<string name="settings">Iestatījumi</string>
<string name="settings_category_title_ui">Interfeiss</string>
<string name="settings_theme">Tēma</string>
<string name="settings_system_theme">Sistēma</string>
<string name="settings_light_theme">Gaisma</string>
<string name="settings_dark_theme">Tumšs</string>
<string name="settings_max_font_size_scale">Max. fonts</string>
<string name="settings_display_barcode_max_brightness">Izgaismojiet svītrkoda skatu</string>
<string name="settings_keep_screen_on">Saglabāt ekrānu</string>
<string name="settings_disable_lockscreen_while_viewing_card">Novērst bloķēšanas ekrānu</string>
<string name="intent_import_card_from_url_share_text">Es vēlos dalīties ar jums karti</string>
<string name="importSuccessful">Importētie kartes dati</string>
<string name="exportSuccessful">Kartes dati eksportēti</string>
<string name="noGroups">Noklikšķiniet uz pogas + plus, lai vispirms pievienotu grupas kategorizēšanai.</string>
<string name="noGroupCards">Šajā grupā nav nevienas kartes</string>
<string name="all">Visi</string>
<string name="settings_system_theme">Sistēmas</string>
<string name="settings_light_theme">Gaiša</string>
<string name="settings_dark_theme">Tumša</string>
<string name="settings_max_font_size_scale">Maksimālais burtu lielums</string>
<string name="settings_display_barcode_max_brightness">Izgaismot svītrkoda skatu</string>
<string name="settings_keep_screen_on">Turēt ekrānu ieslēgtu</string>
<string name="settings_disable_lockscreen_while_viewing_card">Neļaut ekrānam aizslēgties</string>
<string name="intent_import_card_from_url_share_text">Es vēlos ar Jums kopīgot karti</string>
<string name="importSuccessful">Dati importēti</string>
<string name="exportSuccessful">Dati eksportēti</string>
<string name="noGroups">Spiediet uz \"+\" plus pogas, lai pievienotu grupas karšu kategorizēšanai.</string>
<string name="noGroupCards">Šī grupa ir tukša</string>
<string name="all">Visas</string>
<string name="deleteConfirmationGroup">Dzēst grupu\?</string>
<string name="failedOpeningFileManager">Vispirms instalējiet failu pārvaldnieku.</string>
<string name="moveUp">Pārvietot uz augšu</string>
<string name="moveDown">Pārvietot uz leju</string>
<string name="leaveWithoutSaveTitle">Izeja</string>
<string name="leaveWithoutSaveConfirmation">Atstāt bez taupīšanas\?</string>
<string name="addFromImage">Izvēlieties attēlu no galerijas</string>
<string name="leaveWithoutSaveTitle">Iziet</string>
<string name="leaveWithoutSaveConfirmation">Iziet nesaglabājot\?</string>
<string name="addFromImage">Izvēlēties attēlu no galerijas</string>
<string name="card">Karte</string>
<string name="barcode">Svītrkods</string>
<string name="expiryDate">Derīguma termiņš</string>
<string name="never">Nekad</string>
<string name="chooseExpiryDate">Izvēlieties derīguma termiņu</string>
<string name="failedToRetrieveImageFile">Neizdevās ielādēt attēla failu</string>
<string name="barcodeLongPressMessage">Galerijas lietotnē var atvērt tikai attēlus</string>
<string name="sort_by_expiry">Derīguma termiņš</string>
<string name="reverse">...apgrieztā secībā</string>
<string name="credits">Pateicības</string>
<string name="shortcutSelectCard">Izvēlieties karti</string>
<string name="set_scale">Iestatiet mērogu</string>
<string name="duplicateCard">Dublēt</string>
<string name="archive">Arhivēt</string>
<string name="translate_platform">vietnē Weblate</string>
<string name="starred">Izlase</string>
<string name="cardId">Kartes numurs</string>
<string name="enterBarcodeInstructions">Ievadiet kartes numuru un izvēlieties svītrkoda tipu (vai izvēlieties \"bez svītrkoda\").</string>
<plurals name="deleteCardsConfirmation">
<item quantity="zero">Neatgriezeniski dzēst šīs <xliff:g>%d</xliff:g> kartes\?</item>
<item quantity="one">Neatgriezeniski dzēst šo <xliff:g>%d</xliff:g> karti\?</item>
<item quantity="other">Neatgriezeniski dzēst šīs <xliff:g>%d</xliff:g> kartes\?</item>
</plurals>
<string name="noCardIdError">Numurs nav ievadīts</string>
<string name="about_title_fmt">Par <xliff:g id="app_name">%s</xliff:g></string>
<string name="app_revision_fmt">Versijas pārskats: <xliff:g id="app_revision_url">%s</xliff:g></string>
<string name="expiryStateSentenceExpired">Derīguma termiņš beidzās: <xliff:g>%s</xliff:g></string>
<string name="action_hide_details">Slēpt detaļas</string>
<string name="action_show_details">Rādīt detalizēti</string>
<string name="selectColor">Izvēlieties krāsu</string>
<string name="settings_catima_theme">Catima</string>
<string name="settings_pink_theme">Rozā</string>
<string name="settings_magenta_theme">Purpura</string>
<string name="settings_sky_blue_theme">Gaiši zila</string>
<string name="settings_green_theme">Zaļa</string>
<string name="sort_by_name">Nosaukums</string>
<string name="on_google_play">pakalpojumā Google Play</string>
<string name="report_error">Ziņojiet par kļūdu</string>
<plurals name="balancePoints">
<item quantity="zero"><xliff:g>%s</xliff:g> punkti</item>
<item quantity="one"><xliff:g>%s</xliff:g> punkts</item>
<item quantity="other"><xliff:g>%s</xliff:g> punkti</item>
</plurals>
<string name="parsingBalanceFailed"><xliff:g>%s</xliff:g> nešķiet derīga bilance.</string>
<string name="app_loyalty_card_keychain">Loyalty Card Keychain</string>
<string name="privacy_policy_popup_text">Paziņojums par privātuma politiku (nepieciešams dažiem lietotņu veikaliem):
\n
\nNEKĀDI DATI NETIEK VĀKTI, par ko var pārliecināties ikkatrs, jo mūsu lietotne ir brīva, atvērta koda programmatūra.</string>
<string name="importCatimaMessage">Izvēlieties jūstu <i>catima.zip</i> failu importam.
\nFailu var izveidot eksportējot datus no Catima lietotnes citā ierīce, sadaļā \"Imports/Eksports\".</string>
<string name="importLoyaltyCardKeychainMessage">Importam izvēlieties Jūsu <i>LoyaltyCardKeychain.csv</i> eksporta failu no Loyalty Card Keychain.
\nFailu var izveidot \"Imports/Eksports\" izvēlnē Loyalty Card Keychain lietotnē, spiežot \"Eksportēt\".</string>
<string name="removeImage">Noņemt attēlu</string>
<string name="exportPasswordHint">Ievadiet paroli</string>
<string name="on_github">vietnē GitHub</string>
<string name="settings_locale">Valoda</string>
<string name="failedGeneratingShareURL">Nevarēja izveidot koplietojamu URL. Lūdzu, ziņojiet par šo kļūdu.</string>
<string name="turn_flashlight_off">Izslēgt zibspuldzi</string>
<string name="app_contributors">To padarīja iespējamu: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="sort_by_balance">Bilance</string>
<string name="version_history">Versiju vēsture</string>
<string name="sort_by">Kārtot pēc</string>
<string name="help_translate_this_app">Palīdziet tulkot šo lietotni</string>
<string name="and_data_usage">un datu lietojums</string>
<string name="license">Licence</string>
<string name="source_repository">Pirmkods</string>
<string name="rate_this_app">Novērtējiet šo lietotni</string>
<string name="noGiftCardsGroup">Izveidojiet kartes, un pēc tam šeit pievienojiet tās grupai.</string>
<string name="options">Parametri</string>
<plurals name="groupCardCount">
<item quantity="zero"><xliff:g>%d</xliff:g> kartes</item>
<item quantity="one"><xliff:g>%d</xliff:g> karte</item>
<item quantity="other"><xliff:g>%d</xliff:g> kartes</item>
</plurals>
<plurals name="deleteCardsTitle">
<item quantity="zero">Dzēst <xliff:g>%d</xliff:g> kartes</item>
<item quantity="one">Dzēst <xliff:g>%d</xliff:g> karti</item>
<item quantity="other">Dzēst <xliff:g>%d</xliff:g> kartes</item>
</plurals>
<string name="updateBarcodeQuestionText">Jūs izmainījāt numuru. Vai vēlaties arī atjaunināt svītrkodu ar tādu pašu vērtību\?</string>
<string name="updateBarcodeQuestionTitle">Atjaunināt svītrkoda vērtību\?</string>
<string name="yes"></string>
<string name="no"></string>
<string name="settings_system_locale">Sistēmas</string>
<string name="include_if_asking_support">Ja vēlaties lūgt atbalstu, lūdzu iekļaujiet sekojošo informāciju:</string>
<string name="card_ids_copied">Kopētie numuri</string>
<string name="barcodeImageDescriptionWithType"><xliff:g>%s</xliff:g> svītrkoda attēls</string>
<string name="privacy_policy">Privātuma politika</string>
<string name="accept">Apstiprināt</string>
<string name="editGroup">Grupas rediģēšana: <xliff:g>%s</xliff:g></string>
<string name="settings_brown_theme">Brūna</string>
<string name="copy_to_clipboard">Kopēt kartes numuru starpliktuvē</string>
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Autortiesības © 2019<xliff:g>%d</xliff:g> Sylvia van Os</string>
<string name="app_copyright_old">Balstīta uz Loyalty Card Keychain
\nautortiesības © 20162020 Branden Archer</string>
<string name="debug_version_fmt">Versija: <xliff:g id="version">%s</xliff:g></string>
<string name="app_libraries">Brīvas trešo pušu programmatūras bibliotēkas: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="app_resources">Brīvi trešo pušu resursi: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="settings_card_orientation">Svītrkoda orientācija</string>
<string name="settings_follow_system_orientation">Pēc sistēmas</string>
<string name="settings_portrait_orientation">Portreta</string>
<string name="settings_landscape_orientation">Ainavas</string>
<string name="settings_lock_on_opening_orientation">Ievērot to orientāciju, kādā karte atvērta</string>
<string name="enter_group_name">Ievadiet grupas nosaukumu</string>
<string name="groups">Grupas</string>
<string name="group_edit">Rediģēt grupu</string>
<string name="group_name_already_in_use">Jau ir grupa ar šādu nosaukumu</string>
<string name="group_name_is_empty">Grupas nosaukums nevar būt tukšs</string>
<string name="group_updated">Grupa atjaunināta</string>
<string name="addManually">Ievadīt numuru manuāli</string>
<string name="groupsList">Grupas: <xliff:g>%s</xliff:g></string>
<string name="expiryStateSentence">Derīguma termiņš: <xliff:g>%s</xliff:g></string>
<string name="balanceSentence">Bilance: <xliff:g>%s</xliff:g></string>
<string name="editBarcode">Rediģēt svītrkodu</string>
<string name="importCatima">Importēt no Catima</string>
<string name="importFidme">Importēt no FidMe</string>
<string name="importFidmeMessage">Importam izvēlieties Jūsu <i>fidme-export-request-xxxxxx.zip</i> FidMe eksportēto failu, un pēc tam manuāli precizējiet svītrkodu tipus.
\nFailu var izveidot Jūsu FidMe profilā, ejot uz \"Data Protection\" un spiežot \"Extract my data\".</string>
<string name="importLoyaltyCardKeychain">Importēt no Loyalty Card Keychain</string>
<string name="importStocard">Importēt no Stocard</string>
<string name="importStocardMessage">Importam izvēlieties Jūsu <i>***-sync.zip</i> eksporta failu no Stocard.
\nFailu var iegūt sūtot e-pastu uz support@stocardapp.com ar pieprasījumu eksportēt Jūsu datus.</string>
<string name="importVoucherVault">Importēt no Voucher Vault</string>
<string name="importVoucherVaultMessage">Importam izvēlieties Jūsu <i>vouchervault.json</i> failu no Voucher Vault.
\nFailu var izveidot spiežot \"Eksportēt\" Voucher Vault lietotnē.</string>
<string name="barcodeId">Svītrkoda vērtība</string>
<string name="sameAsCardId">Tāpat kā numurs</string>
<string name="setBarcodeId">Norādiet svītrkoda vērtību</string>
<string name="unsupportedBarcodeType">Šo svītrkoda tipu pagaidām nav iespējams attēlot. Iespējams, nākotnē tas tiks atbalstīts vēlākā lietotnes versijā.</string>
<string name="wrongValueForBarcodeType">Šī vērtība nav derīga izvēlētajam svītrkoda tipam</string>
<string name="copy_to_clipboard_multiple_toast">Numuri kopēti starpliktuvē</string>
<string name="intent_import_card_from_url_share_multiple_text">Vēlos koplietot kartes</string>
<string name="frontImageDescription">Priekšas attēls</string>
<string name="backImageDescription">Aizmugures attēls</string>
<string name="photos">Foto</string>
<string name="setFrontImage">Iestatīt priekšas attēlu</string>
<string name="setBackImage">Iestatīt aizmugures attēlu</string>
<string name="takePhoto">Fotografēt</string>
<string name="passwordRequired">Ievadiet paroli</string>
<string name="exportPassword">Iestatiet paroli, lai aizsargātu eksporta failu (nav obligāti)</string>
<string name="turn_flashlight_on">Ieslēgt zibspuldzi</string>
<string name="settings_oled_dark">Tīri melns fons tumšajai tēmai</string>
<string name="setIcon">Iestatīt ikonu</string>
<string name="settings_theme_color">Tēmas krāsa</string>
<string name="settings_violet_theme">Violeta</string>
<string name="settings_blue_theme">Zila</string>
<string name="settings_grey_theme">Pelēka</string>
<string name="sort">Kārtot</string>
<string name="showMoreInfo">Rādīt informāciju</string>
<string name="hideMoreInfo">Slēpt informāciju</string>
<string name="swipeToSwitchImages">Velciet, lai pārslēgtu attēlus; spiediet un turiet lai atvērtu attēlu galerijas lietotnē</string>
<string name="sort_by_most_recently_used">Nesen lietotās</string>
<string name="unarchive">Atarhivēt</string>
<string name="archived">Karte arhivēta</string>
<string name="unarchived">Karte atarhivēta</string>
<string name="archiveList">Arhīvs</string>
<string name="noUnarchivedCardsMessage">Nav atarhivētu karšu</string>
<string name="failedLaunchingPhotoPicker">Nevarēja atrast atbalstītu galerijas lietotni</string>
<string name="previousCard">Iepriekšējā</string>
<string name="nextCard">Nākamā</string>
<plurals name="viewArchivedCardsWithCount">
<item quantity="zero">Skatīt arhivētu (<xliff:g>%1$d</xliff:g> karti)</item>
<item quantity="one">Skatīt arhivētu (<xliff:g>%1$d</xliff:g> karti)</item>
<item quantity="other">Skatīt arhivētas (<xliff:g>%1$d</xliff:g> kartes)</item>
</plurals>
<plurals name="groupCardCountWithArchived">
<item quantity="zero"><xliff:g>%1$d</xliff:g> card (<xliff:g id="archivedCount">%2$d</xliff:g> arhivēta)</item>
<item quantity="one"><xliff:g>%1$d</xliff:g> card (<xliff:g id="archivedCount">%2$d</xliff:g> arhivēta)</item>
<item quantity="other"><xliff:g>%1$d</xliff:g> cards (<xliff:g id="archivedCount">%2$d</xliff:g> arhivētas)</item>
</plurals>
<string name="failedToOpenUrl">Vispirms nepieciešams uzstādīt interneta pārlūku</string>
<string name="welcome">Laipni lūgti Catima</string>
</resources>

View File

@@ -33,7 +33,6 @@
<string name="exportFailed">Kunne ikke utføre eksport</string>
<string name="importing">Importerer…</string>
<string name="exporting">Exporterer…</string>
<string name="noExternalStoragePermissionError">Innvilg lagringstilgang til eksternlager for å importere eller eksportere data</string>
<string name="exportOptionExplanation">Data skrives dit du ønsker det.</string>
<string name="importOptionFilesystemTitle">Importer fra filsystem</string>
<string name="importOptionFilesystemExplanation">Velg spesifikk fil fra filsystemet.</string>
@@ -183,7 +182,7 @@
<string name="settings_theme_color">Draktfarge</string>
<string name="noGroupCards">Denne gruppen er tom</string>
<string name="barcodeImageDescriptionWithType">Bilde av <xliff:g>%s</xliff:g>-strekkode</string>
<string name="swipeToSwitchImages">Dra eller hold lenge for å bygge bilder</string>
<string name="swipeToSwitchImages">Dra for å bytte bilder, hold for å åpne et bilde i galleriet.</string>
<string name="sort_by">Sortering</string>
<string name="reverse">…i omvendt rekkefølge</string>
<string name="sort_by_balance">Saldo</string>
@@ -253,4 +252,14 @@
<item quantity="one">Vis arkiv (<xliff:g>%1$d</xliff:g> kort)</item>
<item quantity="other">Vis arkiv (<xliff:g>%1$d</xliff:g> kort)</item>
</plurals>
<string name="failedToRetrieveImageFile">Kunne ikke hente bildefil</string>
<string name="barcodeLongPressMessage">Kun bilder kan åpnes i galleriet</string>
<string name="cameraPermissionDeniedTitle">Fikk ikke tilgang til kameraet</string>
<string name="noCameraPermissionDirectToSystemSetting">Catima trenger kameratilgang for å skanne strekkoder. Trykk her for å endre tilgangsinnstillingene.</string>
<string name="importCards">Importer kort</string>
<string name="currentBalanceSentence">Nåværende saldo: <xliff:g>%s</xliff:g></string>
<string name="updateBalanceTitle">Hvor mye brukte du\?</string>
<string name="updateBalanceHint">Skriv inn beløp</string>
<string name="newBalanceSentence">Ny saldo: <xliff:g>%s</xliff:g></string>
<string name="updateBalance">Oppdater saldo</string>
</resources>

View File

@@ -38,7 +38,6 @@
<string name="exportFailed">Het exporteren is mislukt</string>
<string name="importing">Bezig met importeren…</string>
<string name="exporting">Bezig met exporteren…</string>
<string name="noExternalStoragePermissionError">Verleen het recht externe opslag om gegevens te kunnen im- of exporteren</string>
<string name="exportOptionExplanation">De gegevens worden weggeschreven op een locatie naar keuze.</string>
<string name="importOptionFilesystemTitle">Importeren uit bestandssysteem</string>
<string name="importOptionFilesystemExplanation">Kies een specifiek bestand van het bestandssysteem.</string>
@@ -185,7 +184,7 @@
<string name="app_contributors">Mede mogelijk gemaakt door: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="noGroupCards">Deze groep bevat geen kaarten</string>
<string name="barcodeImageDescriptionWithType">Afbeelding van barcode <xliff:g>%s</xliff:g></string>
<string name="swipeToSwitchImages">Veeg of houd lang ingedrukt om te bladeren</string>
<string name="swipeToSwitchImages">Veeg om te bladeren; houd lang ingedrukt om te openen in de galerij-app</string>
<string name="sort_by">Sorteren op</string>
<string name="reverse">…in omgekeerde volgorde</string>
<string name="sort_by_balance">Op saldo</string>
@@ -253,4 +252,16 @@
<item quantity="one">Archief bekijken (<xliff:g>%1$d</xliff:g> kaart)</item>
<item quantity="other">Archief bekijken (<xliff:g>%1$d</xliff:g> kaarten)</item>
</plurals>
<string name="failedToRetrieveImageFile">De afbeelding kan niet worden opgehaald</string>
<string name="barcodeLongPressMessage">Alleen afbeeldingen kunnen worden geopend in de galerij-app</string>
<string name="cameraPermissionDeniedTitle">Geen cameratoegang</string>
<string name="updateBalanceTitle">Hoeveel heb je uitgegeven\?</string>
<string name="noCameraPermissionDirectToSystemSetting">Catima heeft toegang tot je camera nodig om barcodes te kunnen scannen. Druk hier om toegang te verlenen.</string>
<string name="currentBalanceSentence">Huidig saldo: <xliff:g>%s</xliff:g></string>
<string name="updateBalance">Saldo bijwerken</string>
<string name="updateBalanceHint">Voer een bedrag in</string>
<string name="newBalanceSentence">Nieuw saldo: <xliff:g>%s</xliff:g></string>
<string name="importCards">Kaarten importeren</string>
<string name="storageReadPermissionRequired">Toestemming om de opslag uit te lezen benodigd voor deze actie…</string>
<string name="cameraPermissionRequired">Toestemming om de camera te openen benodigd voor deze actie…</string>
</resources>

View File

@@ -24,20 +24,19 @@
<string name="noCardsMessage">Najpierw dodaj kartę</string>
<string name="noStoreError">Nie wprowadzono nazwy</string>
<string name="noCardIdError">Nie wprowadzono identyfikatora</string>
<string name="noCardExistsError">Nie można wyszukać karty lojalnościowej</string>
<string name="noCardExistsError">Nie można znaleźć tej karty lojalnościowej</string>
<string name="failedParsingImportUriError">Nie można przeanalizować identyfikatora importu URI</string>
<string name="importExport">Importuj/Eksportuj</string>
<string name="exportName">Eksportuj</string>
<string name="importExportHelp">Kopie zapasowe umożliwiają przeniesienie kart na inne urządzenie.</string>
<string name="importSuccessfulTitle">Zaimportowano</string>
<string name="importFailedTitle">Import nie powiódł się</string>
<string name="importFailedTitle">Importowanie nie powioo się</string>
<string name="importFailed">Nie udało się zaimportować</string>
<string name="exportSuccessfulTitle">Wyeksportowano</string>
<string name="exportFailedTitle">Eksport nie powiódł się</string>
<string name="exportFailed">Nie udało się wyeksportować</string>
<string name="importing">Importowanie…</string>
<string name="exporting">Eksportowanie…</string>
<string name="noExternalStoragePermissionError">Przyznaj uprawnienia pamięci zewnętrznej, aby importować lub eksportować dane</string>
<string name="importOptionFilesystemTitle">Importuj z systemu plików</string>
<string name="importOptionFilesystemExplanation">Wybierz określony plik z systemu plików.</string>
<string name="importOptionFilesystemButton">Z systemu plików</string>
@@ -48,7 +47,7 @@
<string name="app_license">Wolne oprogramowanie typu copyleft, na licencji GPLv3+</string>
<string name="about_title_fmt">O <xliff:g id="app_name">%s</xliff:g></string>
<string name="debug_version_fmt">Wersja: <xliff:g id="version">%s</xliff:g></string>
<string name="app_revision_fmt">Info o wydaniu: <xliff:g id="app_revision_url">%s</xliff:g></string>
<string name="app_revision_fmt">Informacje o wydaniu: <xliff:g id="app_revision_url">%s</xliff:g></string>
<string name="selectBarcodeTitle">Wybierz kod kreskowy</string>
<string name="enterBarcodeInstructions">Wprowadź ID, a następnie wybierz typ kodu kreskowego, którego chcesz użyć lub wybierz „Bez kodu kreskowego”.</string>
<string name="copy_to_clipboard_toast">Skopiowano ID do schowka</string>
@@ -63,12 +62,12 @@
<string name="intent_import_card_from_url_share_text">Chcę udostępnić Ci kartę lojalnościową</string>
<string name="deleteConfirmationGroup">Usunąć grupę\?</string>
<string name="all">Wszystko</string>
<string name="noGroups">Kliknij przycisk + plus, aby dodać grupy w celu kategoryzacji.</string>
<string name="noGroups">Kliknij przycisk + plus, aby dodać grupy do kategoryzacji.</string>
<string name="groups">Grupy</string>
<string name="enter_group_name">Wpisz nazwę grupy</string>
<string name="exportSuccessful">Dane zostały wyeksportowane</string>
<string name="importSuccessful">Zaimportowano dane</string>
<string name="starImage">Ulubiona gwiazda</string>
<string name="starImage">Gwiazdka ulubionych</string>
<string name="app_copyright_old">Na podstawie Loyalty Card Keychain
\nWszelkie prawa zastrzeżone © 20162020 Branden Archer</string>
<string name="exportOptionExplanation">Dane zostaną zapisane w wybranym przez Ciebie miejscu.</string>
@@ -206,20 +205,20 @@
<string name="report_error">Zgłoś Błąd</string>
<string name="setIcon">Ustaw ikonę</string>
<string name="on_github">na GitHub\'ie</string>
<string name="swipeToSwitchImages">Przeciągnij lub przytrzymaj aby zmienić obraz</string>
<string name="swipeToSwitchImages">Przeciągnij aby zmienić obraz, przytrzymaj aby otworzyć obraz w galerii</string>
<string name="selectColor">Wybierz kolor</string>
<string name="version_history">Historia Wersji</string>
<string name="and_data_usage">i wykorzystanie danych</string>
<string name="rate_this_app">Oceń tą aplikację</string>
<string name="license">Licencja</string>
<string name="on_google_play">w Google Play</string>
<string name="noGiftCardsGroup">Stwórz karty i przypisz je do grupy w tym miejscu.</string>
<string name="noGiftCardsGroup">Stwórz karty i przypisz je do grup w tym miejscu.</string>
<string name="reverse">...w odwrotnej kolejności</string>
<string name="translate_platform">na Weblate</string>
<string name="sort">Sortuj</string>
<string name="barcodeImageDescriptionWithType">Obraz kodu kreskowego typu <xliff:g>%s</xliff:g></string>
<string name="group_edit">Edytuj Grupę</string>
<string name="group_name_already_in_use">Ta nazwa jest już użyta</string>
<string name="group_name_already_in_use">Ta nazwa jest już w użytku</string>
<string name="group_name_is_empty">Nazwa grupy nie może być pusta</string>
<string name="group_updated">Zaktualizowano grupę</string>
<string name="editGroup">Edytowanie grupy: <xliff:g>%s</xliff:g></string>
@@ -237,7 +236,7 @@
<string name="settings_oled_dark">Całkowicie czarne tło dla ciemnego motywu</string>
<string name="hideMoreInfo">Ukryj informacje</string>
<string name="settings_card_orientation">Orientacja kodu kreskowego</string>
<string name="settings_follow_system_orientation">Śledź system</string>
<string name="settings_follow_system_orientation">Śledź orientację systemową</string>
<string name="set_scale">Ustaw skalę</string>
<string name="duplicateCard">Duplikuj</string>
<string name="starred">Oznaczone gwiazdką</string>
@@ -259,4 +258,22 @@
<item quantity="many"><xliff:g>%1$d</xliff:g> kart (<xliff:g id="archivedCount">%2$d</xliff:g> zarchwizowanych)</item>
<item quantity="other"><xliff:g>%1$d</xliff:g> kart (<xliff:g id="archivedCount">%2$d</xliff:g> zarchwizowanych)</item>
</plurals>
<string name="failedToRetrieveImageFile">Nie udało się pobrać pliku obrazu</string>
<string name="barcodeLongPressMessage">W galerii możesz otworzyć tylko obrazy</string>
<string name="failedToOpenUrl">Najpierw zainstaluj przeglądarkę</string>
<string name="welcome">Witaj w Catima</string>
<plurals name="viewArchivedCardsWithCount">
<item quantity="one">Wyświetl zarchiwizowaną (<xliff:g>%1$d</xliff:g> kartę)</item>
<item quantity="few">Wyświetl zarchiwizowane (<xliff:g>%1$d</xliff:g> karty)</item>
<item quantity="many">Wyświetl zarchiwizowane (<xliff:g>%1$d</xliff:g> karty)</item>
<item quantity="other">Wyświetl zarchiwizowane (<xliff:g>%1$d</xliff:g> karty)</item>
</plurals>
<string name="currentBalanceSentence">Saldo: <xliff:g>%s</xliff:g></string>
<string name="noCameraPermissionDirectToSystemSetting">By zeskanować kody kreskowe, Catima musi mieć dostęp do twojej kamery. Dotknij tutaj by zmienić swoje ustawienia dostępu.</string>
<string name="updateBalanceTitle">Ile wydałeś\?</string>
<string name="updateBalanceHint">Wpisz sumę</string>
<string name="updateBalance">Zaktualizuj balans</string>
<string name="cameraPermissionDeniedTitle">Odmówiono dostępu do kamery</string>
<string name="newBalanceSentence">Nowe saldo: <xliff:g>%s</xliff:g></string>
<string name="importCards">Importuj karty</string>
</resources>

View File

@@ -12,7 +12,7 @@
<string name="cancel">Cancelar</string>
<string name="save">Guardar</string>
<string name="edit">Editar</string>
<string name="noGiftCards">Clique no botão + para adicionar um cartão ou importe um no botão do menu ⋮.</string>
<string name="noGiftCards">Clique no botão + para adicionar um cartão ou importe-o no menu ⋮.</string>
<string name="noBarcode">Sem código de barras</string>
<string name="unstar">Retirar dos favoritos</string>
<string name="importOptionFilesystemButton">Do sistema de ficheiros</string>
@@ -72,7 +72,6 @@
<string name="moveUp">Subir</string>
<string name="moveDown">Descer</string>
<string name="leaveWithoutSaveTitle">Sair</string>
<string name="noExternalStoragePermissionError">Conceda primeiro a autorização de acesso ao armazenamento externo para importar ou exportar dados</string>
<string name="importExportHelp">A cópia de segurança dos seus dados permite-lhe movê-los para outro dispositivo.</string>
<string name="importSuccessfulTitle">Importado</string>
<string name="importFailedTitle">A importação falhou</string>
@@ -178,7 +177,7 @@
<string name="settings_blue_theme">Azul</string>
<string name="app_contributors">Tornado possível por: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="sort">Ordenar</string>
<string name="swipeToSwitchImages">Deslize ou pressione prolongadamente para mudar as imagens</string>
<string name="swipeToSwitchImages">Deslize para mudar as imagens, toque prolongadamente para abrir na aplicação da galeria</string>
<string name="sort_by_name">Nome</string>
<string name="sort_by_most_recently_used">Mais usados recentemente</string>
<string name="sort_by_expiry">Validade</string>
@@ -260,4 +259,16 @@
<item quantity="other">Ver arquivo (<xliff:g>%1$d</xliff:g> cartões)</item>
</plurals>
<string name="welcome">Bem-vindo ao Catima</string>
<string name="failedToRetrieveImageFile">Falha ao recuperar o ficheiro de imagem</string>
<string name="barcodeLongPressMessage">Apenas imagens podem ser abertas na aplicação de galeria</string>
<string name="noCameraPermissionDirectToSystemSetting">Para digitalizar código de barras, o Catima tem de aceder à câmara. Clique aqui para mudar as configurações de permissão.</string>
<string name="cameraPermissionDeniedTitle">Não foi possível aceder à câmara</string>
<string name="importCards">Importar cartões</string>
<string name="currentBalanceSentence">Saldo atual: <xliff:g>%s</xliff:g></string>
<string name="newBalanceSentence">Novo saldo: <xliff:g>%s</xliff:g></string>
<string name="updateBalance">Atualizar saldo</string>
<string name="updateBalanceTitle">Quanto gastou\?</string>
<string name="updateBalanceHint">Introduza o valor</string>
<string name="storageReadPermissionRequired">É necessária a permissão para ler o armazenamento para esta ação…</string>
<string name="cameraPermissionRequired">É necessária a permissão para aceder à câmara para esta ação…</string>
</resources>

View File

@@ -4,7 +4,7 @@
<string name="cardId">Cardului ID</string>
<string name="note">Notă</string>
<string name="storeName">Numele</string>
<string name="noMatchingGiftCards">Nu am găsit nimic. Încearcă să schimbi căutarea.</string>
<string name="noMatchingGiftCards">Nu au fost găsite rezultate. Încercați să schimbați termenii de căutare.</string>
<string name="noGiftCards">Faceți clic pe butonul + plus pentru a adăuga o carte sau importați mai întâi câteva din meniul ⋮.</string>
<string name="action_add">Adăugați</string>
<string name="action_search">Căutare</string>
@@ -21,13 +21,13 @@
<string name="unstar">Eliminați din favorite</string>
<string name="star">Adaugă la favorite</string>
<string name="noBarcode">Fără cod de bare</string>
<string name="barcodeNoBarcode">Acest card nu are cod de bare</string>
<string name="barcodeNoBarcode">Nu există cod de bare</string>
<string name="moveDown">Mutarea în jos</string>
<string name="card">Cardul</string>
<string name="settings_theme">Tema</string>
<string name="all">Toate</string>
<string name="noCardsMessage">Adăugați mai întâi o carte</string>
<string name="noCardExistsError">Nu a putut găsi cardul</string>
<string name="noCardExistsError">Acel card nu a putut fi găsit</string>
<string name="failedParsingImportUriError">Nu s-a putut analiza URI-ul de import</string>
<string name="importExport">Importație/Export</string>
<string name="exportName">Exportați</string>
@@ -38,7 +38,6 @@
<string name="exportFailed">Nu s-a putut exporta carduri</string>
<string name="importing">Importul…</string>
<string name="exporting">Exportul…</string>
<string name="noExternalStoragePermissionError">Acordați mai întâi permisiunea de stocare externă pentru a importa sau exporta carduri</string>
<string name="exportOptionExplanation">Datele vor fi scrise într-o locație aleasă de dumneavoastră.</string>
<string name="importOptionFilesystemTitle">Import din sistemul de fișiere</string>
<string name="importOptionApplicationTitle">Utilizați o altă aplicație</string>
@@ -88,12 +87,23 @@
<string name="errorReadingImage">Nu s-a putut citi imaginea</string>
<string name="points">Puncte</string>
<string name="cardShortcut">Scurtătură de card</string>
<string name="scanCardBarcode">Scanarea codului de bare al cardului</string>
<string name="importExportHelp">Copierea de rezervă a cardurilor vă permite să le mutați pe un alt dispozitiv.</string>
<string name="scanCardBarcode">Scanați codul de bare</string>
<string name="importExportHelp">Copierea de rezervă a datelor vă permite să le mutați pe un alt dispozitiv</string>
<string name="exportSuccessfulTitle">Exportată</string>
<string name="exportFailedTitle">Export eșuat</string>
<string name="importOptionFilesystemExplanation">Alegeți un anumit fișier din sistemul de fișiere.</string>
<string name="importOptionApplicationButton">Utilizați o altă aplicație</string>
<string name="thumbnailDescription">Miniatură pentru card</string>
<string name="enter_group_name">Introduceți numele grupului</string>
<string name="yes">Da</string>
<string name="no">Nu</string>
<string name="archive">Arhivați</string>
<string name="archiveList">Arhivă</string>
<string name="passwordRequired">Vă rugăm, introduceți parola</string>
<string name="unsupportedBarcodeType">Acest tip de cod de bare nu poate fi afișat. Este posibil ca acesta să se poată afișa într-o versiune mai nouă a aplicației.</string>
<string name="photos">Imagini</string>
<string name="noGiftCardsGroup">Adăugați câteva carduri, iar apoi atribuiți-le grupului aici.</string>
<string name="importCatima">Importați din Catima</string>
<string name="importStocard">Importați din Stocard</string>
<string name="intent_import_card_from_url_share_multiple_text">Aș dori să partajez niște carduri cu tine</string>
</resources>

View File

@@ -38,7 +38,6 @@
<string name="exportFailed">Невозможно выполнить экспорт</string>
<string name="importing">Импорт…</string>
<string name="exporting">Экспорт…</string>
<string name="noExternalStoragePermissionError">Импорт или экспорт данных невозможен без разрешения на доступ к хранилищу</string>
<string name="exportOptionExplanation">Данные будут записаны в выбранное место.</string>
<string name="importOptionFilesystemTitle">Импорт из файловой системы</string>
<string name="importOptionFilesystemExplanation">Выберете файл на файловой системе.</string>
@@ -193,7 +192,7 @@
<string name="app_contributors">Создано при поддержке: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="noGroupCards">Группа пуста</string>
<string name="barcodeImageDescriptionWithType">Изображение штрих-кода <xliff:g>%s</xliff:g></string>
<string name="swipeToSwitchImages">Смахивание или долгое нажатие для переключения изображений</string>
<string name="swipeToSwitchImages">Смахивание переключает изображения, долгое нажатие открывает в приложении галереи</string>
<string name="sort_by_expiry">Срок действия</string>
<string name="sort_by">Сортировать по</string>
<string name="reverse">…в обратном порядке</string>
@@ -267,4 +266,16 @@
<item quantity="many">Просмотр архива (<xliff:g>%1$d</xliff:g> карт)</item>
<item quantity="other">Просмотр архива (<xliff:g>%1$d</xliff:g> карт)</item>
</plurals>
<string name="failedToRetrieveImageFile">Невозможно получить файл изображения</string>
<string name="barcodeLongPressMessage">В приложении галереи можно открывать только изображения</string>
<string name="noCameraPermissionDirectToSystemSetting">Для сканирования штрих-кодов Catima требуется доступ к камере устройства. Нажмите здесь, чтобы изменить настройки разрешений.</string>
<string name="updateBalance">Обновить баланс</string>
<string name="newBalanceSentence">Новый баланс: <xliff:g>%s</xliff:g></string>
<string name="currentBalanceSentence">Текущий баланс: <xliff:g>%s</xliff:g></string>
<string name="cameraPermissionDeniedTitle">Камера недоступна</string>
<string name="updateBalanceHint">Введите сумму</string>
<string name="updateBalanceTitle">Какое изменение\?</string>
<string name="importCards">Импорт карт</string>
<string name="storageReadPermissionRequired">Для этого действия необходимо разрешение на чтение хранилища…</string>
<string name="cameraPermissionRequired">Для этого действия необходимо разрешение на доступ к камере…</string>
</resources>

View File

@@ -32,7 +32,6 @@
<string name="exportFailed">Zlyhal export</string>
<string name="importing">Importujem…</string>
<string name="exporting">Exportujem…</string>
<string name="noExternalStoragePermissionError">Nie je možné importovať a exportovať karty bez prístupu k externému úložisku</string>
<string name="importOptionFilesystemTitle">Import zo súborového systému</string>
<string name="importOptionFilesystemExplanation">Vyberte súbor zo súborového systému.</string>
<string name="importOptionFilesystemButton">Zo súborového systému</string>
@@ -205,4 +204,5 @@
<string name="passwordRequired">Zadajte prosím heslo</string>
<string name="parsingBalanceFailed"><xliff:g>%s</xliff:g> sa nezdá byť platným zostatkom.</string>
<string name="noGiftCardsGroup">Zatiaľ nemáte žiadne vernostné karty. Keď nejaké pridáte, môžete ich priradiť ku skupine tu.</string>
<string name="noCameraPermissionDirectToSystemSetting"></string>
</resources>

View File

@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
<string name="action_add">Dodaj</string>
<string name="noGiftCards">Trenutno nimate shranjene nobene kartice zvestobe. Kliknite \"+\" (plus) na vrhu, da jih dodate.\n\n Aplikacija Kartice zvestobe Vam omogoča, da imate kartice zvestobe shranjene na Vašem telefonu in vedno v dosegu roke.</string>
<string name="storeName">Shrani</string>
<string name="noGiftCards">Pritisnite gumb + za dodajanje nove kartice ali gumb⋮v meniju za uvoz baze kartic iz datoteke.</string>
<string name="storeName">Ime</string>
<string name="note">Zabeležka</string>
<string name="cardId">Št. kartice</string>
<string name="cancel">Prekliči</string>
@@ -18,35 +18,34 @@
<string name="scanCardBarcode">Skeniraj črtno kodo</string>
<string name="cardShortcut">Bližnjica do kartice</string>
<string name="noCardsMessage">Najprej dodajte kartico</string>
<string name="noStoreError">Ime trgovine ni bilo vnešeno</string>
<string name="noCardIdError">Številka kartice ni bila vnešena</string>
<string name="noCardExistsError">Te kartice zvestobe ni bilo moč najti</string>
<string name="noStoreError">Ime ni bilo vnešeno</string>
<string name="noCardIdError">ID številka kartice ni bila vnešena</string>
<string name="noCardExistsError">Te kartice zvestobe ni bilo mogoče najti</string>
<string name="importExport">Uvozi/izvozi</string>
<string name="exportName">Izvozi</string>
<string name="importExportHelp">Varnostna kopija omogoča varen prenos kartic na druge naprave.</string>
<string name="importExportHelp">Varnostna kopija podatkovne baze kartic zvestobe omogoča prenos baze kartic tudi na drugo napravo.</string>
<string name="importSuccessfulTitle">Uvoz je bil uspešen</string>
<string name="importFailedTitle">Uvoz ni uspel</string>
<string name="importFailed">Napaka pri uvozu</string>
<string name="importFailed">Napaka pri uvozu baze</string>
<string name="exportSuccessfulTitle">Izvoz je uspel</string>
<string name="exportFailedTitle">Izvoz ni uspel</string>
<string name="exportFailed">Napaka pri izvozu</string>
<string name="exportFailed">Napaka pri izvozu baze</string>
<string name="importing">Uvažanje…</string>
<string name="exporting">Izvažanje…</string>
<string name="noExternalStoragePermissionError">Izvažanje in uvažanje je nemogoče brez omogočenega dostopa do zunanje shrambe</string>
<string name="importOptionFilesystemTitle">Uvozi iz datotečnega sistema</string>
<string name="importOptionFilesystemExplanation">Izberite specifično datoteko iz datotečnega sistema.</string>
<string name="importOptionFilesystemButton">Iz datotečnega sistema</string>
<string name="importOptionApplicationTitle">Uporabi zunanjo aplikacijo</string>
<string name="importOptionApplicationTitle">Uporabi drugo aplikacijo</string>
<string name="importOptionApplicationExplanation">Uporabi zunanjo aplikacijo, kot npr. Dropbox, Google Drive ali ostale upravljalnike datotek, za odpiranje datoteke.</string>
<string name="importOptionApplicationButton">Uporabi zunanjo aplikacijo</string>
<string name="importOptionApplicationButton">Uporabi drugo aplikacijo</string>
<string name="about">Več o aplikaciji</string>
<string name="app_license">Licencirano s skladu z GPLv3.</string>
<string name="app_license">Odprtokodna programska oprema, licencirana skladno s GPL3+</string>
<string name="about_title_fmt">Več o <xliff:g id="app_name">%s</xliff:g></string>
<string name="debug_version_fmt">Verzija: <xliff:g id="version">%s</xliff:g></string>
<string name="app_revision_fmt">Informacije o popravkih: <xliff:g id="app_revision_url">%s</xliff:g></string>
<string name="selectBarcodeTitle">Izberite črtno kodo</string>
<string name="copy_to_clipboard_toast">Številka kartice je bila kopirana v odložišče</string>
<string name="thumbnailDescription">Ikona kartice</string>
<string name="copy_to_clipboard_toast">ID številka je kopirana v odložišče</string>
<string name="thumbnailDescription">Sličica</string>
<string name="settings">Nastavitve</string>
<string name="settings_category_title_ui">Uporabniški vmesnik</string>
<string name="settings_display_barcode_max_brightness">Povečaj osvetljenost prikaza črtne kode</string>
@@ -54,7 +53,7 @@
<string name="deleteConfirmation">Prosim potrdite, če želite izbrisati to kartico\?</string>
<string name="card">Kartica</string>
<string name="addFromImage">Izberite sliko iz galerije</string>
<string name="addManually">Ročno vnesite št. kartice</string>
<string name="addManually">Ročno vnesite ID kartice</string>
<string name="leaveWithoutSaveConfirmation">Zapustite brez shranjevanja\?</string>
<string name="leaveWithoutSaveTitle">Izhod</string>
<string name="moveDown">Premikanje navzdol</string>
@@ -62,33 +61,34 @@
<string name="failedOpeningFileManager">Najprej namestite upravitelja datotek.</string>
<string name="deleteConfirmationGroup">Brisanje skupine\?</string>
<string name="all">Vse</string>
<string name="noGroupCards">Ta skupina ne vsebuje kartic</string>
<string name="noGroups">Kliknite gumb + plus, če želite najprej dodati skupine za kategorizacijo.</string>
<string name="noGroupCards">Ta skupina je prazna</string>
<string name="noGroups">Pritisnite gumb \"+\", če želite dodati skupine za kategorizacijo.</string>
<string name="groups">Skupine</string>
<string name="enter_group_name">Vnesite ime skupine</string>
<string name="exportSuccessful">Izvoženi podatki o karticah</string>
<string name="importSuccessful">Uvoženi podatki o karticah</string>
<string name="exportSuccessful">Podatkovna baza izvožena</string>
<string name="importSuccessful">Podatkovna baza uvožena</string>
<string name="intent_import_card_from_url_share_text">Z vami želim deliti kartico</string>
<string name="settings_disable_lockscreen_while_viewing_card">Preprečitev zaklepanja zaslona</string>
<string name="settings_disable_lockscreen_while_viewing_card">Prepreči zaklepanje zaslona</string>
<string name="settings_keep_screen_on">Ohranite zaslon vklopljen</string>
<string name="enterBarcodeInstructions">Vnesite ID kartice in spodaj izberite vrsto črtne kode ali \"Ta kartica nima črtne kode\".</string>
<string name="enterBarcodeInstructions">Vnesite ID kartice in spodaj izberite vrsto črtne kode ali izbiro \"Ta kartica nima črtne kode\".</string>
<string name="settings_max_font_size_scale">Največja velikost pisave</string>
<string name="settings_dark_theme">Temno</string>
<string name="settings_light_theme">Svetlo</string>
<string name="settings_system_theme">Sistem</string>
<string name="settings_theme">Tema</string>
<string name="starImage">Zvezdica za priljubljene</string>
<string name="app_copyright_old">Na podlagi aplikacije Loyalty Card Keychain copyright © 2016-2020 Branden Archer.</string>
<string name="app_copyright_old">Bazira na podlagi aplikacije Loyalty Card Keychain
\ncopyright © 2016-2020 Branden Archer</string>
<string name="exportOptionExplanation">Podatki bodo zapisani na izbrano mesto.</string>
<string name="failedParsingImportUriError">Ni bilo mogoče razčleniti URI uvoza</string>
<string name="card_ids_copied">Kopirana kartica ID(s)</string>
<string name="card_ids_copied">Kopirana ID številka kartice</string>
<string name="share">Delite</string>
<string name="unstar">Odstrani iz priljubljenih</string>
<string name="star">Dodaj med priljubljene</string>
<string name="noBarcode">Brez črtne kode</string>
<string name="barcodeNoBarcode">Ta kartica nima črtne kode</string>
<string name="barcodeNoBarcode">Ni črtne kode</string>
<string name="barcodeType">Vrsta črtne kode</string>
<string name="noMatchingGiftCards">Ničesar nisem našel. Poskusite spremeniti iskanje.</string>
<string name="noMatchingGiftCards">Brez rezultata iskanja. Poskusite spremeniti iskalni niz.</string>
<string name="action_search">Iskanje</string>
<string name="exportPasswordHint">Vnesite geslo</string>
<string name="exportPassword">Izberite geslo za zaščito izvoza (neobvezno)</string>
@@ -105,10 +105,10 @@
<string name="settings_theme_color">Barva teme</string>
<string name="settings_system_locale">Sistem</string>
<string name="settings_locale">Jezik</string>
<string name="barcodeImageDescriptionWithType">Slika črtne kode tipa <xliff:g>%s</xliff:g></string>
<string name="swipeToSwitchImages">Povlecite ali dolgo pritisnite da zamenjate slike</string>
<string name="barcodeImageDescriptionWithType">Slika <xliff:g>%s</xliff:g> črtna koda</string>
<string name="swipeToSwitchImages">Povlecite za zamenjavo slike ali dolgo pritisnite, da odprete sliko v aplikaciji za gledanje slik</string>
<string name="sort_by">Razvrsti po</string>
<string name="reverse">Obratno</string>
<string name="reverse">...v obratnem vrstnem redu</string>
<string name="sort_by_balance">Stanje</string>
<string name="sort_by_expiry">Potek</string>
<string name="sort_by_most_recently_used">Nazadnje uporabljene</string>
@@ -127,7 +127,7 @@
<string name="errorReadingImage">Slike ni bilo mogoče prebrati</string>
<string name="noBarcodeFound">Črtna koda ni bila najdena</string>
<string name="balanceSentence">Stanje: <xliff:g>%s</xliff:g></string>
<string name="chooseImportType">Uvoz iz?</string>
<string name="chooseImportType">Uvozi podatke iz</string>
<string name="importCatima">Izvoz iz aplikacije Catima</string>
<string name="importStocard">Izvoz iz aplikacije Stocard</string>
<string name="importVoucherVault">Izvoz iz aplikacije Voucher Vault</string>
@@ -138,23 +138,142 @@
<string name="accept">Sprejmi</string>
<string name="importLoyaltyCardKeychain">Uvoz iz aplikacije Loyalty Card Keychain</string>
<string name="barcodeId">Vsebina črtne kode</string>
<string name="sameAsCardId">Enaka kot številka kartice</string>
<string name="sameAsCardId">Enaka kot ID kartice</string>
<string name="setBarcodeId">Nastavi vsebino črtne kode</string>
<string name="wrongValueForBarcodeType">Ta vrednost ni veljavna pri izbranem tipu čtne kode</string>
<string name="takePhoto">Naredi fotografijo</string>
<string name="intent_import_card_from_url_share_multiple_text">Z vami želim deliti kartice zvestobe</string>
<string name="copy_to_clipboard_multiple_toast">Številke kartic kopirane v odložišče</string>
<string name="copy_to_clipboard_multiple_toast">ID številke kartic so kopirane v odložišče</string>
<string name="importFidme">Uvoz iz aplikacije FidMe</string>
<string name="no">Ne</string>
<string name="yes">Da</string>
<string name="frontImageDescription">Slika sprednje strani</string>
<string name="backImageDescription">Slika zadnje strani</string>
<string name="frontImageDescription">Prednja stran</string>
<string name="backImageDescription">Zadnja stran</string>
<string name="parsingBalanceFailed"><xliff:g>%s</xliff:g> ni veljavno stanje.</string>
<string name="setBackImage">Nastavi sliko sprednje strani</string>
<string name="setFrontImage">Nastavi sliko sprednje strani</string>
<string name="photos">Fotografije</string>
<string name="updateBarcodeQuestionText">Spremenili ste številko kartice. Želite posodobiti tudi črtno kodo na enako vrednost?</string>
<string name="updateBarcodeQuestionText">Spremenili ste ID kartice. Želite posodobiti tudi črtno kodo na enako vrednost\?</string>
<string name="updateBarcodeQuestionTitle">Posodobi črtno kodo?</string>
<string name="removeImage">Odstrani sliko</string>
<string name="unsupportedBarcodeType">Te vrste črtne kode aplikacija ne more prikazati. Morda bo to možno v prihodnosti.</string>
<string name="shortcutSelectCard">Izberite kartico</string>
<string name="starred">Priljubljene</string>
<string name="set_scale">Nastavi velikost</string>
<string name="include_if_asking_support">Ob zahtevani pomoči podpore je potrebno vključiti naslednje informacije:</string>
<plurals name="balancePoints">
<item quantity="one"><xliff:g>%s</xliff:g> točka</item>
<item quantity="two"><xliff:g>%s</xliff:g> točki</item>
<item quantity="few"><xliff:g>%s</xliff:g> točke</item>
<item quantity="other"><xliff:g>%s</xliff:g> točk</item>
</plurals>
<string name="barcode">Črtna koda</string>
<string name="editBarcode">Uredi črtno kodo</string>
<string name="group_edit">Uredi skupino</string>
<string name="never">Nikoli</string>
<string name="importCards">Uvozite kartice</string>
<string name="currentBalanceSentence">Trenutno stanje: <xliff:g>%s</xliff:g></string>
<string name="newBalanceSentence">Novo stanje: <xliff:g>%s</xliff:g></string>
<string name="app_loyalty_card_keychain">Loyalty Card Keychain</string>
<plurals name="selectedCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> izbrana</item>
<item quantity="two"><xliff:g>%d</xliff:g> izbrani</item>
<item quantity="few"><xliff:g>%d</xliff:g> izbrane</item>
<item quantity="other"><xliff:g>%d</xliff:g> izbranih</item>
</plurals>
<string name="settings_card_orientation">Orientacija črtne kode</string>
<string name="settings_follow_system_orientation">Sledi sistemu</string>
<string name="settings_portrait_orientation">Podoba</string>
<string name="settings_landscape_orientation">Pokrajina</string>
<string name="settings_lock_on_opening_orientation">Ohrani usmerjenost uporabljeno pri odpiranju kartice</string>
<string name="setIcon">Nastavite ikono</string>
<string name="showMoreInfo">Prikaži informacije</string>
<string name="hideMoreInfo">Skrij informacije</string>
<string name="updateBalance">Posodobi stanje</string>
<string name="failedToRetrieveImageFile">Slikovne datoteke ni bilo mogoče pridobiti</string>
<string name="credits">Zasluge</string>
<string name="action_show_details">Prikaži podrobnosti</string>
<string name="translate_platform">na Weblate-u</string>
<string name="options">Možnosti</string>
<string name="duplicateCard">Podvoji</string>
<string name="archive">Arhiviraj</string>
<string name="unarchive">Odpakiraj arhiv</string>
<string name="archived">Karta arhivirana</string>
<string name="unarchived">Kartica ni arhivirana</string>
<string name="archiveList">Arhiv</string>
<string name="noUnarchivedCardsMessage">Ne obstajajo ne arhivirane kartice</string>
<string name="failedLaunchingPhotoPicker">Ni mogoče najti podprte aplikacije za gledanje slik</string>
<string name="previousCard">Prejšnje</string>
<string name="nextCard">Naslednje</string>
<string name="updateBalanceTitle">Koliko ste porabili\?</string>
<string name="updateBalanceHint">Vpišite vrednost</string>
<string name="group_name_already_in_use">Ime skupine je že uporabljeno</string>
<string name="group_name_is_empty">Ime skupine ne more biti prazno polje</string>
<string name="group_updated">Skupina posodobljena</string>
<string name="groupsList">Skupine: <xliff:g>%s</xliff:g></string>
<string name="app_libraries">Proste knjižnice tretjih oseb: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="app_resources">Prosti viri tretjih oseb: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="expiryStateSentence">Poteče: <xliff:g>%s</xliff:g></string>
<string name="expiryStateSentenceExpired">Poteklo: <xliff:g>%s</xliff:g></string>
<string name="expiryDate">Datum poteka veljavnosti</string>
<string name="chooseExpiryDate">Izberi datum poteka veljavnosti</string>
<string name="moveBarcodeToTopOfScreen">Premakni črtno kodo na vrh zaslona</string>
<string name="moveBarcodeToCenterOfScreen">Postavi črtno kodo na sredino zaslona</string>
<string name="importCatimaMessage">Izberi svoj obstoječ Catima <i>catima.zip</i> izvoz podatkov za uvoz v aplikacijo.
\nNajprej izvozi podatke v meniju \"Uvozi/Izvozi\" v drugi aplikaciji Catima s pritiskom na izbiro izvozi.</string>
<string name="importStocardMessage">Izberi svoj <i>***-sync.zip</i> Stocard izvoz podatkov za uvoz.
\nIzvoz podatkov dobiš s pošiljanjem elektronske pošte na support@stocardapp.com, kjer povprašaš za izvoz svojih podatkov.</string>
<string name="importVoucherVaultMessage">Izberi svoj <i>vouchervault.json</i> Voucher Vault izvoz podatkov za uvoz.
\nIzvoz podatkov dobiš s pritiskom na gumb \"Export\" v Voucher Vault first.</string>
<string name="failedToOpenUrl">Prvo namestite spletni brskalnik</string>
<string name="welcome">Pozdravljeni v Catimi</string>
<string name="noGiftCardsGroup">Kreiraj kartice in jim dodeli skupino tukaj.</string>
<string name="privacy_policy_popup_text">Obvestilo o politiki zasebnosti (nekatere trgovine aplikacij to zahtevajo):
\n
\nPODATKI SE NE ZBIRAJO, kar se lahko preveri v programski kodi, saj je aplikacija prosta programska oprema.</string>
<plurals name="deleteCardsTitle">
<item quantity="one">Izbriši <xliff:g>%d</xliff:g> kartico zvestobe</item>
<item quantity="two">Izbriši <xliff:g>%d</xliff:g> kartici zvestobe</item>
<item quantity="few">Izbriši <xliff:g>%d</xliff:g> kartice zvestobe</item>
<item quantity="other">Izbriši <xliff:g>%d</xliff:g> kartic zvestobe</item>
</plurals>
<plurals name="deleteCardsConfirmation">
<item quantity="one">Izbriši to <xliff:g>%d</xliff:g> kartico zvestobe dokončno\?</item>
<item quantity="two">Izbriši ti dve <xliff:g>%d</xliff:g> kartici zvestobe dokončno\?</item>
<item quantity="few">Izbriši te <xliff:g>%d</xliff:g> kartice zvestobe dokončno\?</item>
<item quantity="other">Izbriši teh <xliff:g>%d</xliff:g> kartic zvestobe dokončno\?</item>
</plurals>
<string name="cameraPermissionDeniedTitle">Ni bilo mogoče dostopati do kamere</string>
<string name="noCameraPermissionDirectToSystemSetting">Catima potrebuje dostop do vaše kamere za skeniranje črtnih kod. Pritisnite tukaj in spremenite nastavitve dovoljenj.</string>
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Copyright © 2019<xliff:g>%d</xliff:g> Sylvia van Os</string>
<plurals name="groupCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> kartica</item>
<item quantity="two"><xliff:g>%d</xliff:g> kartici</item>
<item quantity="few"><xliff:g>%d</xliff:g> kartice</item>
<item quantity="other"><xliff:g>%d</xliff:g> kartic</item>
</plurals>
<string name="editGroup">Urejanje skupine: <xliff:g>%s</xliff:g></string>
<string name="importFidmeMessage">Izberi svoj <i>fidme-export-request-xxxxxx.zip</i> FidMe izvoz podatkov za uvoz in naknadno ročno izberi tipe črtnih kod.
\nFidMe izvoz podatkov naredi v svojem FidMe profilu z izbiro \"Data Protection\" in nato s pritiskom na gumb \"Extract my data first\".</string>
<string name="importLoyaltyCardKeychainMessage">Izberi svoj <i>LoyaltyCardKeychain.csv</i> Loyalty Card Keychain izvoz podatkov za uvoz.
\nLoyalty Card Keychain izvoz podatkov naredi s pritiskom na gumb \"Import/Export\" v meniju s pritiskom najprej na gumb \"Export\".</string>
<string name="failedGeneratingShareURL">URL-ja za skupno rabo ni bilo mogoče ustvariti. Prosim prijavite napako.</string>
<string name="settings_oled_dark">Čisto črno ozadje za temno temo</string>
<string name="selectColor">Izberite barvo</string>
<string name="settings_catima_theme">Catima</string>
<string name="app_contributors">Omogočeno od: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="barcodeLongPressMessage">V aplikaciji za gledanje slik lahko odpremo samo slike</string>
<string name="action_hide_details">Skrij podrobnosti</string>
<plurals name="groupCardCountWithArchived">
<item quantity="one"><xliff:g>%1$d</xliff:g> kartica (<xliff:g id="archivedCount">%2$d</xliff:g> arhivirana)</item>
<item quantity="two"><xliff:g>%1$d</xliff:g> kartici (<xliff:g id="archivedCount">%2$d</xliff:g> arhivirani)</item>
<item quantity="few"><xliff:g>%1$d</xliff:g> kartice (<xliff:g id="archivedCount">%2$d</xliff:g> arhivirane)</item>
<item quantity="other"><xliff:g>%1$d</xliff:g> kartic (<xliff:g id="archivedCount">%2$d</xliff:g> arhiviranih)</item>
</plurals>
<plurals name="viewArchivedCardsWithCount">
<item quantity="one">Poglej arhiv (<xliff:g>%1$d</xliff:g> kartice)</item>
<item quantity="two">Poglej arhiv (<xliff:g>%1$d</xliff:g> kartic)</item>
<item quantity="few">Poglej arhiv (<xliff:g>%1$d</xliff:g> kartic)</item>
<item quantity="other">Poglej arhiv (<xliff:g>%1$d</xliff:g> kartic)</item>
</plurals>
</resources>

View File

@@ -171,7 +171,6 @@
<string name="note">Anteckning</string>
<string name="settings_system_locale">System</string>
<string name="settings_locale">Språk</string>
<string name="noExternalStoragePermissionError">Bevilja tillstånd för extern lagring för att kunna importera eller exportera data</string>
<string name="app_contributors">Möjliggjordes av: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="settings_brown_theme">Brunt</string>
<string name="settings_grey_theme">Grått</string>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
<string name="swipeToSwitchImages">Resimler arasında geçiş yapmak için kaydırın veya uzun basın</string>
<string name="swipeToSwitchImages">Resimler arasında geçiş yapmak için kaydırın, resmi galeri uygulamasında açmak için basılı tutun</string>
<string name="app_contributors">Katkıda bulunanlar: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="settings_brown_theme">Kahverengi</string>
<string name="settings_grey_theme">Gri</string>
@@ -128,7 +128,6 @@
<string name="importOptionFilesystemExplanation">Dosya sisteminden belirli bir dosya seçin.</string>
<string name="importOptionFilesystemTitle">Dosya sisteminden içe aktar</string>
<string name="exportOptionExplanation">Veriler seçtiğiniz bir konuma yazılacak.</string>
<string name="noExternalStoragePermissionError">Verileri içeri veya dışarı aktarmak için harici depolama izni verin</string>
<string name="exporting">Dışa aktarılıyor…</string>
<string name="importing">İçe aktarılıyor…</string>
<string name="exportFailed">Dışa aktarma gerçekleştirilemedi</string>
@@ -179,7 +178,7 @@
<string name="note">Not</string>
<string name="storeName">Ad</string>
<string name="noMatchingGiftCards">Sonuç yok. Aramanızı değiştirmeyi deneyin.</string>
<string name="noGiftCards">Bir kart eklemek için + artı düğmesine tıklayın veya ⋮ menüsünden birkaçını içe aktarın.</string>
<string name="noGiftCards">Bir kart eklemek için + artı düğmesine tıklayın veya ⋮ menüsünden içe aktarın.</string>
<plurals name="selectedCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> seçildi</item>
<item quantity="other"><xliff:g>%d</xliff:g> seçildi</item>
@@ -253,4 +252,16 @@
<item quantity="other">Arşivi görüntüle (<xliff:g>%1$d</xliff:g> kart)</item>
</plurals>
<string name="welcome">Catima\'ya Hoş Geldiniz</string>
<string name="failedToRetrieveImageFile">Resim dosyası alınamadı</string>
<string name="barcodeLongPressMessage">Galeri uygulamasında yalnızca resimler açılabilir</string>
<string name="noCameraPermissionDirectToSystemSetting">Barkodları taramak için Catima\'nın kameranıza erişmesi gerekecektir. İzin ayarlarınızı değiştirmek için buraya dokunun.</string>
<string name="currentBalanceSentence">Geçerli bakiye: <xliff:g>%s</xliff:g></string>
<string name="updateBalanceHint">Miktarı girin</string>
<string name="updateBalanceTitle">Ne kadar harcadınız\?</string>
<string name="newBalanceSentence">Yeni bakiye: <xliff:g>%s</xliff:g></string>
<string name="cameraPermissionDeniedTitle">Kameraya erişilemedi</string>
<string name="updateBalance">Bakiyeyi güncelle</string>
<string name="importCards">Kartları içe aktar</string>
<string name="storageReadPermissionRequired">Bu eylem için depolama alanını okuma izni gerekiyor…</string>
<string name="cameraPermissionRequired">Bu eylem için kameraya erişim izni gerekiyor…</string>
</resources>

View File

@@ -2,8 +2,8 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
<string name="privacy_policy_popup_text">Політика конфіденційності (вимагається деякими магазинами):
\n
\nЖОДНОЇ ІНФОРМАЦІЇ НЕ ЗБИРАЄТЬСЯ, що може підтвердити будь-хто, адже наша програма це вільне програмне забезпечення.</string>
<string name="noGiftCards">Натисніть + щоб додати карту чи імпортуйте з ⋮ меню.</string>
\nЖОДНОЇ ІНФОРМАЦІЇ НЕ ЗБИРАЄТЬСЯ, що може підтвердити будь-хто, адже наш застосунок це вільне програмне забезпечення.</string>
<string name="noGiftCards">Натисніть кнопку +, щоб додати картку, або ⋮ для імпорту з меню.</string>
<string name="settings_display_barcode_max_brightness">Яскравіший штрих-код</string>
<string name="enterBarcodeInstructions">Введіть ID та оберіть тип штрих-коду чи \"Не має штрих-коду\".</string>
<string name="selectBarcodeTitle">Оберіть штрих-код</string>
@@ -22,7 +22,7 @@
<string name="updateBarcodeQuestionText">Ви змінили ID. Чи ви бажаєте оновити штрих-код для використання цього ж значення\?</string>
<string name="updateBarcodeQuestionTitle">Оновити значення штрих-коду\?</string>
<string name="wrongValueForBarcodeType">Значення не дійсне для обраного типу штрих-коду</string>
<string name="unsupportedBarcodeType">Цей тип штрих-коду поки що не відображається. Підтримку може бути додано в подальших версіях програми.</string>
<string name="unsupportedBarcodeType">Цей тип штрих-коду поки що не відображається. Підтримку може бути додано в подальших версіях застосунку.</string>
<string name="setBarcodeId">Встановіть значення штрих-коду</string>
<string name="sameAsCardId">Таке ж як ID</string>
<string name="barcodeId">Значення штрих-коду</string>
@@ -99,14 +99,13 @@
\nавторські права © 20162020 Branden Archer</string>
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Авторські права © 2019<xliff:g>%d</xliff:g> Sylvia van Os</string>
<string name="about">Про програму</string>
<string name="importOptionApplicationButton">Вибір програми</string>
<string name="importOptionApplicationExplanation">Використайте іншу програму чи ваш улюблений файл-менеджер для відкриття файлу.</string>
<string name="importOptionApplicationTitle">З іншої програми</string>
<string name="importOptionApplicationButton">Використовувати інший застосунок</string>
<string name="importOptionApplicationExplanation">Використайте інший застосунок чи ваш улюблений файл-менеджер для відкриття файлу.</string>
<string name="importOptionApplicationTitle">З іншого застосунку</string>
<string name="importOptionFilesystemButton">Обрати файл</string>
<string name="importOptionFilesystemExplanation">Оберіть файл у провіднику.</string>
<string name="importOptionFilesystemTitle">Імпорт з файлу</string>
<string name="exportOptionExplanation">Дані буде записано до локації обраної вами.</string>
<string name="noExternalStoragePermissionError">Надайте дозвіл на доступ до пам\'яті пристрою для імпорту/експорту даних</string>
<string name="exporting">Експортуємо…</string>
<string name="importing">Імпортуємо…</string>
<string name="exportFailed">Неможливо здійснити експорт</string>
@@ -160,7 +159,7 @@
<string name="importStocard">Імпорт із Stocard</string>
<plurals name="selectedCardCount">
<item quantity="one">Обрано: <xliff:g>%d</xliff:g></item>
<item quantity="few">Обрано: <xliff:g>%d</xliff:g></item>
<item quantity="few">Обрані: <xliff:g>%d</xliff:g></item>
<item quantity="many">Обрано: <xliff:g>%d</xliff:g></item>
<item quantity="other">Обрано: <xliff:g>%d</xliff:g></item>
</plurals>
@@ -193,7 +192,7 @@
<string name="app_contributors">Стало можливим завдяки: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="noGroupCards">Пуста група</string>
<string name="barcodeImageDescriptionWithType">Зображення штрих-коду <xliff:g>%s</xliff:g></string>
<string name="swipeToSwitchImages">Свайп чи довге натискання для зміни зображень</string>
<string name="swipeToSwitchImages">Свайп для зміни зображень, довге натискання для перегляду в галереї</string>
<string name="sort_by">Сортувати за</string>
<string name="reverse">у зворотному порядку</string>
<string name="sort_by_balance">Баланс</string>
@@ -202,13 +201,13 @@
<string name="sort_by_name">Назва</string>
<string name="sort">Сортувати</string>
<string name="version_history">Історія версій</string>
<string name="help_translate_this_app">Допомогти з перекладом програми</string>
<string name="help_translate_this_app">Допомогти з перекладом застосунку</string>
<string name="license">Ліцензія</string>
<string name="source_repository">Початковий код</string>
<string name="on_github">на GitHub</string>
<string name="and_data_usage">та використання даних</string>
<string name="credits">Подяки</string>
<string name="rate_this_app">Оцінити програму</string>
<string name="rate_this_app">Оцінити застосунок</string>
<string name="on_google_play">у Google Play</string>
<string name="report_error">Повідомити про помилку</string>
<string name="exportPassword">Встановіть пароль для захисту експорту (необов\'язково)</string>
@@ -256,15 +255,27 @@
<item quantity="many"><xliff:g>%1$d</xliff:g> карт (<xliff:g id="archivedCount">%2$d</xliff:g> заархівовано)</item>
<item quantity="other"><xliff:g>%1$d</xliff:g> карт (<xliff:g id="archivedCount">%2$d</xliff:g> заархівовано)</item>
</plurals>
<string name="failedLaunchingPhotoPicker">Підтримувану програму галереї не знайдено</string>
<string name="failedLaunchingPhotoPicker">Підтримуваний застосунок галереї не знайдено</string>
<string name="previousCard">Попередня</string>
<string name="nextCard">Наступна</string>
<plurals name="viewArchivedCardsWithCount">
<item quantity="one">Переглянути архів (<xliff:g>%1$d</xliff:g> картка)</item>
<item quantity="few">Переглянути архів (<xliff:g>%1$d</xliff:g> картки)</item>
<item quantity="many">Переглянути архів (<xliff:g>%1$d</xliff:g> картки)</item>
<item quantity="other">Переглянути архів (<xliff:g>%1$d</xliff:g> картки)</item>
<item quantity="many">Переглянути архів (<xliff:g>%1$d</xliff:g> карток)</item>
<item quantity="other">Переглянути архів (<xliff:g>%1$d</xliff:g> карток)</item>
</plurals>
<string name="failedToOpenUrl">Спочатку встановіть браузер</string>
<string name="welcome">Ласкаво просимо до Катіма</string>
<string name="welcome">Ласкаво просимо до Catima</string>
<string name="failedToRetrieveImageFile">Збій доступу до файлу зображення</string>
<string name="barcodeLongPressMessage">Галерея може відкривати лише зображення</string>
<string name="importCards">Імпорт карток</string>
<string name="updateBalanceTitle">Скільки витратили\?</string>
<string name="updateBalanceHint">Введіть суму</string>
<string name="currentBalanceSentence">Поточний баланс: <xliff:g>%s</xliff:g></string>
<string name="newBalanceSentence">Новий баланс: <xliff:g>%s</xliff:g></string>
<string name="cameraPermissionDeniedTitle">Не вдалося отримати доступ до камери</string>
<string name="noCameraPermissionDirectToSystemSetting">Для сканування штрих-кодів програмі Catima потрібен доступ до вашої камери. Натисніть тут, щоб змінити дозволи.</string>
<string name="updateBalance">Оновити баланс</string>
<string name="storageReadPermissionRequired">Дозвіл на читання сховища, необхідний для цієї дії…</string>
<string name="cameraPermissionRequired">Дозвіл на доступ до камери, необхідний для цієї дії…</string>
</resources>

View File

@@ -40,7 +40,7 @@
\n
\n本应用没有收集任何数据任何人都可以查阅源码来确认因为本软件是自由软件。</string>
<string name="privacy_policy">隐私政策</string>
<string name="app_loyalty_card_keychain">Loyalty Card Keychain</string>
<string name="app_loyalty_card_keychain">会员卡卡包</string>
<string name="chooseImportType">数据导入源</string>
<string name="parsingBalanceFailed"><xliff:g>%s</xliff:g>似乎不是有效的余额。</string>
<string name="points">积分</string>
@@ -94,7 +94,8 @@
<string name="importOptionFilesystemExplanation">请从文件系统选择文件.</string>
<string name="importOptionFilesystemTitle">从文件系统导入</string>
<string name="exportOptionExplanation">导出的数据将储存至你选择的位置.</string>
<string name="noExternalStoragePermissionError">在导入导出前需要获得外部储存权限</string>
<string name="cameraPermissionDeniedTitle">无法访问相机</string>
<string name="noCameraPermissionDirectToSystemSetting">Catima需要访问您的相机来扫描条形码. 轻触这里以更改您的权限设置。</string>
<string name="exporting">导出中…</string>
<string name="importing">导入中…</string>
<string name="exportFailed">无法导出卡片</string>
@@ -133,7 +134,7 @@
<string name="note">备注</string>
<string name="storeName">名称</string>
<string name="noMatchingGiftCards">没有结果。尝试改变你的搜索。</string>
<string name="noGiftCards">点击 \"+\"加号按钮来添加卡片,或者从⋮ 菜单导入一些</string>
<string name="noGiftCards">点击 \"+\"加号按钮来添加卡片,或者从⋮ 菜单导入。</string>
<string name="action_add">添加</string>
<string name="action_search">搜索</string>
<string name="deleteConfirmation">删除此卡?</string>
@@ -199,7 +200,7 @@
<string name="sort_by_name">名称</string>
<string name="help_translate_this_app">帮助翻译此应用</string>
<string name="sort_by_balance">余额</string>
<string name="swipeToSwitchImages">滑动或长按来切换图片</string>
<string name="swipeToSwitchImages">滑动切换图片,按住打开图库应用中的图片</string>
<string name="reverse">倒序</string>
<string name="sort_by">排序方式</string>
<string name="selectColor">选择颜色</string>
@@ -243,4 +244,15 @@
<string name="noUnarchivedCardsMessage">没有未归档卡</string>
<string name="failedToOpenUrl">先安装一个浏览器</string>
<string name="welcome">欢迎使用Catima</string>
<string name="updateBalanceHint">输入金额</string>
<string name="importCards">导入卡</string>
<plurals name="viewArchivedCardsWithCount">
<item quantity="other">查看存档(<xliff:g>%1$d</xliff:g> 张卡片)</item>
</plurals>
<string name="updateBalance">更新余额</string>
<string name="updateBalanceTitle">你花了多少钱?</string>
<string name="currentBalanceSentence">当前余额:<xliff:g>%s</xliff:g></string>
<string name="failedToRetrieveImageFile">无法检索图像文件</string>
<string name="newBalanceSentence">新余额:<xliff:g>%s</xliff:g></string>
<string name="barcodeLongPressMessage">只能在图库应用程序中打开图像</string>
</resources>

View File

@@ -161,7 +161,6 @@
<string name="scanCardBarcode">掃描條碼</string>
<string name="noStoreError">尚未輸入卡片名稱</string>
<string name="importExportHelp">備份您的資料以將其轉移至其他裝置中。</string>
<string name="noExternalStoragePermissionError">在匯入及匯出資料前,請先允許外部儲存裝置存取權限</string>
<string name="importOptionFilesystemTitle">自檔案系統中匯入</string>
<string name="importOptionFilesystemExplanation">自檔案系統中選取檔案。</string>
<string name="importOptionFilesystemButton">自檔案系統</string>
@@ -224,4 +223,28 @@
<string name="set_scale">設定大小</string>
<string name="include_if_asking_support">如果您想請求協助,請附上以下訊息:</string>
<string name="settings_card_orientation">條碼方向</string>
<string name="failedToRetrieveImageFile">無法擷取圖片檔案</string>
<string name="barcodeLongPressMessage">圖庫應用程式僅可開啟圖片</string>
<string name="duplicateCard">重複</string>
<string name="archive">封存</string>
<string name="unarchive">解除封存</string>
<string name="archived">卡片已封存</string>
<string name="unarchived">卡片已解除封存</string>
<plurals name="groupCardCountWithArchived">
<item quantity="other"><xliff:g>%1$d</xliff:g> 張卡片 (<xliff:g id="archivedCount">%2$d</xliff:g> 張已封存)</item>
</plurals>
<string name="settings_portrait_orientation">直向</string>
<string name="settings_follow_system_orientation">跟隨系統</string>
<string name="settings_landscape_orientation">橫向</string>
<string name="failedToOpenUrl">先安裝網頁瀏覽器</string>
<string name="archiveList">封存</string>
<string name="failedLaunchingPhotoPicker">無法找到支援的圖庫應用程式</string>
<string name="previousCard">上一張</string>
<string name="noUnarchivedCardsMessage">沒有已封存的卡片</string>
<string name="nextCard">下一張</string>
<string name="welcome">歡迎使用 Catima</string>
<plurals name="viewArchivedCardsWithCount">
<item quantity="other">檢視封存 (<xliff:g>%1$d</xliff:g> 張卡片)</item>
</plurals>
<string name="settings_lock_on_opening_orientation">開啟卡片時鎖定的方向</string>
</resources>

View File

@@ -32,7 +32,10 @@
<dimen name="activity_margin_small">8dp</dimen>
<dimen name="activity_margin">16dp</dimen>
<!-- Padding for layouts-->
<dimen name="activity_scanner_padding">10dp</dimen>
<dimen name="alert_dialog_content_padding">@dimen/mtrl_alert_dialog_picker_background_inset</dimen>
<dimen name="alert_dialog_title_padding">8dp</dimen>
<!-- The default letter tile text size -->
<dimen name="tileLetterFontSize">66sp</dimen>
<dimen name="tileLetterFontSizeForShortcut">48dp</dimen>

View File

@@ -62,6 +62,7 @@
<item />
<item>ar</item>
<item>bg</item>
<item>bn</item>
<item>bn-rIN</item>
<item>bs</item>
<item>cs</item>
@@ -76,8 +77,11 @@
<item>fi</item>
<item>fr</item>
<item>he-rIL</item>
<item>hi</item>
<item>hr</item>
<item>hu</item>
<item>in-rID</item>
<item>is</item>
<item>it</item>
<item>ja</item>
<item>ko</item>

View File

@@ -6,7 +6,7 @@
<item quantity="one"><xliff:g>%d</xliff:g> selected</item>
<item quantity="other"><xliff:g>%d</xliff:g> selected</item>
</plurals>
<string name="noGiftCards">Click the + plus button to add a card, or import some from the ⋮ menu.</string>
<string name="noGiftCards">Click the + plus button to add a card, or import from the ⋮ menu.</string>
<string name="noGiftCardsGroup">Create some cards, and then assign them to the group here.</string>
<string name="noMatchingGiftCards">No results. Try changing your search.</string>
<string name="storeName">Name</string>
@@ -65,7 +65,10 @@
<string name="exportFailed">Could not perform export</string>
<string name="importing">Importing…</string>
<string name="exporting">Exporting…</string>
<string name="noExternalStoragePermissionError">Grant external storage permission to import or export data</string>
<string name="storageReadPermissionRequired">Permission to read storage needed for this action…</string>
<string name="cameraPermissionRequired">Permission to access camera needed for this action…</string>
<string name="cameraPermissionDeniedTitle">Could not access the camera</string>
<string name="noCameraPermissionDirectToSystemSetting">To scan barcodes, Catima will need access to your camera. Tap here to change your permission settings.</string>
<string name="exportOptionExplanation">The data will be written to a location of your choice.</string>
<string name="importOptionFilesystemTitle">Import from filesystem</string>
<string name="importOptionFilesystemExplanation">Choose a specific file from the filesystem.</string>
@@ -250,6 +253,7 @@
<string name="sort">Sort</string>
<string name="showMoreInfo">Show info</string>
<string name="hideMoreInfo">Hide info</string>
<string name="updateBalance">Update balance</string>
<string name="swipeToSwitchImages">Swipe to switch images, hold to open image in the gallery app</string>
<string name="failedToRetrieveImageFile">Failed to retrieve image file</string>
<string name="barcodeLongPressMessage">Only images can be opened in the gallery app</string>
@@ -300,4 +304,9 @@
<item quantity="other">View archive (<xliff:g>%1$d</xliff:g> cards)</item>
</plurals>
<string name="welcome">Welcome to Catima</string>
<string name="importCards">Import cards</string>
<string name="updateBalanceTitle">How much did you spend?</string>
<string name="updateBalanceHint">Enter amount</string>
<string name="currentBalanceSentence">Current balance: <xliff:g>%s</xliff:g></string>
<string name="newBalanceSentence">New balance: <xliff:g>%s</xliff:g></string>
</resources>

View File

@@ -504,4 +504,30 @@ public class DatabaseTest {
assertEquals(0, card2.lastUsed);
assertEquals(100, card2.zoomLevel);
}
@Test
public void updateGiftCardOnlyBalance() {
long id = DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, new BigDecimal("100"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0, null,0);
boolean result = (id != -1);
assertTrue(result);
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
result = DBHelper.updateLoyaltyCardBalance(mDatabase, 1, new BigDecimal(60));
assertTrue(result);
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
LoyaltyCard loyaltyCard = DBHelper.getLoyaltyCard(mDatabase, 1);
assertNotNull(loyaltyCard);
assertEquals("store", loyaltyCard.store);
assertEquals("note", loyaltyCard.note);
assertEquals(null, loyaltyCard.expiry);
assertEquals(new BigDecimal(60), loyaltyCard.balance);
assertEquals(null, loyaltyCard.balanceType);
assertEquals("cardId", loyaltyCard.cardId);
assertEquals(null, loyaltyCard.barcodeId);
assertEquals(BarcodeFormat.UPC_A, loyaltyCard.barcodeType.format());
assertEquals(DEFAULT_HEADER_COLOR, loyaltyCard.headerColor);
assertEquals(0, loyaltyCard.starStatus);
assertEquals(0, loyaltyCard.archiveStatus);
}
}

View File

@@ -1,29 +1,11 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
mavenCentral()
maven { url "https://jitpack.io" }
gradlePluginPortal()
}
dependencies {
classpath 'com.android.tools.build:gradle:7.0.4'
classpath 'gradle.plugin.com.github.spotbugs.snom:spotbugs-gradle-plugin:4.7.5'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
plugins {
id 'com.android.application' version '7.0.4' apply false
id 'com.github.spotbugs' version "4.7.5" apply false
}
allprojects {
repositories {
google()
mavenCentral()
maven { url "https://jitpack.io" }
gradlePluginPortal()
}
tasks.withType(JavaCompile) {
options.compilerArgs << "-Xlint:deprecation"
}

51
build.sh Executable file
View File

@@ -0,0 +1,51 @@
#!/bin/bash
set -euo pipefail
IFS=$'\n\t'
### build.sh
### Builds Catima the same way F-Droid does for reproducible builds
if [ -z "${ANDROID_SDK_ROOT:-}" ]; then
echo "ANDROID_SDK_ROOT is not set, setting to $HOME/Android/Sdk";
export ANDROID_SDK_ROOT=$HOME/Android/Sdk
fi
if [ -z "${JAVA_HOME:-}" ]; then
echo "JAVA_HOME is not set, setting to Java 11 (like F-Droid)"
if [ -f "/etc/debian_version" ]; then
echo "Debian-based distro, Java 11 is /usr/lib/jvm/java-11-openjdk-amd64"
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
else
echo "Not Debian-based, assuming Fedora and setting Java 11 as /usr/lib/jvm/java-11-openjdk"
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk
fi
fi
echo "Starting build"
./gradlew clean assembleRelease
echo "Build finished (unsigned)"
echo "Your build is at app/build/outputs/apk/release/app-release-unsigned.apk"
if [ -z "${KEYSTORE:-}" ]; then
echo "KEYSTORE not set, skipping signing..."
else
if [ -z "${KEYSTORE_ALIAS:-}" ]; then
echo "KEYSTORE_ALIAS is not set, setting to catima"
KEYSTORE_ALIAS=catima
fi
apksigner_version="$(ls -1 "$HOME/Android/Sdk/build-tools/" | tail -n 1)"
cp app/build/outputs/apk/release/app-release-unsigned.apk app/build/outputs/apk/release/app-release.apk
"$HOME/Android/Sdk/build-tools/$apksigner_version/apksigner" sign -v --ks "$KEYSTORE" --ks-key-alias "$KEYSTORE_ALIAS" app/build/outputs/apk/release/app-release.apk
echo "Build finished (signed)"
echo "Your build is at app/build/outputs/apk/release/app-release.apk"
fi
pushd app/build/outputs/apk/release/
sha256sum -- *.apk > SHA256SUMS
popd
echo "SHA256SUMS generated"
echo "Your SHA256SUMS is at app/build/outputs/apk/release/SHA256SUMS"

View File

@@ -5,7 +5,7 @@ Copylefted libre software (GPLv3+) card management app.
[![GitHub Version](https://img.shields.io/github/v/release/TheLastProject/Catima.svg?logo=github&label=GitHub)](https://github.com/TheLastProject/Catima/releases)
[![F-Droid Version](https://img.shields.io/f-droid/v/me.hackerchick.catima.svg?logo=f-droid&label=F-Droid)](https://f-droid.org/packages/me.hackerchick.catima/)
[![IzzyOnDroid Version](https://img.shields.io/endpoint?url=https://apt.izzysoft.de/fdroid/api/v1/shield/me.hackerchick.catima)](https://apt.izzysoft.de/fdroid/index/apk/me.hackerchick.catima)
[![Google Play Store Version](https://img.shields.io/endpoint?color=blue&logo=google-play&url=https%3A%2F%2Fplayshields.herokuapp.com%2Fplay%3Fi%3Dme.hackerchick.catima%26l%3DGoogle%2520Play%26m%3D%24version)](https://play.google.com/store/apps/details?id=me.hackerchick.catima)
[![Google Play Store Version](https://img.shields.io/endpoint?color=blue&logo=google-play&url=https%3A%2F%2Fplay.cuzi.workers.dev%2Fplay%3Fi%3Dme.hackerchick.catima%26l%3DGoogle%2520Play%26m%3D%24version)](https://play.google.com/store/apps/details?id=me.hackerchick.catima)
![Android CI](https://github.com/TheLastProject/Catima/workflows/Android%20CI/badge.svg)
[![Translation status](https://hosted.weblate.org/widgets/catima/-/svg-badge.svg)](https://hosted.weblate.org/engage/catima/)
@@ -18,7 +18,7 @@ Copylefted libre software (GPLv3+) card management app.
<a href="https://play.google.com/store/apps/details?id=me.hackerchick.catima" target="_blank">
<img src="https://play.google.com/intl/en_us/badges/images/generic/en-play-badge.png" alt="Get it on Google Play" height="90"/></a>
![Logo](https://github.com/TheLastProject/Catima/raw/master/app/src/main/ic_launcher-playstore.png)
![Logo](https://github.com/TheLastProject/Catima/raw/main/app/src/main/ic_launcher-playstore.png)
*Logo by [Rose (TangentFoxy)](http://github.com/TangentFoxy)*
@@ -42,14 +42,14 @@ Supported barcodes:
# Screenshots
[<img src="https://github.com/TheLastProject/Catima/raw/master/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-01.png" width=250>](https://github.com/TheLastProject/Catima/raw/master/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-01.png)
[<img src="https://github.com/TheLastProject/Catima/raw/master/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-02.png" width=250>](https://github.com/TheLastProject/Catima/raw/master/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-02.png)
[<img src="https://github.com/TheLastProject/Catima/raw/master/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-03.png" width=250>](https://github.com/TheLastProject/Catima/raw/master/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-03.png)
[<img src="https://github.com/TheLastProject/Catima/raw/master/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-04.png" width=250>](https://github.com/TheLastProject/Catima/raw/master/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-04.png)
[<img src="https://github.com/TheLastProject/Catima/raw/master/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-05.png" width=250>](https://github.com/TheLastProject/Catima/raw/master/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-05.png)
[<img src="https://github.com/TheLastProject/Catima/raw/master/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-06.png" width=250>](https://github.com/TheLastProject/Catima/raw/master/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-06.png)
[<img src="https://github.com/TheLastProject/Catima/raw/master/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-07.png" width=250>](https://github.com/TheLastProject/Catima/raw/master/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-07.png)
[<img src="https://github.com/TheLastProject/Catima/raw/master/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-08.png" width=250>](https://github.com/TheLastProject/Catima/raw/master/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-08.png)
[<img src="https://github.com/TheLastProject/Catima/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-01.png" width=250>](https://github.com/TheLastProject/Catima/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-01.png)
[<img src="https://github.com/TheLastProject/Catima/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-02.png" width=250>](https://github.com/TheLastProject/Catima/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-02.png)
[<img src="https://github.com/TheLastProject/Catima/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-03.png" width=250>](https://github.com/TheLastProject/Catima/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-03.png)
[<img src="https://github.com/TheLastProject/Catima/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-04.png" width=250>](https://github.com/TheLastProject/Catima/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-04.png)
[<img src="https://github.com/TheLastProject/Catima/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-05.png" width=250>](https://github.com/TheLastProject/Catima/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-05.png)
[<img src="https://github.com/TheLastProject/Catima/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-06.png" width=250>](https://github.com/TheLastProject/Catima/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-06.png)
[<img src="https://github.com/TheLastProject/Catima/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-07.png" width=250>](https://github.com/TheLastProject/Catima/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-07.png)
[<img src="https://github.com/TheLastProject/Catima/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-08.png" width=250>](https://github.com/TheLastProject/Catima/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-08.png)
# Moving data from other apps
@@ -58,17 +58,16 @@ For FidMe you need to select the barcode type for each entry afterwards.
# Building
Use the Gradle wrapper scripts provided in the top level directory of the project.
To compile the app and run all unit tests:
Building can either be done through Android Studio (not reproducible!) or the build.sh script in this repository (reproducibly with Java 11, same way F-Droid builds it). This script can also sign the build.
Linux|GNU, Unix-like, macOS:
Build without signing:
```
./gradlew build
./build.sh
```
Windows:
Build with signing:
```
./gradlew.bat build
KEYSTORE=/path/to/keystore KEYSTORE_ALIAS=catima ./build.sh
```
# Translating

View File

@@ -0,0 +1 @@
- Добавена е възможност потребителското заглавие да бъде по-видимо

View File

@@ -0,0 +1,3 @@
- Добавена е едноцветна пиктиграма за Android 13
- Подобрен е първия екран при стартиране
- Поправки при внасяне от Fidme

View File

@@ -0,0 +1,2 @@
- Отваряне на изображение в галерията при задържане
- Прилагане на стила Material към диалоговите прозорци

View File

@@ -0,0 +1 @@
Za vaše barkodove, članstva, loyalty programe, kupone i tikete.

View File

@@ -0,0 +1 @@
Catima - Loyalty card novčanik

View File

@@ -0,0 +1,4 @@
- Otevření obrázku v aplikaci pro galerii při dlouhém stisku
- Styl Material použit na dialogová okna
- Podpora vytváření karty pomocí sdílení obrázku do Catima
- Na obrazovku karty přidáno tlačítko pro rychlé zadání útraty

View File

@@ -0,0 +1,2 @@
- Oprava dialogu pro rychlé zadání útraty, který neumožňuje oddělovač , (čárku)
- Podpora načítání obrázku ze správce souborů

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