Compare commits

...

208 Commits

Author SHA1 Message Date
Sylvia van Os
551fbed8ad Release Catima 2.14.1 2022-01-15 13:46:49 +01:00
Sylvia van Os
468c86b5ea Merge pull request #748 from CatimaLoyalty/create-pull-request/patch-1642250378
Update Fastlane changelogs
2022-01-15 13:40:17 +01:00
TheLastProject
50cb3146bf Update Fastlane changelogs 2022-01-15 12:39:37 +00:00
Sylvia van Os
0853bd88a4 Various theming fixes 2022-01-15 13:39:19 +01:00
Sylvia van Os
3bbe8e9524 Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker 2022-01-15 12:12:04 +01:00
Sylvia van Os
ebc2e07fc4 Use new URLs 2022-01-15 12:11:57 +01:00
Sylvia van Os
ad368e68eb Merge pull request #747 from CatimaLoyalty/create-pull-request/patch-1642244294
Update Fastlane changelogs
2022-01-15 11:59:07 +01:00
TheLastProject
a1d4bb746f Update Fastlane changelogs 2022-01-15 10:58:14 +00:00
Sylvia van Os
44473ae921 Hide search, expand and sort icons until there is at least one card 2022-01-15 11:57:52 +01:00
Sylvia van Os
2c3d9f714c Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker 2022-01-14 23:07:21 +01:00
Sylvia van Os
13121e9869 Also colour scaler with card colour 2022-01-14 23:07:14 +01:00
Sylvia van Os
14116324fb Merge pull request #743 from CatimaLoyalty/create-pull-request/patch-1642196358
Update Fastlane changelogs
2022-01-14 22:40:14 +01:00
TheLastProject
d207197055 Update Fastlane changelogs 2022-01-14 21:39:18 +00:00
Sylvia van Os
a36775c6fd Release Catima 2.14.0 2022-01-14 22:38:52 +01:00
Sylvia van Os
cae95d2577 Update screenshots to Material You 2022-01-14 21:54:10 +01:00
bors[bot]
1c95a767c0 Merge #741
741: Material You redesign r=TheLastProject a=TheLastProject

I'm not super excited about the new dark theme's primary colour as generated by https://material-foundation.github.io/material-theme-builder/ for primary colour `#A83536` but alas...

![image](https://user-images.githubusercontent.com/1885159/149578453-72a6c345-e2ec-4271-9110-7ee39356b385.png)


Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Sylvia van Os <sylvia@hackerchick.me>
2022-01-14 20:36:05 +00:00
Sylvia van Os
26fd3e3a58 Make spotBugs happy 2022-01-14 21:35:02 +01:00
Sylvia van Os
e79be213fc Fix lint 2022-01-14 21:26:29 +01:00
Sylvia van Os
2010b9a25c Card-related colours on view screen 2022-01-14 21:05:50 +01:00
Sylvia van Os
355c2f9ceb Material You redesign 2022-01-14 20:27:11 +01:00
Sylvia van Os
43daeec5c3 Merge pull request #738 from TheLastProject/dependabot/gradle/androidx.constraintlayout-constraintlayout-2.1.3
Bump constraintlayout from 2.1.2 to 2.1.3
2022-01-14 07:23:26 +01:00
dependabot[bot]
5ddf77dd63 Bump material from 1.4.0 to 1.5.0
Bumps [material](https://github.com/material-components/material-components-android) from 1.4.0 to 1.5.0.
- [Release notes](https://github.com/material-components/material-components-android/releases)
- [Commits](https://github.com/material-components/material-components-android/compare/1.4.0...1.5.0)

---
updated-dependencies:
- dependency-name: com.google.android.material:material
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-14 02:26:18 +00:00
dependabot[bot]
64fb91d644 Bump constraintlayout from 2.1.2 to 2.1.3
Bumps [constraintlayout](https://github.com/androidx/constraintlayout) from 2.1.2 to 2.1.3.
- [Release notes](https://github.com/androidx/constraintlayout/releases)
- [Commits](https://github.com/androidx/constraintlayout/commits)

---
updated-dependencies:
- dependency-name: androidx.constraintlayout:constraintlayout
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-14 02:26:13 +00:00
Sylvia van Os
4921d9f4b0 Merge pull request #736 from TheLastProject/dependabot/gradle/androidx.core-core-splashscreen-1.0.0-beta01
Bump core-splashscreen from 1.0.0-alpha02 to 1.0.0-beta01
2022-01-13 08:19:33 +01:00
Sylvia van Os
8f9dd584b1 Merge pull request #735 from TheLastProject/dependabot/gradle/androidx.appcompat-appcompat-1.4.1
Bump appcompat from 1.4.0 to 1.4.1
2022-01-13 08:17:16 +01:00
dependabot[bot]
04f2cffeb3 Bump core-splashscreen from 1.0.0-alpha02 to 1.0.0-beta01
Bumps core-splashscreen from 1.0.0-alpha02 to 1.0.0-beta01.

---
updated-dependencies:
- dependency-name: androidx.core:core-splashscreen
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-13 02:24:29 +00:00
dependabot[bot]
8ca899b7d1 Bump appcompat from 1.4.0 to 1.4.1
Bumps appcompat from 1.4.0 to 1.4.1.

---
updated-dependencies:
- dependency-name: androidx.appcompat:appcompat
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-13 02:24:23 +00:00
bors[bot]
c0f3e814a0 Merge #734
734: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

* [Catima/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: DEL <mylnico@yahoo.fr>
Co-authored-by: 109247019824 <stoyan@gmx.com>
2022-01-12 07:03:19 +00:00
109247019824
1eb8d03b74 Translated using Weblate (Bulgarian)
Currently translated at 100.0% (238 of 238 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2022-01-12 07:53:48 +01:00
DEL
ec0dc6bd4c Translated using Weblate (French)
Currently translated at 13.4% (13 of 97 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2022-01-12 07:53:48 +01:00
bors[bot]
cd7b3d5970 Merge #733
733: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

* [Catima/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: vesp <vesp@post.cz>
Co-authored-by: Altons <marsupilami450@gmail.com>
Co-authored-by: Petr Novák <nit.monkey@gmail.com>
2022-01-10 22:55:22 +00:00
Petr Novák
55843899da Translated using Weblate (Czech)
Currently translated at 98.9% (96 of 97 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2022-01-10 23:53:36 +01:00
Altons
d639013bea Translated using Weblate (German)
Currently translated at 4.1% (4 of 97 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2022-01-10 23:53:33 +01:00
Altons
45785b66e7 Translated using Weblate (French)
Currently translated at 9.2% (9 of 97 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2022-01-10 23:53:33 +01:00
Altons
6a20366cc9 Translated using Weblate (German)
Currently translated at 100.0% (238 of 238 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2022-01-10 23:53:32 +01:00
vesp
4856e9e971 Translated using Weblate (Czech)
Currently translated at 100.0% (238 of 238 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2022-01-10 23:53:32 +01:00
bors[bot]
4141856287 Merge #732
732: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

* [Catima/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: Petr Novák <nit.monkey@gmail.com>
2022-01-09 22:24:51 +00:00
Petr Novák
12196fc9b1 Translated using Weblate (Czech)
Currently translated at 100.0% (238 of 238 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2022-01-09 23:21:07 +01:00
Sylvia van Os
c73e7924ad Release Catima 2.13.1 2022-01-09 15:51:50 +01:00
Sylvia van Os
acf83087f4 Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker 2022-01-09 15:00:26 +01:00
Sylvia van Os
8ef507c011 Fix breaking scrolling 2022-01-09 15:00:20 +01:00
bors[bot]
d36f82df05 Merge #728
728: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

* [Catima/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: vesp <vesp@post.cz>
Co-authored-by: J. Lavoie <j.lavoie@net-c.ca>
Co-authored-by: Heimen Stoffels <vistausss@fastmail.com>
Co-authored-by: Maciej Błędkowski <mble@tuta.io>
Co-authored-by: solokot <solokot@gmail.com>
Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
2022-01-09 09:47:42 +00:00
Oğuz Ersen
5f50e86234 Translated using Weblate (Turkish)
Currently translated at 49.4% (48 of 97 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/tr/
2022-01-09 10:45:38 +01:00
Oğuz Ersen
733c9885e8 Translated using Weblate (Turkish)
Currently translated at 100.0% (238 of 238 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2022-01-09 10:45:38 +01:00
solokot
4b7acefece Translated using Weblate (Russian)
Currently translated at 100.0% (238 of 238 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2022-01-09 10:45:38 +01:00
Maciej Błędkowski
a6b950e2e1 Translated using Weblate (Polish)
Currently translated at 98.3% (234 of 238 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pl/
2022-01-09 10:45:37 +01:00
Heimen Stoffels
c21f8098ef Translated using Weblate (Dutch)
Currently translated at 100.0% (238 of 238 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2022-01-09 10:45:37 +01:00
J. Lavoie
3ccce45f17 Translated using Weblate (Italian)
Currently translated at 100.0% (238 of 238 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2022-01-09 10:45:37 +01:00
J. Lavoie
f096f63352 Translated using Weblate (French)
Currently translated at 100.0% (238 of 238 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2022-01-09 10:45:37 +01:00
J. Lavoie
babd6ff9bb Translated using Weblate (German)
Currently translated at 99.5% (237 of 238 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2022-01-09 10:45:37 +01:00
vesp
3c5dea6fbf Translated using Weblate (Czech)
Currently translated at 86.5% (206 of 238 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2022-01-09 10:45:37 +01:00
Sylvia van Os
3bf7d827a1 Merge pull request #727 from TheLastProject/create-pull-request/patch-1641705432
Update contributors
2022-01-09 10:45:34 +01:00
TheLastProject
eea03dd516 Update contributors 2022-01-09 05:17:12 +00:00
bors[bot]
92ceb7ee50 Merge #726
726: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

* [Catima/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: Allan Nordhøy <epost@anotheragency.no>
2022-01-07 21:28:52 +00:00
Allan Nordhøy
aba5dbfb38 Translated using Weblate (Norwegian Bokmål)
Currently translated at 97.8% (233 of 238 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nb_NO/
2022-01-07 22:26:43 +01:00
Sylvia van Os
1ba4839544 Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker 2022-01-07 22:26:37 +01:00
Sylvia van Os
cca68cfcc5 Simplify 2022-01-07 22:26:29 +01:00
bors[bot]
d2043c331a Merge #725
725: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

* [Catima/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: Maciej Błędkowski <mble@tuta.io>
2022-01-07 21:09:35 +00:00
Maciej Błędkowski
b57bc7d7b6 Translated using Weblate (Polish)
Currently translated at 100.0% (235 of 235 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pl/
2022-01-07 22:08:54 +01:00
Sylvia van Os
23fb6d9c6a Merge pull request #724 from TheLastProject/create-pull-request/patch-1641589559
Update Fastlane changelogs
2022-01-07 22:08:50 +01:00
TheLastProject
2498ee0354 Update Fastlane changelogs 2022-01-07 21:05:59 +00:00
Sylvia van Os
eb38d0a8aa Accessibility fixes 2022-01-07 22:02:51 +01:00
bors[bot]
cb0deaae27 Merge #720
720: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

* [Catima/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: solokot <solokot@gmail.com>
Co-authored-by: IllusiveMan196 <hamsterrv@gmail.com>
2022-01-06 17:00:49 +00:00
IllusiveMan196
8220c8b32e Translated using Weblate (Ukrainian)
Currently translated at 100.0% (235 of 235 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/uk/
2022-01-06 17:54:58 +01:00
solokot
8458a2e79a Translated using Weblate (Russian)
Currently translated at 100.0% (235 of 235 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2022-01-06 17:54:57 +01:00
bors[bot]
d436a20b23 Merge #718
718: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

* [Catima/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: Altons <marsupilami450@gmail.com>
2022-01-04 19:39:02 +00:00
Altons
c24f3b6ece Translated using Weblate (French)
Currently translated at 8.3% (8 of 96 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2022-01-04 19:55:38 +01:00
Altons
d5cb1a79d2 Translated using Weblate (French)
Currently translated at 100.0% (235 of 235 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2022-01-04 19:55:38 +01:00
Altons
7040dbf997 Translated using Weblate (German)
Currently translated at 100.0% (235 of 235 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2022-01-04 19:55:38 +01:00
Sylvia van Os
d1685f2557 More metadata fixes 2022-01-03 21:05:11 +01:00
Sylvia van Os
36237d9b3e Release Catima 2.13.0 2022-01-03 19:19:34 +01:00
bors[bot]
f968aba926 Merge #716
716: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

* [Catima/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: Michael Moroni <michaelmoroni@disroot.org>
Co-authored-by: Allan Nordhøy <epost@anotheragency.no>
Co-authored-by: Heimen Stoffels <vistausss@fastmail.com>
Co-authored-by: solokot <solokot@gmail.com>
Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
2022-01-03 18:00:48 +00:00
Oğuz Ersen
2d7960ddc4 Translated using Weblate (Turkish)
Currently translated at 48.9% (47 of 96 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/tr/
2022-01-03 18:59:01 +01:00
Oğuz Ersen
4cdd168b8c Translated using Weblate (Turkish)
Currently translated at 100.0% (235 of 235 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2022-01-03 18:59:00 +01:00
solokot
9de54872f3 Translated using Weblate (Russian)
Currently translated at 100.0% (235 of 235 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2022-01-03 18:58:59 +01:00
Heimen Stoffels
f8f0edd8d3 Translated using Weblate (Dutch)
Currently translated at 100.0% (235 of 235 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2022-01-03 18:58:59 +01:00
Allan Nordhøy
3703f3d1ac Translated using Weblate (Norwegian Bokmål)
Currently translated at 98.7% (232 of 235 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nb_NO/
2022-01-03 18:58:59 +01:00
Michael Moroni
3bbd16e3a9 Translated using Weblate (Italian)
Currently translated at 100.0% (235 of 235 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2022-01-03 18:58:59 +01:00
Sylvia van Os
a2947d1f58 Metadata fixes 2022-01-03 18:30:06 +01:00
Sylvia van Os
4b94dd8b48 Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker 2022-01-03 17:47:57 +01:00
Sylvia van Os
62376769cd Update screenshots 2022-01-03 17:47:48 +01:00
Sylvia van Os
e057a24526 Merge pull request #715 from TheLastProject/create-pull-request/patch-1641158322
Update Fastlane changelogs
2022-01-02 22:19:54 +01:00
TheLastProject
25cc1a1160 Update Fastlane changelogs 2022-01-02 21:18:42 +00:00
Sylvia van Os
d7ed4aeff8 Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker 2022-01-02 22:18:22 +01:00
Sylvia van Os
58ebb7c7bf Improve star icon contrast in main view 2022-01-02 22:18:11 +01:00
bors[bot]
be2c586820 Merge #714
714: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

* [Catima/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: Michael Moroni <michaelmoroni@disroot.org>
Co-authored-by: Allan Nordhøy <epost@anotheragency.no>
Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
Co-authored-by: ssantos <ssantos@web.de>
2022-01-02 20:43:24 +00:00
ssantos
8a0b2d9460 Translated using Weblate (Portuguese)
Currently translated at 13.5% (13 of 96 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt/
2022-01-02 21:42:33 +01:00
ssantos
4b1583ce4c Translated using Weblate (Portuguese (Portugal))
Currently translated at 87.6% (205 of 234 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt_PT/
2022-01-02 21:42:33 +01:00
ssantos
83c611f4ae Translated using Weblate (Portuguese)
Currently translated at 87.6% (205 of 234 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt/
2022-01-02 21:42:33 +01:00
Oğuz Ersen
0a7082bed5 Translated using Weblate (Turkish)
Currently translated at 44.7% (43 of 96 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/tr/
2022-01-02 21:42:33 +01:00
Allan Nordhøy
94c84c60f5 Translated using Weblate (Norwegian Bokmål)
Currently translated at 20.8% (20 of 96 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/nb_NO/
2022-01-02 21:42:33 +01:00
Allan Nordhøy
4ce7f475f4 Translated using Weblate (Norwegian Bokmål)
Currently translated at 98.7% (231 of 234 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nb_NO/
2022-01-02 21:42:33 +01:00
Michael Moroni
75057d3c41 Translated using Weblate (Italian)
Currently translated at 100.0% (234 of 234 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2022-01-02 21:42:33 +01:00
Sylvia van Os
62fce7231d Merge pull request #713 from TheLastProject/create-pull-request/patch-1641156077
Update Fastlane changelogs
2022-01-02 21:42:30 +01:00
TheLastProject
d201d2e98f Update Fastlane changelogs 2022-01-02 20:41:17 +00:00
Sylvia van Os
36ff4ca9ae Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker 2022-01-02 21:40:57 +01:00
Sylvia van Os
a7a775bc01 Put all barcode related fields together in the edit screen 2022-01-02 21:40:44 +01:00
Sylvia van Os
d217ac8752 Merge pull request #709 from TheLastProject/create-pull-request/patch-1641100630
Update contributors
2022-01-02 09:07:47 +01:00
TheLastProject
d376569ba1 Update contributors 2022-01-02 05:17:10 +00:00
bors[bot]
1a09b1bd5e Merge #708
708: Update Fastlane changelogs r=TheLastProject a=github-actions[bot]

Automated changes by [create-pull-request](https://github.com/peter-evans/create-pull-request) GitHub action

Co-authored-by: TheLastProject <TheLastProject@users.noreply.github.com>
2022-01-01 23:19:19 +00:00
TheLastProject
ec1f4f8fbd Update Fastlane changelogs 2022-01-01 23:14:01 +00:00
Sylvia van Os
3883617a34 Smaller header when details are hidden 2022-01-02 00:10:37 +01:00
bors[bot]
2e7c8f39a7 Merge #705
705: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

* [Catima/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: vesp <vesp@post.cz>
2022-01-01 18:00:31 +00:00
vesp
7fc2bdc46e Translated using Weblate (Czech)
Currently translated at 87.6% (205 of 234 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2022-01-01 18:54:31 +01:00
bors[bot]
c141a8986c Merge #703
703: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

* [Catima/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: Maciej Błędkowski <mble@tuta.io>
2022-01-01 13:27:48 +00:00
Maciej Błędkowski
70ad884aa3 Translated using Weblate (Polish)
Currently translated at 100.0% (234 of 234 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pl/
2021-12-31 13:50:31 +01:00
bors[bot]
2bd8aed853 Merge #702
702: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

* [Catima/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: Oğuz Ersen <oguzersen@protonmail.com>
2021-12-28 16:14:08 +00:00
Oğuz Ersen
78f5908c33 Translated using Weblate (Turkish)
Currently translated at 33.3% (32 of 96 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/tr/
2021-12-28 16:53:31 +01:00
Sylvia van Os
2f43febe95 Merge pull request #701 from TheLastProject/create-pull-request/patch-1640550052
Update Fastlane changelogs
2021-12-26 21:22:34 +01:00
TheLastProject
17d23de518 Update Fastlane changelogs 2021-12-26 20:20:52 +00:00
Sylvia van Os
af831cfdbd Fixed pressing the save button multiple times creating multiple entries
Fixes #691
2021-12-26 21:20:27 +01:00
bors[bot]
4476646317 Merge #700
700: Update contributors r=TheLastProject a=github-actions[bot]

Automated changes by [create-pull-request](https://github.com/peter-evans/create-pull-request) GitHub action

Co-authored-by: TheLastProject <TheLastProject@users.noreply.github.com>
2021-12-26 07:44:16 +00:00
TheLastProject
958dc29689 Update contributors 2021-12-26 05:16:50 +00:00
Sylvia van Os
21216f3aa6 Release Catima 2.12.0 2021-12-23 17:41:06 +01:00
bors[bot]
808dd73221 Merge #697
697: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

* [Catima/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: Oğuz Ersen <oguzersen@protonmail.com>
2021-12-23 16:03:57 +00:00
Oğuz Ersen
e3bd82f4a2 Translated using Weblate (Turkish)
Currently translated at 28.4% (27 of 95 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/tr/
2021-12-23 16:53:14 +01:00
Sylvia van Os
2cbb105c21 Merge pull request #696 from TheLastProject/create-pull-request/patch-1640123935
Update Fastlane changelogs
2021-12-21 23:01:58 +01:00
TheLastProject
40c364a5e8 Update Fastlane changelogs 2021-12-21 21:58:54 +00:00
Sylvia van Os
8c484078b4 Mention various small fixes 2021-12-21 22:58:33 +01:00
bors[bot]
f93f3b912d Merge #695
695: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

* [Catima/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: Yevgeny M <yevgenym.lg3@gmail.com>
Co-authored-by: IllusiveMan196 <hamsterrv@gmail.com>
Co-authored-by: Sylvia van Os <sylvia@hackerchick.me>
2021-12-20 17:09:03 +00:00
Sylvia van Os
934ef22a8c Translated using Weblate (Hebrew (Israel))
Currently translated at 33.7% (79 of 234 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/he_IL/
2021-12-20 12:51:14 +01:00
IllusiveMan196
732679f3f8 Translated using Weblate (Ukrainian)
Currently translated at 14.7% (14 of 95 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2021-12-19 08:33:17 +01:00
IllusiveMan196
2e7cbcbac9 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (234 of 234 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/uk/
2021-12-19 08:33:17 +01:00
Yevgeny M
eb5161a382 Translated using Weblate (Hebrew (Israel))
Currently translated at 34.1% (80 of 234 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/he_IL/
2021-12-19 08:33:16 +01:00
bors[bot]
b765d77145 Merge #693
693: Update contributors r=TheLastProject a=github-actions[bot]

Automated changes by [create-pull-request](https://github.com/peter-evans/create-pull-request) GitHub action

Co-authored-by: TheLastProject <TheLastProject@users.noreply.github.com>
2021-12-19 07:28:43 +00:00
TheLastProject
ad344c7d12 Update contributors 2021-12-19 05:16:53 +00:00
Sylvia van Os
d84ce6ff82 Remove Google-declined title 2021-12-17 16:59:50 +01:00
Sylvia van Os
d4e388cf5d Fix some crashes after DB refactor 2021-12-16 22:49:22 +01:00
bors[bot]
34fcedfa28 Merge #688
688: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

* [Catima/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: Nyatsuki <Odamaki@yandex.ru>
2021-12-16 16:23:48 +00:00
Nyatsuki
c75eed56f0 Translated using Weblate (Japanese)
Currently translated at 99.1% (232 of 234 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ja/
2021-12-16 10:51:04 +01:00
bors[bot]
8ce0ce82ef Merge #680
680: Cleanup DBHelper r=TheLastProject a=TheLastProject

Should fix #661 

Supersedes #678 

While #678 does fix the issue too, the real issue was that an importer could cause such a state issue. So I've instead been seriously cleaning up. While all the tests pass, I do want to test this slightly longer before merging it into master.

Co-authored-by: Sylvia van Os <sylvia@hackerchick.me>
2021-12-14 19:24:29 +00:00
bors[bot]
304754f991 Merge #677
677: 671 adding English to list of languages, 672, 607 relaunch main activity after language, theme change r=TheLastProject a=Kethen

#671, #672 please review
added #607

Co-authored-by: Katharine <kwchuiaa@connect.ust.hk>
Co-authored-by: Katharine Chui <kwchuiaa@connect.ust.hk>
2021-12-14 17:38:17 +00:00
Katharine Chui
ab6e90d9f6 reload main activity with splash screen skip 2021-12-15 00:38:17 +08:00
Katharine
9df22f18f0 671 adding English to list of languages, 672 relaunch main activity after language change 2021-12-15 00:33:15 +08:00
bors[bot]
2eeec777d7 Merge #684
684: 681 fix star icon vector graphics, star color by theme when selected r=TheLastProject a=Kethen

#681 please review
![image](https://user-images.githubusercontent.com/22017945/145991885-991e09d5-913f-499d-94b1-03ae6326eb9f.png)
![image](https://user-images.githubusercontent.com/22017945/145992155-589f45d0-218b-4ab9-b351-2a58d19990bc.png)

![image](https://user-images.githubusercontent.com/22017945/145992048-a08f8e88-bce3-4bfc-a112-35dd991f4516.png)
![image](https://user-images.githubusercontent.com/22017945/145992074-e7699e72-e4d4-44d5-851c-5cd3c453a745.png)


Co-authored-by: Katharine Chui <kwchuiaa@connect.ust.hk>
2021-12-14 16:27:57 +00:00
Katharine Chui
1d41039de2 674 currency symbol order fixes (#679) 2021-12-14 17:26:18 +01:00
Katharine Chui
112b4a034c fix card icon layout 2021-12-14 20:16:36 +08:00
Katharine Chui
8c06427976 681 fix vector graphics, star color by theme when selected 2021-12-14 19:41:11 +08:00
bors[bot]
486a2b887e Merge #682
682: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

* [Catima/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: Altons <marsupilami450@gmail.com>
Co-authored-by: Heimen Stoffels <vistausss@fastmail.com>
Co-authored-by: solokot <solokot@gmail.com>
Co-authored-by: Eric <spice2wolf@gmail.com>
Co-authored-by: Joel A <joeax910@student.liu.se>
Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
2021-12-14 07:44:19 +00:00
Oğuz Ersen
3f3f289f62 Translated using Weblate (Turkish)
Currently translated at 100.0% (234 of 234 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2021-12-14 02:53:59 +01:00
Joel A
bf2b28065d Translated using Weblate (Swedish)
Currently translated at 100.0% (234 of 234 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sv/
2021-12-14 02:53:58 +01:00
Eric
d00d25ad00 Translated using Weblate (Chinese (Simplified))
Currently translated at 80.7% (189 of 234 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hans/
2021-12-14 02:53:58 +01:00
solokot
f1371daecb Translated using Weblate (Russian)
Currently translated at 100.0% (234 of 234 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2021-12-14 02:53:58 +01:00
Heimen Stoffels
2fecc524f0 Translated using Weblate (Dutch)
Currently translated at 100.0% (234 of 234 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2021-12-14 02:53:58 +01:00
Altons
f5beffcad5 Translated using Weblate (French)
Currently translated at 100.0% (234 of 234 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2021-12-14 02:53:58 +01:00
Altons
b78bdb3ced Translated using Weblate (German)
Currently translated at 100.0% (234 of 234 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2021-12-14 02:53:57 +01:00
bors[bot]
f16b3ca119 Merge #675
675: 635 android 5 stuck row height, 619 star icon color r=TheLastProject a=Kethen

please review, for #635 and #619

https://user-images.githubusercontent.com/22017945/145800150-b3afa43e-de80-4172-bbdd-5d06af6276d1.mp4




Co-authored-by: Katharine <kwchuiaa@connect.ust.hk>
2021-12-13 22:06:26 +00:00
Sylvia van Os
f2e820f7bb Cleanup DBHelper 2021-12-13 22:47:12 +01:00
Katharine
cf38357f3e spotbug 2021-12-13 17:32:44 +08:00
Katharine
9862a9912f 619 adapt star color to card icon 2021-12-13 16:52:21 +08:00
Katharine
990968a67b 635 trigger requestLayout on possible card text view shrink 2021-12-13 15:08:46 +08:00
Sylvia van Os
3331cf9ccf Make spotBugs happy 2021-12-12 19:25:51 +01:00
Sylvia van Os
8a45222783 Simplify card shortcut code 2021-12-12 19:18:13 +01:00
bors[bot]
d92efc020b Merge #670
670: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

* [Catima/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: Michael Moroni <michaelmoroni@disroot.org>
Co-authored-by: Heimen Stoffels <vistausss@fastmail.com>
2021-12-12 10:48:38 +00:00
Michael Moroni
deb1edb7a6 Translated using Weblate (Italian)
Currently translated at 4.2% (4 of 95 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/it/
2021-12-12 11:45:54 +01:00
Heimen Stoffels
3265a9eb4d Translated using Weblate (Dutch)
Currently translated at 100.0% (233 of 233 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2021-12-12 11:45:54 +01:00
Michael Moroni
c0ed86818f Translated using Weblate (Italian)
Currently translated at 100.0% (233 of 233 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2021-12-12 11:45:54 +01:00
bors[bot]
67d8a242b5 Merge #673
673: Update contributors r=TheLastProject a=github-actions[bot]

Automated changes by [create-pull-request](https://github.com/peter-evans/create-pull-request) GitHub action

Co-authored-by: TheLastProject <TheLastProject@users.noreply.github.com>
2021-12-12 10:41:17 +00:00
TheLastProject
d12a4bf75d Update contributors 2021-12-12 05:16:31 +00:00
bors[bot]
e86db3887b Merge #667
667: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

* [Catima/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: Altons <marsupilami450@gmail.com>
Co-authored-by: J. Lavoie <j.lavoie@net-c.ca>
Co-authored-by: Heimen Stoffels <vistausss@fastmail.com>
Co-authored-by: solokot <solokot@gmail.com>
Co-authored-by: IllusiveMan196 <hamsterrv@gmail.com>
Co-authored-by: Joel A <joeax910@student.liu.se>
Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
2021-12-09 21:00:45 +00:00
Oğuz Ersen
ce8488e515 Translated using Weblate (Turkish)
Currently translated at 28.4% (27 of 95 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/tr/
2021-12-09 21:53:29 +01:00
Oğuz Ersen
5ef9aad5a7 Translated using Weblate (Turkish)
Currently translated at 100.0% (233 of 233 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2021-12-09 21:53:28 +01:00
Joel A
d9fd3fd001 Translated using Weblate (Swedish)
Currently translated at 99.5% (232 of 233 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sv/
2021-12-09 21:53:28 +01:00
J. Lavoie
f9f3efe1e2 Translated using Weblate (Finnish)
Currently translated at 71.6% (167 of 233 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fi/
2021-12-09 21:53:27 +01:00
Altons
c5b9399fc4 Translated using Weblate (French)
Currently translated at 5.2% (5 of 95 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2021-12-09 21:53:27 +01:00
IllusiveMan196
19ad303508 Translated using Weblate (Ukrainian)
Currently translated at 99.5% (232 of 233 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/uk/
2021-12-09 21:53:27 +01:00
solokot
d5b9bb9ca1 Translated using Weblate (Russian)
Currently translated at 99.5% (232 of 233 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2021-12-09 21:53:26 +01:00
Heimen Stoffels
c50661f1bd Translated using Weblate (Dutch)
Currently translated at 99.5% (232 of 233 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2021-12-09 21:53:26 +01:00
J. Lavoie
afd8d2e675 Translated using Weblate (Italian)
Currently translated at 99.5% (232 of 233 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2021-12-09 21:53:26 +01:00
Altons
be8765aab1 Translated using Weblate (French)
Currently translated at 100.0% (233 of 233 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2021-12-09 21:53:25 +01:00
J. Lavoie
5656751a14 Translated using Weblate (French)
Currently translated at 100.0% (233 of 233 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2021-12-09 21:53:25 +01:00
Altons
12b81f7fe5 Translated using Weblate (German)
Currently translated at 100.0% (233 of 233 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2021-12-09 21:53:24 +01:00
J. Lavoie
3ff64d9abc Translated using Weblate (German)
Currently translated at 100.0% (233 of 233 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2021-12-09 21:53:24 +01:00
Altons
0a39a8bb5b Translated using Weblate (English)
Currently translated at 100.0% (233 of 233 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/en/
2021-12-09 21:53:24 +01:00
bors[bot]
64f68d5c19 Merge #666
666: Add long press to add card to group r=TheLastProject a=Altonss

Fixed issue #649.

Co-authored-by: Altonss <66519591+Altonss@users.noreply.github.com>
2021-12-09 18:48:15 +00:00
Altonss
2975c46f96 Update ManageGroupActivity.java
Fix long press to add card to group
2021-12-09 19:28:00 +01:00
bors[bot]
f6762df1cf Merge #665
665: Bump gradle from 7.0.3 to 7.0.4 r=TheLastProject a=dependabot[bot]

Bumps gradle from 7.0.3 to 7.0.4.


[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=com.android.tools.build:gradle&package-manager=gradle&previous-version=7.0.3&new-version=7.0.4)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting ``@dependabot` rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- ``@dependabot` rebase` will rebase this PR
- ``@dependabot` recreate` will recreate this PR, overwriting any edits that have been made to it
- ``@dependabot` merge` will merge this PR after your CI passes on it
- ``@dependabot` squash and merge` will squash and merge this PR after your CI passes on it
- ``@dependabot` cancel merge` will cancel a previously requested merge and block automerging
- ``@dependabot` reopen` will reopen this PR if it is closed
- ``@dependabot` close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
- ``@dependabot` ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
- ``@dependabot` ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
- ``@dependabot` ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)


</details>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-12-09 16:30:19 +00:00
dependabot[bot]
1aa0585909 Bump gradle from 7.0.3 to 7.0.4
Bumps gradle from 7.0.3 to 7.0.4.

---
updated-dependencies:
- dependency-name: com.android.tools.build:gradle
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-12-09 02:19:09 +00:00
bors[bot]
1cb20eeab3 Merge #663
663: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

* [Catima/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: Andreas Blaser <andreas.blaser@outlook.com>
Co-authored-by: Altons <marsupilami450@gmail.com>
2021-12-08 19:31:49 +00:00
Altons
c8acee2fbd Translated using Weblate (German)
Currently translated at 3.1% (3 of 94 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2021-12-08 20:31:13 +01:00
Andreas Blaser
ff35773eed Translated using Weblate (German)
Currently translated at 3.1% (3 of 94 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2021-12-08 20:31:13 +01:00
Sylvia van Os
48403399ab Merge pull request #664 from TheLastProject/create-pull-request/patch-1638991178
Update Fastlane changelogs
2021-12-08 20:31:10 +01:00
TheLastProject
96dafeab70 Update Fastlane changelogs 2021-12-08 19:19:37 +00:00
Sylvia van Os
d10e358e7d Document CODE 93 support 2021-12-08 20:19:20 +01:00
Altonss
71eb8c53bc Add code 93 (#659) 2021-12-08 20:18:15 +01:00
bors[bot]
186c2d1d56 Merge #657
657: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

* [Catima/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: Marco <magliano32@gmail.com>
Co-authored-by: Heimen Stoffels <vistausss@fastmail.com>
Co-authored-by: Eric <spice2wolf@gmail.com>
Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
2021-12-07 17:34:52 +00:00
Oğuz Ersen
2efa35504f Translated using Weblate (Turkish)
Currently translated at 99.5% (231 of 232 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2021-12-07 18:32:34 +01:00
Eric
ca1996da53 Translated using Weblate (Chinese (Simplified))
Currently translated at 81.4% (189 of 232 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hans/
2021-12-07 18:32:34 +01:00
Heimen Stoffels
b8d0724446 Translated using Weblate (Dutch)
Currently translated at 100.0% (232 of 232 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2021-12-07 18:32:34 +01:00
Marco
c9a08e4f5b Translated using Weblate (Italian)
Currently translated at 89.2% (207 of 232 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2021-12-07 18:32:34 +01:00
Altonss
4920b67d0c Add translation platform details in about page (#656) 2021-12-07 18:32:28 +01:00
bors[bot]
e8eb3fce5c Merge #655
655: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

* [Catima/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: solokot <solokot@gmail.com>
Co-authored-by: Sylvia van Os <sylvia@hackerchick.me>
Co-authored-by: Altons <marsupilami450@gmail.com>
2021-12-06 23:11:18 +00:00
solokot
aaccae647a Translated using Weblate (Russian)
Currently translated at 100.0% (232 of 232 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2021-12-07 00:06:32 +01:00
Altons
df4e851bfe Translated using Weblate (French)
Currently translated at 90.0% (209 of 232 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2021-12-07 00:06:31 +01:00
Sylvia van Os
05c85dac14 Translated using Weblate (Russian)
Currently translated at 87.9% (204 of 232 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2021-12-06 21:03:58 +01:00
solokot
86d953bb74 Translated using Weblate (Russian)
Currently translated at 100.0% (232 of 232 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2021-12-06 20:34:00 +01:00
Allan Nordhøy
1ecc39bea5 Less verbose strings (#645) 2021-12-06 20:33:56 +01:00
Sylvia van Os
4c9182eb0b Merge pull request #651 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2021-12-05 13:36:48 +01:00
Oğuz Ersen
62fafaff95 Translated using Weblate (Turkish)
Currently translated at 27.6% (26 of 94 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/tr/
2021-12-05 12:53:33 +01:00
Oğuz Ersen
aa0fdcc6b6 Translated using Weblate (Turkish)
Currently translated at 100.0% (232 of 232 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2021-12-05 12:53:32 +01:00
Heimen Stoffels
6c33dba401 Translated using Weblate (Dutch)
Currently translated at 100.0% (232 of 232 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2021-12-05 12:53:32 +01:00
Allan Nordhøy
c07d9805e4 Translated using Weblate (Norwegian Bokmål)
Currently translated at 97.8% (227 of 232 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nb_NO/
2021-12-05 12:53:31 +01:00
Arco
941a123db0 Translated using Weblate (French)
Currently translated at 100.0% (232 of 232 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2021-12-05 12:53:31 +01:00
Arco
2e58421a80 Translated using Weblate (English)
Currently translated at 100.0% (232 of 232 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/en/
2021-12-05 12:53:31 +01:00
Sylvia van Os
ae28e02cce Merge pull request #650 from TheLastProject/create-pull-request/patch-1638681427
Update contributors
2021-12-05 12:17:48 +01:00
TheLastProject
e5d8dc8d59 Update contributors 2021-12-05 05:17:07 +00:00
Sylvia van Os
b85de0e089 Merge pull request #647 from TheLastProject/create-pull-request/patch-1638623066
Update Fastlane changelogs
2021-12-04 14:04:59 +01:00
TheLastProject
4264155837 Update Fastlane changelogs 2021-12-04 13:04:25 +00:00
193 changed files with 2381 additions and 1924 deletions

View File

@@ -1,5 +1,30 @@
# Changelog
## v2.14.1 - 100 (2022-01-15)
- Hide search, expand and sort icons until there is at least 1 card
- Various theming fixes
## v2.14.0 - 99 (2022-01-14)
- Material You redesign
## v2.13.1 - 98 (2022-01-09)
- Fix various TalkBack-related bugs
## v2.13.0 - 97 (2022-01-03)
- Fixed pressing the save button multiple times creating multiple entries
- Lower card header size when hiding details to fit even more cards
- Restructure edit screen
- Improve star icon contrast in main view
## v2.12.0 - 96 (2021-12-23)
- Add CODE 93 support
- Various minor bugfixes and improvements
## v2.11.2 - 95 (2021-12-04)
- Fix crash on sharing card

View File

@@ -18,8 +18,8 @@ android {
applicationId "me.hackerchick.catima"
minSdkVersion 21
targetSdkVersion 31
versionCode 95
versionName "2.11.2"
versionCode 100
versionName "2.14.1"
vectorDrawables.useSupportLibrary true
multiDexEnabled true
@@ -80,17 +80,17 @@ android {
dependencies {
// AndroidX
implementation 'androidx.appcompat:appcompat:1.4.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.2'
implementation 'androidx.appcompat:appcompat:1.4.1'
implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
implementation 'androidx.exifinterface:exifinterface:1.3.3'
implementation 'androidx.palette:palette:1.0.0'
implementation 'androidx.preference:preference:1.1.1'
implementation 'com.google.android.material:material:1.4.0'
implementation 'com.google.android.material:material:1.5.0'
implementation 'com.github.yalantis:ucrop:2.2.7'
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'
// Splash Screen
implementation 'androidx.core:core-splashscreen:1.0.0-alpha02'
implementation 'androidx.core:core-splashscreen:1.0.0-beta01'
// Third-party
implementation 'com.journeyapps:zxing-android-embedded:4.3.0@aar'

View File

@@ -151,13 +151,13 @@ public class AboutActivity extends CatimaAppCompatActivity implements View.OnCli
} else if (id == R.id.translate) {
url = "https://hosted.weblate.org/engage/catima/";
} else if (id == R.id.license) {
url = "https://github.com/TheLastProject/Catima/blob/master/LICENSE";
url = "https://github.com/CatimaLoyalty/Android/blob/master/LICENSE";
} else if (id == R.id.repo) {
url = "https://github.com/TheLastProject/Catima/";
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/TheLastProject/Catima/issues";
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 {

View File

@@ -120,6 +120,8 @@ public class BarcodeImageWriterTask implements CompatCallable<Bitmap> {
return "C0C";
case CODE_39:
return "CODE_39";
case CODE_93:
return "CODE_93";
case CODE_128:
return "CODE_128";
case EAN_8:

View File

@@ -1,19 +1,16 @@
package protect.card_locker;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.pm.ShortcutInfoCompat;
import androidx.core.content.pm.ShortcutManagerCompat;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
/**
@@ -21,48 +18,41 @@ import androidx.recyclerview.widget.RecyclerView;
*/
public class CardShortcutConfigure extends AppCompatActivity implements LoyaltyCardCursorAdapter.CardAdapterListener {
static final String TAG = "Catima";
final DBHelper mDb = new DBHelper(this);
private SQLiteDatabase mDatabase;
@Override
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
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.main_activity);
setContentView(R.layout.simple_toolbar_list_activity);
Toolbar toolbar = findViewById(R.id.toolbar);
toolbar.setVisibility(View.GONE);
// Hide new button because it won't work here anyway
FloatingActionButton newFab = findViewById(R.id.fabAdd);
newFab.setVisibility(View.GONE);
final DBHelper db = new DBHelper(this);
toolbar.setTitle(R.string.shortcutSelectCard);
// If there are no cards, bail
if (db.getLoyaltyCardCount() == 0) {
if (DBHelper.getLoyaltyCardCount(mDatabase) == 0) {
Toast.makeText(this, R.string.noCardsMessage, Toast.LENGTH_LONG).show();
finish();
}
final RecyclerView cardList = findViewById(R.id.list);
GridLayoutManager layoutManager = (GridLayoutManager) cardList.getLayoutManager();
if (layoutManager != null) {
layoutManager.setSpanCount(getResources().getInteger(R.integer.main_view_card_columns));
}
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
cardList.setLayoutManager(mLayoutManager);
cardList.setItemAnimator(new DefaultItemAnimator());
cardList.setVisibility(View.VISIBLE);
Cursor cardCursor = db.getLoyaltyCardCursor();
Cursor cardCursor = DBHelper.getLoyaltyCardCursor(mDatabase);
final LoyaltyCardCursorAdapter adapter = new LoyaltyCardCursorAdapter(this, cardCursor, this);
cardList.setAdapter(adapter);
}
private void onClickAction(int position) {
Cursor selected = mDb.getLoyaltyCardCursor();
Cursor selected = DBHelper.getLoyaltyCardCursor(mDatabase);
selected.moveToPosition(position);
LoyaltyCard loyaltyCard = LoyaltyCard.toLoyaltyCard(selected);

View File

@@ -5,6 +5,7 @@ import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.graphics.drawable.Icon;
import android.os.Build;
@@ -27,12 +28,19 @@ public class CardsOnPowerScreenService extends ControlsProviderService {
public static final String PREFIX = "catima-";
static final String TAG = "Catima";
private final DBHelper dbHelper = new DBHelper(this);
private SQLiteDatabase mDatabase;
@Override
public void onCreate() {
super.onCreate();
mDatabase = new DBHelper(this).getReadableDatabase();
}
@NonNull
@Override
public Flow.Publisher<Control> createPublisherForAllAvailable() {
Cursor loyaltyCardCursor = dbHelper.getLoyaltyCardCursor();
Cursor loyaltyCardCursor = DBHelper.getLoyaltyCardCursor(mDatabase);
return subscriber -> {
while (loyaltyCardCursor.moveToNext()) {
LoyaltyCard card = LoyaltyCard.toLoyaltyCard(loyaltyCardCursor);
@@ -64,7 +72,7 @@ public class CardsOnPowerScreenService extends ControlsProviderService {
try {
Integer cardId = this.controlIdToCardId(controlId);
LoyaltyCard card = dbHelper.getLoyaltyCard(cardId);
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, cardId);
Intent openIntent = new Intent(this, LoyaltyCardViewActivity.class)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
.putExtra("id", card.id);

View File

@@ -1,53 +1,13 @@
package protect.card_locker;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.util.TypedValue;
import java.util.HashMap;
import androidx.appcompat.app.AppCompatActivity;
import androidx.preference.PreferenceManager;
public class CatimaAppCompatActivity extends AppCompatActivity {
SharedPreferences pref;
HashMap<String, Integer> supportedThemes;
@Override
protected void attachBaseContext(Context base) {
// Apply chosen language
super.attachBaseContext(Utils.updateBaseContextLocale(base));
}
@Override
public Resources.Theme getTheme() {
if (supportedThemes == null) {
supportedThemes = new HashMap<>();
supportedThemes.put(getString(R.string.settings_key_blue_theme), R.style.AppTheme_blue);
supportedThemes.put(getString(R.string.settings_key_brown_theme), R.style.AppTheme_brown);
supportedThemes.put(getString(R.string.settings_key_green_theme), R.style.AppTheme_green);
supportedThemes.put(getString(R.string.settings_key_grey_theme), R.style.AppTheme_grey);
supportedThemes.put(getString(R.string.settings_key_magenta_theme), R.style.AppTheme_magenta);
supportedThemes.put(getString(R.string.settings_key_pink_theme), R.style.AppTheme_pink);
supportedThemes.put(getString(R.string.settings_key_sky_blue_theme), R.style.AppTheme_sky_blue);
supportedThemes.put(getString(R.string.settings_key_violet_theme), R.style.AppTheme_violet);
}
Resources.Theme theme = super.getTheme();
pref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
String themeName = pref.getString(getString(R.string.setting_key_theme_color), getString(R.string.settings_key_catima_theme));
theme.applyStyle(Utils.mapGetOrDefault(supportedThemes, themeName, R.style.AppTheme_NoActionBar), true);
return theme;
}
public int getThemeColor() {
TypedValue typedValue = new TypedValue();
Resources.Theme theme = getTheme();
theme.resolveAttribute(R.attr.colorPrimary, typedValue, true);
return typedValue.data;
}
}

View File

@@ -10,6 +10,7 @@ public class CatimaBarcode {
public static final List<BarcodeFormat> barcodeFormats = Collections.unmodifiableList(Arrays.asList(
BarcodeFormat.AZTEC,
BarcodeFormat.CODE_39,
BarcodeFormat.CODE_93,
BarcodeFormat.CODE_128,
BarcodeFormat.CODABAR,
BarcodeFormat.DATA_MATRIX,
@@ -25,6 +26,7 @@ public class CatimaBarcode {
public static final List<String> barcodePrettyNames = Collections.unmodifiableList(Arrays.asList(
"Aztec",
"Code 39",
"Code 93",
"Code 128",
"Codabar",
"Data Matrix",

View File

@@ -111,7 +111,6 @@ public class DBHelper extends SQLiteOpenHelper {
"tokenize=unicode61);");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (oldVersion < 2 && newVersion >= 2) {
@@ -305,7 +304,7 @@ public class DBHelper extends SQLiteOpenHelper {
}
}
private ContentValues generateFTSContentValues(final int id, final String store, final String note) {
private static ContentValues generateFTSContentValues(final int id, final String store, final String note) {
// FTS on Android is severely limited and can only search for word starting with a certain string
// So for each word, we grab every single substring
// This makes it possible to find Décathlon by searching both de and cat, for example
@@ -337,22 +336,21 @@ public class DBHelper extends SQLiteOpenHelper {
return ftsContentValues;
}
private void insertFTS(final SQLiteDatabase db, final int id, final String store, final String note) {
private static void insertFTS(final SQLiteDatabase db, final int id, final String store, final String note) {
db.insert(LoyaltyCardDbFTS.TABLE, null, generateFTSContentValues(id, store, note));
}
private void updateFTS(final SQLiteDatabase db, final int id, final String store, final String note) {
private static void updateFTS(final SQLiteDatabase db, final int id, final String store, final String note) {
db.update(LoyaltyCardDbFTS.TABLE, generateFTSContentValues(id, store, note),
whereAttrs(LoyaltyCardDbFTS.ID), withArgs(id));
}
public long insertLoyaltyCard(final String store, final String note, final Date expiry,
final BigDecimal balance, final Currency balanceType,
final String cardId, final String barcodeId,
final CatimaBarcode barcodeType, final Integer headerColor,
final int starStatus, final Long lastUsed) {
SQLiteDatabase db = getWritableDatabase();
db.beginTransaction();
public static long insertLoyaltyCard(
final SQLiteDatabase database, final String store, final String note, final Date expiry,
final BigDecimal balance, final Currency balanceType, final String cardId,
final String barcodeId, final CatimaBarcode barcodeType, final Integer headerColor,
final int starStatus, final Long lastUsed) {
database.beginTransaction();
// Card
ContentValues contentValues = new ContentValues();
@@ -367,56 +365,23 @@ public class DBHelper extends SQLiteOpenHelper {
contentValues.put(LoyaltyCardDbIds.HEADER_COLOR, headerColor);
contentValues.put(LoyaltyCardDbIds.STAR_STATUS, starStatus);
contentValues.put(LoyaltyCardDbIds.LAST_USED, lastUsed != null ? lastUsed : Utils.getUnixTime());
long id = db.insert(LoyaltyCardDbIds.TABLE, null, contentValues);
long id = database.insert(LoyaltyCardDbIds.TABLE, null, contentValues);
// FTS
insertFTS(db, (int) id, store, note);
insertFTS(database, (int) id, store, note);
db.setTransactionSuccessful();
db.endTransaction();
database.setTransactionSuccessful();
database.endTransaction();
return id;
}
public long insertLoyaltyCard(final SQLiteDatabase db, final String store,
final String note, final Date expiry, final BigDecimal balance,
final Currency balanceType, final String cardId,
final String barcodeId, final CatimaBarcode barcodeType,
final Integer headerColor, final int starStatus,
final Long lastUsed) {
db.beginTransaction();
// Card
ContentValues contentValues = new ContentValues();
contentValues.put(LoyaltyCardDbIds.STORE, store);
contentValues.put(LoyaltyCardDbIds.NOTE, note);
contentValues.put(LoyaltyCardDbIds.EXPIRY, expiry != null ? expiry.getTime() : null);
contentValues.put(LoyaltyCardDbIds.BALANCE, balance.toString());
contentValues.put(LoyaltyCardDbIds.BALANCE_TYPE, balanceType != null ? balanceType.getCurrencyCode() : null);
contentValues.put(LoyaltyCardDbIds.CARD_ID, cardId);
contentValues.put(LoyaltyCardDbIds.BARCODE_ID, barcodeId);
contentValues.put(LoyaltyCardDbIds.BARCODE_TYPE, barcodeType != null ? barcodeType.name() : null);
contentValues.put(LoyaltyCardDbIds.HEADER_COLOR, headerColor);
contentValues.put(LoyaltyCardDbIds.STAR_STATUS, starStatus);
contentValues.put(LoyaltyCardDbIds.LAST_USED, lastUsed != null ? lastUsed : Utils.getUnixTime());
long id = db.insert(LoyaltyCardDbIds.TABLE, null, contentValues);
// FTS
insertFTS(db, (int) id, store, note);
db.setTransactionSuccessful();
db.endTransaction();
return id;
}
public long insertLoyaltyCard(final SQLiteDatabase db, final int id, final String store,
final String note, final Date expiry, final BigDecimal balance,
final Currency balanceType, final String cardId,
final String barcodeId, final CatimaBarcode barcodeType,
final Integer headerColor, final int starStatus,
final Long lastUsed) {
db.beginTransaction();
public static long insertLoyaltyCard(
final SQLiteDatabase database, final int id, final String store, final String note,
final Date expiry, final BigDecimal balance, final Currency balanceType,
final String cardId, final String barcodeId, final CatimaBarcode barcodeType,
final Integer headerColor, final int starStatus, final Long lastUsed) {
database.beginTransaction();
// Card
ContentValues contentValues = new ContentValues();
@@ -432,24 +397,23 @@ public class DBHelper extends SQLiteOpenHelper {
contentValues.put(LoyaltyCardDbIds.HEADER_COLOR, headerColor);
contentValues.put(LoyaltyCardDbIds.STAR_STATUS, starStatus);
contentValues.put(LoyaltyCardDbIds.LAST_USED, lastUsed != null ? lastUsed : Utils.getUnixTime());
db.insert(LoyaltyCardDbIds.TABLE, null, contentValues);
database.insert(LoyaltyCardDbIds.TABLE, null, contentValues);
// FTS
insertFTS(db, id, store, note);
insertFTS(database, id, store, note);
db.setTransactionSuccessful();
db.endTransaction();
database.setTransactionSuccessful();
database.endTransaction();
return id;
}
public boolean updateLoyaltyCard(final int id, final String store, final String note,
final Date expiry, final BigDecimal balance,
final Currency balanceType, final String cardId,
final String barcodeId, final CatimaBarcode barcodeType,
final Integer headerColor) {
SQLiteDatabase db = getWritableDatabase();
db.beginTransaction();
public static boolean updateLoyaltyCard(
SQLiteDatabase database, final int id, final String store, final String note,
final Date expiry, final BigDecimal balance, final Currency balanceType,
final String cardId, final String barcodeId, final CatimaBarcode barcodeType,
final Integer headerColor) {
database.beginTransaction();
// Card
ContentValues contentValues = new ContentValues();
@@ -462,53 +426,49 @@ public class DBHelper extends SQLiteOpenHelper {
contentValues.put(LoyaltyCardDbIds.BARCODE_ID, barcodeId);
contentValues.put(LoyaltyCardDbIds.BARCODE_TYPE, barcodeType != null ? barcodeType.name() : null);
contentValues.put(LoyaltyCardDbIds.HEADER_COLOR, headerColor);
int rowsUpdated = db.update(LoyaltyCardDbIds.TABLE, contentValues,
int rowsUpdated = database.update(LoyaltyCardDbIds.TABLE, contentValues,
whereAttrs(LoyaltyCardDbIds.ID), withArgs(id));
// FTS
updateFTS(db, id, store, note);
updateFTS(database, id, store, note);
db.setTransactionSuccessful();
db.endTransaction();
database.setTransactionSuccessful();
database.endTransaction();
return (rowsUpdated == 1);
}
public boolean updateLoyaltyCardStarStatus(final int id, final int starStatus) {
SQLiteDatabase db = getWritableDatabase();
public static boolean updateLoyaltyCardStarStatus(SQLiteDatabase database, final int id, final int starStatus) {
ContentValues contentValues = new ContentValues();
contentValues.put(LoyaltyCardDbIds.STAR_STATUS, starStatus);
int rowsUpdated = db.update(LoyaltyCardDbIds.TABLE, contentValues,
int rowsUpdated = database.update(LoyaltyCardDbIds.TABLE, contentValues,
whereAttrs(LoyaltyCardDbIds.ID),
withArgs(id));
return (rowsUpdated == 1);
}
public boolean updateLoyaltyCardLastUsed(final int id) {
SQLiteDatabase db = getWritableDatabase();
public static boolean updateLoyaltyCardLastUsed(SQLiteDatabase database, final int id) {
ContentValues contentValues = new ContentValues();
contentValues.put(LoyaltyCardDbIds.LAST_USED, System.currentTimeMillis() / 1000);
int rowsUpdated = db.update(LoyaltyCardDbIds.TABLE, contentValues,
int rowsUpdated = database.update(LoyaltyCardDbIds.TABLE, contentValues,
whereAttrs(LoyaltyCardDbIds.ID),
withArgs(id));
return (rowsUpdated == 1);
}
public boolean updateLoyaltyCardZoomLevel(int loyaltyCardId, int zoomLevel) {
SQLiteDatabase db = getWritableDatabase();
public static boolean updateLoyaltyCardZoomLevel(SQLiteDatabase database, int loyaltyCardId, int zoomLevel) {
ContentValues contentValues = new ContentValues();
contentValues.put(LoyaltyCardDbIds.ZOOM_LEVEL, zoomLevel);
Log.d("updateLoyaltyCardZLevel", "Card Id = " + loyaltyCardId + " Zoom level= " + zoomLevel);
int rowsUpdated = db.update(LoyaltyCardDbIds.TABLE, contentValues,
int rowsUpdated = database.update(LoyaltyCardDbIds.TABLE, contentValues,
whereAttrs(LoyaltyCardDbIds.ID),
withArgs(loyaltyCardId));
Log.d("updateLoyaltyCardZLevel", "Rows changed = " + rowsUpdated);
return (rowsUpdated == 1);
}
public LoyaltyCard getLoyaltyCard(final int id) {
SQLiteDatabase db = getReadableDatabase();
Cursor data = db.query(LoyaltyCardDbIds.TABLE, null, whereAttrs(LoyaltyCardDbIds.ID), withArgs(id), null, null, null);
public static LoyaltyCard getLoyaltyCard(SQLiteDatabase database, final int id) {
Cursor data = database.query(LoyaltyCardDbIds.TABLE, null, whereAttrs(LoyaltyCardDbIds.ID), withArgs(id), null, null, null);
LoyaltyCard card = null;
@@ -522,9 +482,8 @@ public class DBHelper extends SQLiteOpenHelper {
return card;
}
public List<Group> getLoyaltyCardGroups(final int id) {
SQLiteDatabase db = getReadableDatabase();
Cursor data = db.rawQuery("select * from " + LoyaltyCardDbGroups.TABLE + " g " +
public static List<Group> getLoyaltyCardGroups(SQLiteDatabase database, final int id) {
Cursor data = database.rawQuery("select * from " + LoyaltyCardDbGroups.TABLE + " g " +
" LEFT JOIN " + LoyaltyCardDbIdsGroups.TABLE + " ig ON ig." + LoyaltyCardDbIdsGroups.groupID + " = g." + LoyaltyCardDbGroups.ID +
" where " + LoyaltyCardDbIdsGroups.cardID + "=?" +
" ORDER BY " + LoyaltyCardDbIdsGroups.groupID, withArgs(id));
@@ -547,11 +506,9 @@ public class DBHelper extends SQLiteOpenHelper {
return groups;
}
public void setLoyaltyCardGroups(final int id, List<Group> groups) {
SQLiteDatabase db = getWritableDatabase();
public static void setLoyaltyCardGroups(SQLiteDatabase database, final int id, List<Group> groups) {
// First delete lookup table entries associated with this card
db.delete(LoyaltyCardDbIdsGroups.TABLE,
database.delete(LoyaltyCardDbIdsGroups.TABLE,
whereAttrs(LoyaltyCardDbIdsGroups.cardID),
withArgs(id));
@@ -560,39 +517,23 @@ public class DBHelper extends SQLiteOpenHelper {
ContentValues contentValues = new ContentValues();
contentValues.put(LoyaltyCardDbIdsGroups.cardID, id);
contentValues.put(LoyaltyCardDbIdsGroups.groupID, group._id);
db.insert(LoyaltyCardDbIdsGroups.TABLE, null, contentValues);
database.insert(LoyaltyCardDbIdsGroups.TABLE, null, contentValues);
}
}
public void setLoyaltyCardGroups(final SQLiteDatabase db, final int id, List<Group> groups) {
// First delete lookup table entries associated with this card
db.delete(LoyaltyCardDbIdsGroups.TABLE,
whereAttrs(LoyaltyCardDbIdsGroups.cardID),
withArgs(id));
// Then create entries for selected values
for (Group group : groups) {
ContentValues contentValues = new ContentValues();
contentValues.put(LoyaltyCardDbIdsGroups.cardID, id);
contentValues.put(LoyaltyCardDbIdsGroups.groupID, group._id);
db.insert(LoyaltyCardDbIdsGroups.TABLE, null, contentValues);
}
}
public boolean deleteLoyaltyCard(Context context, final int id) {
SQLiteDatabase db = getWritableDatabase();
public static boolean deleteLoyaltyCard(SQLiteDatabase database, Context context, final int id) {
// Delete card
int rowsDeleted = db.delete(LoyaltyCardDbIds.TABLE,
int rowsDeleted = database.delete(LoyaltyCardDbIds.TABLE,
whereAttrs(LoyaltyCardDbIds.ID),
withArgs(id));
// And delete lookup table entries associated with this card
db.delete(LoyaltyCardDbIdsGroups.TABLE,
database.delete(LoyaltyCardDbIdsGroups.TABLE,
whereAttrs(LoyaltyCardDbIdsGroups.cardID),
withArgs(id));
// Delete FTS table entries
db.delete(LoyaltyCardDbFTS.TABLE,
database.delete(LoyaltyCardDbFTS.TABLE,
whereAttrs(LoyaltyCardDbFTS.ID),
withArgs(id));
@@ -608,9 +549,9 @@ public class DBHelper extends SQLiteOpenHelper {
return (rowsDeleted == 1);
}
public Cursor getLoyaltyCardCursor() {
public static Cursor getLoyaltyCardCursor(SQLiteDatabase database) {
// An empty string will match everything
return getLoyaltyCardCursor("");
return getLoyaltyCardCursor(database, "");
}
/**
@@ -619,8 +560,8 @@ public class DBHelper extends SQLiteOpenHelper {
* @param filter
* @return Cursor
*/
public Cursor getLoyaltyCardCursor(final String filter) {
return getLoyaltyCardCursor(filter, null);
public static Cursor getLoyaltyCardCursor(SQLiteDatabase database, final String filter) {
return getLoyaltyCardCursor(database, filter, null);
}
/**
@@ -630,8 +571,8 @@ public class DBHelper extends SQLiteOpenHelper {
* @param group
* @return Cursor
*/
public Cursor getLoyaltyCardCursor(final String filter, Group group) {
return getLoyaltyCardCursor(filter, group, LoyaltyCardOrder.Alpha, LoyaltyCardOrderDirection.Ascending);
public static Cursor getLoyaltyCardCursor(SQLiteDatabase database, final String filter, Group group) {
return getLoyaltyCardCursor(database, filter, group, LoyaltyCardOrder.Alpha, LoyaltyCardOrderDirection.Ascending);
}
/**
@@ -642,14 +583,12 @@ public class DBHelper extends SQLiteOpenHelper {
* @param order
* @return Cursor
*/
public Cursor getLoyaltyCardCursor(String filter, Group group, LoyaltyCardOrder order, LoyaltyCardOrderDirection direction) {
public static Cursor getLoyaltyCardCursor(SQLiteDatabase database, String filter, Group group, LoyaltyCardOrder order, LoyaltyCardOrderDirection direction) {
StringBuilder groupFilter = new StringBuilder();
String limitString = "";
SQLiteDatabase db = getReadableDatabase();
if (group != null) {
List<Integer> allowedIds = getGroupCardIds(group._id);
List<Integer> allowedIds = getGroupCardIds(database, group._id);
// Empty group
if (!allowedIds.isEmpty()) {
@@ -669,7 +608,7 @@ public class DBHelper extends SQLiteOpenHelper {
String orderField = getFieldForOrder(order);
return db.rawQuery("SELECT " + LoyaltyCardDbIds.TABLE + ".* FROM " + LoyaltyCardDbIds.TABLE +
return database.rawQuery("SELECT " + LoyaltyCardDbIds.TABLE + ".* FROM " + LoyaltyCardDbIds.TABLE +
" JOIN " + LoyaltyCardDbFTS.TABLE +
" ON " + LoyaltyCardDbFTS.TABLE + "." + LoyaltyCardDbFTS.ID + " = " + LoyaltyCardDbIds.TABLE + "." + LoyaltyCardDbIds.ID +
(filter.trim().isEmpty() ? " " : " AND " + LoyaltyCardDbFTS.TABLE + " MATCH ? ") +
@@ -686,9 +625,8 @@ public class DBHelper extends SQLiteOpenHelper {
*
* @return Integer
*/
public int getLoyaltyCardCount() {
SQLiteDatabase db = getReadableDatabase();
return (int) DatabaseUtils.queryNumEntries(db, LoyaltyCardDbIds.TABLE);
public static int getLoyaltyCardCount(SQLiteDatabase database) {
return (int) DatabaseUtils.queryNumEntries(database, LoyaltyCardDbIds.TABLE);
}
/**
@@ -696,15 +634,13 @@ public class DBHelper extends SQLiteOpenHelper {
*
* @return Cursor
*/
public Cursor getGroupCursor() {
SQLiteDatabase db = getReadableDatabase();
return db.rawQuery("select * from " + LoyaltyCardDbGroups.TABLE +
public static Cursor getGroupCursor(SQLiteDatabase database) {
return database.rawQuery("select * from " + LoyaltyCardDbGroups.TABLE +
" ORDER BY " + LoyaltyCardDbGroups.ORDER + " ASC," + LoyaltyCardDbGroups.ID + " COLLATE NOCASE ASC", null, null);
}
public List<Group> getGroups() {
Cursor data = getGroupCursor();
public static List<Group> getGroups(SQLiteDatabase database) {
Cursor data = getGroupCursor(database);
List<Group> groups = new ArrayList<>();
@@ -722,15 +658,14 @@ public class DBHelper extends SQLiteOpenHelper {
return groups;
}
public void reorderGroups(final List<Group> groups) {
public static void reorderGroups(SQLiteDatabase database, final List<Group> groups) {
Integer order = 0;
SQLiteDatabase db = getWritableDatabase();
for (Group group : groups) {
ContentValues contentValues = new ContentValues();
contentValues.put(LoyaltyCardDbGroups.ORDER, order);
db.update(LoyaltyCardDbGroups.TABLE, contentValues,
database.update(LoyaltyCardDbGroups.TABLE, contentValues,
whereAttrs(LoyaltyCardDbGroups.ID),
withArgs(group._id));
@@ -738,9 +673,8 @@ public class DBHelper extends SQLiteOpenHelper {
}
}
public Group getGroup(final String groupName) {
SQLiteDatabase db = getReadableDatabase();
Cursor data = db.query(LoyaltyCardDbGroups.TABLE, null,
public static Group getGroup(SQLiteDatabase database, final String groupName) {
Cursor data = database.query(LoyaltyCardDbGroups.TABLE, null,
whereAttrs(LoyaltyCardDbGroups.ID), withArgs(groupName), null, null, null);
Group group = null;
@@ -753,14 +687,12 @@ public class DBHelper extends SQLiteOpenHelper {
return group;
}
public int getGroupCount() {
SQLiteDatabase db = getReadableDatabase();
return (int) DatabaseUtils.queryNumEntries(db, LoyaltyCardDbGroups.TABLE);
public static int getGroupCount(SQLiteDatabase database) {
return (int) DatabaseUtils.queryNumEntries(database, LoyaltyCardDbGroups.TABLE);
}
public List<Integer> getGroupCardIds(final String groupName) {
SQLiteDatabase db = getReadableDatabase();
Cursor data = db.query(LoyaltyCardDbIdsGroups.TABLE, withArgs(LoyaltyCardDbIdsGroups.cardID),
public static List<Integer> getGroupCardIds(SQLiteDatabase database, final String groupName) {
Cursor data = database.query(LoyaltyCardDbIdsGroups.TABLE, withArgs(LoyaltyCardDbIdsGroups.cardID),
whereAttrs(LoyaltyCardDbIdsGroups.groupID), withArgs(groupName), null, null, null);
List<Integer> cardIds = new ArrayList<>();
@@ -779,99 +711,85 @@ public class DBHelper extends SQLiteOpenHelper {
return cardIds;
}
public long insertGroup(final String name) {
public static long insertGroup(SQLiteDatabase database, final String name) {
if (name.isEmpty()) return -1;
SQLiteDatabase db = getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(LoyaltyCardDbGroups.ID, name);
contentValues.put(LoyaltyCardDbGroups.ORDER, getGroupCount());
return db.insert(LoyaltyCardDbGroups.TABLE, null, contentValues);
contentValues.put(LoyaltyCardDbGroups.ORDER, getGroupCount(database));
return database.insert(LoyaltyCardDbGroups.TABLE, null, contentValues);
}
public boolean insertGroup(final SQLiteDatabase db, final String name) {
ContentValues contentValues = new ContentValues();
contentValues.put(LoyaltyCardDbGroups.ID, name);
contentValues.put(LoyaltyCardDbGroups.ORDER, getGroupCount());
final long newId = db.insert(LoyaltyCardDbGroups.TABLE, null, contentValues);
return newId != -1;
}
public boolean updateGroup(final String groupName, final String newName) {
public static boolean updateGroup(SQLiteDatabase database, final String groupName, final String newName) {
if (newName.isEmpty()) return false;
boolean success = false;
SQLiteDatabase db = getWritableDatabase();
ContentValues groupContentValues = new ContentValues();
groupContentValues.put(LoyaltyCardDbGroups.ID, newName);
ContentValues lookupContentValues = new ContentValues();
lookupContentValues.put(LoyaltyCardDbIdsGroups.groupID, newName);
db.beginTransaction();
database.beginTransaction();
try {
// Update group name
int groupsChanged = db.update(LoyaltyCardDbGroups.TABLE, groupContentValues,
int groupsChanged = database.update(LoyaltyCardDbGroups.TABLE, groupContentValues,
whereAttrs(LoyaltyCardDbGroups.ID),
withArgs(groupName));
// Also update lookup tables
db.update(LoyaltyCardDbIdsGroups.TABLE, lookupContentValues,
database.update(LoyaltyCardDbIdsGroups.TABLE, lookupContentValues,
whereAttrs(LoyaltyCardDbIdsGroups.groupID),
withArgs(groupName));
if (groupsChanged == 1) {
db.setTransactionSuccessful();
database.setTransactionSuccessful();
success = true;
}
} catch (SQLiteException e) {
} catch (SQLiteException ignored) {
} finally {
db.endTransaction();
database.endTransaction();
}
return success;
}
public boolean deleteGroup(final String groupName) {
public static boolean deleteGroup(SQLiteDatabase database, final String groupName) {
boolean success = false;
SQLiteDatabase db = getWritableDatabase();
db.beginTransaction();
database.beginTransaction();
try {
// Delete group
int groupsDeleted = db.delete(LoyaltyCardDbGroups.TABLE,
int groupsDeleted = database.delete(LoyaltyCardDbGroups.TABLE,
whereAttrs(LoyaltyCardDbGroups.ID),
withArgs(groupName));
// And delete lookup table entries associated with this group
db.delete(LoyaltyCardDbIdsGroups.TABLE,
database.delete(LoyaltyCardDbIdsGroups.TABLE,
whereAttrs(LoyaltyCardDbIdsGroups.groupID),
withArgs(groupName));
if (groupsDeleted == 1) {
db.setTransactionSuccessful();
database.setTransactionSuccessful();
success = true;
}
} finally {
db.endTransaction();
database.endTransaction();
}
// Reorder after delete to ensure no bad order IDs
reorderGroups(getGroups());
reorderGroups(database, getGroups(database));
return success;
}
public int getGroupCardCount(final String groupName) {
SQLiteDatabase db = getReadableDatabase();
return (int) DatabaseUtils.queryNumEntries(db, LoyaltyCardDbIdsGroups.TABLE,
public static int getGroupCardCount(SQLiteDatabase database, final String groupName) {
return (int) DatabaseUtils.queryNumEntries(database, LoyaltyCardDbIdsGroups.TABLE,
whereAttrs(LoyaltyCardDbIdsGroups.groupID), withArgs(groupName));
}
private String whereAttrs(String... attrs) {
static private String whereAttrs(String... attrs) {
if (attrs.length == 0) {
return null;
}
@@ -882,13 +800,13 @@ public class DBHelper extends SQLiteOpenHelper {
return whereClause.toString();
}
private String[] withArgs(Object... object) {
static private String[] withArgs(Object... object) {
return Arrays.stream(object)
.map(String::valueOf)
.toArray(String[]::new);
}
private String getFieldForOrder(LoyaltyCardOrder order) {
private static String getFieldForOrder(LoyaltyCardOrder order) {
if (order == LoyaltyCardOrder.Alpha) {
return LoyaltyCardDbIds.STORE;
}
@@ -904,7 +822,7 @@ public class DBHelper extends SQLiteOpenHelper {
throw new IllegalArgumentException("Unknown order " + order);
}
private String getDbDirection(LoyaltyCardOrder order, LoyaltyCardOrderDirection direction) {
private static String getDbDirection(LoyaltyCardOrder order, LoyaltyCardOrderDirection direction) {
if (order == LoyaltyCardOrder.LastUsed) {
// We want the default sorting to put the most recently used first
return direction == LoyaltyCardOrderDirection.Descending ? "ASC" : "DESC";

View File

@@ -2,6 +2,7 @@ package protect.card_locker;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -16,7 +17,7 @@ public class GroupCursorAdapter extends BaseCursorAdapter<GroupCursorAdapter.Gro
Settings mSettings;
private final Context mContext;
private final GroupAdapterListener mListener;
DBHelper mDb;
SQLiteDatabase mDatabase;
public GroupCursorAdapter(Context inputContext, Cursor inputCursor, GroupAdapterListener inputListener) {
super(inputCursor, DBHelper.LoyaltyCardDbGroups.ORDER);
@@ -24,7 +25,7 @@ public class GroupCursorAdapter extends BaseCursorAdapter<GroupCursorAdapter.Gro
mSettings = new Settings(inputContext);
mContext = inputContext.getApplicationContext();
mListener = inputListener;
mDb = new DBHelper(inputContext);
mDatabase = new DBHelper(inputContext).getReadableDatabase();
swapCursor(inputCursor);
}
@@ -41,7 +42,7 @@ public class GroupCursorAdapter extends BaseCursorAdapter<GroupCursorAdapter.Gro
inputHolder.mName.setText(group._id);
int groupCardCount = mDb.getGroupCardCount(group._id);
int groupCardCount = DBHelper.getGroupCardCount(mDatabase, group._id);
inputHolder.mCardCount.setText(mContext.getResources().getQuantityString(R.plurals.groupCardCount, groupCardCount, groupCardCount));
inputHolder.mName.setTextSize(mSettings.getFontSizeMax(mSettings.getMediumFont()));

View File

@@ -4,6 +4,7 @@ import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import java.io.IOException;
@@ -59,20 +60,20 @@ public class ImportExportTask implements CompatCallable<ImportExportResult> {
this.listener = listener;
}
private ImportExportResult performImport(Context context, InputStream stream, DBHelper db, char[] password) {
ImportExportResult importResult = MultiFormatImporter.importData(context, db, stream, format, password);
private ImportExportResult performImport(Context context, InputStream stream, SQLiteDatabase database, char[] password) {
ImportExportResult importResult = MultiFormatImporter.importData(context, database, stream, format, password);
Log.i(TAG, "Import result: " + importResult.name());
return importResult;
}
private ImportExportResult performExport(Context context, OutputStream stream, DBHelper db, char[] password) {
private ImportExportResult performExport(Context context, OutputStream stream, SQLiteDatabase database, char[] password) {
ImportExportResult result = ImportExportResult.GenericFailure;
try {
OutputStreamWriter writer = new OutputStreamWriter(stream, StandardCharsets.UTF_8);
result = MultiFormatExporter.exportData(context, db, stream, format, password);
result = MultiFormatExporter.exportData(context, database, stream, format, password);
writer.close();
} catch (IOException e) {
Log.e(TAG, "Unable to export file", e);
@@ -98,15 +99,17 @@ public class ImportExportTask implements CompatCallable<ImportExportResult> {
}
protected ImportExportResult doInBackground(Void... nothing) {
final DBHelper db = new DBHelper(activity);
final SQLiteDatabase database = new DBHelper(activity).getWritableDatabase();
ImportExportResult result;
if (doImport) {
result = performImport(activity.getApplicationContext(), inputStream, db, password);
result = performImport(activity.getApplicationContext(), inputStream, database, password);
} else {
result = performExport(activity.getApplicationContext(), outputStream, db, password);
result = performExport(activity.getApplicationContext(), outputStream, database, password);
}
database.close();
return result;
}

View File

@@ -15,6 +15,7 @@ import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.core.content.ContextCompat;
import androidx.core.graphics.BlendModeColorFilterCompat;
import androidx.core.graphics.BlendModeCompat;
@@ -25,6 +26,8 @@ import com.google.android.material.card.MaterialCardView;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Currency;
import java.util.Date;
import protect.card_locker.preferences.Settings;
@@ -77,59 +80,28 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
// Invisible until we want to show something more
inputHolder.mDivider.setVisibility(View.GONE);
int size = mSettings.getFontSizeMax(mSettings.getSmallFont());
if (mDarkModeEnabled) {
inputHolder.mStarIcon.setColorFilter(BlendModeColorFilterCompat.createBlendModeColorFilterCompat(Color.WHITE, BlendModeCompat.SRC_ATOP));
}
LoyaltyCard loyaltyCard = LoyaltyCard.toLoyaltyCard(inputCursor);
inputHolder.mStoreField.setText(loyaltyCard.store);
inputHolder.mStoreField.setTextSize(mSettings.getFontSizeMax(mSettings.getMediumFont()));
inputHolder.setStoreField(loyaltyCard.store);
if (mShowDetails && !loyaltyCard.note.isEmpty()) {
inputHolder.mNoteField.setVisibility(View.VISIBLE);
inputHolder.mNoteField.setText(loyaltyCard.note);
inputHolder.mNoteField.setTextSize(size);
inputHolder.setNoteField(loyaltyCard.note);
} else {
inputHolder.mNoteField.setVisibility(View.GONE);
inputHolder.setNoteField(null);
}
if (mShowDetails && !loyaltyCard.balance.equals(new BigDecimal("0"))) {
int drawableSize = dpToPx((size * 24) / 14, mContext);
inputHolder.mDivider.setVisibility(View.VISIBLE);
inputHolder.mBalanceField.setVisibility(View.VISIBLE);
Drawable balanceIcon = inputHolder.mBalanceField.getCompoundDrawables()[0];
balanceIcon.setBounds(0, 0, drawableSize, drawableSize);
inputHolder.mBalanceField.setCompoundDrawablesRelative(balanceIcon, null, null, null);
if (mDarkModeEnabled) {
balanceIcon.setColorFilter(BlendModeColorFilterCompat.createBlendModeColorFilterCompat(Color.WHITE, BlendModeCompat.SRC_ATOP));
}
inputHolder.mBalanceField.setText(Utils.formatBalance(mContext, loyaltyCard.balance, loyaltyCard.balanceType));
inputHolder.mBalanceField.setTextSize(size);
inputHolder.setBalanceField(loyaltyCard.balance, loyaltyCard.balanceType);
} else {
inputHolder.mBalanceField.setVisibility(View.GONE);
inputHolder.setBalanceField(null, null);
}
if (mShowDetails && loyaltyCard.expiry != null) {
int drawableSize = dpToPx((size * 24) / 14, mContext);
inputHolder.mDivider.setVisibility(View.VISIBLE);
inputHolder.mExpiryField.setVisibility(View.VISIBLE);
Drawable expiryIcon = inputHolder.mExpiryField.getCompoundDrawables()[0];
expiryIcon.setBounds(0, 0, drawableSize, drawableSize);
inputHolder.mExpiryField.setCompoundDrawablesRelative(expiryIcon, null, null, null);
if (Utils.hasExpired(loyaltyCard.expiry)) {
expiryIcon.setColorFilter(BlendModeColorFilterCompat.createBlendModeColorFilterCompat(Color.RED, BlendModeCompat.SRC_ATOP));
inputHolder.mExpiryField.setTextColor(Color.RED);
} else if (mDarkModeEnabled) {
expiryIcon.setColorFilter(BlendModeColorFilterCompat.createBlendModeColorFilterCompat(Color.WHITE, BlendModeCompat.SRC_ATOP));
}
inputHolder.mExpiryField.setText(DateFormat.getDateInstance(DateFormat.LONG).format(loyaltyCard.expiry));
inputHolder.mExpiryField.setTextSize(size);
inputHolder.setExpiryField(loyaltyCard.expiry);
} else {
inputHolder.mExpiryField.setVisibility(View.GONE);
inputHolder.setExpiryField(null);
}
setHeaderHeight(inputHolder, mShowDetails);
Bitmap cardIcon = Utils.retrieveCardImage(mContext, loyaltyCard.id, ImageLocationType.icon);
if (cardIcon != null) {
inputHolder.mCardIcon.setImageBitmap(cardIcon);
@@ -138,9 +110,9 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
inputHolder.mCardIcon.setImageBitmap(Utils.generateIcon(mContext, loyaltyCard.store, loyaltyCard.headerColor).getLetterTile());
inputHolder.mCardIcon.setScaleType(ImageView.ScaleType.FIT_CENTER);
}
inputHolder.mIconLayout.setBackgroundColor(loyaltyCard.headerColor != null ? loyaltyCard.headerColor : ContextCompat.getColor(mContext, R.color.colorPrimary));
inputHolder.setIconBackgroundColor(loyaltyCard.headerColor != null ? loyaltyCard.headerColor : R.attr.colorPrimary);
inputHolder.mStarIcon.setVisibility(loyaltyCard.starStatus != 0 ? View.VISIBLE : View.GONE);
inputHolder.toggleStar(loyaltyCard.starStatus != 0, itemSelected(inputCursor.getPosition()));
inputHolder.itemView.setActivated(mSelectedItems.get(inputCursor.getPosition(), false));
applyIconAnimation(inputHolder, inputCursor.getPosition());
@@ -150,6 +122,19 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
inputHolder.mRow.requestLayout();
}
private void setHeaderHeight(LoyaltyCardListItemViewHolder inputHolder, boolean expanded) {
int iconHeight;
if (expanded) {
iconHeight = ViewGroup.LayoutParams.MATCH_PARENT;
} else {
iconHeight = (int) mContext.getResources().getDimension(R.dimen.cardThumbnailSize);
}
inputHolder.mIconLayout.getLayoutParams().height = expanded ? 0 : iconHeight;
inputHolder.mCardIcon.getLayoutParams().height = iconHeight;
inputHolder.mTickIcon.getLayoutParams().height = iconHeight;
}
private void applyClickEvents(LoyaltyCardListItemViewHolder inputHolder, final int inputPosition) {
inputHolder.mRow.setOnClickListener(inputView -> mListener.onRowClicked(inputPosition));
@@ -160,8 +145,12 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
});
}
private boolean itemSelected(int inputPosition) {
return mSelectedItems.get(inputPosition, false);
}
private void applyIconAnimation(LoyaltyCardListItemViewHolder inputHolder, int inputPosition) {
if (mSelectedItems.get(inputPosition, false)) {
if (itemSelected(inputPosition)) {
inputHolder.mCardIcon.setVisibility(View.GONE);
inputHolder.mTickIcon.setVisibility(View.VISIBLE);
if (mCurrentSelectedIndex == inputPosition) {
@@ -221,25 +210,30 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
void onRowLongClicked(int inputPosition);
}
public static class LoyaltyCardListItemViewHolder extends RecyclerView.ViewHolder {
public class LoyaltyCardListItemViewHolder extends RecyclerView.ViewHolder {
public TextView mStoreField, mNoteField, mBalanceField, mExpiryField;
public ImageView mCardIcon, mStarIcon, mTickIcon;
public MaterialCardView mIconLayout, mRow;
public ImageView mCardIcon, mStarBackground, mStarBorder, mTickIcon;
public MaterialCardView mRow, mIconLayout;
public ConstraintLayout mStar;
public View mDivider;
public LoyaltyCardListItemViewHolder(View inputView, CardAdapterListener inputListener) {
private int mIconBackgroundColor;
protected LoyaltyCardListItemViewHolder(View inputView, CardAdapterListener inputListener) {
super(inputView);
mRow = inputView.findViewById(R.id.row);
mIconLayout = inputView.findViewById(R.id.icon_layout);
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);
mStarIcon = inputView.findViewById(R.id.star);
mStar = inputView.findViewById(R.id.star);
mStarBackground = inputView.findViewById(R.id.star_background);
mStarBorder = inputView.findViewById(R.id.star_border);
mTickIcon = inputView.findViewById(R.id.selected_thumbnail);
inputView.setOnLongClickListener(view -> {
inputListener.onRowClicked(getAdapterPosition());
@@ -247,6 +241,101 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
return true;
});
}
public void setStoreField(String text) {
mStoreField.setText(text);
mStoreField.setTextSize(mSettings.getFontSizeMax(mSettings.getMediumFont()));
mStoreField.requestLayout();
}
public void setNoteField(String text) {
if (text == null) {
mNoteField.setVisibility(View.GONE);
} else {
mNoteField.setVisibility(View.VISIBLE);
mNoteField.setText(text);
mNoteField.setTextSize(mSettings.getFontSizeMax(mSettings.getSmallFont()));
}
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];
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];
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));
mExpiryField.setTextColor(Color.RED);
} else if (mDarkModeEnabled) {
expiryIcon.setColorFilter(BlendModeColorFilterCompat.createBlendModeColorFilterCompat(Color.WHITE, BlendModeCompat.SRC_ATOP));
}
mExpiryField.setText(DateFormat.getDateInstance(DateFormat.LONG).format(expiry));
mExpiryField.setTextSize(size);
}
mExpiryField.requestLayout();
}
public void toggleStar(boolean enable, boolean colorByTheme) {
/* the below code does not work in android 5! hence the change of drawable instead
boolean needDarkForeground = Utils.needsDarkForeground(mIconBackgroundColor);
Drawable borderDrawable = mStarBorder.getDrawable().mutate();
Drawable backgroundDrawable = mStarBackground.getDrawable().mutate();
DrawableCompat.setTint(borderDrawable, needsDarkForeground ? Color.BLACK : Color.WHITE);
DrawableCompat.setTint(backgroundDrawable, needsDarkForeground ? Color.BLACK : Color.WHITE);
mStarBorder.setImageDrawable(borderDrawable);
mStarBackground.setImageDrawable(backgroundDrawable);
*/
boolean dark = Utils.needsDarkForeground(mIconBackgroundColor);
if (colorByTheme) {
dark = !mDarkModeEnabled;
}
if (dark) {
mStarBorder.setImageResource(R.drawable.ic_unstarred_white);
mStarBackground.setImageResource(R.drawable.ic_starred_black);
} else {
mStarBorder.setImageResource(R.drawable.ic_unstarred_black);
mStarBackground.setImageResource(R.drawable.ic_starred_white);
}
if (enable) {
mStar.setVisibility(View.VISIBLE);
} else {
mStar.setVisibility(View.GONE);
}
mStarBorder.invalidate();
mStarBackground.invalidate();
}
public void setIconBackgroundColor(int color) {
mIconBackgroundColor = color;
mCardIcon.setBackgroundColor(color);
}
}
public int dpToPx(int dp, Context mContext) {

View File

@@ -9,6 +9,7 @@ import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.res.TypedArray;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
@@ -73,6 +74,7 @@ import androidx.core.content.FileProvider;
import androidx.exifinterface.media.ExifInterface;
import androidx.fragment.app.DialogFragment;
import androidx.palette.graphics.Palette;
import protect.card_locker.async.TaskHandler;
public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
@@ -141,7 +143,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
Uri importLoyaltyCardUri = null;
DBHelper db;
SQLiteDatabase mDatabase;
ImportURIHelper importUriHelper;
boolean hasChanged = false;
@@ -151,7 +153,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
AlertDialog confirmExitDialog = null;
boolean validBalance = true;
Runnable warnOnInvalidBarcodeType;
Runnable barcodeImageGenerationFinishedCallback;
HashMap<String, Currency> currencies = new HashMap<>();
@@ -176,6 +178,16 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
final private TaskHandler mTasks = new TaskHandler();
// store system locale for Build.VERSION.SDK_INT < Build.VERSION_CODES.N
private Locale mSystemLocale;
@Override
protected void attachBaseContext(Context base) {
// store system locale
mSystemLocale = Locale.getDefault();
super.attachBaseContext(base);
}
private static LoyaltyCard updateTempState(LoyaltyCard loyaltyCard, LoyaltyCardField fieldName, Object value) {
return new LoyaltyCard(
(int) (fieldName == LoyaltyCardField.id ? value : loyaltyCard.id),
@@ -196,6 +208,10 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
private void updateTempState(LoyaltyCardField fieldName, Object value) {
tempLoyaltyCard = updateTempState(tempLoyaltyCard, fieldName, value);
if (initDone && (fieldName == LoyaltyCardField.cardId || fieldName == LoyaltyCardField.barcodeId || fieldName == LoyaltyCardField.barcodeType)) {
generateBarcode();
}
hasChanged = true;
}
@@ -211,7 +227,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
importLoyaltyCardUri = intent.getData();
Log.d(TAG, "View activity: id=" + loyaltyCardId
Log.d(TAG, "Edit activity: id=" + loyaltyCardId
+ ", updateLoyaltyCard=" + updateLoyaltyCard);
}
@@ -281,9 +297,10 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
actionBar.setDisplayHomeAsUpEnabled(true);
}
mDatabase = new DBHelper(this).getWritableDatabase();
extractIntentFields(getIntent());
db = new DBHelper(this);
importUriHelper = new ImportURIHelper(this);
for (Currency currency : Currency.getAvailableCurrencies()) {
@@ -310,11 +327,10 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
cardImageBack = findViewById(R.id.backImage);
enterButton = findViewById(R.id.enterButton);
cardImageFront.setBackgroundColor(getThemeColor());
cardImageBack.setBackgroundColor(getThemeColor());
warnOnInvalidBarcodeType = () -> {
barcodeImageGenerationFinishedCallback = () -> {
if (!(boolean) barcodeImage.getTag()) {
barcodeImageLayout.setVisibility(View.GONE);
Toast.makeText(LoyaltyCardEditActivity.this, getString(R.string.wrongValueForBarcodeType), Toast.LENGTH_LONG).show();
}
};
@@ -426,14 +442,14 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
LocaleList locales = getApplicationContext().getResources().getConfiguration().getLocales();
for (int i = locales.size() - 1; i > 0; i--) {
for (int i = locales.size() - 1; i >= 0; i--) {
Locale locale = locales.get(i);
String currencySymbol = Currency.getInstance(locale).getSymbol();
currencyList.remove(currencySymbol);
currencyList.add(0, currencySymbol);
}
} else {
String currencySymbol = Currency.getInstance(getApplicationContext().getResources().getConfiguration().locale).getSymbol();
String currencySymbol = Currency.getInstance(mSystemLocale).getSymbol();
currencyList.remove(currencySymbol);
currencyList.add(0, currencySymbol);
}
@@ -511,8 +527,6 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
} else {
updateTempState(LoyaltyCardField.barcodeId, s.toString());
}
generateOrHideBarcode();
}
@Override
@@ -543,8 +557,6 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
} catch (IllegalArgumentException e) {
}
}
generateOrHideBarcode();
}
}
@@ -656,7 +668,6 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
});
mCropperOptions = new UCrop.Options();
setCropperTheme();
}
// ucrop 2.2.6 initial aspect ratio is glitched when 0x0 is used as the initial ratio option
@@ -678,13 +689,6 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
);
}
private void setCropperTheme() {
mCropperOptions.setToolbarColor(getThemeColor());
mCropperOptions.setStatusBarColor(getThemeColor());
mCropperOptions.setToolbarWidgetColor(Color.WHITE);
mCropperOptions.setActiveControlsWidgetColor(getThemeColor());
}
@Override
public void onNewIntent(Intent intent) {
super.onNewIntent(intent);
@@ -729,7 +733,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
if (tempLoyaltyCard == null) {
if (updateLoyaltyCard) {
tempLoyaltyCard = db.getLoyaltyCard(loyaltyCardId);
tempLoyaltyCard = DBHelper.getLoyaltyCard(mDatabase, loyaltyCardId);
if (tempLoyaltyCard == null) {
Log.w(TAG, "Could not lookup loyalty card " + loyaltyCardId);
Toast.makeText(this, R.string.noCardExistsError, Toast.LENGTH_LONG).show();
@@ -792,9 +796,9 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
barcodeTypeField.setText(tempLoyaltyCard.barcodeType != null ? tempLoyaltyCard.barcodeType.prettyName() : getString(R.string.noBarcode));
if (groupsChips.getChildCount() == 0) {
List<Group> existingGroups = db.getGroups();
List<Group> existingGroups = DBHelper.getGroups(mDatabase);
List<Group> loyaltyCardGroups = db.getLoyaltyCardGroups(loyaltyCardId);
List<Group> loyaltyCardGroups = DBHelper.getLoyaltyCardGroups(mDatabase, loyaltyCardId);
if (existingGroups.isEmpty()) {
groupsChips.setVisibility(View.GONE);
@@ -802,7 +806,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
groupsChips.setVisibility(View.VISIBLE);
}
for (Group group : db.getGroups()) {
for (Group group : DBHelper.getGroups(mDatabase)) {
Chip chip = (Chip) getLayoutInflater().inflate(R.layout.layout_chip_choice, groupsChips, false);
chip.setText(group._id);
chip.setTag(group);
@@ -876,7 +880,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
hasChanged = hadChanges;
}
generateOrHideBarcode();
generateBarcode();
enterButton.setOnClickListener(new EditCardIdAndBarcode());
barcodeImage.setOnClickListener(new EditCardIdAndBarcode());
@@ -896,7 +900,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
protected void setColorFromIcon() {
Object icon = thumbnail.getTag();
if (icon != null && (icon instanceof Bitmap)) {
updateTempState(LoyaltyCardField.headerColor, new Palette.Builder((Bitmap) icon).generate().getDominantColor(tempLoyaltyCard.headerColor != null ? tempLoyaltyCard.headerColor : ContextCompat.getColor(this, R.color.colorPrimary)));
updateTempState(LoyaltyCardField.headerColor, new Palette.Builder((Bitmap) icon).generate().getDominantColor(tempLoyaltyCard.headerColor != null ? tempLoyaltyCard.headerColor : R.attr.colorPrimary));
} else {
Log.d("setColorFromIcon", "attempting header color change from icon but icon does not exist");
}
@@ -1230,6 +1234,11 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
}
private void doSave() {
if (isFinishing()) {
// If we are done saving, ignore any queued up save button presses
return;
}
if (tempStoredOldBarcodeValue != null) {
askBarcodeChange(this::doSave);
return;
@@ -1258,7 +1267,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
}
if (updateLoyaltyCard) { //update of "starStatus" not necessary, since it cannot be changed in this activity (only in ViewActivity)
db.updateLoyaltyCard(loyaltyCardId, tempLoyaltyCard.store, tempLoyaltyCard.note, tempLoyaltyCard.expiry, tempLoyaltyCard.balance, tempLoyaltyCard.balanceType, tempLoyaltyCard.cardId, tempLoyaltyCard.barcodeId, tempLoyaltyCard.barcodeType, tempLoyaltyCard.headerColor);
DBHelper.updateLoyaltyCard(mDatabase, loyaltyCardId, tempLoyaltyCard.store, tempLoyaltyCard.note, tempLoyaltyCard.expiry, tempLoyaltyCard.balance, tempLoyaltyCard.balanceType, tempLoyaltyCard.cardId, tempLoyaltyCard.barcodeId, tempLoyaltyCard.barcodeType, tempLoyaltyCard.headerColor);
try {
Utils.saveCardImage(this, (Bitmap) cardImageFront.getTag(), loyaltyCardId, ImageLocationType.front);
Utils.saveCardImage(this, (Bitmap) cardImageBack.getTag(), loyaltyCardId, ImageLocationType.back);
@@ -1268,7 +1277,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
}
Log.i(TAG, "Updated " + loyaltyCardId + " to " + cardId);
} else {
loyaltyCardId = (int) db.insertLoyaltyCard(tempLoyaltyCard.store, tempLoyaltyCard.note, tempLoyaltyCard.expiry, tempLoyaltyCard.balance, tempLoyaltyCard.balanceType, tempLoyaltyCard.cardId, tempLoyaltyCard.barcodeId, tempLoyaltyCard.barcodeType, tempLoyaltyCard.headerColor, 0, tempLoyaltyCard.lastUsed);
loyaltyCardId = (int) DBHelper.insertLoyaltyCard(mDatabase, tempLoyaltyCard.store, tempLoyaltyCard.note, tempLoyaltyCard.expiry, tempLoyaltyCard.balance, tempLoyaltyCard.balanceType, tempLoyaltyCard.cardId, tempLoyaltyCard.barcodeId, tempLoyaltyCard.barcodeType, tempLoyaltyCard.headerColor, 0, tempLoyaltyCard.lastUsed);
try {
Utils.saveCardImage(this, (Bitmap) cardImageFront.getTag(), loyaltyCardId, ImageLocationType.front);
Utils.saveCardImage(this, (Bitmap) cardImageBack.getTag(), loyaltyCardId, ImageLocationType.back);
@@ -1278,9 +1287,9 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
}
}
db.setLoyaltyCardGroups(loyaltyCardId, selectedGroups);
DBHelper.setLoyaltyCardGroups(mDatabase, loyaltyCardId, selectedGroups);
ShortcutHelper.updateShortcuts(this, db.getLoyaltyCard(loyaltyCardId));
ShortcutHelper.updateShortcuts(this, DBHelper.getLoyaltyCard(mDatabase, loyaltyCardId));
finish();
}
@@ -1312,8 +1321,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
builder.setPositiveButton(R.string.confirm, (dialog, which) -> {
Log.e(TAG, "Deleting card: " + loyaltyCardId);
DBHelper db = new DBHelper(LoyaltyCardEditActivity.this);
db.deleteLoyaltyCard(LoyaltyCardEditActivity.this, loyaltyCardId);
DBHelper.deleteLoyaltyCard(mDatabase, LoyaltyCardEditActivity.this, loyaltyCardId);
ShortcutHelper.removeShortcut(LoyaltyCardEditActivity.this, loyaltyCardId);
@@ -1386,27 +1394,22 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
);
}
private void showBarcode() {
barcodeImageLayout.setVisibility(View.VISIBLE);
}
private void generateBarcode() {
if (tempLoyaltyCard == null) {
return;
}
private void hideBarcode() {
barcodeImageLayout.setVisibility(View.GONE);
}
mTasks.flushTaskList(TaskHandler.TYPE.BARCODE, true, false, false);
private void generateOrHideBarcode() {
String cardIdString = tempLoyaltyCard.barcodeId != null ? tempLoyaltyCard.barcodeId : tempLoyaltyCard.cardId;
CatimaBarcode barcodeFormat = tempLoyaltyCard.barcodeType;
if (barcodeFormat == null || cardIdString.isEmpty() || !barcodeFormat.isSupported()) {
hideBarcode();
} else {
generateBarcode(cardIdString, barcodeFormat);
if (cardIdString == null || barcodeFormat == null) {
barcodeImageLayout.setVisibility(View.GONE);
return;
}
}
private void generateBarcode(String cardIdString, CatimaBarcode barcodeFormat) {
mTasks.flushTaskList(TaskHandler.TYPE.BARCODE, true, false, false);
barcodeImageLayout.setVisibility(View.VISIBLE);
if (barcodeImage.getHeight() == 0) {
Log.d(TAG, "ImageView size is not known known at start, waiting for load");
@@ -1419,17 +1422,15 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
barcodeImage.getViewTreeObserver().removeOnGlobalLayoutListener(this);
Log.d(TAG, "ImageView size now known");
BarcodeImageWriterTask barcodeWriter = new BarcodeImageWriterTask(getApplicationContext(), barcodeImage, cardIdString, barcodeFormat, null, false, warnOnInvalidBarcodeType);
BarcodeImageWriterTask barcodeWriter = new BarcodeImageWriterTask(getApplicationContext(), barcodeImage, cardIdString, barcodeFormat, null, false, barcodeImageGenerationFinishedCallback);
mTasks.executeTask(TaskHandler.TYPE.BARCODE, barcodeWriter);
}
});
} else {
Log.d(TAG, "ImageView size known known, creating barcode");
BarcodeImageWriterTask barcodeWriter = new BarcodeImageWriterTask(getApplicationContext(), barcodeImage, cardIdString, barcodeFormat, null, false, warnOnInvalidBarcodeType);
BarcodeImageWriterTask barcodeWriter = new BarcodeImageWriterTask(getApplicationContext(), barcodeImage, cardIdString, barcodeFormat, null, false, barcodeImageGenerationFinishedCallback);
mTasks.executeTask(TaskHandler.TYPE.BARCODE, barcodeWriter);
}
showBarcode();
}
private void generateIcon(String store) {
@@ -1459,30 +1460,24 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
}
View cardPart = findViewById(R.id.cardPart);
View barcodePart = findViewById(R.id.barcodePart);
View optionsPart = findViewById(R.id.optionsPart);
View picturesPart = findViewById(R.id.picturesPart);
if (getString(R.string.card).equals(part)) {
cardPart.setVisibility(View.VISIBLE);
barcodePart.setVisibility(View.GONE);
picturesPart.setVisibility(View.GONE);
// Explicitly hide barcode (fixes blurriness on redraw)
hideBarcode();
} else if (getString(R.string.barcode).equals(part)) {
cardPart.setVisibility(View.GONE);
barcodePart.setVisibility(View.VISIBLE);
optionsPart.setVisibility(View.GONE);
picturesPart.setVisibility(View.GONE);
// Redraw barcode due to size change (Visibility.GONE sets it to 0)
generateOrHideBarcode();
generateBarcode();
} else if (getString(R.string.options).equals(part)) {
cardPart.setVisibility(View.GONE);
optionsPart.setVisibility(View.VISIBLE);
picturesPart.setVisibility(View.GONE);
} else if (getString(R.string.photos).equals(part)) {
cardPart.setVisibility(View.GONE);
barcodePart.setVisibility(View.GONE);
optionsPart.setVisibility(View.GONE);
picturesPart.setVisibility(View.VISIBLE);
// Explicitly hide barcode (fixes blurriness on redraw)
hideBarcode();
} else {
throw new UnsupportedOperationException();
}

View File

@@ -3,6 +3,9 @@ package protect.card_locker;
import android.app.Application;
import androidx.appcompat.app.AppCompatDelegate;
import com.google.android.material.color.DynamicColors;
import protect.card_locker.preferences.Settings;
public class LoyaltyCardLockerApplication extends Application {
@@ -13,5 +16,6 @@ public class LoyaltyCardLockerApplication extends Application {
Settings settings = new Settings(this);
AppCompatDelegate.setDefaultNightMode(settings.getTheme());
DynamicColors.applyToActivitiesIfAvailable(this);
}
}

View File

@@ -2,7 +2,9 @@ package protect.card_locker;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.res.ColorStateList;
import android.content.res.Configuration;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.Outline;
@@ -45,9 +47,9 @@ import androidx.appcompat.app.ActionBar;
import androidx.appcompat.content.res.AppCompatResources;
import androidx.appcompat.widget.AppCompatTextView;
import androidx.appcompat.widget.Toolbar;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.constraintlayout.widget.Guideline;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
import androidx.core.content.ContextCompat;
import androidx.core.graphics.ColorUtils;
import androidx.core.graphics.drawable.DrawableCompat;
import androidx.core.widget.NestedScrollView;
@@ -62,6 +64,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
private GestureDetector mGestureDetector;
CoordinatorLayout coordinatorLayout;
ConstraintLayout mainLayout;
TextView cardIdFieldView;
BottomSheetBehavior behavior;
LinearLayout bottomSheet;
@@ -84,7 +87,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
int loyaltyCardId;
LoyaltyCard loyaltyCard;
boolean rotationEnabled;
DBHelper db;
SQLiteDatabase database;
ImportURIHelper importURIHelper;
Settings settings;
@@ -257,10 +260,11 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
setContentView(R.layout.loyalty_card_view_layout);
db = new DBHelper(this);
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);
bottomSheet = findViewById(R.id.bottom_sheet);
bottomSheetContentWrapper = findViewById(R.id.bottomSheetContentWrapper);
@@ -281,9 +285,6 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
centerGuideline = findViewById(R.id.centerGuideline);
barcodeScaler = findViewById(R.id.barcodeScaler);
maximizeButton.setBackgroundColor(getThemeColor());
minimizeButton.setBackgroundColor(getThemeColor());
bottomSheetButton.setBackgroundColor(getThemeColor());
barcodeScaler.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
@@ -297,7 +298,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
Log.d(TAG, "Scaling to " + scale);
loyaltyCard.zoomLevel = progress;
db.updateLoyaltyCardZoomLevel(loyaltyCardId, loyaltyCard.zoomLevel);
DBHelper.updateLoyaltyCardZoomLevel(database, loyaltyCardId, loyaltyCard.zoomLevel);
setCenterGuideline(loyaltyCard.zoomLevel);
@@ -378,9 +379,13 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
editButton.hide();
} else if (newState == BottomSheetBehavior.STATE_EXPANDED) {
bottomSheetButton.setImageResource(R.drawable.ic_baseline_arrow_drop_down_24);
bottomSheetButton.setContentDescription(getString(R.string.hideMoreInfo));
mainLayout.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS);
editButton.hide();
} else if (newState == BottomSheetBehavior.STATE_COLLAPSED) {
bottomSheetButton.setImageResource(R.drawable.ic_baseline_arrow_drop_up_24);
bottomSheetButton.setContentDescription(getString(R.string.showMoreInfo));
mainLayout.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_AUTO);
if (!isFullscreen) {
editButton.show();
}
@@ -466,7 +471,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
window.setAttributes(attributes);
}
loyaltyCard = db.getLoyaltyCard(loyaltyCardId);
loyaltyCard = DBHelper.getLoyaltyCard(database, loyaltyCardId);
if (loyaltyCard == null) {
Log.w(TAG, "Could not lookup loyalty card " + loyaltyCardId);
Toast.makeText(this, R.string.noCardExistsError, Toast.LENGTH_LONG).show();
@@ -493,7 +498,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
noteView.setVisibility(View.GONE);
}
List<Group> loyaltyCardGroups = db.getLoyaltyCardGroups(loyaltyCardId);
List<Group> loyaltyCardGroups = DBHelper.getLoyaltyCardGroups(database, loyaltyCardId);
if (loyaltyCardGroups.size() > 0) {
List<String> groupNames = new ArrayList<>();
@@ -522,7 +527,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
int expiryString = R.string.expiryStateSentence;
if (Utils.hasExpired(loyaltyCard.expiry)) {
expiryString = R.string.expiryStateSentenceExpired;
expiryView.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.alert));
expiryView.setTextColor(Color.RED);
}
expiryView.setText(getString(expiryString, DateFormat.getDateInstance(DateFormat.LONG).format(loyaltyCard.expiry)));
expiryView.setTextSize(settings.getFontSizeMax(settings.getMediumFont()));
@@ -560,6 +565,18 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
storeName.setTextColor(textColor);
landscapeToolbar.setTitleTextColor(textColor);
// Also apply colours to UI elements
int darkenedColor = ColorUtils.blendARGB(backgroundHeaderColor, Color.BLACK, 0.1f);
barcodeScaler.setProgressTintList(ColorStateList.valueOf(darkenedColor));
barcodeScaler.setThumbTintList(ColorStateList.valueOf(darkenedColor));
maximizeButton.setBackgroundColor(darkenedColor);
minimizeButton.setBackgroundColor(darkenedColor);
bottomSheetButton.setBackgroundColor(darkenedColor);
maximizeButton.setColorFilter(textColor);
minimizeButton.setColorFilter(textColor);
bottomSheetButton.setColorFilter(textColor);
editButton.setBackgroundTintList(ColorStateList.valueOf(Utils.getComplementaryColor(darkenedColor)));
Bitmap icon = Utils.retrieveCardImage(this, loyaltyCard.id, ImageLocationType.icon);
if (icon != null) {
int backgroundAlphaColor = Utils.needsDarkForeground(backgroundHeaderColor) ? Color.WHITE : Color.BLACK;
@@ -640,7 +657,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
// restore bottomSheet UI states from changing orientation
changeUiToBottomSheetState(bottomSheetState);
db.updateLoyaltyCardLastUsed(loyaltyCard.id);
DBHelper.updateLoyaltyCardLastUsed(database, loyaltyCard.id);
}
@Override
@@ -665,7 +682,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
item.setVisible(false);
}
loyaltyCard = db.getLoyaltyCard(loyaltyCardId);
loyaltyCard = DBHelper.getLoyaltyCard(database, loyaltyCardId);
starred = loyaltyCard.starStatus != 0;
menu.findItem(R.id.action_share).setIcon(getIcon(R.drawable.ic_share_white, backgroundNeedsDarkIcons));
@@ -716,7 +733,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
case R.id.action_star_unstar:
starred = !starred;
db.updateLoyaltyCardStarStatus(loyaltyCardId, starred ? 1 : 0);
DBHelper.updateLoyaltyCardStarStatus(database, loyaltyCardId, starred ? 1 : 0);
invalidateOptionsMenu();
return true;
}
@@ -829,12 +846,15 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
drawBarcode();
}
mainImage.setBackgroundColor(Color.WHITE);
mainImage.setContentDescription(getString(R.string.barcodeImageDescriptionWithType, format.prettyName()));
} else if (wantedImageType == ImageType.IMAGE_FRONT) {
mainImage.setImageBitmap(frontImageBitmap);
mainImage.setBackgroundColor(Color.TRANSPARENT);
mainImage.setContentDescription(getString(R.string.frontImageDescription));
} else if (wantedImageType == ImageType.IMAGE_BACK) {
mainImage.setImageBitmap(backImageBitmap);
mainImage.setBackgroundColor(Color.TRANSPARENT);
mainImage.setContentDescription(getString(R.string.backImageDescription));
} else {
throw new IllegalArgumentException("Unknown image type: " + wantedImageType);
}

View File

@@ -1,13 +1,14 @@
package protect.card_locker;
import android.app.Activity;
import android.app.SearchManager;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.database.CursorIndexOutOfBoundsException;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.GestureDetector;
@@ -18,14 +19,6 @@ import android.view.View;
import android.widget.CheckBox;
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.AlertDialog;
@@ -35,12 +28,21 @@ import androidx.appcompat.widget.Toolbar;
import androidx.core.splashscreen.SplashScreen;
import androidx.recyclerview.widget.RecyclerView;
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 protect.card_locker.preferences.SettingsActivity;
public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCardCursorAdapter.CardAdapterListener, GestureDetector.OnGestureListener {
private static final String TAG = "Catima";
public static final String RESTART_ACTIVITY_INTENT = "restart_activity_intent";
private final DBHelper mDB = new DBHelper(this);
private SQLiteDatabase mDatabase;
private LoyaltyCardCursorAdapter mAdapter;
private ActionMode mCurrentActionMode;
private SearchView mSearchView;
@@ -56,6 +58,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
private View mNoGroupCardsText;
private ActivityResultLauncher<Intent> mBarcodeScannerLauncher;
private ActivityResultLauncher<Intent> mSettingsLauncher;
private ActionMode.Callback mCurrentActionModeCallback = new ActionMode.Callback() {
@Override
@@ -142,7 +145,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
for (LoyaltyCard loyaltyCard : mAdapter.getSelectedItems()) {
Log.e(TAG, "Deleting card: " + loyaltyCard.id);
db.deleteLoyaltyCard(MainActivity.this, loyaltyCard.id);
DBHelper.deleteLoyaltyCard(mDatabase, MainActivity.this, loyaltyCard.id);
ShortcutHelper.removeShortcut(MainActivity.this, loyaltyCard.id);
}
@@ -180,6 +183,8 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
mDatabase = new DBHelper(this).getWritableDatabase();
TabLayout groupsTabLayout = findViewById(R.id.groups);
groupsTabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
@@ -277,6 +282,15 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
startActivity(newIntent);
}
});
mSettingsLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
if (result.getResultCode() == Activity.RESULT_OK) {
Intent intent = result.getData();
if (intent != null && intent.getBooleanExtra(RESTART_ACTIVITY_INTENT, false)) {
recreate();
}
}
});
}
@Override
@@ -348,20 +362,38 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
super.onBackPressed();
}
private void displayCardSetupOptions(boolean shouldShow) {
View search = findViewById(R.id.action_search);
View folder = findViewById(R.id.action_unfold);
View sort = findViewById(R.id.action_sort);
if (search != null && mSearchView.isIconified()) {
search.setVisibility(shouldShow ? View.VISIBLE : View.GONE);
}
if (folder != null) {
folder.setVisibility(shouldShow ? View.VISIBLE : View.GONE);
}
if (sort != null) {
sort.setVisibility(shouldShow ? View.VISIBLE : View.GONE);
}
}
private void updateLoyaltyCardList() {
Group group = null;
if (mGroup != null) {
group = (Group) mGroup;
}
mAdapter.swapCursor(mDB.getLoyaltyCardCursor(mFilter, group, mOrder, mOrderDirection));
mAdapter.swapCursor(DBHelper.getLoyaltyCardCursor(mDatabase, mFilter, group, mOrder, mOrderDirection));
if (mDB.getLoyaltyCardCount() > 0) {
if (DBHelper.getLoyaltyCardCount(mDatabase) > 0) {
// We want the cardList to be visible regardless of the filtered match count
// to ensure that the noMatchingCardsText doesn't end up being shown below
// the keyboard
mHelpText.setVisibility(View.GONE);
mNoGroupCardsText.setVisibility(View.GONE);
displayCardSetupOptions(true);
if (mAdapter.getItemCount() > 0) {
mCardList.setVisibility(View.VISIBLE);
mNoMatchingCardsText.setVisibility(View.GONE);
@@ -380,6 +412,8 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
} else {
mCardList.setVisibility(View.GONE);
mHelpText.setVisibility(View.VISIBLE);
displayCardSetupOptions(false);
mNoMatchingCardsText.setVisibility(View.GONE);
mNoGroupCardsText.setVisibility(View.GONE);
}
@@ -390,9 +424,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
}
public void updateTabGroups(TabLayout groupsTabLayout) {
final DBHelper db = new DBHelper(this);
List<Group> newGroups = db.getGroups();
List<Group> newGroups = DBHelper.getGroups(mDatabase);
if (newGroups.size() == 0) {
groupsTabLayout.removeAllTabs();
@@ -528,7 +560,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
if (id == R.id.action_settings) {
Intent i = new Intent(getApplicationContext(), SettingsActivity.class);
startActivity(i);
mSettingsLauncher.launch(i);
return true;
}

View File

@@ -2,6 +2,7 @@ package protect.card_locker;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
@@ -25,7 +26,7 @@ import androidx.recyclerview.widget.RecyclerView;
public class ManageGroupActivity extends CatimaAppCompatActivity implements ManageGroupCursorAdapter.CardAdapterListener {
private final DBHelper mDB = new DBHelper(this);
private SQLiteDatabase mDatabase;
private ManageGroupCursorAdapter mAdapter;
private final String SAVE_INSTANCE_ADAPTER_STATE = "adapterState";
@@ -45,6 +46,8 @@ public class ManageGroupActivity extends CatimaAppCompatActivity implements Mana
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
mDatabase = new DBHelper(this).getWritableDatabase();
mHelpText = findViewById(R.id.helpText);
mCardList = findViewById(R.id.list);
FloatingActionButton saveButton = findViewById(R.id.fabSave);
@@ -70,7 +73,7 @@ public class ManageGroupActivity extends CatimaAppCompatActivity implements Mana
return;
}
if (!mGroup._id.equals(currentGroupName)) {
if (mDB.getGroup(currentGroupName) != null) {
if (DBHelper.getGroup(mDatabase, currentGroupName) != null) {
mGroupNameNotInUse = false;
mGroupNameText.setError(getResources().getText(R.string.group_name_already_in_use));
} else {
@@ -86,7 +89,7 @@ public class ManageGroupActivity extends CatimaAppCompatActivity implements Mana
throw (new IllegalArgumentException("this activity expects a group loaded into it's intent"));
}
Log.d("groupId", "groupId: " + groupId);
mGroup = mDB.getGroup(groupId);
mGroup = DBHelper.getGroup(mDatabase, groupId);
if (mGroup == null) {
throw (new IllegalArgumentException("cannot load group " + groupId + " from database"));
}
@@ -123,7 +126,7 @@ public class ManageGroupActivity extends CatimaAppCompatActivity implements Mana
mAdapter.commitToDatabase();
if (!currentGroupName.equals(mGroup._id)) {
mDB.updateGroup(mGroup._id, currentGroupName);
DBHelper.updateGroup(mDatabase, mGroup._id, currentGroupName);
}
Toast.makeText(getApplicationContext(), R.string.group_updated, Toast.LENGTH_SHORT).show();
finish();
@@ -163,7 +166,7 @@ public class ManageGroupActivity extends CatimaAppCompatActivity implements Mana
}
private void updateLoyaltyCardList() {
mAdapter.swapCursor(mDB.getLoyaltyCardCursor());
mAdapter.swapCursor(DBHelper.getLoyaltyCardCursor(mDatabase));
if (mAdapter.getItemCount() == 0) {
mCardList.setVisibility(View.GONE);
@@ -205,7 +208,7 @@ public class ManageGroupActivity extends CatimaAppCompatActivity implements Mana
@Override
public void onRowLongClicked(int inputPosition) {
// do nothing for now
mAdapter.toggleSelection(inputPosition);
}
@Override

View File

@@ -2,24 +2,27 @@ package protect.card_locker;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import androidx.recyclerview.widget.RecyclerView;
public class ManageGroupCursorAdapter extends LoyaltyCardCursorAdapter {
private HashMap<Integer, Integer> mIndexCardMap;
private HashMap<Integer, Boolean> mInGroupOverlay;
private HashMap<Integer, Boolean> mIsLoyaltyCardInGroupCache;
private HashMap<Integer, List<Group>> mGetGroupCache;
final private Group mGroup;
final private DBHelper mDb;
final private SQLiteDatabase mDatabase;
public ManageGroupCursorAdapter(Context inputContext, Cursor inputCursor, CardAdapterListener inputListener, Group group) {
super(inputContext, inputCursor, inputListener);
mGroup = new Group(group._id, group.order);
mInGroupOverlay = new HashMap<>();
mDb = new DBHelper(inputContext);
mDatabase = new DBHelper(inputContext).getWritableDatabase();
}
@Override
@@ -47,7 +50,7 @@ public class ManageGroupCursorAdapter extends LoyaltyCardCursorAdapter {
if (cache != null) {
return cache;
}
List<Group> groups = mDb.getLoyaltyCardGroups(cardId);
List<Group> groups = DBHelper.getLoyaltyCardGroups(mDatabase, cardId);
mGetGroupCache.put(cardId, groups);
return groups;
}
@@ -94,7 +97,7 @@ public class ManageGroupCursorAdapter extends LoyaltyCardCursorAdapter {
} else {
groups.remove(mGroup);
}
mDb.setLoyaltyCardGroups(cardId, groups);
DBHelper.setLoyaltyCardGroups(mDatabase, cardId, groups);
}
}

View File

@@ -3,6 +3,7 @@ package protect.card_locker;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.text.InputType;
import android.view.MenuItem;
@@ -26,7 +27,7 @@ import androidx.recyclerview.widget.RecyclerView;
public class ManageGroupsActivity extends CatimaAppCompatActivity implements GroupCursorAdapter.GroupAdapterListener {
private static final String TAG = "Catima";
private final DBHelper mDb = new DBHelper(this);
private SQLiteDatabase mDatabase;
private TextView mHelpText;
private RecyclerView mGroupList;
GroupCursorAdapter mAdapter;
@@ -42,6 +43,8 @@ public class ManageGroupsActivity extends CatimaAppCompatActivity implements Gro
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
}
mDatabase = new DBHelper(this).getWritableDatabase();
}
@Override
@@ -72,9 +75,9 @@ public class ManageGroupsActivity extends CatimaAppCompatActivity implements Gro
}
private void updateGroupList() {
mAdapter.swapCursor(mDb.getGroupCursor());
mAdapter.swapCursor(DBHelper.getGroupCursor(mDatabase));
if (mDb.getGroupCount() == 0) {
if (DBHelper.getGroupCount(mDatabase) == 0) {
mGroupList.setVisibility(View.GONE);
mHelpText.setVisibility(View.VISIBLE);
@@ -106,7 +109,7 @@ public class ManageGroupsActivity extends CatimaAppCompatActivity implements Gro
}
private void createGroup() {
AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.AlertDialogTheme);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(R.string.enter_group_name);
final EditText input = new EditText(this);
input.setInputType(InputType.TYPE_CLASS_TEXT);
@@ -118,11 +121,11 @@ public class ManageGroupsActivity extends CatimaAppCompatActivity implements Gro
Toast.makeText(getApplicationContext(), R.string.group_name_is_empty, Toast.LENGTH_SHORT).show();
return;
}
if (mDb.getGroup(inputString) != null) {
if (DBHelper.getGroup(mDatabase, inputString) != null) {
Toast.makeText(getApplicationContext(), R.string.group_name_already_in_use, Toast.LENGTH_SHORT).show();
return;
}
mDb.insertGroup(inputString);
DBHelper.insertGroup(mDatabase, inputString);
updateGroupList();
});
builder.setNegativeButton(getString(R.string.cancel), (dialog, which) -> dialog.cancel());
@@ -138,10 +141,10 @@ public class ManageGroupsActivity extends CatimaAppCompatActivity implements Gro
}
private void moveGroup(View view, boolean up) {
List<Group> groups = mDb.getGroups();
List<Group> groups = DBHelper.getGroups(mDatabase);
final String groupName = getGroupName(view);
int currentIndex = mDb.getGroup(groupName).order;
int currentIndex = DBHelper.getGroup(mDatabase, groupName).order;
int newIndex;
// Reinsert group in correct position
@@ -160,7 +163,7 @@ public class ManageGroupsActivity extends CatimaAppCompatActivity implements Gro
groups.add(newIndex, group);
// Update database
mDb.reorderGroups(groups);
DBHelper.reorderGroups(mDatabase, groups);
// Update UI
updateGroupList();
@@ -195,7 +198,7 @@ public class ManageGroupsActivity extends CatimaAppCompatActivity implements Gro
builder.setMessage(groupName);
builder.setPositiveButton(getString(R.string.ok), (dialog, which) -> {
mDb.deleteGroup(groupName);
DBHelper.deleteGroup(mDatabase, groupName);
updateGroupList();
// Delete may change ordering, so invalidate
invalidateHomescreenActiveTab();

View File

@@ -2,6 +2,7 @@ package protect.card_locker;
import android.content.Context;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
@@ -45,7 +46,7 @@ class ShortcutHelper {
static void updateShortcuts(Context context, LoyaltyCard card) {
LinkedList<ShortcutInfoCompat> list = new LinkedList<>(ShortcutManagerCompat.getDynamicShortcuts(context));
DBHelper dbHelper = new DBHelper(context);
SQLiteDatabase database = new DBHelper(context).getReadableDatabase();
String shortcutId = Integer.toString(card.id);
@@ -88,7 +89,7 @@ class ShortcutHelper {
for (int index = 0; index < list.size(); index++) {
ShortcutInfoCompat prevShortcut = list.get(index);
LoyaltyCard loyaltyCard = dbHelper.getLoyaltyCard(Integer.parseInt(prevShortcut.getId()));
LoyaltyCard loyaltyCard = DBHelper.getLoyaltyCard(database, Integer.parseInt(prevShortcut.getId()));
ShortcutInfoCompat updatedShortcut = createShortcutBuilder(context, loyaltyCard)
.setRank(index)

View File

@@ -448,4 +448,15 @@ public class Utils {
return loadImage(context.getCacheDir() + "/" + name);
}
// https://stackoverflow.com/a/59324801/8378787
public static int getComplementaryColor(int color) {
int R = color & 255;
int G = (color >> 8) & 255;
int B = (color >> 16) & 255;
int A = (color >> 24) & 255;
R = 255 - R;
G = 255 - G;
B = 255 - B;
return R + (G << 8) + ( B << 16) + ( A << 24);
}
}

View File

@@ -2,6 +2,7 @@ package protect.card_locker.importexport;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import net.lingala.zip4j.io.outputstream.ZipOutputStream;
@@ -31,7 +32,7 @@ import protect.card_locker.Utils;
* format.
*/
public class CatimaExporter implements Exporter {
public void exportData(Context context, DBHelper db, OutputStream output, char[] password) throws IOException, InterruptedException {
public void exportData(Context context, SQLiteDatabase database, OutputStream output, char[] password) throws IOException, InterruptedException {
// Necessary vars
int readLen;
byte[] readBuffer = new byte[InternalZipConstants.BUFF_SIZE];
@@ -48,7 +49,7 @@ public class CatimaExporter implements Exporter {
// Generate CSV
ByteArrayOutputStream catimaOutputStream = new ByteArrayOutputStream();
OutputStreamWriter catimaOutputStreamWriter = new OutputStreamWriter(catimaOutputStream, StandardCharsets.UTF_8);
writeCSV(db, catimaOutputStreamWriter);
writeCSV(database, catimaOutputStreamWriter);
// Add CSV to zip file
ZipParameters csvZipParameters = createZipParameters("catima.csv", password);
@@ -60,7 +61,7 @@ public class CatimaExporter implements Exporter {
zipOutputStream.closeEntry();
// Loop over all cards again
Cursor cardCursor = db.getLoyaltyCardCursor();
Cursor cardCursor = DBHelper.getLoyaltyCardCursor(database);
while (cardCursor.moveToNext()) {
// For each card
LoyaltyCard card = LoyaltyCard.toLoyaltyCard(cardCursor);
@@ -94,7 +95,7 @@ public class CatimaExporter implements Exporter {
return zipParameters;
}
private void writeCSV(DBHelper db, OutputStreamWriter output) throws IOException, InterruptedException {
private void writeCSV(SQLiteDatabase database, OutputStreamWriter output) throws IOException, InterruptedException {
CSVPrinter printer = new CSVPrinter(output, CSVFormat.RFC4180);
// Print the version
@@ -105,7 +106,7 @@ public class CatimaExporter implements Exporter {
// Print the header for groups
printer.printRecord(DBHelper.LoyaltyCardDbGroups.ID);
Cursor groupCursor = db.getGroupCursor();
Cursor groupCursor = DBHelper.getGroupCursor(database);
while (groupCursor.moveToNext()) {
Group group = Group.toGroup(groupCursor);
@@ -136,7 +137,7 @@ public class CatimaExporter implements Exporter {
DBHelper.LoyaltyCardDbIds.STAR_STATUS,
DBHelper.LoyaltyCardDbIds.LAST_USED);
Cursor cardCursor = db.getLoyaltyCardCursor();
Cursor cardCursor = DBHelper.getLoyaltyCardCursor(database);
while (cardCursor.moveToNext()) {
LoyaltyCard card = LoyaltyCard.toLoyaltyCard(cardCursor);
@@ -168,12 +169,12 @@ public class CatimaExporter implements Exporter {
printer.printRecord(DBHelper.LoyaltyCardDbIdsGroups.cardID,
DBHelper.LoyaltyCardDbIdsGroups.groupID);
Cursor cardCursor2 = db.getLoyaltyCardCursor();
Cursor cardCursor2 = DBHelper.getLoyaltyCardCursor(database);
while (cardCursor2.moveToNext()) {
LoyaltyCard card = LoyaltyCard.toLoyaltyCard(cardCursor2);
for (Group group : db.getLoyaltyCardGroups(card.id)) {
for (Group group : DBHelper.getLoyaltyCardGroups(database, card.id)) {
printer.printRecord(card.id, group._id);
}

View File

@@ -40,7 +40,7 @@ import protect.card_locker.ZipUtils;
* A header is expected for the each table showing the names of the columns.
*/
public class CatimaImporter implements Importer {
public void importData(Context context, DBHelper db, InputStream input, char[] password) throws IOException, FormatException, InterruptedException {
public void importData(Context context, SQLiteDatabase database, InputStream input, char[] password) throws IOException, FormatException, InterruptedException {
InputStream bufferedInputStream = new BufferedInputStream(input);
bufferedInputStream.mark(100);
@@ -55,7 +55,7 @@ public class CatimaImporter implements Importer {
String fileName = Uri.parse(localFileHeader.getFileName()).getLastPathSegment();
if (fileName.equals("catima.csv")) {
importCSV(context, db, new ByteArrayInputStream(ZipUtils.read(zipInputStream).getBytes(StandardCharsets.UTF_8)));
importCSV(context, database, new ByteArrayInputStream(ZipUtils.read(zipInputStream).getBytes(StandardCharsets.UTF_8)));
} else if (fileName.endsWith(".png")) {
Utils.saveCardImage(context, ZipUtils.readImage(zipInputStream), fileName);
} else {
@@ -66,11 +66,11 @@ public class CatimaImporter implements Importer {
if (!isZipFile) {
// This is not a zip file, try importing as bare CSV
bufferedInputStream.reset();
importCSV(context, db, bufferedInputStream);
importCSV(context, database, bufferedInputStream);
}
}
public void importCSV(Context context, DBHelper db, InputStream input) throws IOException, FormatException, InterruptedException {
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);
@@ -87,10 +87,10 @@ public class CatimaImporter implements Importer {
switch (version) {
case 1:
parseV1(context, db, bufferedReader);
parseV1(context, database, bufferedReader);
break;
case 2:
parseV2(context, db, bufferedReader);
parseV2(context, database, bufferedReader);
break;
default:
throw new FormatException(String.format("No code to parse version %s", version));
@@ -99,15 +99,12 @@ public class CatimaImporter implements Importer {
bufferedReader.close();
}
public void parseV1(Context context, DBHelper db, BufferedReader input) throws IOException, FormatException, InterruptedException {
public void parseV1(Context context, SQLiteDatabase database, BufferedReader input) throws IOException, FormatException, InterruptedException {
final CSVParser parser = new CSVParser(input, CSVFormat.RFC4180.builder().setHeader().build());
SQLiteDatabase database = db.getWritableDatabase();
database.beginTransaction();
try {
for (CSVRecord record : parser) {
importLoyaltyCard(context, database, db, record);
importLoyaltyCard(context, database, record);
if (Thread.currentThread().isInterrupted()) {
throw new InterruptedException();
@@ -115,19 +112,12 @@ public class CatimaImporter implements Importer {
}
parser.close();
database.setTransactionSuccessful();
} catch (IllegalArgumentException | IllegalStateException e) {
throw new FormatException("Issue parsing CSV data", e);
} finally {
database.endTransaction();
database.close();
}
}
public void parseV2(Context context, DBHelper db, BufferedReader input) throws IOException, FormatException, InterruptedException {
SQLiteDatabase database = db.getWritableDatabase();
database.beginTransaction();
public void parseV2(Context context, SQLiteDatabase database, BufferedReader input) throws IOException, FormatException, InterruptedException {
Integer part = 0;
String stringPart = "";
@@ -145,7 +135,7 @@ public class CatimaImporter implements Importer {
break;
case 1:
try {
parseV2Groups(db, database, stringPart);
parseV2Groups(database, stringPart);
sectionParsed = true;
} catch (FormatException e) {
// We may have a multiline field, try again
@@ -153,7 +143,7 @@ public class CatimaImporter implements Importer {
break;
case 2:
try {
parseV2Cards(context, db, database, stringPart);
parseV2Cards(context, database, stringPart);
sectionParsed = true;
} catch (FormatException e) {
// We may have a multiline field, try again
@@ -161,7 +151,7 @@ public class CatimaImporter implements Importer {
break;
case 3:
try {
parseV2CardGroups(db, database, stringPart);
parseV2CardGroups(database, stringPart);
sectionParsed = true;
} catch (FormatException e) {
// We may have a multiline field, try again
@@ -185,16 +175,12 @@ public class CatimaImporter implements Importer {
stringPart += tmp + "\n";
}
}
database.setTransactionSuccessful();
} catch (FormatException e) {
throw new FormatException("Issue parsing CSV data", e);
} finally {
database.endTransaction();
database.close();
}
}
public void parseV2Groups(DBHelper db, SQLiteDatabase database, String data) throws IOException, FormatException, InterruptedException {
public void parseV2Groups(SQLiteDatabase database, String data) throws IOException, FormatException, InterruptedException {
// Parse groups
final CSVParser groupParser = new CSVParser(new StringReader(data), CSVFormat.RFC4180.builder().setHeader().build());
@@ -215,11 +201,11 @@ public class CatimaImporter implements Importer {
}
for (CSVRecord record : records) {
importGroup(database, db, record);
importGroup(database, record);
}
}
public void parseV2Cards(Context context, DBHelper db, SQLiteDatabase database, String data) throws IOException, FormatException, InterruptedException {
public void parseV2Cards(Context context, SQLiteDatabase database, String data) throws IOException, FormatException, InterruptedException {
// Parse cards
final CSVParser cardParser = new CSVParser(new StringReader(data), CSVFormat.RFC4180.builder().setHeader().build());
@@ -240,11 +226,11 @@ public class CatimaImporter implements Importer {
}
for (CSVRecord record : records) {
importLoyaltyCard(context, database, db, record);
importLoyaltyCard(context, database, record);
}
}
public void parseV2CardGroups(DBHelper db, SQLiteDatabase database, String data) throws IOException, FormatException, InterruptedException {
public void parseV2CardGroups(SQLiteDatabase database, String data) throws IOException, FormatException, InterruptedException {
// Parse card group mappings
final CSVParser cardGroupParser = new CSVParser(new StringReader(data), CSVFormat.RFC4180.builder().setHeader().build());
@@ -265,7 +251,7 @@ public class CatimaImporter implements Importer {
}
for (CSVRecord record : records) {
importCardGroupMapping(database, db, record);
importCardGroupMapping(database, record);
}
}
@@ -273,7 +259,7 @@ public class CatimaImporter implements Importer {
* Import a single loyalty card into the database using the given
* session.
*/
private void importLoyaltyCard(Context context, SQLiteDatabase database, DBHelper helper, CSVRecord record)
private void importLoyaltyCard(Context context, SQLiteDatabase database, CSVRecord record)
throws IOException, FormatException {
int id = CSVHelpers.extractInt(DBHelper.LoyaltyCardDbIds.ID, record, false);
@@ -343,31 +329,29 @@ public class CatimaImporter implements Importer {
// We catch this exception so we can still import old backups
}
helper.insertLoyaltyCard(database, id, store, note, expiry, balance, balanceType, cardId, barcodeId, barcodeType, headerColor, starStatus, lastUsed);
DBHelper.insertLoyaltyCard(database, id, store, note, expiry, balance, balanceType, cardId, barcodeId, barcodeType, headerColor, starStatus, lastUsed);
}
/**
* Import a single group into the database using the given
* session.
*/
private void importGroup(SQLiteDatabase database, DBHelper helper, CSVRecord record)
throws IOException, FormatException {
private void importGroup(SQLiteDatabase database, CSVRecord record) throws FormatException {
String id = CSVHelpers.extractString(DBHelper.LoyaltyCardDbGroups.ID, record, null);
helper.insertGroup(database, id);
DBHelper.insertGroup(database, id);
}
/**
* Import a single card to group mapping into the database using the given
* session.
*/
private void importCardGroupMapping(SQLiteDatabase database, DBHelper helper, CSVRecord record)
throws IOException, FormatException {
private void importCardGroupMapping(SQLiteDatabase database, CSVRecord record) throws FormatException {
Integer cardId = CSVHelpers.extractInt(DBHelper.LoyaltyCardDbIdsGroups.cardID, record, false);
String groupId = CSVHelpers.extractString(DBHelper.LoyaltyCardDbIdsGroups.groupID, record, null);
List<Group> cardGroups = helper.getLoyaltyCardGroups(cardId);
cardGroups.add(helper.getGroup(groupId));
helper.setLoyaltyCardGroups(database, cardId, cardGroups);
List<Group> cardGroups = DBHelper.getLoyaltyCardGroups(database, cardId);
cardGroups.add(DBHelper.getGroup(database, groupId));
DBHelper.setLoyaltyCardGroups(database, cardId, cardGroups);
}
}

View File

@@ -1,12 +1,11 @@
package protect.card_locker.importexport;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import java.io.IOException;
import java.io.OutputStream;
import protect.card_locker.DBHelper;
/**
* Interface for a class which can export the contents of the database
* in a given format.
@@ -17,5 +16,5 @@ public interface Exporter {
*
* @throws IOException
*/
void exportData(Context context, DBHelper db, OutputStream output, char[] password) throws IOException, InterruptedException;
void exportData(Context context, SQLiteDatabase database, OutputStream output, char[] password) throws IOException, InterruptedException;
}

View File

@@ -30,7 +30,7 @@ import protect.card_locker.FormatException;
* A header is expected for the each table showing the names of the columns.
*/
public class FidmeImporter implements Importer {
public void importData(Context context, DBHelper db, InputStream input, char[] password) throws IOException, FormatException, JSONException, ParseException {
public void importData(Context context, SQLiteDatabase database, InputStream input, char[] password) throws IOException, FormatException, JSONException, ParseException {
// We actually retrieve a .zip file
ZipInputStream zipInputStream = new ZipInputStream(input, password);
@@ -52,14 +52,11 @@ public class FidmeImporter implements Importer {
throw new FormatException("Couldn't find loyalty_programs.csv in zip file or it is empty");
}
SQLiteDatabase database = db.getWritableDatabase();
database.beginTransaction();
final CSVParser fidmeParser = new CSVParser(new StringReader(loyaltyCards.toString()), CSVFormat.RFC4180.builder().setDelimiter(';').setHeader().build());
try {
for (CSVRecord record : fidmeParser) {
importLoyaltyCard(database, db, record);
importLoyaltyCard(database, record);
if (Thread.currentThread().isInterrupted()) {
throw new InterruptedException();
@@ -71,10 +68,6 @@ public class FidmeImporter implements Importer {
fidmeParser.close();
}
database.setTransactionSuccessful();
database.endTransaction();
database.close();
zipInputStream.close();
}
@@ -82,8 +75,8 @@ public class FidmeImporter implements Importer {
* Import a single loyalty card into the database using the given
* session.
*/
private void importLoyaltyCard(SQLiteDatabase database, DBHelper helper, CSVRecord record)
throws IOException, FormatException {
private void importLoyaltyCard(SQLiteDatabase database, CSVRecord record)
throws FormatException {
// A loyalty card export from Fidme contains the following fields:
// Retailer (store name)
// Program (program name)
@@ -129,6 +122,6 @@ public class FidmeImporter implements Importer {
// TODO: Front and back image
helper.insertLoyaltyCard(database, store, note, null, BigDecimal.valueOf(0), null, cardId, null, barcodeType, null, starStatus, null);
DBHelper.insertLoyaltyCard(database, store, note, null, BigDecimal.valueOf(0), null, cardId, null, barcodeType, null, starStatus, null);
}
}

View File

@@ -1,6 +1,7 @@
package protect.card_locker.importexport;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import org.json.JSONException;
@@ -8,7 +9,6 @@ import java.io.IOException;
import java.io.InputStream;
import java.text.ParseException;
import protect.card_locker.DBHelper;
import protect.card_locker.FormatException;
/**
@@ -23,5 +23,5 @@ public interface Importer {
* @throws IOException
* @throws FormatException
*/
void importData(Context context, DBHelper db, InputStream input, char[] password) throws IOException, FormatException, InterruptedException, JSONException, ParseException;
void importData(Context context, SQLiteDatabase database, InputStream input, char[] password) throws IOException, FormatException, InterruptedException, JSONException, ParseException;
}

View File

@@ -1,13 +1,12 @@
package protect.card_locker.importexport;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import java.io.IOException;
import java.io.OutputStream;
import protect.card_locker.DBHelper;
public class MultiFormatExporter {
private static final String TAG = "Catima";
@@ -21,7 +20,7 @@ public class MultiFormatExporter {
* another ImportExportResult otherwise. If not Success, partial data may have been
* written to the output stream, and it should be discarded.
*/
public static ImportExportResult exportData(Context context, DBHelper db, OutputStream output, DataFormat format, char[] password) {
public static ImportExportResult exportData(Context context, SQLiteDatabase database, OutputStream output, DataFormat format, char[] password) {
Exporter exporter = null;
switch (format) {
@@ -35,7 +34,7 @@ public class MultiFormatExporter {
if (exporter != null) {
try {
exporter.exportData(context, db, output, password);
exporter.exportData(context, database, output, password);
return ImportExportResult.Success;
} catch (IOException e) {
Log.e(TAG, "Failed to export data", e);

View File

@@ -1,6 +1,7 @@
package protect.card_locker.importexport;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import net.lingala.zip4j.exception.ZipException;
@@ -11,7 +12,6 @@ import java.io.IOException;
import java.io.InputStream;
import java.text.ParseException;
import protect.card_locker.DBHelper;
import protect.card_locker.FormatException;
public class MultiFormatImporter {
@@ -28,7 +28,7 @@ public class MultiFormatImporter {
* or another result otherwise. If no Success, no data was written to
* the database.
*/
public static ImportExportResult importData(Context context, DBHelper db, InputStream input, DataFormat format, char[] password) {
public static ImportExportResult importData(Context context, SQLiteDatabase database, InputStream input, DataFormat format, char[] password) {
Importer importer = null;
switch (format) {
@@ -47,15 +47,18 @@ public class MultiFormatImporter {
}
if (importer != null) {
database.beginTransaction();
try {
importer.importData(context, db, input, password);
importer.importData(context, database, input, password);
database.setTransactionSuccessful();
return ImportExportResult.Success;
} catch (ZipException e) {
return ImportExportResult.BadPassword;
} catch (IOException | FormatException | InterruptedException | JSONException | ParseException | NullPointerException e) {
Log.e(TAG, "Failed to import data", e);
} finally {
database.endTransaction();
}
} else {
Log.e(TAG, "Unsupported data format imported: " + format.name());
}

View File

@@ -39,7 +39,7 @@ import protect.card_locker.ZipUtils;
* A header is expected for the each table showing the names of the columns.
*/
public class StocardImporter implements Importer {
public void importData(Context context, DBHelper db, InputStream input, char[] password) throws IOException, FormatException, JSONException, ParseException {
public void importData(Context context, SQLiteDatabase database, InputStream input, char[] password) throws IOException, FormatException, JSONException, ParseException {
HashMap<String, HashMap<String, Object>> loyaltyCardHashMap = new HashMap<>();
HashMap<String, HashMap<String, String>> providers = new HashMap<>();
@@ -153,9 +153,6 @@ public class StocardImporter implements Importer {
throw new FormatException("Couldn't find any loyalty cards in this Stocard export.");
}
SQLiteDatabase database = db.getWritableDatabase();
database.beginTransaction();
for (HashMap<String, Object> loyaltyCardData : loyaltyCardHashMap.values()) {
String providerId = (String) loyaltyCardData.get("_providerId");
HashMap<String, String> providerData = providers.get(providerId);
@@ -173,7 +170,7 @@ public class StocardImporter implements Importer {
}
}
long loyaltyCardInternalId = db.insertLoyaltyCard(database, store, note, null, BigDecimal.valueOf(0), null, cardId, null, barcodeType, null, 0, null);
long loyaltyCardInternalId = DBHelper.insertLoyaltyCard(database, store, note, null, BigDecimal.valueOf(0), null, cardId, null, barcodeType, null, 0, null);
if (loyaltyCardData.containsKey("frontImage")) {
Utils.saveCardImage(context, (Bitmap) loyaltyCardData.get("frontImage"), (int) loyaltyCardInternalId, ImageLocationType.front);
@@ -183,10 +180,6 @@ public class StocardImporter implements Importer {
}
}
database.setTransactionSuccessful();
database.endTransaction();
database.close();
zipInputStream.close();
}

View File

@@ -36,7 +36,7 @@ import protect.card_locker.Utils;
* A header is expected for the each table showing the names of the columns.
*/
public class VoucherVaultImporter implements Importer {
public void importData(Context context, DBHelper db, InputStream input, char[] password) throws IOException, FormatException, JSONException, ParseException {
public void importData(Context context, SQLiteDatabase database, InputStream input, char[] password) throws IOException, FormatException, JSONException, ParseException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8));
StringBuilder sb = new StringBuilder();
@@ -46,9 +46,6 @@ public class VoucherVaultImporter implements Importer {
}
JSONArray jsonArray = new JSONArray(sb.toString());
SQLiteDatabase database = db.getWritableDatabase();
database.beginTransaction();
// See https://github.com/tim-smart/vouchervault/issues/4#issuecomment-788226503 for more info
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonCard = jsonArray.getJSONObject(i);
@@ -129,13 +126,9 @@ public class VoucherVaultImporter implements Importer {
throw new FormatException("Unknown colour type found: " + colorFromJSON);
}
db.insertLoyaltyCard(store, "", expiry, balance, balanceType, cardId, null, barcodeType, headerColor, 0, Utils.getUnixTime());
DBHelper.insertLoyaltyCard(database, store, "", expiry, balance, balanceType, cardId, null, barcodeType, headerColor, 0, Utils.getUnixTime());
}
database.setTransactionSuccessful();
database.endTransaction();
database.close();
bufferedReader.close();
}
}

View File

@@ -1,6 +1,7 @@
package protect.card_locker.preferences;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.MenuItem;
@@ -9,22 +10,26 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatDelegate;
import androidx.appcompat.widget.Toolbar;
import androidx.core.app.ActivityCompat;
import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.FragmentActivity;
import androidx.preference.ListPreference;
import androidx.preference.Preference;
import androidx.preference.PreferenceFragmentCompat;
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;
public class SettingsActivity extends CatimaAppCompatActivity {
private final static String RELOAD_MAIN_STATE = "mReloadMain";
private SettingsFragment fragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -38,10 +43,21 @@ public class SettingsActivity extends CatimaAppCompatActivity {
}
// Display the fragment as the main content.
SettingsFragment fragment = new SettingsFragment();
fragment = new SettingsFragment();
getSupportFragmentManager().beginTransaction()
.replace(R.id.settings_container, fragment)
.commit();
// restore reload main state
if (savedInstanceState != null) {
fragment.mReloadMain = savedInstanceState.getBoolean(RELOAD_MAIN_STATE);
}
}
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean(RELOAD_MAIN_STATE, fragment.mReloadMain);
}
@Override
@@ -49,16 +65,34 @@ public class SettingsActivity extends CatimaAppCompatActivity {
int id = item.getItemId();
if (id == android.R.id.home) {
finish();
finishSettingsActivity();
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onBackPressed() {
finishSettingsActivity();
}
private void finishSettingsActivity() {
if (fragment.mReloadMain) {
Intent intent = new Intent();
intent.putExtra(MainActivity.RESTART_ACTIVITY_INTENT, true);
setResult(Activity.RESULT_OK, intent);
} else {
setResult(Activity.RESULT_OK);
}
finish();
}
public static class SettingsFragment extends PreferenceFragmentCompat {
private static final String DIALOG_FRAGMENT_TAG = "SettingsFragment";
public boolean mReloadMain;
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
// Load the preferences from an XML resource
@@ -91,32 +125,23 @@ public class SettingsActivity extends CatimaAppCompatActivity {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);
}
FragmentActivity activity = getActivity();
if (activity != null) {
ActivityCompat.recreate(activity);
}
return true;
});
Preference colorPreference = findPreference(getResources().getString(R.string.setting_key_theme_color));
assert colorPreference != null;
colorPreference.setOnPreferenceChangeListener((preference, o) -> {
FragmentActivity activity = getActivity();
if (activity != null) {
ActivityCompat.recreate(activity);
}
return true;
});
localePreference.setOnPreferenceChangeListener((preference, newValue) -> {
// Refresh the activity
Intent intent = new Intent(getContext(), SettingsActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
getContext().startActivity(intent);
refreshActivity(true);
return true;
});
}
private void refreshActivity(boolean reloadMain) {
mReloadMain = reloadMain || mReloadMain;
Activity activity = getActivity();
if (activity != null) {
activity.recreate();
}
}
@Override
public void onDisplayPreferenceDialog(Preference preference) {
if (preference instanceof NumberDialogPreference) {

View File

@@ -1,4 +1,4 @@
<vector android:height="24dp" android:tint="#FFFFFF"
<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="M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/>

View File

@@ -1,4 +1,4 @@
<vector android:height="24dp" android:tint="#FFFFFF"
<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="M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z"/>

View File

@@ -1,4 +1,4 @@
<vector android:height="24dp" android:tint="#FFFFFF"
<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,10l5,5 5,-5z"/>

View File

@@ -1,4 +1,4 @@
<vector android:height="24dp" android:tint="#FFFFFF"
<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,14l5,-5 5,5z"/>

View File

@@ -1,5 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:tint="#FFFFFF" android:viewportHeight="24"
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="M3,18h6v-2L3,16v2zM3,6v2h18L21,6L3,6zM3,13h12v-2L3,11v2z"/>
</vector>

View File

@@ -1,4 +1,4 @@
<vector android:height="24dp" android:tint="#FFFFFF"
<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.41,18.59L8.83,20 12,16.83 15.17,20l1.41,-1.41L12,14l-4.59,4.59zM16.59,5.41L15.17,4 12,7.17 8.83,4 7.41,5.41 12,10l4.59,-4.59z"/>

View File

@@ -1,4 +1,4 @@
<vector android:height="24dp" android:tint="#FFFFFF"
<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="M12,5.83L15.17,9l1.41,-1.41L12,3 7.41,7.59 8.83,9 12,5.83zM12,18.17L8.83,15l-1.41,1.41L12,21l4.59,-4.59L15.17,15 12,18.17z"/>

View File

@@ -2,7 +2,8 @@
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M16,1L4,1c-1.1,0 -2,0.9 -2,2v14h2L4,3h12L16,1zM19,5L8,5c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h11c1.1,0 2,-0.9 2,-2L21,7c0,-1.1 -0.9,-2 -2,-2zM19,21L8,21L8,7h11v14z"/>

View File

@@ -1,4 +1,4 @@
<vector android:height="24dp" android:tint="#FFFFFF"
<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="M6,19c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2V7H6v12zM19,4h-3.5l-1,-1h-5l-1,1H5v2h14V4z"/>

View File

@@ -1,9 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="@color/colorPrimary"
android:viewportWidth="24"
android:viewportHeight="24">
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="#FFFFFF"
android:pathData="M9,16.2L4.8,12l-1.4,1.4L9,19 21,7l-1.4,-1.4L9,16.2z"/>

View File

@@ -2,7 +2,8 @@
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:pathData="M18,5l0,-3l-12,0l0,1.17l1.83,1.83z"
android:fillColor="#FFFFFF"/>

View File

@@ -2,7 +2,8 @@
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:pathData="M6,2h12v3h-12z"
android:fillColor="#FFFFFF"/>

View File

@@ -1,4 +1,4 @@
<vector android:height="24dp" android:tint="#FFFFFF"
<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="M10,4H4c-1.1,0 -1.99,0.9 -1.99,2L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V8c0,-1.1 -0.9,-2 -2,-2h-8l-2,-2z"/>

View File

@@ -1,4 +1,4 @@
<vector android:height="24dp" android:tint="#FFFFFF"
<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="M9,3L5,6.99h3L8,14h2L10,6.99h3L9,3zM16,17.01L16,10h-2v7.01h-3L15,21l4,-3.99h-3z"/>

View File

@@ -1,4 +1,4 @@
<vector android:height="24dp" android:tint="#FFFFFF"
<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="M12,17c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM18,8h-1L17,6c0,-2.76 -2.24,-5 -5,-5S7,3.24 7,6h1.9c0,-1.71 1.39,-3.1 3.1,-3.1 1.71,0 3.1,1.39 3.1,3.1v2L6,8c-1.1,0 -2,0.9 -2,2v10c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2L20,10c0,-1.1 -0.9,-2 -2,-2zM18,20L6,20L6,10h12v10z"/>

View File

@@ -1,4 +1,4 @@
<vector android:height="24dp" android:tint="#FFFFFF"
<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="M18,8h-1L17,6c0,-2.76 -2.24,-5 -5,-5S7,3.24 7,6v2L6,8c-1.1,0 -2,0.9 -2,2v10c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2L20,10c0,-1.1 -0.9,-2 -2,-2zM12,17c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2 2,0.9 2,2 -0.9,2 -2,2zM15.1,8L8.9,8L8.9,6c0,-1.71 1.39,-3.1 3.1,-3.1 1.71,0 3.1,1.39 3.1,3.1v2z"/>

View File

@@ -1,4 +1,4 @@
<vector android:height="24dp" android:tint="#FFFFFF"
<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="M3,17.25V21h3.75L17.81,9.94l-3.75,-3.75L3,17.25zM20.71,7.04c0.39,-0.39 0.39,-1.02 0,-1.41l-2.34,-2.34c-0.39,-0.39 -1.02,-0.39 -1.41,0l-1.83,1.83 3.75,3.75 1.83,-1.83z"/>

View File

@@ -1,4 +1,4 @@
<vector android:height="24dp" android:tint="#FFFFFF"
<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="M15.5,14h-0.79l-0.28,-0.27C15.41,12.59 16,11.11 16,9.5 16,5.91 13.09,3 9.5,3S3,5.91 3,9.5 5.91,16 9.5,16c1.61,0 3.09,-0.59 4.23,-1.57l0.27,0.28v0.79l5,4.99L20.49,19l-4.99,-5zM9.5,14C7.01,14 5,11.99 5,9.5S7.01,5 9.5,5 14,7.01 14,9.5 11.99,14 9.5,14z"/>

View File

@@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#000000"
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="M12,17.27L18.18,21l-1.64,-7.03L22,9.24l-7.19,-0.61L12,2 9.19,8.63 2,9.24l5.46,4.73L5.82,21z"/>
</vector>

View File

@@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#000000"
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="M22,9.24l-7.19,-0.62L12,2 9.19,8.63 2,9.24l5.46,4.73L5.82,21 12,17.27 18.18,21l-1.63,-7.03L22,9.24zM12,15.4l-3.76,2.27 1,-4.28 -3.32,-2.88 4.38,-0.38L12,6.1l1.71,4.04 4.38,0.38 -3.32,2.88 1,4.28L12,15.4z"/>
</vector>

View File

@@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/listItemHighlight" android:state_activated="true" />
</selector>

View File

@@ -1,4 +1,4 @@
<vector android:height="24dp" android:tint="#FFFFFF"
<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="M17,3L5,3c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,7l-4,-4zM12,19c-1.66,0 -3,-1.34 -3,-3s1.34,-3 3,-3 3,1.34 3,3 -1.34,3 -3,3zM15,9L5,9L5,5h10v4z"/>

View File

@@ -10,15 +10,13 @@
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
android:layout_height="wrap_content">
<androidx.appcompat.widget.Toolbar
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay"/>
style="?attr/toolbarStyle" />
</com.google.android.material.appbar.AppBarLayout>
@@ -46,7 +44,6 @@
android:fontFamily="sans-serif-medium"
android:padding="2dp"
android:text="@string/version_history"
android:textColor="@color/colorSecondaryText"
android:textSize="18sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
@@ -61,12 +58,12 @@
app:layout_constraintTop_toBottomOf="@id/version_history_main" />
<TextView
android:importantForAccessibility="no"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:fontFamily="sans-serif-medium"
android:text="@string/arrow"
android:textColor="@color/colorSecondaryText"
android:textSize="20sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
@@ -86,7 +83,6 @@
android:fontFamily="sans-serif-medium"
android:padding="2dp"
android:text="@string/credits"
android:textColor="@color/colorSecondaryText"
android:textSize="18sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
@@ -101,12 +97,12 @@
app:layout_constraintTop_toBottomOf="@id/credits_main" />
<TextView
android:importantForAccessibility="no"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:fontFamily="sans-serif-medium"
android:text="@string/arrow"
android:textColor="@color/colorSecondaryText"
android:textSize="20sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
@@ -126,18 +122,28 @@
android:fontFamily="sans-serif-medium"
android:padding="2dp"
android:text="@string/help_translate_this_app"
android:textColor="@color/colorSecondaryText"
android:textSize="18sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/translate_sub"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="2dp"
android:text="@string/translate_platform"
android:layout_marginEnd="20dp"
android:textSize="16sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/translate_main"/>
<TextView
android:importantForAccessibility="no"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:fontFamily="sans-serif-medium"
android:text="@string/arrow"
android:textColor="@color/colorSecondaryText"
android:textSize="20sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
@@ -157,7 +163,6 @@
android:fontFamily="sans-serif-medium"
android:padding="2dp"
android:text="@string/license"
android:textColor="@color/colorSecondaryText"
android:textSize="18sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
@@ -174,12 +179,12 @@
app:layout_constraintTop_toBottomOf="@id/license_main"/>
<TextView
android:importantForAccessibility="no"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:fontFamily="sans-serif-medium"
android:text="@string/arrow"
android:textColor="@color/colorSecondaryText"
android:textSize="20sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
@@ -199,7 +204,6 @@
android:fontFamily="sans-serif-medium"
android:padding="2dp"
android:text="@string/source_repository"
android:textColor="@color/colorSecondaryText"
android:textSize="18sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
@@ -215,12 +219,12 @@
app:layout_constraintTop_toBottomOf="@id/repo_main" />
<TextView
android:importantForAccessibility="no"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:fontFamily="sans-serif-medium"
android:text="@string/arrow"
android:textColor="@color/colorSecondaryText"
android:textSize="20sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
@@ -240,7 +244,6 @@
android:fontFamily="sans-serif-medium"
android:padding="2dp"
android:text="@string/privacy_policy"
android:textColor="@color/colorSecondaryText"
android:textSize="18sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
@@ -256,12 +259,12 @@
app:layout_constraintTop_toBottomOf="@id/privacy_main" />
<TextView
android:importantForAccessibility="no"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:fontFamily="sans-serif-medium"
android:text="@string/arrow"
android:textColor="@color/colorSecondaryText"
android:textSize="20sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
@@ -281,7 +284,6 @@
android:fontFamily="sans-serif-medium"
android:padding="2dp"
android:text="@string/rate_this_app"
android:textColor="@color/colorSecondaryText"
android:textSize="18sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
@@ -297,12 +299,12 @@
app:layout_constraintTop_toBottomOf="@id/rate_main" />
<TextView
android:importantForAccessibility="no"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:fontFamily="sans-serif-medium"
android:text="@string/arrow"
android:textColor="@color/colorSecondaryText"
android:textSize="20sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
@@ -322,7 +324,6 @@
android:fontFamily="sans-serif-medium"
android:padding="2dp"
android:text="@string/report_error"
android:textColor="@color/colorSecondaryText"
android:textSize="18sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
@@ -338,12 +339,12 @@
android:padding="2dp"/>
<TextView
android:importantForAccessibility="no"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:fontFamily="sans-serif-medium"
android:text="@string/arrow"
android:textColor="@color/colorSecondaryText"
android:textSize="20sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"

View File

@@ -22,15 +22,13 @@
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
android:layout_height="wrap_content">
<androidx.appcompat.widget.Toolbar
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay" />
style="?attr/toolbarStyle" />
<com.google.android.material.tabs.TabLayout
android:id="@+id/groups"

View File

@@ -5,6 +5,7 @@
android:layout_height="wrap_content"
xmlns:android="http://schemas.android.com/apk/res/android">
<ImageView
android:importantForAccessibility="no"
android:layout_width="match_parent"
android:layout_height="@dimen/barcode_disp_height"
android:layout_gravity="center_horizontal"

View File

@@ -2,19 +2,19 @@
<androidx.coordinatorlayout.widget.CoordinatorLayout
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="fill_parent"
android:layout_height="fill_parent">
<com.google.android.material.appbar.AppBarLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<androidx.appcompat.widget.Toolbar
android:layout_height="wrap_content">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay" />
style="?attr/toolbarStyle" />
</com.google.android.material.appbar.AppBarLayout>
<LinearLayout
@@ -62,7 +62,8 @@
android:hint="AB1234"
android:importantForAutofill="no"
android:inputType="text"
android:minHeight="48dp" />
android:minHeight="48dp"
tools:ignore="ContentDescription" />
</LinearLayout>
<Button
android:id="@+id/noBarcode"

View File

@@ -43,7 +43,6 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical"
android:background="@color/mainLoyaltyCardBackground"
android:visibility="gone"/>
</RelativeLayout>

View File

@@ -43,8 +43,7 @@
android:layout_height="@dimen/cardThumbnailSize"
android:layout_weight="1"
app:srcCompat="@drawable/ic_baseline_arrow_drop_up_24"
android:contentDescription="@string/moveUp"
app:tint="@color/iconColor"/>
android:contentDescription="@string/moveUp"/>
<ImageButton
android:id="@+id/moveDown"
@@ -52,8 +51,7 @@
android:layout_height="@dimen/cardThumbnailSize"
android:layout_weight="1"
app:srcCompat="@drawable/ic_baseline_arrow_drop_down_24"
android:contentDescription="@string/moveDown"
app:tint="@color/iconColor"/>
android:contentDescription="@string/moveDown"/>
<ImageButton
android:id="@+id/edit"
@@ -61,8 +59,7 @@
android:layout_height="@dimen/cardThumbnailSize"
android:layout_weight="1"
app:srcCompat="@drawable/ic_mode_edit_white_24dp"
android:contentDescription="@string/edit"
app:tint="@color/iconColor"/>
android:contentDescription="@string/edit"/>
<ImageButton
android:id="@+id/delete"
@@ -70,8 +67,7 @@
android:layout_height="@dimen/cardThumbnailSize"
android:layout_weight="1"
app:srcCompat="@drawable/ic_delete_white_24dp"
android:contentDescription="@string/delete"
app:tint="@color/iconColor"/>
android:contentDescription="@string/delete"/>
</LinearLayout>

View File

@@ -7,15 +7,13 @@
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
android:layout_height="wrap_content">
<androidx.appcompat.widget.Toolbar
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay" />
style="?attr/toolbarStyle" />
</com.google.android.material.appbar.AppBarLayout>

View File

@@ -4,6 +4,6 @@
android:layout_height="wrap_content"
android:paddingLeft="8dp"
android:paddingRight="8dp"
style="@style/Widget.MaterialComponents.Chip.Choice"
style="@style/Widget.MaterialComponents.Chip.Filter"
app:checkedIconVisible="true"
android:textAppearance="?android:attr/textAppearance" />
android:textAppearance="?android:attr/textAppearance" />

View File

@@ -18,15 +18,13 @@
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
android:layout_height="wrap_content">
<androidx.appcompat.widget.Toolbar
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay" />
style="?attr/toolbarStyle" />
<com.google.android.material.tabs.TabLayout
android:id="@+id/tabs"
@@ -39,7 +37,7 @@
<com.google.android.material.tabs.TabItem
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/barcode"/>
android:text="@string/options"/>
<com.google.android.material.tabs.TabItem
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@@ -50,7 +48,6 @@
<ScrollView android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@color/inputContrastBackground"
app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior">
<TableLayout
android:layout_width="match_parent"
@@ -128,6 +125,94 @@
</com.google.android.material.textfield.TextInputLayout>
</LinearLayout>
<!-- Barcode ID -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingHorizontal="@dimen/inputPadding"
android:paddingTop="@dimen/inputPadding"
android:orientation="horizontal">
<!-- Barcode ID -->
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/barcodeIdView"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.ExposedDropdownMenu"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1.0"
android:hint="@string/barcodeId"
android:labelFor="@+id/barcodeIdView">
<AutoCompleteTextView
android:id="@+id/barcodeIdField"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="none"/>
</com.google.android.material.textfield.TextInputLayout>
</LinearLayout>
<!-- Barcode type -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingHorizontal="@dimen/inputPadding"
android:paddingTop="@dimen/inputPadding"
android:orientation="horizontal">
<!-- Barcode type -->
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/barcodeTypeView"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.ExposedDropdownMenu"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1.0"
android:hint="@string/barcodeType"
android:labelFor="@+id/barcodeTypeField">
<AutoCompleteTextView
android:id="@+id/barcodeTypeField"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="none"/>
</com.google.android.material.textfield.TextInputLayout>
</LinearLayout>
<!-- Barcode -->
<LinearLayout android:orientation="horizontal"
android:padding="10.0dip"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/barcodeLayout">
<ImageView
android:importantForAccessibility="no"
android:layout_width="0dp"
android:layout_height="@dimen/barcode_disp_height"
android:layout_gravity="center_horizontal"
android:padding="10.0dp"
android:background="#ffffff"
android:id="@+id/barcode"
android:layout_weight="1.0"/>
</LinearLayout>
<!-- Buttons -->
<LinearLayout android:orientation="horizontal"
android:padding="10.0dip"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/barcodeCaptureLayout">
<Button android:id="@+id/enterButton"
android:layout_margin="@dimen/inputMargin"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="@string/editBarcode"
android:layout_weight="1.0"/>
</LinearLayout>
</TableLayout>
<TableLayout
android:id="@+id/optionsPart"
android:visibility="gone">
<!-- Note -->
<LinearLayout
android:layout_width="match_parent"
@@ -161,6 +246,7 @@
android:orientation="horizontal">
<com.google.android.material.chip.ChipGroup
android:contentDescription="@string/groups"
android:id="@+id/groupChips"
android:layout_height="match_parent"
android:layout_width="match_parent"
@@ -240,99 +326,6 @@
</com.google.android.material.textfield.TextInputLayout>
</LinearLayout>
</TableLayout>
<TableLayout
android:id="@+id/barcodePart"
android:visibility="gone">
<!-- Barcode ID -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingHorizontal="@dimen/inputPadding"
android:paddingTop="@dimen/inputPadding"
android:orientation="horizontal">
<!-- Barcode ID -->
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/barcodeIdView"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.ExposedDropdownMenu"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1.0"
android:hint="@string/barcodeId"
android:labelFor="@+id/barcodeIdView">
<AutoCompleteTextView
android:id="@+id/barcodeIdField"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="none"/>
</com.google.android.material.textfield.TextInputLayout>
</LinearLayout>
<!-- Barcode type -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingHorizontal="@dimen/inputPadding"
android:paddingTop="@dimen/inputPadding"
android:orientation="horizontal">
<!-- Barcode type -->
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/barcodeTypeView"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.ExposedDropdownMenu"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1.0"
android:hint="@string/barcodeType"
android:labelFor="@+id/barcodeTypeField">
<AutoCompleteTextView
android:id="@+id/barcodeTypeField"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="none"/>
</com.google.android.material.textfield.TextInputLayout>
</LinearLayout>
<!-- Barcode -->
<View
android:layout_height="@dimen/inputBorderThickness"
android:layout_width="match_parent" />
<LinearLayout android:orientation="horizontal"
android:padding="10.0dip"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:visibility="gone"
android:id="@+id/barcodeLayout">
<ImageView
android:layout_width="0dp"
android:layout_height="@dimen/barcode_disp_height"
android:layout_gravity="center_horizontal"
android:padding="10.0dp"
android:background="#ffffff"
android:id="@+id/barcode"
android:layout_weight="1.0"/>
</LinearLayout>
<!-- Buttons -->
<LinearLayout android:orientation="horizontal"
android:padding="10.0dip"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/barcodeCaptureLayout">
<Button android:id="@+id/enterButton"
android:layout_margin="@dimen/inputMargin"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="@string/editBarcode"
android:textColor="#FFFFFF"
android:layout_weight="1.0"/>
</LinearLayout>
</TableLayout>
<TableLayout
android:id="@+id/picturesPart"
@@ -369,7 +362,8 @@
android:minHeight="50dp"
android:contentDescription="@string/frontImageDescription"
android:scaleType="fitCenter"
app:srcCompat="@drawable/ic_camera_white" />
app:srcCompat="@drawable/ic_camera_white"
android:background="?attr/colorPrimary" />
</com.google.android.material.card.MaterialCardView>
</LinearLayout>
@@ -404,7 +398,8 @@
android:minHeight="50dp"
android:contentDescription="@string/backImageDescription"
android:scaleType="fitCenter"
app:srcCompat="@drawable/ic_camera_white" />
app:srcCompat="@drawable/ic_camera_white"
android:background="?attr/colorPrimary" />
</com.google.android.material.card.MaterialCardView>
</LinearLayout>

View File

@@ -16,48 +16,76 @@
android:id="@+id/icon_layout"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintDimensionRatio="85.6f:53.98f"
android:outlineProvider="none"
app:cardCornerRadius="8dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@+id/store">
app:strokeWidth="0dp"
app:layout_constraintBottom_toTopOf="@+id/store"
app:layout_constraintDimensionRatio="85.6f:53.98f"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:importantForAccessibility="no"
android:id="@+id/thumbnail"
android:scaleType="fitCenter"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:contentDescription="@string/thumbnailDescription"
android:scaleType="fitCenter"
android:src="@mipmap/ic_launcher"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:importantForAccessibility="no"
android:id="@+id/selected_thumbnail"
android:scaleType="fitCenter"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:contentDescription="@string/thumbnailDescription"
app:srcCompat="@drawable/ic_done"
app:layout_constraintTop_toTopOf="parent"
android:scaleType="fitCenter"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"/>
<ImageView
android:id="@+id/star"
android:layout_width="@dimen/cardThumbnailSize"
android:layout_height="@dimen/cardThumbnailSize"
android:layout_gravity="end"
app:srcCompat="@drawable/ic_starred_white"
android:contentDescription="@string/starImage"
app:tint="?attr/colorControlNormal"
android:visibility="gone"
tools:visibility="visible"
android:elevation="4dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
app:srcCompat="@drawable/ic_done" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/star"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end">
<ImageView
android:id="@+id/star_background"
android:layout_width="@dimen/cardThumbnailSize"
android:layout_height="@dimen/cardThumbnailSize"
android:layout_gravity="end"
android:alpha="0.5"
android:contentDescription="@string/starred"
android:elevation="4dp"
android:visibility="visible"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_starred_white"
tools:ignore="ImageContrastCheck" />
<ImageView
android:importantForAccessibility="no"
android:id="@+id/star_border"
android:layout_width="@dimen/cardThumbnailSize"
android:layout_height="@dimen/cardThumbnailSize"
android:layout_gravity="end"
android:alpha="0.5"
android:contentDescription="@string/starImage"
android:elevation="4dp"
android:visibility="visible"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_unstarred_black"
tools:ignore="ImageContrastCheck" />
</androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.card.MaterialCardView>
<TextView

View File

@@ -25,6 +25,7 @@
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/mainLayout"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:orientation="vertical">
@@ -54,11 +55,12 @@
android:padding="0dp"
app:srcCompat="@drawable/ic_baseline_arrow_drop_up_24"
android:contentDescription="@string/moveBarcodeToTopOfScreen"
app:tint="#ffffff"
app:tint="?attr/colorOnPrimary"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@+id/mainImage"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
app:layout_constraintStart_toStartOf="parent"
android:background="?attr/colorPrimary" />
<ImageView
android:id="@+id/mainImage"
@@ -85,10 +87,11 @@
android:padding="0dp"
app:srcCompat="@drawable/ic_baseline_arrow_drop_down_24"
android:contentDescription="@string/moveBarcodeToCenterOfScreen"
app:tint="#ffffff"
app:tint="?attr/colorOnPrimary"
app:layout_constraintTop_toBottomOf="@+id/mainImage"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
app:layout_constraintStart_toStartOf="parent"
android:background="?attr/colorPrimary" />
<LinearLayout
android:id="@+id/dotIndicator"
@@ -107,6 +110,7 @@
app:layout_constraintTop_toBottomOf="@+id/minimizeButton"/>
<SeekBar
android:contentDescription="@string/set_scale"
android:id="@+id/barcodeScaler"
android:visibility="gone"
android:max="100"
@@ -154,7 +158,7 @@
android:id="@+id/bottom_sheet"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/inputBackground"
android:background="?android:colorBackground"
android:orientation="vertical"
android:paddingTop="0px"
android:visibility="gone"
@@ -168,10 +172,11 @@
android:layout_width="match_parent"
android:layout_height="80dp"
android:layout_gravity="top|start"
android:contentDescription="@string/toggleMoreInfo"
android:contentDescription="@string/showMoreInfo"
android:scaleType="fitCenter"
app:srcCompat="@drawable/ic_baseline_arrow_drop_up_24"
app:tint="#ffffff" />
app:tint="?attr/colorOnPrimary"
android:background="?attr/colorPrimary" />
<androidx.core.widget.NestedScrollView
android:id="@+id/bottomSheetContentWrapper"
@@ -247,14 +252,13 @@
android:weightSum="1.0"
>
<androidx.appcompat.widget.Toolbar
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar_landscape"
android:layout_width="fill_parent"
android:layout_height="?actionBarSize"
android:background="@android:color/transparent"
android:fitsSystemWindows="false"
android:paddingTop="0dp"
android:theme="@style/CardView.ActionBarTheme"
android:visibility="gone"
app:contentInsetStart="72.0dip"
app:layout_collapseMode="pin" />
@@ -290,7 +294,6 @@
android:layout_width="fill_parent"
android:layout_height="?actionBarSize"
android:background="@android:color/transparent"
android:theme="@style/CardView.ActionBarTheme"
app:contentInsetStart="72.0dip"
app:layout_collapseMode="pin" />

View File

@@ -19,15 +19,13 @@
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
android:layout_height="wrap_content">
<androidx.appcompat.widget.Toolbar
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay"/>
style="?attr/toolbarStyle" />
<com.google.android.material.tabs.TabLayout
android:id="@+id/groups"

View File

@@ -19,15 +19,13 @@
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
android:layout_height="wrap_content">
<androidx.appcompat.widget.Toolbar
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay"/>
style="?attr/toolbarStyle" />
</com.google.android.material.appbar.AppBarLayout>

View File

@@ -9,15 +9,13 @@
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
android:layout_height="wrap_content">
<androidx.appcompat.widget.Toolbar
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay" />
style="?attr/toolbarStyle" />
</com.google.android.material.appbar.AppBarLayout>
@@ -25,6 +23,7 @@
android:id="@+id/zxing_barcode_scanner"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="?attr/actionBarSize"
app:zxing_scanner_layout="@layout/custom_barcode_scanner">
</com.journeyapps.barcodescanner.DecoratedBarcodeView>
</RelativeLayout>
</RelativeLayout>

View File

@@ -7,15 +7,13 @@
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
android:layout_height="wrap_content">
<androidx.appcompat.widget.Toolbar
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay"/>
style="?attr/toolbarStyle" />
</com.google.android.material.appbar.AppBarLayout>

View File

@@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
style="?attr/toolbarStyle" />
</com.google.android.material.appbar.AppBarLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/list"
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
app:spanCount="1"
android:layout_height="match_parent"
android:layout_width="match_parent" />
</RelativeLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@@ -10,26 +10,30 @@ Oğuz Ersen
IllusiveMan196
Petr Novák
Taco
Gediminas Murauskas
Joel A
Gediminas Murauskas
Altonss
StoyanDimitrov
Nyatsuki
Samantaz Fox
arno-github
Ankit Tiwari
Sergio Paredes
Michael Moroni
laralem
arshbeerSingh
huuhaa
Miha Frangež
Michael Moroni
sr093906
Olivia (Zoe)
betsythefc
waffshappen
K. Herbert
Maciej Błędkowski
Quentin PAGÈS
String E. Fighter
Yurical
Silvério Santos
/usr/local/ΕΨΗΕΛΩΝ
Adolfo Jayme-Barrientos
Alessandro Mandelli
@@ -37,7 +41,6 @@ KovalevArtem
Clonewayx
D. Domig
Diego
sr093906
Jane Kong
Lukas Grassauer
Marnick L'Eau
@@ -51,20 +54,21 @@ phlostically
Aditya Das
Kevin Sicong Jiang
Airat
Andreas Blaser
BMN
Biren
Kasina Dheeraj
Flav
Franciszek Stefan
Izzy
Karol Kosek
krkk
bittin
Maciej Błędkowski
Marco
Mattia
Michael Gangolf
pbeckmann
Peer Beckmann
QuangDNguyen2211
Quang Nguyen
Reza
Rohan Babbar
Ronak Upadhyay
@@ -74,6 +78,7 @@ Still Hsu
Subhashish Anand
Tymofii Lytvynenko
Tjipke van der Heide
Yevgeny M
avikkundu
opsik
psa-jforestier
@@ -81,3 +86,4 @@ Robin
sergio
Marcus
techwebpd
rr-vesp

View File

@@ -11,7 +11,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">Идентификатор на карта</string>
<string name="note">Бележка</string>
@@ -25,8 +25,8 @@
</plurals>
<string name="failedOpeningFileManager">Инсталирайте приложение за управление на файлове.</string>
<string name="app_license">Свободен софтуер с авторски права, лицензиран под GPLv3+</string>
<string name="frontImageDescription">Снимка на предната страна на карта</string>
<string name="backImageDescription">Снимка на задната страна на карта</string>
<string name="frontImageDescription">Снимка на предната страна</string>
<string name="backImageDescription">Снимка на задната страна</string>
<string name="parsingBalanceFailed"><xliff:g>%s</xliff:g> не изглежда истинска наличност.</string>
<string name="no">Не</string>
<string name="yes">Да</string>
@@ -34,9 +34,9 @@
<string name="setFrontImage">Снимка на предната страна</string>
<string name="photos">Снимки</string>
<string name="importOptionApplicationExplanation">Изберете файл чрез друго приложение.</string>
<string name="noExternalStoragePermissionError">Дайте разрешение за достъп до хранилището, за да работи внасянето и изнасянето</string>
<string name="noExternalStoragePermissionError">Разрешете достъп до хранилището, за да работи внасянето и изнасянето</string>
<string name="noCardExistsError">Картата не е намерена</string>
<string name="updateBarcodeQuestionText">Идентификаторът е променен. Желаете ли с неговата стойност да бъде променен и щрихкода\?</string>
<string name="updateBarcodeQuestionText">Идентификаторът е променен. Желаете ли с неговата стойност да бъде променен и щрихкодът\?</string>
<string name="updateBarcodeQuestionTitle">Обновяване на щрихкода\?</string>
<string name="noCardIdError">Не е въведен идентификатор</string>
<string name="noCardsMessage">Добавете карта</string>
@@ -99,29 +99,29 @@
<string name="settings_category_title_ui">Потребителски интерфейс</string>
<string name="settings">Настройки</string>
<string name="starImage">Звезда за любимо</string>
<string name="thumbnailDescription">Миниатюра на картата</string>
<string name="copy_to_clipboard_toast">Идентификаторът на картата е копиран в междинната памет</string>
<string name="enterBarcodeInstructions">Въведете идентификатор на картата или като изберете вида на щрихкода или докоснете бутона „Картата няма щрихкод“.</string>
<string name="thumbnailDescription">Миниатюра</string>
<string name="copy_to_clipboard_toast">Идентификаторът е копиран в междинната памет</string>
<string name="enterBarcodeInstructions">Въведете идентификатор и или изберете вида на щрихкода, или докоснете бутона „Липсва щрихкод“.</string>
<string name="selectBarcodeTitle">Избиране на щрихкод</string>
<string name="importOptionApplicationButton">Избиране чрез приложение</string>
<string name="importing">Внасяне…</string>
<string name="exporting">Изнасяне…</string>
<string name="exportFailed">Картите не могат да бъдат изнесени</string>
<string name="exportFailed">Данните не могат да бъдат изнесени</string>
<string name="exportFailedTitle">Грешка при изнасяне</string>
<string name="importFailed">Картите не могат да бъдат внесени</string>
<string name="importFailed">Данните не могат да бъдат внесени</string>
<string name="importFailedTitle">Грешка при внасяне</string>
<string name="exportSuccessfulTitle">Резултат от изнасяне</string>
<string name="importSuccessfulTitle">Резултат от внасяне</string>
<string name="importExportHelp">Резервните копия на картите ви дават възможност да ги преместите на друго устройство.</string>
<string name="importExportHelp">Резервните копия на данните ви дават възможност да ги премествате на друго устройство.</string>
<string name="exportName">Изнасяне</string>
<string name="importExport">Внасяне/изнасяне</string>
<string name="sendLabel">Изпращане…</string>
<string name="scanCardBarcode">Снемане на щрихкод от карта</string>
<string name="scanCardBarcode">Снемане на щрихкод</string>
<string name="editCardTitle">Редактиране на карта</string>
<string name="share">Споделя</string>
<string name="copy_to_clipboard">Копира идентификатора в междинната памет</string>
<string name="ok">Добре</string>
<string name="importSuccessful">Картите са внесени успешно</string>
<string name="importSuccessful">Данните са внесени</string>
<string name="chooseImportType">От къде ще внесете\?</string>
<string name="importCatimaMessage">Изберете файла <i>catima.zip</i>, предварително изнесен от Catima.
\nСъздайте такъв файл от меню Внасяне/изнасяне от друго устройство с Catima като изберете Изнасяне.</string>
@@ -139,12 +139,12 @@
<string name="about">Относно</string>
<string name="importOptionFilesystemTitle">Внасяне от файловата система</string>
<string name="importCatima">Внасяне от Catima</string>
<string name="exportSuccessful">Картите са изнесени успешно</string>
<string name="exportSuccessful">Данните са изнесени</string>
<string name="unlockScreen">Разрешава автоматичното завъртане</string>
<string name="lockScreen">Спира автоматичното завъртане</string>
<plurals name="selectedCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> избрана карта</item>
<item quantity="other"><xliff:g>%d</xliff:g> избрани карти</item>
<item quantity="one"><xliff:g>%d</xliff:g> избрана</item>
<item quantity="other"><xliff:g>%d</xliff:g> избрани</item>
</plurals>
<string name="deleteConfirmationGroup">Изтриване на група\?</string>
<string name="moveDown">Преместване надолу</string>
@@ -162,7 +162,6 @@
<string name="importLoyaltyCardKeychainMessage">Изберете файла <i>LoyaltyCardKeychain.csv</i>, предварително изнесен от Loyalty Card Keychain.
\nСъздайте такъв файл от меню Внасяне/изнасяне от друго устройство с Loyalty Card Keychain като изберете Изнасяне.</string>
<string name="failedParsingImportUriError">Препратката не може да бъде анализирана за внасяне</string>
<string name="card_ids_copied">[не превеждай този низ, https://github.com/TheLastProject/Catima/issues/278]</string>
<string name="failedGeneratingShareURL">Грешка при създаване на адрес за споделяне. Изпратете доклад за дефект.</string>
<string name="deleteTitle">Премахване на карта</string>
<plurals name="deleteCardsTitle">
@@ -187,12 +186,11 @@
<string name="settings_theme_color">Цвят на темата</string>
<string name="settings_system_locale">Система</string>
<string name="settings_locale">Език</string>
<string name="noGroupCards">Групата не съдържа карти</string>
<string name="toggleMoreInfo">Превключване на повече информация</string>
<string name="barcodeImageDescriptionWithType">Изображение на щрихкод на карта от вида <xliff:g>%s</xliff:g></string>
<string name="noGroupCards">Групата е празна</string>
<string name="barcodeImageDescriptionWithType">Изображение на щрихкод от вид <xliff:g>%s</xliff:g></string>
<string name="swipeToSwitchImages">Плъзване или задържане за смяна на изображения</string>
<string name="sort_by">Сортиране по</string>
<string name="reverse">Наобратно</string>
<string name="reverse">…в обратен ред</string>
<string name="sort_by_balance">Наличност</string>
<string name="sort_by_expiry">Валидност</string>
<string name="sort_by_most_recently_used">Последно използване</string>
@@ -219,5 +217,12 @@
<string name="group_edit">Редактиране на списък</string>
<string name="action_show_details">Повече детайли</string>
<string name="action_hide_details">По-малко детайли</string>
<string name="noGiftCardsGroup">Няма карти. След като добавите ще можете да ги зачислите към списък от тук.</string>
</resources>
<string name="noGiftCardsGroup">Създайте карти и ги зачислите към списък от тук.</string>
<string name="translate_platform">в Weblate</string>
<string name="shortcutSelectCard">Избор на карта</string>
<string name="starred">Със звезда</string>
<string name="set_scale">Мащаб</string>
<string name="showMoreInfo">Показване на информация</string>
<string name="hideMoreInfo">Скриване на информация</string>
<string name="options">Настройки</string>
</resources>

View File

@@ -66,7 +66,6 @@
<string name="settings_green_theme">সবুজ থিম</string>
<string name="settings_brown_theme">বাদামী থিম</string>
<string name="sort">সাজান</string>
<string name="toggleMoreInfo">আরও তথ্য টগল করুন</string>
<string name="swipeToSwitchImages">ছবি পরিবর্তন করতে সোয়াইপ করুন</string>
<string name="sort_by_name">নামের দ্বারা সাজান</string>
<string name="sort_by_most_recently_used">সর্বাধিক সম্প্রতি ব্যবহৃত দ্বারা সাজান</string>

View File

@@ -66,7 +66,6 @@
<string name="settings_green_theme">Zeleno</string>
<string name="settings_brown_theme">Braun</string>
<string name="sort">Poništi sortiranje</string>
<string name="toggleMoreInfo">Uključi savjete</string>
<string name="swipeToSwitchImages">Swipe ili long press za prebacivanje slika</string>
<string name="sort_by_name">Ime</string>
<string name="sort_by_most_recently_used">Nedavno Korišten</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">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">Klepnutím na tlačítko + plus přidáte kartu nebo ji nejprve importujete z nabídky ⋮.</string>
<string name="storeName">Název</string>
<string name="note">Poznámka</string>
<string name="cardId">ID karty</string>
@@ -15,21 +15,21 @@
<string name="sendLabel">Odeslat…</string>
<string name="editCardTitle">Editovat věrnostní kartu</string>
<string name="addCardTitle">Přidat věrnostní kartu</string>
<string name="scanCardBarcode">Skenování Čárový Kód Karty</string>
<string name="scanCardBarcode">Skenování čárového kódu</string>
<string name="noStoreError">Zadáno žádné jméno</string>
<string name="noCardIdError">Žádné ID karty zadáno</string>
<string name="noCardIdError">ID nezadáno</string>
<string name="importExport">Import/Export</string>
<string name="exportName">Export</string>
<string name="importExportHelp">Zálohování karet vám umožní přesunout je do jiného zařízení.</string>
<string name="importExportHelp">Zálohování dat vám umožní přesunout je do jiného zařízení.</string>
<string name="importSuccessfulTitle">Importováno</string>
<string name="importFailedTitle">Import selhal</string>
<string name="importFailed">Nelze importovat karty</string>
<string name="importFailed">Nelze provést import</string>
<string name="exportSuccessfulTitle">Exportovat</string>
<string name="exportFailedTitle">Export selhal</string>
<string name="exportFailed">Nelze exportovat karty</string>
<string name="exportFailed">Nelze provést export</string>
<string name="importing">Importuji…</string>
<string name="exporting">Exportuji…</string>
<string name="noExternalStoragePermissionError">Udělit povolení externího úložiště pro import nebo export karet jako první</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 uložišti.</string>
<string name="importOptionFilesystemButton">Ze souborového systému</string>
@@ -42,7 +42,7 @@
<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>
<string name="selectBarcodeTitle">Vyberte čárový kód</string>
<string name="copy_to_clipboard_toast">ID karty zkopírované do schránky</string>
<string name="copy_to_clipboard_toast">ID zkopírované do schránky</string>
<string name="deleteTitle">Smazat kartu</string>
<string name="deleteConfirmation">Opravdu chcete smazat tuto věrnostní kartu?</string>
<string name="moveBarcodeToCenterOfScreen">Střed čárového kódu na obrazovce</string>
@@ -58,7 +58,7 @@
\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="noCardExistsError">Nelze najít kartu</string>
<string name="noCardExistsError">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>
@@ -69,10 +69,10 @@
<string name="noBarcode">Žádný čárový kód</string>
<string name="barcodeNoBarcode">Tato karta nemá čárový kód</string>
<string name="barcodeType">Typ čárového kódu</string>
<string name="noMatchingGiftCards">Nic jsem nenašel. Zkuste změnit vyhledávání.</string>
<string name="noMatchingGiftCards">Nic nenalezeno. Zkuste změnit vyhledávání.</string>
<string name="action_search">Vyhledávání</string>
<string name="thumbnailDescription">Miniatura karty</string>
<string name="card_ids_copied">Zkopírované ID karty(karet)</string>
<string name="thumbnailDescription">Miniatura</string>
<string name="card_ids_copied">Zkopírované ID</string>
<plurals name="deleteCardsConfirmation">
<item quantity="one">Opravdu chcete kartu <xliff:g>%d</xliff:g> trvale odstranit\?</item>
<item quantity="few">Opravdu chcete karty <xliff:g>%d</xliff:g> trvale odstranit\?</item>
@@ -83,7 +83,7 @@
<item quantity="few">Odstranit karty <xliff:g>%d</xliff:g></item>
<item quantity="other">Odstranit karty <xliff:g>%d</xliff:g></item>
</plurals>
<string name="importSuccessful">Data karty importována</string>
<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="settings_disable_lockscreen_while_viewing_card">Bránit uzamykání obrazovky</string>
<string name="settings_keep_screen_on">Udržovat obrazovku zapnutou</string>
@@ -102,7 +102,7 @@
<string name="expiryStateSentence">Platí do: <xliff:g>%s</xliff:g></string>
<string name="moveDown">Přesunout dolů</string>
<string name="moveUp">Přesunout nahoru</string>
<string name="enterBarcodeInstructions">Zadejte ID karty a níže vyberte typ čárového kódu nebo \"Tato karta nemá čárový kód\".</string>
<string name="enterBarcodeInstructions">Zadejte ID a níže vyberte typ čárového kódu nebo \"Tato karta nemá čárový kód\".</string>
<string name="settings_brown_theme">Hnědá</string>
<string name="settings_grey_theme">Šedá</string>
<string name="settings_green_theme">Zelená</string>
@@ -121,22 +121,22 @@
<string name="passwordRequired">Zadejte prosím heslo</string>
<string name="no">Ne</string>
<string name="yes">Ano</string>
<string name="updateBarcodeQuestionText">Změnili jste ID karty. Chcete také aktualizovat čárový kód, aby používal stejnou hodnotu\?</string>
<string name="updateBarcodeQuestionText">Změnili jste ID. Chcete také aktualizovat čárový kód, aby používal stejnou hodnotu\?</string>
<string name="updateBarcodeQuestionTitle">Aktualizovat hodnotu čárového kódu\?</string>
<string name="takePhoto">Pořídit fotku</string>
<string name="removeImage">Odstranit obrázek</string>
<string name="setBackImage">Nastavit obrázek zadní strany</string>
<string name="setFrontImage">Nastavit obrázek přední strany</string>
<string name="photos">Fotky</string>
<string name="backImageDescription">Obrázek zadní strany karty</string>
<string name="frontImageDescription">Obrázek přední strany karty</string>
<string name="backImageDescription">Obrázek zadní strany</string>
<string name="frontImageDescription">Obrázek přední strany</string>
<string name="intent_import_card_from_url_share_multiple_text">Chci s Vámi sdílet kartu</string>
<string name="copy_to_clipboard_multiple_toast">ID karty zkopírováno do schránky</string>
<string name="copy_to_clipboard_multiple_toast">ID zkopírováno do schránky</string>
<string name="wrongValueForBarcodeType">Hodnota není platná pro vybraný typ čárového kódu</string>
<string name="unsupportedBarcodeType">Tento typ čárového kódu zatím nelze zobrazit. Možná bude podporován v pozdější verzi aplikace.</string>
<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 karty</string>
<string name="sameAsCardId">Stejné jako ID</string>
<string name="importVoucherVaultMessage">Vyberte svůj <i>vouchervault.json</i> export z Voucher Vault, který chcete importovat.
\nVytvořte jej tak, že nejprve stisknete tlačítko Exportovat v aplikaci Voucher Vault.</string>
<string name="importVoucherVault">Import z Voucher Vault</string>
@@ -167,7 +167,7 @@
<string name="noBarcodeFound">Čarový 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="addManually">Ruční zadání ID karty</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>
<string name="failedOpeningFileManager">Nejprve si nainstalujte správce souborů.</string>
@@ -178,10 +178,10 @@
<item quantity="few"><xliff:g>%d</xliff:g> karty</item>
<item quantity="other"><xliff:g>%d</xliff:g> karet</item>
</plurals>
<string name="noGroups">Kliknutím na tlačítko + plus nejprve přidejte skupiny pro kategorizaci.</string>
<string name="noGroups">Kliknutím na tlačítko + plus přidejte skupiny pro kategorizaci.</string>
<string name="groups">Skupiny</string>
<string name="enter_group_name">Zadejte název skupiny</string>
<string name="exportSuccessful">Data karty exportována</string>
<string name="exportSuccessful">Data exportována</string>
<string name="settings_display_barcode_max_brightness">Rozjasněné zobrazení čárového kódu</string>
<string name="starImage">Oblíbená hvězda</string>
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Copyright © 2019<xliff:g>%d</xliff:g> Sylvia van Os</string>
@@ -191,17 +191,16 @@
<item quantity="other">Vybráno <xliff:g>%d</xliff:g> karet</item>
</plurals>
<string name="app_contributors">Přispěli: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="noGroupCards">Tato skupina neobsahuje žádné karty</string>
<string name="noGroupCards">Tato skupina je prázdná</string>
<string name="sort_by">Seřadit podle</string>
<string name="reverse">Obrátit</string>
<string name="reverse">...v obráceném pořadí</string>
<string name="sort_by_balance">Zůstatek</string>
<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="toggleMoreInfo">Přepnout zobrazení dalších informací</string>
<string name="sort">Seřadit</string>
<string name="barcodeImageDescriptionWithType">Obrázek čárového kódu karty typu <xliff:g>%s</xliff:g></string>
<string name="barcodeImageDescriptionWithType">Obrázek čárového kódu <xliff:g>%s</xliff:g></string>
<string name="version_history">Historie verzí</string>
<string name="rate_this_app">Ohodnoťte tuto aplikaci</string>
<string name="and_data_usage">a využití dat</string>
@@ -222,4 +221,13 @@
<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="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="set_scale">Nastavení měřítka</string>
<string name="options">Volby</string>
</resources>

View File

@@ -3,7 +3,7 @@
<string name="action_search">Suchen</string>
<string name="action_add">Hinzufügen</string>
<string name="noGiftCards">Füge eine Karte mit + hinzu oder importiere welche über das ⋮ Menü.</string>
<string name="noMatchingGiftCards">Nichts gefunden. Versuche, deine Suche zu ändern.</string>
<string name="noMatchingGiftCards">Keine Ergebnisse. Versuche, deine Suche zu ändern.</string>
<string name="storeName">Name</string>
<string name="note">Notiz</string>
<string name="cardId">Kartennummer</string>
@@ -25,20 +25,20 @@
<string name="cardShortcut">Shortcut zu einer Karte</string>
<string name="noCardsMessage">Füge zuerst eine Karte hinzu</string>
<string name="noStoreError">Kein Name eingegeben</string>
<string name="noCardIdError">Keine Kartennummer angegeben</string>
<string name="noCardExistsError">Karte konnte nicht gefunden werden</string>
<string name="noCardIdError">Keine ID eingegeben</string>
<string name="noCardExistsError">Diese Karte konnte nicht gefunden werden</string>
<string name="importExport">Import/Export</string>
<string name="exportName">Export</string>
<string name="importExportHelp">Durch das Sichern deiner Karten kannst du sie auf ein anderes Gerät übertragen.</string>
<string name="importExportHelp">Wenn du deine Daten sicherst, kannst du sie auf ein anderes Gerät übertragen.</string>
<string name="importSuccessfulTitle">Importiert</string>
<string name="importFailedTitle">Import fehlgeschlagen</string>
<string name="importFailed">Karten konnten nicht importiert werden</string>
<string name="importFailed">Import konnte nicht durchgeführt werden</string>
<string name="exportSuccessfulTitle">Exportiert</string>
<string name="exportFailedTitle">Export fehlgeschlagen</string>
<string name="exportFailed">Karten konnten nicht exportiert werden</string>
<string name="exportFailed">Export konnte nicht durchgeführt werden</string>
<string name="importing">Importiere…</string>
<string name="exporting">Exportiere…</string>
<string name="noExternalStoragePermissionError">Erlaube Speicherzugriff um Karten zu importieren oder exportieren</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>
@@ -51,39 +51,39 @@
<string name="debug_version_fmt">Version: <xliff:g id="version">%s</xliff:g></string>
<string name="app_revision_fmt">Revisionsinfo: <xliff:g id="app_revision_url">%s</xliff:g></string>
<string name="selectBarcodeTitle">Barcode auswählen</string>
<string name="copy_to_clipboard_toast">Kartennummer in die Zwischenablage kopiert</string>
<string name="thumbnailDescription">Vorschaubild für die Karte</string>
<string name="copy_to_clipboard_toast">ID in die Zwischenablage kopiert</string>
<string name="thumbnailDescription">Vorschaubild</string>
<string name="settings">Einstellungen</string>
<string name="settings_category_title_ui">Benutzeroberfläche</string>
<string name="settings_display_barcode_max_brightness">Barcodeansicht aufhellen</string>
<string name="settings_lock_barcode_orientation">Barcoderotation sperren</string>
<string name="exportSuccessful">Kartendaten exportiert</string>
<string name="importSuccessful">Kartendaten importiert</string>
<string name="exportSuccessful">Daten exportiert</string>
<string name="importSuccessful">Daten importiert</string>
<string name="intent_import_card_from_url_share_text">Ich würde gerne diese Karte mit dir teilen</string>
<string name="settings_dark_theme">Dunkel</string>
<string name="settings_light_theme">Hell</string>
<string name="settings_system_theme">System</string>
<string name="settings_theme">Farbschema</string>
<string name="enterBarcodeInstructions">Gib die Kartennummer ein und wähle entweder den Barcode-Typ unten oder wähle \"Diese Karte hat keinen Barcode\" aus.</string>
<string name="enterBarcodeInstructions">Gib die ID ein und wähle unten entweder einen Barcodetyp oder „Es gibt keinen Barcode.</string>
<string name="app_copyright_old">Basierend auf Loyalty Card Keychain
\nCopyright © 2016-2020 Branden Archer</string>
<string name="exportOptionExplanation">Die Daten werden an einen Ort deiner Wahl geschrieben.</string>
<string name="failedParsingImportUriError">Die Import-URI konnte nicht verarbeitet werden</string>
<string name="share">Teilen</string>
<string name="barcodeNoBarcode">Diese Karte hat keinen Barcode</string>
<string name="barcodeNoBarcode">Es gibt keinen Barcode</string>
<string name="barcodeType">Barcodetyp</string>
<string name="starImage">Favoritenstern</string>
<string name="deleteConfirmationGroup">Gruppe löschen?</string>
<string name="all">Alle</string>
<string name="noGroups">Klicke auf das Pluszeichen + um eine Gruppe hinzuzufügen.</string>
<string name="noGroupCards">Diese Gruppe hat noch keine Karten</string>
<string name="noGroups">Klicke auf das Pluszeichen +, um eine Gruppe hinzuzufügen.</string>
<string name="noGroupCards">Diese Gruppe ist leer</string>
<string name="groups">Gruppen</string>
<string name="enter_group_name">Gib einen Gruppennamen ein</string>
<string name="leaveWithoutSaveConfirmation">Beenden ohne zu speichern\?</string>
<string name="leaveWithoutSaveTitle">Beenden</string>
<string name="failedOpeningFileManager">Installiere zuerst einen Dateimanager.</string>
<string name="noBarcode">Kein Barcode</string>
<string name="addManually">Kartennummer manuell eingeben</string>
<string name="addManually">ID manuell eingeben</string>
<string name="moveDown">Nach unten verschieben</string>
<string name="moveUp">Nach oben verschieben</string>
<plurals name="groupCardCount">
@@ -116,17 +116,17 @@
\nKEINE DATEN WERDEN GESAMMELT, was jeder bestätigen kann, da unsere Anwendung eine freie Software ist.</string>
<string name="accept">Annehmen</string>
<string name="privacy_policy">Datenschutzrichtlinie</string>
<string name="importVoucherVaultMessage">Wählen Sie Ihren <i>vouchervault.json</i>-Export aus Voucher Vault zum Importieren aus.
\nErstellen Sie ihn, indem Sie zuerst auf Export in Voucher Vault drücken.</string>
<string name="importVoucherVaultMessage">Wähle deinen <i>vouchervault.json</i>-Export aus Voucher Vault zum Importieren aus.
\nErstellen Sie ihn, indem du zuerst auf Export in Voucher Vault drückst.</string>
<string name="importVoucherVault">Aus Voucher Vault importieren</string>
<string name="importLoyaltyCardKeychainMessage">Wählen Sie Ihren <i>LoyaltyCardKeychain.csv</i>-Export aus Loyalty Card Keychain zum Importieren aus.
\nErstellen Sie ihn über das Menü Import/Export in Loyalty Card Keychain, indem Sie dort zuerst auf Export drücken.</string>
<string name="importLoyaltyCardKeychainMessage">Wählen du deinen <i>LoyaltyCardKeychain.csv</i>-Export aus Loyalty Card Keychain zum Importieren aus.
\nErstelle ihn über das Menü Import/Export in Loyalty Card Keychain, indem du dort zuerst auf Export drückst.</string>
<string name="importLoyaltyCardKeychain">Aus Loyalty Card Keychain importieren</string>
<string name="importFidmeMessage">Wählen Sie Ihren <i>fidme-export-request-xxxxxx.zip</i>-Export aus FidMe zum Importieren aus und wählen Sie anschließend die Strichcodetypen manuell aus.
\nOder erstellen Sie ihn aus Ihrem FidMe-Profil, indem Sie Datenschutz wählen und dann zuerst auf Meine Daten extrahieren drücken.</string>
<string name="importFidmeMessage">Wähle deinen <i>fidme-export-request-xxxxxx.zip</i>-Export aus FidMe zum Importieren aus und wähle anschließend die Strichcodetypen manuell aus.
\nOder erstelle ihn aus deinem FidMe-Profil, indem du Datenschutz wählst und dann zuerst auf Meine Daten extrahieren drückst.</string>
<string name="importFidme">Aus FidMe importieren</string>
<string name="importCatimaMessage">Wählen Sie Ihren <i>catima.zip</i>-Export aus Catima zum Importieren aus.
\nErstellen Sie ihn aus dem Import/Export-Menü einer anderen Catima-Anwendung, indem Sie dort zuerst Export drücken.</string>
<string name="importCatimaMessage">Wähle deinen <i>catima.zip</i>-Export aus Catima zum Importieren aus.
\nErstelle ihn aus dem Import/Export-Menü einer anderen Catima-Anwendung, indem du dort zuerst Export drückst.</string>
<string name="importCatima">Aus Catima importieren</string>
<string name="setBarcodeId">Manuell eingeben</string>
<string name="sameAsCardId">Entspricht Kartennummer</string>
@@ -142,28 +142,28 @@
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Copyright © 2019<xliff:g>%d</xliff:g> Sylvia van Os</string>
<string name="intent_import_card_from_url_share_multiple_text">Ich möchte diese Karten mit dir teilen</string>
<string name="copy_to_clipboard_multiple_toast">Kartennummern in die Zwischenablage kopiert</string>
<string name="card_ids_copied">Kartennummer(n) kopiert</string>
<string name="card_ids_copied">ID(s) kopiert</string>
<string name="no">Nein</string>
<string name="yes">Ja</string>
<string name="updateBarcodeQuestionText">Kartennummer geändert. Möchtest du auch den Barcode auf den gleichen Wert ändern?</string>
<string name="updateBarcodeQuestionText">Kartennummer geändert. Möchtest du auch den Barcode auf den gleichen Wert ändern\?</string>
<string name="updateBarcodeQuestionTitle">Barcodewert aktualisieren?</string>
<string name="takePhoto">Foto aufnehmen</string>
<string name="removeImage">Bild entfernen</string>
<string name="setBackImage">Kartenrückseite</string>
<string name="setFrontImage">Kartenvorderseite</string>
<string name="photos">Fotos</string>
<string name="frontImageDescription">Bild der Kartenvorderseite</string>
<string name="backImageDescription">Bild der Kartenrückseite</string>
<string name="frontImageDescription">Bild auf der Vorseite</string>
<string name="backImageDescription">Bild auf der Rückseite</string>
<string name="passwordRequired">Bitte gib das Passwort ein</string>
<string name="importStocardMessage">Wählen Sie Ihren <i>***-sync.zip</i>-Export aus Stocard zum Importieren aus.
\nSie erhalten ihn, indem Sie eine E-Mail an support@stocardapp.com senden und um einen Export Ihrer Daten bitten.</string>
<string name="importStocardMessage">Wähle deinen <i>***-sync.zip</i>-Export aus Stocard zum Importieren aus.
\nSie erhalten ihn, indem du eine E-Mail an support@stocardapp.com sendest und um einen Export deiner Daten bitten.</string>
<string name="importStocard">Von Stocard importieren</string>
<string name="turn_flashlight_off">Licht ausschalten</string>
<string name="turn_flashlight_on">Licht einschalten</string>
<string name="failedGeneratingShareURL">URL konnte nicht erstellt werden. Bitte melde das an uns.</string>
<plurals name="selectedCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> Karte ausgewählt</item>
<item quantity="other"><xliff:g>%d</xliff:g> Karten ausgewählt</item>
<item quantity="one"><xliff:g>%d</xliff:g> ausgewählt</item>
<item quantity="other"><xliff:g>%d</xliff:g> ausgewählt</item>
</plurals>
<string name="deleteTitle">Karte löschen</string>
<string name="deleteConfirmation">Diese Karte wirklich löschen?</string>
@@ -188,8 +188,7 @@
<string name="settings_catima_theme">Catima</string>
<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="toggleMoreInfo">Umschalten, um weitere Informationen anzuzeigen</string>
<string name="barcodeImageDescriptionWithType">Bild des Kartenstrichcodes des Typs <xliff:g>%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="sort_by">Sortieren nach</string>
<string name="sort_by_balance">Kontostand</string>
@@ -197,7 +196,7 @@
<string name="sort_by_most_recently_used">Zuletzt verwendet</string>
<string name="sort_by_name">Name</string>
<string name="sort">Sortieren</string>
<string name="reverse">Umgekehrt</string>
<string name="reverse"> in umgekehrter Reihenfolge</string>
<string name="version_history">Versionshistorie</string>
<string name="credits">Dank an</string>
<string name="help_translate_this_app">Hilfe bei der Übersetzung</string>
@@ -208,16 +207,23 @@
<string name="source_repository">Quellcode</string>
<string name="on_github">auf GitHub</string>
<string name="report_error">Fehler melden</string>
<string name="exportPassword">Legen Sie ein Passwort fest, um Ihren Export zu schützen (optional)</string>
<string name="exportPassword">Lege ein Passwort fest, um deinen Export zu schützen (optional)</string>
<string name="exportPasswordHint">Passwort eingeben</string>
<string name="group_name_already_in_use">Der Gruppenname wird bereits verwendet</string>
<string name="group_name_is_empty">Gruppenname darf nicht leer sein</string>
<string name="group_updated">Gruppe aktualisiert</string>
<string name="editGroup">Gruppe wird bearbeitet: <xliff:g>%s</xliff:g></string>
<string name="group_edit">Gruppe bearbeiten</string>
<string name="noGiftCardsGroup">Sie haben noch keine Kundenkarten. Sobald Sie welche hinzugefügt haben, können Sie sie hier der Gruppe zuordnen.</string>
<string name="noGiftCardsGroup">Erstelle einige Karten und ordne sie dann hier der Gruppe zu.</string>
<string name="setIcon">Symbol einstellen</string>
<string name="selectColor">Farbe auswählen</string>
<string name="action_show_details">Details anzeigen</string>
<string name="action_hide_details">Details ausblenden</string>
<string name="translate_platform">auf Weblate</string>
<string name="shortcutSelectCard">Wählen Sie eine Karte</string>
<string name="options">Optionen</string>
<string name="hideMoreInfo">Infos ausblenden</string>
<string name="set_scale">Größe festlegen</string>
<string name="showMoreInfo">Infos anzeigen</string>
<string name="starred">als Favorit</string>
</resources>

View File

@@ -143,7 +143,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ää ensin kortti napsauttamalla + plus-painiketta, tai mene ⋮ valikkoon tuodaksesi varmuuskopiosta.</string>
<string name="noGiftCards">Lisää kortti napsauttamalla + plus-painiketta, tai mene ⋮ valikkoon tuodaksesi varmuuskopiosta.</string>
<string name="action_add">Lisää</string>
<string name="action_search">Hae</string>
<string name="takePhoto">Ota valokuva</string>
@@ -164,8 +164,8 @@
<item quantity="other">Poista <xliff:g>%d</xliff:g>kortit</item>
</plurals>
<plurals name="selectedCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> Kortti valittu</item>
<item quantity="other"><xliff:g>%d</xliff:g> kortit valitut</item>
<item quantity="one"><xliff:g>%d</xliff:g> valittu</item>
<item quantity="other"><xliff:g>%d</xliff:g> valitut</item>
</plurals>
<string name="importStocard">Tuo Stocardista</string>
<string name="importStocardMessage">Valitse tuotava <i>***-sync.zip</i>-vienti Stocardista.

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">Ajouter</string>
<string name="noGiftCards">Cliquez sur le bouton + plus pour ajouter une carte, ou importez les depuis le menu ⋮</string>
<string name="noGiftCards">Cliquez sur le bouton + plus pour ajouter une carte, ou importez les depuis le menu ⋮.</string>
<string name="storeName">Nom</string>
<string name="note">Notes</string>
<string name="cardId">Numéro</string>
@@ -19,22 +19,22 @@
<string name="addCardTitle">Ajouter une carte de fidélité</string>
<string name="scanCardBarcode">Scanner le code-barres</string>
<string name="cardShortcut">Raccourci de carte</string>
<string name="noCardsMessage">Ajoutez d\'abord une carte</string>
<string name="noCardsMessage">Ajoutez dabord une carte</string>
<string name="noStoreError">Aucun nom saisi</string>
<string name="noCardIdError">Aucun numéro de carte saisi</string>
<string name="noCardExistsError">Aucune carte trouvée</string>
<string name="noCardIdError">Aucun identifiant saisi</string>
<string name="noCardExistsError">Impossible de trouver cette carte</string>
<string name="importExport">Importer/Exporter</string>
<string name="exportName">Exporter</string>
<string name="importExportHelp">Exporter vos cartes vous permet de les récupérer sur un autre appareil.</string>
<string name="importExportHelp">La sauvegarde de vos données permet de les déplacer sur un autre appareil.</string>
<string name="importSuccessfulTitle">Importé</string>
<string name="importFailedTitle">Échec de l\'import</string>
<string name="importFailed">Impossible d\'importer les cartes</string>
<string name="importFailedTitle">Échec de limport</string>
<string name="importFailed">Impossible deffectuer limportation</string>
<string name="exportSuccessfulTitle">Exporté</string>
<string name="exportFailedTitle">Échec de l\'export</string>
<string name="exportFailed">Impossible d\'exporter les cartes</string>
<string name="exportFailedTitle">Échec de lexport</string>
<string name="exportFailed">Impossible deffectuer lexportation</string>
<string name="importing">Import …</string>
<string name="exporting">Export …</string>
<string name="noExternalStoragePermissionError">Veuillez autoriser l\'accès au stockage externe avant d\'importer/exporter les données</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>
@@ -47,26 +47,26 @@
<string name="debug_version_fmt">Version : <xliff:g id="version">%s</xliff:g></string>
<string name="app_revision_fmt">Notes de version : <xliff:g id="app_revision_url">%s</xliff:g></string>
<string name="selectBarcodeTitle">Choisissez le code-barres</string>
<string name="copy_to_clipboard_toast">Numéro de carte copié dans le presse-papier</string>
<string name="thumbnailDescription">Miniature de la carte</string>
<string name="copy_to_clipboard_toast">Identifiant copié dans le presse-papiers</string>
<string name="thumbnailDescription">Miniature</string>
<string name="settings">Paramètres</string>
<string name="settings_category_title_ui">Interface utilisateur</string>
<string name="settings_display_barcode_max_brightness">Augmenter la luminosité du code-barres</string>
<string name="settings_lock_barcode_orientation">Verrouiller l\'orientation du code-barres</string>
<string name="exportSuccessful">Carte exportée avec succès</string>
<string name="importSuccessful">Carte de fidélité importée</string>
<string name="settings_lock_barcode_orientation">Verrouiller lorientation du code-barres</string>
<string name="exportSuccessful">Données exportées</string>
<string name="importSuccessful">Données importées</string>
<string name="intent_import_card_from_url_share_text">Je veux partager une carte avec toi</string>
<string name="settings_dark_theme">Sombre</string>
<string name="settings_light_theme">Clair</string>
<string name="settings_system_theme">Système</string>
<string name="settings_theme">Thème</string>
<string name="enterBarcodeInstructions">Entrez lidentifiant de la carte et choisissez le type de code-barres ci-dessous, ou « Cette carte na pas de code-barres ».</string>
<string name="enterBarcodeInstructions">Entrez lidentifiant, et choisissez un type de code-barres ci-dessous, ou « Il ny a pas de code-barres ».</string>
<string name="app_copyright_old">Basé sur Loyalty Card Keychain
\ncopyright © 2016-2020 Branden Archer</string>
<string name="exportOptionExplanation">Les données seront exportées vers l\'emplacement de votre choix.</string>
<string name="failedParsingImportUriError">Impossible d\'analyser l\'URI d\'importation</string>
<string name="exportOptionExplanation">Les données seront exportées vers lemplacement de votre choix.</string>
<string name="failedParsingImportUriError">Impossible danalyser lURI dimportation</string>
<string name="share">Partager</string>
<string name="barcodeNoBarcode">Cette carte n\'a pas de code-barres</string>
<string name="barcodeNoBarcode">Il ny a pas de code-barres</string>
<string name="barcodeType">Type de code-barres</string>
<string name="noMatchingGiftCards">Aucun résultat. Essayez de modifier votre recherche.</string>
<string name="action_search">Rechercher</string>
@@ -82,7 +82,7 @@
<string name="leaveWithoutSaveConfirmation">Quitter sans enregistrer \?</string>
<string name="leaveWithoutSaveTitle">Quitter</string>
<string name="failedOpeningFileManager">Installez dabord un gestionnaire de fichiers.</string>
<string name="addManually">Entrer manuellement l\'identifiant de la carte</string>
<string name="addManually">Entrer manuellement lidentifiant</string>
<string name="moveDown">Descendre</string>
<string name="moveUp">Monter</string>
<plurals name="groupCardCount">
@@ -91,7 +91,7 @@
</plurals>
<string name="groupsList">Groupes : <xliff:g>%s</xliff:g></string>
<string name="accept">Accepter</string>
<string name="privacy_policy_popup_text">Avis sur la politique de confidentialité (exigé par certains magasins d\'applications) :
<string name="privacy_policy_popup_text">Avis sur la politique de confidentialité (exigé par certains magasins dapplications) :
\n
\nAUCUNE DONNÉE NEST COLLECTÉE, ce que tout le monde peut confirmer puisque notre application est un logiciel libre.</string>
<string name="privacy_policy">Politique de confidentialité</string>
@@ -101,11 +101,11 @@
<string name="points">Points</string>
<string name="currency">Monnaie</string>
<string name="balance">Solde</string>
<string name="moveBarcodeToCenterOfScreen">Centrer le code-barres sur l\'écran</string>
<string name="moveBarcodeToTopOfScreen">Déplacez le code-barres vers le haut de l\'écran</string>
<string name="chooseExpiryDate">Choisissez la date d\'expiration</string>
<string name="moveBarcodeToCenterOfScreen">Centrer le code-barres sur lécran</string>
<string name="moveBarcodeToTopOfScreen">Déplacez le code-barres vers le haut de lécran</string>
<string name="chooseExpiryDate">Choisissez la date dexpiration</string>
<string name="never">Jamais</string>
<string name="expiryDate">Date d\'expiration</string>
<string name="expiryDate">Date dexpiration</string>
<string name="editBarcode">Modifier le code-barres</string>
<string name="barcode">Code-barres</string>
<string name="card">Carte</string>
@@ -128,21 +128,21 @@
\nCréez-la à partir du menu Importer/Exporter dune autre application Catima en appuyant dabord sur Exporter.</string>
<string name="importCatima">Importer depuis Catima</string>
<string name="addFromImage">Sélectionner dans la galerie</string>
<string name="errorReadingImage">Impossible de lire l\'image</string>
<string name="noBarcodeFound">Aucun code-barres n\'a été trouvé</string>
<string name="errorReadingImage">Impossible de lire limage</string>
<string name="noBarcodeFound">Aucun code-barres na été trouvé</string>
<string name="setBarcodeId">Définir la valeur du code-barres</string>
<string name="sameAsCardId">Identique à lidentifiant de la carte</string>
<string name="sameAsCardId">Identique à lidentifiant</string>
<string name="barcodeId">Valeur du code-barres</string>
<string name="settings_max_font_size_scale">Taille max. de la police</string>
<string name="unsupportedBarcodeType">Ce type de code-barres ne peut pas encore être affiché. Il sera peut-être pris en charge dans une version ultérieure de lapplication.</string>
<string name="wrongValueForBarcodeType">La valeur n\'est pas valide pour le type de code-barres sélectionné</string>
<string name="wrongValueForBarcodeType">La valeur nest pas valide pour le type de code-barres sélectionné</string>
<string name="app_resources">Ressources tierces libres : <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="app_libraries">Bibliothèques tierces libres : <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Copyright © 2019<xliff:g>%d</xliff:g> Sylvia van Os</string>
<string name="intent_import_card_from_url_share_multiple_text">Je veux partager des cartes avec vous</string>
<string name="copy_to_clipboard_multiple_toast">Identifiants des cartes copiés dans le presse-papiers</string>
<string name="card_ids_copied">Num. de la carte copié(s)</string>
<string name="updateBarcodeQuestionText">Vous avez changé l\'identifiant de la carte. Voulez-vous également mettre à jour le code-barres pour utiliser la même valeur \?</string>
<string name="copy_to_clipboard_multiple_toast">Identifiants copiés dans le presse-papiers</string>
<string name="card_ids_copied">Numéro(s) copié(s)</string>
<string name="updateBarcodeQuestionText">Vous avez changé lidentifiant. Voulez-vous également mettre à jour le code-barres pour utiliser la même valeur \?</string>
<string name="no">Non</string>
<string name="yes">Oui</string>
<string name="updateBarcodeQuestionTitle">Mettre à jour la valeur du code-barres \?</string>
@@ -151,8 +151,8 @@
<string name="setBackImage">Définir limage verso</string>
<string name="setFrontImage">Définir limage recto</string>
<string name="photos">Photos</string>
<string name="backImageDescription">Image verso de la carte</string>
<string name="frontImageDescription">Image recto de la carte</string>
<string name="backImageDescription">Image du verso</string>
<string name="frontImageDescription">Image du recto</string>
<string name="passwordRequired">Veuillez entrer le mot de passe</string>
<string name="importStocardMessage">Sélectionnez votre exportation <i>***-sync.zip</i> de Stocard pour limporter.
\nVous pouvez lobtenir en envoyant un courriel à support@stocardapp.com pour demander une exportation de vos données.</string>
@@ -161,8 +161,8 @@
<string name="turn_flashlight_on">Allumer la lampe de poche</string>
<string name="failedGeneratingShareURL">Impossible de générer une URL partageable. Veuillez signaler ceci.</string>
<plurals name="selectedCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> carte sélectionnée</item>
<item quantity="other"><xliff:g>%d</xliff:g> cartes sélectionnées</item>
<item quantity="one"><xliff:g>%d</xliff:g> sélectionnée</item>
<item quantity="other"><xliff:g>%d</xliff:g> sélectionnées</item>
</plurals>
<string name="deleteTitle">Supprimer la carte</string>
<string name="deleteConfirmation">Supprimer cette carte \?</string>
@@ -187,14 +187,13 @@
<string name="settings_catima_theme">Catima</string>
<string name="settings_theme_color">Couleur du thème</string>
<string name="app_contributors">Rendu possible par : <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="noGroupCards">Ce groupe ne contient pas de cartes</string>
<string name="toggleMoreInfo">Activer/désactiver l\'affichage de plus d\'infos</string>
<string name="barcodeImageDescriptionWithType">Image du code-barres de la carte de type <xliff:g>%s</xliff:g></string>
<string name="swipeToSwitchImages">Balayez ou appuyez longuement pour changer d\'image</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="sort">Trier</string>
<string name="sort_by">Trier par</string>
<string name="reverse">Inversé</string>
<string name="sort_by_expiry">Date d\'expiration</string>
<string name="reverse"> dans lordre inverse</string>
<string name="sort_by_expiry">Date dexpiration</string>
<string name="sort_by_most_recently_used">Les plus récemment utilisées</string>
<string name="sort_by_name">Nom</string>
<string name="sort_by_balance">Solde</string>
@@ -211,13 +210,20 @@
<string name="exportPassword">Définissez un mot de passe pour protéger vos exportations (facultatif)</string>
<string name="exportPasswordHint">Entrez le mot de passe</string>
<string name="editGroup">Modification du groupe : <xliff:g> %s </xliff:g></string>
<string name="noGiftCardsGroup">Vous n\'avez pas encore de cartes de fidélité. Une fois que vous en aurez ajouté, vous pourrez les affecter au groupe ici.</string>
<string name="noGiftCardsGroup">Créez des cartes, puis affectez-les au groupe ici.</string>
<string name="group_edit">Modifier le groupe</string>
<string name="group_name_already_in_use">Nom de groupe déjà utilisé</string>
<string name="group_updated">Groupe mis à jour</string>
<string name="group_name_is_empty">Le nom du groupe ne peut pas être vide</string>
<string name="setIcon">Définir l\'icône</string>
<string name="setIcon">Définir licône</string>
<string name="selectColor">Sélectionnez la couleur</string>
<string name="action_show_details">Afficher les détails</string>
<string name="action_hide_details">Masquer les détails</string>
<string name="translate_platform">sur Weblate</string>
<string name="shortcutSelectCard">Sélectionnez une carte</string>
<string name="options">Options</string>
<string name="starred">En favori</string>
<string name="set_scale">Définir une échelle</string>
<string name="showMoreInfo">Afficher les infos</string>
<string name="hideMoreInfo">Masquer les infos</string>
</resources>

View File

@@ -1,9 +1,56 @@
<resources
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_add">הוספה</string>
<string name="cardId">מזהה כרטיס</string>
<string name="cancel">ביטול</string>
<string name="save">שמור</string>
</resources>
<string name="ok">אישור</string>
<string name="action_search">חיפוש</string>
<string name="noGiftCards">לחץ על לחצן ה + להוספת כרטיס, או ייבא מספר כרטיסים באמצעות התפריט ⋮.</string>
<string name="lockScreen">סיבוב</string>
<string name="share">שיתוף</string>
<string name="copy_to_clipboard">העתקת מזהה ללוח</string>
<string name="addCardTitle">הוספת כרטיס</string>
<string name="noCardIdError">אין מזהה כרטיס</string>
<string name="star">הוספה למועדפים</string>
<string name="unstar">הסרה ממועדפים</string>
<string name="note">הערות</string>
<string name="barcodeType">סוג ברקוד</string>
<string name="noBarcode">אין ברקוד</string>
<string name="edit">עריכה</string>
<plurals name="selectedCardCount">
<item quantity="one">אחד</item>
<item quantity="two">שניים</item>
<item quantity="many">מעט</item>
<item quantity="other">אחר</item>
</plurals>
<string name="exportFailed">לא ניתן לייצא</string>
<string name="noGiftCardsGroup">צור מספר כרטיסים, ואז שייך אותם לקבוצה פה.</string>
<string name="failedParsingImportUriError">נתיב לא נמצא</string>
<string name="noMatchingGiftCards">אין תוצאות. נסה חיפוש אחר.</string>
<string name="storeName">שם חנות</string>
<string name="barcodeNoBarcode">אין ברקוד</string>
<string name="delete">מחיקה</string>
<string name="confirm">אישור</string>
<string name="deleteTitle">מחק כרטיס</string>
<string name="deleteConfirmation">האם למחוק כרטיס זה\?</string>
<string name="sendLabel">שליחה…</string>
<string name="editCardTitle">עריכת כרטיס</string>
<string name="scanCardBarcode">סריקת ברקוד</string>
<string name="cardShortcut">קיצור דרך</string>
<string name="noCardsMessage">תחילה הוסף כרטיס</string>
<string name="card_ids_copied">מזהי כרטיס הועתקו</string>
<string name="barcodeImageDescriptionWithType"></string>
<string name="noStoreError">לא הוכנס שם חנות</string>
<string name="noCardExistsError">כרטיס לא נמצא</string>
<string name="importExport">ייבוא/ייצוא</string>
<string name="exportName">ייצוא</string>
<string name="importExportHelp">גיבוי המידע שלך מאפשר העברתו למכשיר אחר.</string>
<string name="importSuccessfulTitle">הייבוא הצליח</string>
<string name="importFailedTitle">הייבוא נכשל</string>
<string name="importFailed">לא ניתן לייבא</string>
<string name="exportSuccessfulTitle">הייצוא הצליח</string>
<string name="exportFailedTitle">הייצוא נכשל</string>
<string name="importing">מייבא…</string>
<string name="exporting">ייצוא…</string>
</resources>

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="app_revision_url">https://github.com/TheLastProject/Catima/releases</string>
<string name="app_revision_url">https://github.com/CatimaLoyalty/Android/releases</string>
<string name="storeName">Nama</string>
<string name="note">Keterangan</string>
<string name="delete">Hapus</string>
@@ -180,7 +180,6 @@
<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="toggleMoreInfo">Tampilkan info selengkapnya</string>
<string name="swipeToSwitchImages">Geser atau tekan yang lama untuk mengganti gambar</string>
<string name="reverse">Ubah urutan</string>
<string name="version_history">Riwayat Versi</string>

View File

@@ -2,12 +2,12 @@
<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">Clicca il pulsante + più per aggiungere una carta, o importane alcune dal menù ⋮ prima.</string>
<string name="noMatchingGiftCards">Non ho trovato niente. Prova a cambiare la tua ricerca.</string>
<string name="noGiftCards">Premi il pulsante + per aggiungere una carta oppure importane alcune 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>
<string name="cardId">Codice</string>
<string name="barcodeNoBarcode">Questa carta non ha un codice a barre</string>
<string name="barcodeNoBarcode">Non c\'è un codice a barre</string>
<string name="cancel">Annulla</string>
<string name="save">Salva</string>
<string name="edit">Modifica</string>
@@ -15,71 +15,71 @@
<string name="confirm">Conferma</string>
<string name="lockScreen">Blocca rotazione</string>
<string name="unlockScreen">Sblocca rotazione</string>
<string name="ok">OK</string>
<string name="copy_to_clipboard">Copia ID negli appunti</string>
<string name="ok">Ok</string>
<string name="copy_to_clipboard">Copia codice negli appunti</string>
<string name="share">Condividi</string>
<string name="sendLabel">Invia…</string>
<string name="editCardTitle">Modifica carta</string>
<string name="addCardTitle">Aggiungi carta</string>
<string name="scanCardBarcode">Scansiona il codice carta</string>
<string name="scanCardBarcode">Scansiona il codice</string>
<string name="cardShortcut">Scorciatoia per la carta</string>
<string name="noCardsMessage">Aggiungi prima una carta</string>
<string name="noStoreError">Nessun nome inserito</string>
<string name="noCardIdError">Nessun codice carta inserito</string>
<string name="noCardExistsError">Impossibile trovare la carta</string>
<string name="failedParsingImportUriError">Impossibile analizzare l\'URI</string>
<string name="noCardIdError">Nessun codice inserito</string>
<string name="noCardExistsError">Impossibile trovare quella carta</string>
<string name="failedParsingImportUriError">Impossibile analizzare l\'URI di importazione</string>
<string name="importExport">Importa/Esporta</string>
<string name="exportName">Esporta</string>
<string name="importExportHelp">Il backup delle carte ti consente di spostarle su un altro dispositivo.</string>
<string name="importExportHelp">Il backup dei dati permette di spostarli su un altro dispositivo.</string>
<string name="importSuccessfulTitle">Importato</string>
<string name="importFailedTitle">Importazione fallita</string>
<string name="importFailed">Impossibile importare le carte</string>
<string name="importFailed">Impossibile eseguire l\'importazione</string>
<string name="exportSuccessfulTitle">Esportato</string>
<string name="exportFailedTitle">Esportazione fallita</string>
<string name="exportFailed">Impossibile esportare le carte</string>
<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 l\'autorizzazione all\'archiviazione esterna per importare o esportare prima le carte</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>
<string name="importOptionApplicationTitle">Usa unaltra app</string>
<string name="importOptionApplicationTitle">Usa un\'altra app</string>
<string name="importOptionApplicationExplanation">Usa qualsiasi app o il tuo gestore di file preferito per aprire un file.</string>
<string name="importOptionApplicationButton">Usa unaltra app</string>
<string name="importOptionApplicationButton">Usa un\'altra app</string>
<string name="about">Informazioni</string>
<string name="app_license">Software libero con copyleft, licenza GPLv3+</string>
<string name="about_title_fmt">Informazioni su <xliff:g id="app_name">%s</xliff:g></string>
<string name="debug_version_fmt">Versione: <xliff:g id="version">%s</xliff:g></string>
<string name="app_revision_fmt">Informazioni sulla revisione: <xliff:g id="app_revision_url"> %s </xliff:g></string>
<string name="selectBarcodeTitle">Seleziona codice a barre</string>
<string name="enterBarcodeInstructions">Inserisci lID della carta, e scegli il suo tipo di codice a barre qui sotto, oppure «Questa carta non ha codice a barre».</string>
<string name="copy_to_clipboard_toast">Numero della carta copiato negli appunti</string>
<string name="thumbnailDescription">Miniatura carta</string>
<string name="enterBarcodeInstructions">Inserisci il codice e scegli un tipo di codice a barre sotto oppure seleziona «Non c\'è un codice a barre».</string>
<string name="copy_to_clipboard_toast">Codice copiato negli appunti</string>
<string name="thumbnailDescription">Miniatura</string>
<string name="settings">Impostazioni</string>
<string name="settings_category_title_ui">Interfaccia utente</string>
<string name="settings_theme">Tema</string>
<string name="settings_system_theme">Sistema</string>
<string name="settings_light_theme">Chiaro</string>
<string name="settings_dark_theme">Scuro</string>
<string name="settings_display_barcode_max_brightness">Aumenta luminosità dello schermo quando apro un codice a barre</string>
<string name="settings_display_barcode_max_brightness">Aumenta luminosità dello schermo quando viene aperto un codice a barre</string>
<string name="settings_lock_barcode_orientation">Blocca orientamento del codice a barre</string>
<string name="intent_import_card_from_url_share_text">Voglio condividere una carta fedeltà con te</string>
<string name="exportSuccessful">Dati della carta importati</string>
<string name="importSuccessful">Dati della carta importati</string>
<string name="exportSuccessful">Dati della carta esportati</string>
<string name="importSuccessful">Dati importati</string>
<string name="app_copyright_old">Basato su Loyalty Card Keychain
\ncopyright © 20162020 Branden Archer</string>
<string name="exportOptionExplanation">I dati verranno scritti in una posizione a tua scelta.</string>
<string name="barcodeType">Tipo di codice a barre</string>
<string name="unstar">Rimuovi dai preferiti</string>
<string name="star">Aggiungi ai preferiti</string>
<string name="starImage">Stella preferita</string>
<string name="starImage">Stella dei preferiti</string>
<string name="deleteConfirmationGroup">Eliminare il gruppo\?</string>
<string name="all">Tutti</string>
<string name="noGroups">Clicca sul pulsante + più per aggiungere prima i gruppi per la categorizzazione.</string>
<string name="noGroups">Clicca sul pulsante + per aggiungere i gruppi per la categorizzazione.</string>
<string name="groups">Gruppi</string>
<string name="enter_group_name">Inserisci il nome del gruppo</string>
<string name="groupsList">Gruppi: <xliff:g>%s</xliff:g></string>
<string name="addManually">Inserisci manualmente l\'ID della carta</string>
<string name="addManually">Inserisci manualmente il codice</string>
<string name="leaveWithoutSaveConfirmation">Uscire senza salvare\?</string>
<string name="leaveWithoutSaveTitle">Esci</string>
<string name="moveDown">Sposta in basso</string>
@@ -105,70 +105,70 @@
<string name="balancePoints"><xliff:g>%s</xliff:g> punti</string>
<string name="balanceSentence">Saldo: <xliff:g>%s</xliff:g></string>
<string name="expiryStateSentenceExpired">Scaduta: <xliff:g>%s</xliff:g></string>
<string name="expiryStateSentence">Scade: <xliff:g>%s</xliff:g></string>
<string name="settings_keep_screen_on">Tieni schermo attivo</string>
<string name="app_loyalty_card_keychain">Loyalty Card Keychain</string>
<string name="chooseImportType">Importare i dati da\?</string>
<string name="settings_disable_lockscreen_while_viewing_card">Impedisci blocco schermo</string>
<string name="expiryStateSentence">Scadenza: <xliff:g>%s</xliff:g></string>
<string name="settings_keep_screen_on">Mantieni lo schermo attivo</string>
<string name="app_loyalty_card_keychain">Carte fedeltà</string>
<string name="chooseImportType">Importa i dati da</string>
<string name="settings_disable_lockscreen_while_viewing_card">Impedisci il blocco dello schermo</string>
<string name="accept">Accetta</string>
<string name="privacy_policy_popup_text">Informativa sulla riservatezza (spesso richiesta):
<string name="privacy_policy_popup_text">Informativa sulla riservatezza (richiesta da alcuni app store):
\n
\nNESSUN DATO VIENE RACCOLTO, cosa che chiunque può confermare dato che la nostra applicazione è un software libero.</string>
<string name="privacy_policy">Informativa sulla riservatezza</string>
<string name="importVoucherVaultMessage">Seleziona la tua esportazione <i>vouchervault.json</i> da Voucher Vault da importare.
<string name="importVoucherVaultMessage">Seleziona il tuo file di esportazione <i>vouchervault.json</i> da Voucher Vault per importarlo.
\nCrealo premendo prima Esporta in Voucher Vault.</string>
<string name="importVoucherVault">Importa da Voucher Vault</string>
<string name="importLoyaltyCardKeychainMessage">Seleziona la tua esportazione <i>LoyaltyCardKeychain.csv</i> da Loyalty Card Keychain per importarla.
\nCreatelo dal menù Importazione/Esportazione in Loyalty Card Keychain premendo prima su Esporta.</string>
<string name="importLoyaltyCardKeychainMessage">Seleziona il tuo file di esportazione <i>LoyaltyCardKeychain.csv</i> da Loyalty Card Keychain per importarlo.
\nCrealo dal menù Importa/Esporta in Loyalty Card Keychain premendo prima su Esporta.</string>
<string name="importLoyaltyCardKeychain">Importa da Loyalty Card Keychain</string>
<string name="importFidmeMessage">Seleziona la tua esportazione <i>fidme-export-request-xxxxxx.zip</i> da FidMe per importare, e seleziona i tipi di codice a barre manualmente dopo.
\nCrearlo dal tuo profilo FidMe scegliendo Protezione Dati e poi premendo Estrai i miei dati prima.</string>
<string name="importFidmeMessage">Seleziona il tuo file di esportazione <i>fidme-export-request-xxxxxx.zip</i> da FidMe per importare e seleziona successivamente i tipi di codice a barre manualmente.
\nCrealo dal tuo profilo FidMe scegliendo Protezione Dati e poi premendo Estrai i miei dati prima.</string>
<string name="importFidme">Importa da FidMe</string>
<string name="importCatimaMessage">Seleziona la tua esportazione <i>catima.zip</i> da Catima per importarla.
\nCrealo dal menù Importazione/Esportazione di un\'altra applicazione Catima premendo prima Esporta.</string>
<string name="importCatimaMessage">Seleziona il file di esportazione <i>catima.zip</i> per importarlo.
\nCrealo dal menù Importa/Esporta di un\'altra applicazione Catima premendo prima Esporta.</string>
<string name="importCatima">Importa da Catima</string>
<string name="setBarcodeId">Imposta il valore del codice a barre</string>
<string name="sameAsCardId">Uguale all\'ID della carta</string>
<string name="sameAsCardId">Uguale al codice</string>
<string name="barcodeId">Valore del codice a barre</string>
<string name="errorReadingImage">Impossibile leggere l\'immagine</string>
<string name="noBarcodeFound">Nessun codice a barre trovato</string>
<string name="addFromImage">Seleziona immagine dalla galleria</string>
<string name="settings_max_font_size_scale">Dimensione mass. caratteri</string>
<string name="settings_max_font_size_scale">Dimensione massima del carattere</string>
<string name="unsupportedBarcodeType">Questo tipo di codice a barre non può ancora essere visualizzato. Potrebbe essere supportato in una versione successiva dell\'applicazione.</string>
<string name="wrongValueForBarcodeType">Il valore non è valido per il tipo di codice a barre selezionato</string>
<string name="app_resources">Risorse libre di terze parti: <xliff:g id="app_resources_list"> %s </xliff:g></string>
<string name="app_libraries">Librerie libre di terze parti: <xliff:g id="app_libraries_list"> %s </xliff:g></string>
<string name="app_resources">Risorse libere di terze parti: <xliff:g id="app_resources_list"> %s </xliff:g></string>
<string name="app_libraries">Librerie libere di terze parti: <xliff:g id="app_libraries_list"> %s </xliff:g></string>
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Copyright © 2019<xliff:g>%d</xliff:g> Sylvia van Os</string>
<string name="intent_import_card_from_url_share_multiple_text">Voglio condividere alcune carte con te</string>
<string name="copy_to_clipboard_multiple_toast">Numeri delle carte copiati negli appunti</string>
<string name="card_ids_copied">Numero/i della carta copiato/i</string>
<string name="copy_to_clipboard_multiple_toast">Codici copiati negli appunti</string>
<string name="card_ids_copied">Codice/i copiato/i</string>
<string name="no">No</string>
<string name="yes"></string>
<string name="updateBarcodeQuestionText">Hai cambiato l\'ID della carta. Vuoi anche aggiornare il codice a barre per usare lo stesso valore\?</string>
<string name="updateBarcodeQuestionText">Hai cambiato il codice. Vuoi anche aggiornare il codice a barre per usare lo stesso valore\?</string>
<string name="updateBarcodeQuestionTitle">Aggiornare il valore del codice a barre\?</string>
<string name="takePhoto">Scatta una foto</string>
<string name="removeImage">Rimuovi limmagine</string>
<string name="removeImage">Rimuovi l\'immagine</string>
<string name="setBackImage">Imposta immagine posteriore</string>
<string name="setFrontImage">Imposta immagine frontale</string>
<string name="photos">Foto</string>
<string name="backImageDescription">Immagine posteriore della carta</string>
<string name="frontImageDescription">Immagine frontale della carta</string>
<string name="backImageDescription">Immagine posteriore</string>
<string name="frontImageDescription">Immagine frontale</string>
<string name="passwordRequired">Si prega di inserire la password</string>
<string name="importStocardMessage">Seleziona la tua esportazione <i>***-sync.zip</i> da Stocard per importare.
<string name="importStocardMessage">Seleziona il tuo file di esportazione <i>***-sync.zip</i> da Stocard per importarlo.
\nOttienilo inviando un\'e-mail a support@stocardapp.com chiedendo un\'esportazione dei tuoi dati.</string>
<string name="importStocard">Importa da Stocard</string>
<string name="turn_flashlight_off">Spegni la torcia</string>
<string name="turn_flashlight_on">Accendi la torcia</string>
<string name="failedGeneratingShareURL">Impossibile generare un URL condivisibile. Si prega di segnalarlo.</string>
<plurals name="selectedCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> carta selezionata</item>
<item quantity="other"><xliff:g>%d</xliff:g> carte selezionate</item>
<item quantity="one"><xliff:g>%d</xliff:g> selezionata</item>
<item quantity="other"><xliff:g>%d</xliff:g> selezionate</item>
</plurals>
<string name="deleteTitle">Rimuovi la carta</string>
<string name="deleteConfirmation">Eliminare questa carta\?</string>
<plurals name="deleteCardsConfirmation">
<item quantity="one">Eliminare definitivamente questa scheda <xliff:g>%d</xliff:g>\?</item>
<item quantity="other">Eliminare definitivamente queste schede <xliff:g>%d</xliff:g>\?</item>
<item quantity="one">Eliminare definitivamente questa <xliff:g>%d</xliff:g> carta\?</item>
<item quantity="other">Eliminare definitivamente queste <xliff:g>%d</xliff:g> carte\?</item>
</plurals>
<plurals name="deleteCardsTitle">
<item quantity="one">Elimina <xliff:g>%d</xliff:g> carta</item>
@@ -187,19 +187,18 @@
<string name="settings_catima_theme">Catima</string>
<string name="settings_theme_color">Colore del tema</string>
<string name="app_contributors">Reso possibile da: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="noGroupCards">Questo gruppo non contiene carte</string>
<string name="toggleMoreInfo">Attiva/disattiva la visualizzazione di altre informazioni</string>
<string name="barcodeImageDescriptionWithType">Immagine del codice a barre della carta del tipo <xliff:g>%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="sort_by">Ordina per</string>
<string name="reverse">Inverti</string>
<string name="reverse">…in ordine inverso</string>
<string name="sort_by_balance">Saldo</string>
<string name="sort_by_expiry">Scadenza</string>
<string name="sort_by_most_recently_used">Usate più di recente</string>
<string name="sort_by_most_recently_used">Usate più recentemente</string>
<string name="sort_by_name">Nome</string>
<string name="sort">Ordina</string>
<string name="license">Licenza</string>
<string name="source_repository">Repository fonti</string>
<string name="source_repository">Repository del codice sorgente</string>
<string name="on_github">su GitHub</string>
<string name="exportPasswordHint">Inserisci la password</string>
<string name="on_google_play">su Google Play</string>
@@ -210,14 +209,21 @@
<string name="and_data_usage">e utilizzo dei dati</string>
<string name="rate_this_app">Valuta questa applicazione</string>
<string name="report_error">Segnala un errore</string>
<string name="editGroup">Gruppo di modifica: <xliff:g>%s</xliff:g></string>
<string name="editGroup">Modifica del gruppo: <xliff:g>%s</xliff:g></string>
<string name="group_name_is_empty">Il nome del gruppo non può essere vuoto</string>
<string name="noGiftCardsGroup">Non hai ancora nessuna carta fedeltà. Una volta che ne hai aggiunte, puoi assegnarle al gruppo qui.</string>
<string name="noGiftCardsGroup">Crea alcune carte e poi assegnale al gruppo qui.</string>
<string name="group_edit">Modifica il gruppo</string>
<string name="group_name_already_in_use">Nome del gruppo già in uso</string>
<string name="group_name_already_in_use">Il nome del gruppo è già in uso</string>
<string name="group_updated">Gruppo aggiornato</string>
<string name="selectColor">Seleziona il colore</string>
<string name="setIcon">Imposta l\'icona</string>
<string name="action_show_details">Mostra i dettagli</string>
<string name="action_hide_details">Nascondi i dettagli</string>
<string name="translate_platform">su Weblate</string>
<string name="shortcutSelectCard">Seleziona una tessera</string>
<string name="options">Opzioni</string>
<string name="starred">Nei preferiti</string>
<string name="set_scale">Imposta la scala</string>
<string name="showMoreInfo">Mostra info</string>
<string name="hideMoreInfo">Nascondi info</string>
</resources>

View File

@@ -53,8 +53,8 @@
<string name="noGroups">+ボタンを押してグループを追加してください。</string>
<string name="groups">グループ</string>
<string name="enter_group_name">グループ名を入力</string>
<string name="exportSuccessful">カードのデータがエクスポートされました</string>
<string name="importSuccessful">カードのデータがインポートされました</string>
<string name="exportSuccessful">データがエクスポートされました</string>
<string name="importSuccessful">データがインポートされました</string>
<string name="intent_import_card_from_url_share_text">カード共有をしましょう</string>
<string name="settings_disable_lockscreen_while_viewing_card">バーコード表示中は画面をロックしない</string>
<string name="settings_keep_screen_on">バーコード表示中は画面を消灯しない</string>
@@ -68,7 +68,7 @@
<string name="settings_category_title_ui">外観</string>
<string name="settings">設定</string>
<string name="starImage">お気に入りのスター</string>
<string name="thumbnailDescription">カードのサムネイル</string>
<string name="thumbnailDescription">サムネイル</string>
<string name="copy_to_clipboard_toast">カード番号をクリップボードにコピーしました</string>
<string name="enterBarcodeInstructions">カード番号を入力し、バーコード形式を選択してください。</string>
<string name="selectBarcodeTitle">バーコード選択</string>
@@ -89,7 +89,7 @@
<string name="importOptionFilesystemExplanation">ストレージからファイルを選択してください。</string>
<string name="importOptionFilesystemTitle">ストレージからインポート</string>
<string name="exportOptionExplanation">選択した場所にデータを出力します。</string>
<string name="noExternalStoragePermissionError">カードをインポート/エクスポートするために外部ストレージへのアクセスを許可してください</string>
<string name="noExternalStoragePermissionError">データをインポート/エクスポートするために外部ストレージへのアクセスを許可してください</string>
<string name="exporting">エクスポート中…</string>
<string name="importing">インポート中…</string>
<string name="exportFailed">カードをエクスポートできませんでした</string>
@@ -103,7 +103,7 @@
<string name="importFailed">カードをインポートできません</string>
<string name="importFailedTitle">インポートに失敗しました</string>
<string name="importSuccessfulTitle">インポートしました</string>
<string name="importExportHelp">カードをバックアップすると、他のデバイスにカードを移すことができます。</string>
<string name="importExportHelp">データをバックアップすると、他のデバイスにカードを移すことができます。</string>
<string name="exportName">エクスポート</string>
<string name="importExport">インポート/エクスポート</string>
<string name="failedParsingImportUriError">インポートURIを解析できません</string>
@@ -112,7 +112,7 @@
<string name="noStoreError">名前が入力されていません</string>
<string name="noCardsMessage">カードを追加</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>
@@ -129,7 +129,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">カード番号</string>
<string name="note">メモ</string>
@@ -154,8 +154,8 @@
<string name="setBackImage">裏面の画像を設定</string>
<string name="setFrontImage">オモテ面の画像を設定</string>
<string name="photos">フォト</string>
<string name="backImageDescription">カードの裏面</string>
<string name="frontImageDescription">カードのオモテ面</string>
<string name="backImageDescription"></string>
<string name="frontImageDescription"></string>
<string name="importStocardMessage">Stocardでエクスポートした<i>***-sync.zip</i>ファイルを選択してください。
\nファイルがない場合、e-mailing support@stocardapp.comにデータのエクスポートを要求してください。</string>
<string name="importStocard">Stocardからインポート</string>
@@ -171,7 +171,6 @@
<item quantity="other"><xliff:g>%d</xliff:g> 枚のカードの削除</item>
</plurals>
<string name="barcodeImageDescriptionWithType">バーコード形式の画像 <xliff:g>%s</xliff:g></string>
<string name="toggleMoreInfo">詳細を表示する</string>
<string name="app_contributors">Made possible by: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="settings_brown_theme">Brown</string>
<string name="settings_grey_theme">Gray</string>
@@ -215,4 +214,6 @@
<string name="group_edit">グループ編集</string>
<string name="group_name_already_in_use">このグループ名は既に使用されています</string>
<string name="group_name_is_empty">グループ名を入力してください</string>
<string name="shortcutSelectCard">カードを選択してください</string>
<string name="translate_platform">on Weblate</string>
</resources>

View File

@@ -192,7 +192,6 @@
<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 nėra jokių kortelių</string>
<string name="toggleMoreInfo">Perjungti išsamios informacijos rodymą</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="sort_by">Rikiuoti pagal</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">Legg til</string>
<string name="noGiftCards">Klikk på «+» (pluss)-knappen for å legge til eller importer kort fra «⋮»-menyen først.</string>
<string name="noGiftCards">Klikk på «+» (pluss)-knappen for å legge til eller importer kort fra «⋮»-menyen</string>
<string name="storeName">Navn</string>
<string name="note">Merknad</string>
<string name="cardId">Kort-ID</string>
@@ -18,24 +18,24 @@
<string name="sendLabel">Send…</string>
<string name="editCardTitle">Rediger kundekort</string>
<string name="addCardTitle">Legg til kundekort</string>
<string name="scanCardBarcode">Skann kortets strekkode</string>
<string name="scanCardBarcode">Skann strekkoden</string>
<string name="cardShortcut">Kort-snarvei</string>
<string name="noCardsMessage">Legg til et kort først</string>
<string name="noStoreError">Navn ikke angitt</string>
<string name="noCardIdError">Ingen kort-ID innskrevet</string>
<string name="noCardExistsError">Kunne ikke finne kort</string>
<string name="noCardIdError">Ingen ID innskrevet</string>
<string name="noCardExistsError">Fant ikke det kortet</string>
<string name="importExport">Importer/eksporter</string>
<string name="exportName">Eksporter</string>
<string name="importExportHelp">Sikkerhetskopiering av kort lar deg flytte dem til en annen enhet.</string>
<string name="importExportHelp">Sikkerhetskopiering av data lar deg flytte dem til en annen enhet.</string>
<string name="importSuccessfulTitle">Importert</string>
<string name="importFailedTitle">Kunne ikke importere</string>
<string name="importFailed">Klarte ikke å importere kort</string>
<string name="importFailed">Kunne ikke utføre import</string>
<string name="exportSuccessfulTitle">Eksportert</string>
<string name="exportFailedTitle">Kunne ikke eksportere</string>
<string name="exportFailed">Kunne ikke eksportere kort</string>
<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 kort først</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>
@@ -49,15 +49,15 @@
<string name="debug_version_fmt">Versjon: <xliff:g id="version">%s</xliff:g></string>
<string name="app_revision_fmt">Utgivelsesinfo: <xliff:g id="app_revision_url">%s</xliff:g></string>
<string name="selectBarcodeTitle">Velg strekkode</string>
<string name="enterBarcodeInstructions">Skriv inn kortets ID, og enten velg dens strekkode nedenfor, eller «Dette kortet har ingen strekkode».</string>
<string name="copy_to_clipboard_toast">Kort-ID kopiert til utklippstavle</string>
<string name="thumbnailDescription">Miniatyrbilde for kort</string>
<string name="enterBarcodeInstructions">Skriv inn kortets ID, og enten velg strekkodetypen nedenfor, eller «Det er ingen strekkode».</string>
<string name="copy_to_clipboard_toast">ID kopiert til utklippstavle</string>
<string name="thumbnailDescription">Miniatyrbilde</string>
<string name="settings">Innstillinger</string>
<string name="settings_category_title_ui">Brukergrensesnitt</string>
<string name="settings_display_barcode_max_brightness">Lysere strekkodevisning</string>
<string name="settings_lock_barcode_orientation">Lås strekkodesideretning</string>
<string name="exportSuccessful">Kortdata eksportert</string>
<string name="importSuccessful">Kortdata importert</string>
<string name="exportSuccessful">Data eksportert</string>
<string name="importSuccessful">Data importert</string>
<string name="intent_import_card_from_url_share_text">Jeg ønsker å dele et kort med deg</string>
<string name="settings_dark_theme">Mørk</string>
<string name="settings_light_theme">Lys</string>
@@ -67,8 +67,8 @@
\nopphavsrett 20162020 Branden Archer</string>
<string name="failedParsingImportUriError">Kunne ikke tolke importerings-URI</string>
<string name="share">Del</string>
<string name="barcodeNoBarcode">Dette kortet har ingen strekkode</string>
<string name="noMatchingGiftCards">Fant ikke noe. Prøv å endre søket.</string>
<string name="barcodeNoBarcode">Det er ingen strekkode</string>
<string name="noMatchingGiftCards">Resultatløst. Prøv å endre søket.</string>
<string name="action_search">Søk</string>
<string name="starImage">Favorittstjerne</string>
<string name="unstar">Fjern fra favoritter</string>
@@ -82,7 +82,7 @@
<string name="failedOpeningFileManager">Installer en filbehandler først.</string>
<string name="leaveWithoutSaveConfirmation">Forlat uten å lagre?</string>
<string name="leaveWithoutSaveTitle">Avslutt</string>
<string name="addManually">Skriv inn kort-ID manuelt</string>
<string name="addManually">Skriv inn ID manuelt</string>
<string name="moveDown">Flytt nedover</string>
<string name="moveUp">Flytt oppover</string>
<plurals name="groupCardCount">
@@ -122,7 +122,7 @@
<string name="addFromImage">Velg bilde fra galleri</string>
<string name="unsupportedBarcodeType">Denne strekkodetypen kan ikke vises for øyeblikket. Støtte kan bli lagt til i en senere versjon av programmet.</string>
<string name="setBarcodeId">Sett strekkodeverdi</string>
<string name="sameAsCardId">Samme som kort-ID</string>
<string name="sameAsCardId">Samme som ID</string>
<string name="barcodeId">Strekkodeverdi</string>
<string name="importVoucherVaultMessage">Velg din <i>vouchervault.json</i>-eksport fra Voucher Vault å importere.
\nOpprett den ved å trykke «Eksport» i Voucher Vault først.</string>
@@ -135,12 +135,12 @@
<string name="settings_max_font_size_scale">Maks. skriftstørrelse</string>
<string name="wrongValueForBarcodeType">Verdien er ikke gyldig for valgt strekkodetype</string>
<string name="intent_import_card_from_url_share_multiple_text">Jeg vil dele noen kort med deg</string>
<string name="copy_to_clipboard_multiple_toast">Kort-ID-er kopiert til utklippstavle</string>
<string name="copy_to_clipboard_multiple_toast">ID-er ble kopiert til utklippstavle</string>
<string name="app_resources">Frie tredjepartsressurser: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="app_libraries">Frie tredjepartsbibliotek: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="card_ids_copied">Kopierte kort-ID(er)</string>
<string name="card_ids_copied">Kopierte ID(er)</string>
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Opphavsrett © 2019<xliff:g>%d</xliff:g> Sylvia van Os</string>
<string name="updateBarcodeQuestionText">Du har endret kortets ID. Ønsker du å også oppdatere strekkoden til samme verdi?</string>
<string name="updateBarcodeQuestionText">Du har endret ID-en. Ønsker du å også oppdatere strekkoden til samme verdi\?</string>
<string name="no">Nei</string>
<string name="yes">Ja</string>
<string name="updateBarcodeQuestionTitle">Oppdater strekkodeverdi?</string>
@@ -149,16 +149,16 @@
<string name="setBackImage">Sett bakside</string>
<string name="setFrontImage">Sett forside</string>
<string name="photos">Bilder</string>
<string name="backImageDescription">Kortets bakside</string>
<string name="frontImageDescription">Kortets forside</string>
<string name="backImageDescription">Baksidebilde</string>
<string name="frontImageDescription">Forsidebilde</string>
<string name="importStocardMessage">Velg din <i>***-sync.zip</i>-eksport fra Stocard å importere.
\nSkaff den ved å sende e-post til support@stocardapp.com der du etterspør eksport av dataen din.</string>
<string name="passwordRequired">Skriv inn passordet</string>
<string name="importStocard">Importer fra Stocard</string>
<string name="failedGeneratingShareURL">Klarte ikke å lage delbar nettadresse. Rapporter denne feilen.</string>
<plurals name="selectedCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> kort valgt</item>
<item quantity="other"><xliff:g>%d</xliff:g> korten valgt</item>
<item quantity="one"><xliff:g>%d</xliff:g> valgt</item>
<item quantity="other"><xliff:g>%d</xliff:g> valgt</item>
</plurals>
<string name="deleteConfirmation">Slett dette kortet for godt?</string>
<plurals name="deleteCardsConfirmation">
@@ -185,12 +185,11 @@
<string name="settings_pink_theme">Rosa</string>
<string name="settings_catima_theme">Catima</string>
<string name="settings_theme_color">Draktfarge</string>
<string name="noGroupCards">Denne gruppen inneholder ikke noen kort</string>
<string name="toggleMoreInfo">Veksle visning av mer info</string>
<string name="barcodeImageDescriptionWithType">Bilde av kortstrekkode av typen <xliff:g>%s</xliff:g></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="sort_by">Sorter etter</string>
<string name="reverse">Vend</string>
<string name="reverse">…i omvendt rekkefølge</string>
<string name="sort_by_balance">Saldo</string>
<string name="sort_by_expiry">Utløp</string>
<string name="sort_by_most_recently_used">Nyligst brukt</string>
@@ -215,9 +214,16 @@
<string name="group_updated">Gruppe oppdatert</string>
<string name="group_name_is_empty">Gruppenavn kan ikke være tomt</string>
<string name="editGroup">Redigerer gruppe: <xliff:g>%s</xliff:g></string>
<string name="noGiftCardsGroup">Du har ingen lojalitetskort enda. Når du først har det kan du legge dem til i en gruppe her.</string>
<string name="noGiftCardsGroup">Lag noen kort, og legg dem til i en gruppe her.</string>
<string name="action_show_details">Vis detaljer</string>
<string name="action_hide_details">Skjul detaljer</string>
<string name="selectColor">Velg farge</string>
<string name="setIcon">Sett ikon</string>
<string name="shortcutSelectCard">velg et kort</string>
<string name="translate_platform">på Weblate</string>
<string name="options">Alternativer</string>
<string name="starred">Stjernemerket</string>
<string name="set_scale">Sett skalering</string>
<string name="showMoreInfo">Vis mer info</string>
<string name="hideMoreInfo">Skjul mer info</string>
</resources>

View File

@@ -1,24 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Palette generated by Material IO https://material.io/color/#!/?view.left=0&view.right=0&primary.color=3F51B5&secondary.color=FFC107 -->
<!-- Colors manually flipped to dark variants -->
<resources>
<color name="colorPrimary">#B53F3F</color>
<color name="colorPrimaryLight">#E87575</color>
<color name="colorPrimaryDark">#840000</color>
<color name="colorSecondary">#ffc107</color>
<color name="colorSecondaryLight">#fff350</color>
<color name="colorSecondaryDark">#c79100</color>
<color name="colorPrimaryText">#000000</color>
<color name="colorSecondaryText">#ffffff</color>
<color name="listItemHighlight">#88000000</color>
<color name="inputContrastBackground">#070707</color>
<color name="inputBackground">#000000</color>
<color name="inputBorder">#222222</color>
<color name="inputDividerBorder">#666666</color>
<color name="iconColor">#ffffff</color>
<color name="mainLoyaltyCardBackground">#000000</color>
</resources>

View File

@@ -0,0 +1,33 @@
<resources>
<style name="AppTheme" parent="Theme.Material3.Dark.NoActionBar">
<item name="colorPrimary">@color/md_theme_dark_primary</item>
<item name="colorOnPrimary">@color/md_theme_dark_onPrimary</item>
<item name="colorPrimaryContainer">@color/md_theme_dark_primaryContainer</item>
<item name="colorOnPrimaryContainer">@color/md_theme_dark_onPrimaryContainer</item>
<item name="colorSecondary">@color/md_theme_dark_secondary</item>
<item name="colorOnSecondary">@color/md_theme_dark_onSecondary</item>
<item name="colorSecondaryContainer">@color/md_theme_dark_secondaryContainer</item>
<item name="colorOnSecondaryContainer">@color/md_theme_dark_onSecondaryContainer</item>
<item name="colorTertiary">@color/md_theme_dark_tertiary</item>
<item name="colorOnTertiary">@color/md_theme_dark_onTertiary</item>
<item name="colorTertiaryContainer">@color/md_theme_dark_tertiaryContainer</item>
<item name="colorOnTertiaryContainer">@color/md_theme_dark_onTertiaryContainer</item>
<item name="colorError">@color/md_theme_dark_error</item>
<item name="colorErrorContainer">@color/md_theme_dark_errorContainer</item>
<item name="colorOnError">@color/md_theme_dark_onError</item>
<item name="colorOnErrorContainer">@color/md_theme_dark_onErrorContainer</item>
<item name="android:colorBackground">@color/md_theme_dark_background</item>
<item name="colorOnBackground">@color/md_theme_dark_onBackground</item>
<item name="colorSurface">@color/md_theme_dark_surface</item>
<item name="colorOnSurface">@color/md_theme_dark_onSurface</item>
<item name="colorSurfaceVariant">@color/md_theme_dark_surfaceVariant</item>
<item name="colorOnSurfaceVariant">@color/md_theme_dark_onSurfaceVariant</item>
<item name="colorOutline">@color/md_theme_dark_outline</item>
<item name="colorOnSurfaceInverse">@color/md_theme_dark_inverseOnSurface</item>
<item name="colorSurfaceInverse">@color/md_theme_dark_inverseSurface</item>
<item name="colorPrimaryInverse">@color/md_theme_dark_primaryInverse</item>
<item name="windowActionModeOverlay">true</item>
</style>
</resources>

View File

@@ -8,7 +8,7 @@
<string name="note">Aantekening</string>
<string name="cardId">Kaartnummer</string>
<string name="barcodeType">Soort barcode</string>
<string name="barcodeNoBarcode">Deze kaart heeft geen barcode</string>
<string name="barcodeNoBarcode">Er is geen barcode</string>
<string name="cancel">Annuleren</string>
<string name="save">Opslaan</string>
<string name="edit">Bewerken</string>
@@ -22,16 +22,16 @@
<string name="sendLabel">Versturen…</string>
<string name="editCardTitle">Kaart bewerken</string>
<string name="addCardTitle">Kaart toevoegen</string>
<string name="scanCardBarcode">Scan de barcode van de kaart</string>
<string name="scanCardBarcode">Barcode scannen</string>
<string name="cardShortcut">Kaartsnelkoppeling</string>
<string name="noCardsMessage">Voeg eerst een kaart toe</string>
<string name="noStoreError">Geen naam ingevoerd</string>
<string name="noCardIdError">Geen kaartnummer ingevoerd</string>
<string name="noCardIdError">Geen id ingevoerd</string>
<string name="noCardExistsError">De kaart is niet aangetroffen</string>
<string name="failedParsingImportUriError">Kan de import-uri niet verwerken</string>
<string name="importExport">Importeren/Exporteren</string>
<string name="exportName">Exporteren</string>
<string name="importExportHelp">Door je kaarten te back-uppen, kun je ze overzetten naar een ander apparaat.</string>
<string name="importExportHelp">Door je gegevens te back-uppen, kun je ze overzetten naar een ander apparaat.</string>
<string name="importSuccessfulTitle">Importeren voltooid</string>
<string name="importFailedTitle">Importeren mislukt</string>
<string name="importFailed">Het importeren is mislukt</string>
@@ -40,7 +40,7 @@
<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 kaarten te kunnen im- of 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>
@@ -56,7 +56,7 @@
<string name="selectBarcodeTitle">Barcode toevoegen</string>
<string name="enterBarcodeInstructions">Voer de kaart-id in en kies daarna het soort barcode of druk op “Deze kaart heeft geen barcode”.</string>
<string name="copy_to_clipboard_toast">De kaart-id is gekopieerd naar het klembord</string>
<string name="thumbnailDescription">Miniatuurvoorbeeld van kaart</string>
<string name="thumbnailDescription">Miniatuurvoorbeeld</string>
<string name="settings">Instellingen</string>
<string name="settings_category_title_ui">Vormgeving</string>
<string name="settings_theme">Thema</string>
@@ -67,10 +67,10 @@
<string name="settings_lock_barcode_orientation">Barcode-oriëntatie vergrendelen</string>
<string name="intent_import_card_from_url_share_text">Ik wil een klantenkaart met je delen</string>
<string name="all">Alles</string>
<string name="importSuccessful">De kaartgegevens zijn geïmporteerd</string>
<string name="importSuccessful">De gegevens zijn geïmporteerd</string>
<string name="deleteConfirmationGroup">Groep verwijderen\?</string>
<string name="noGroups">Druk op de plusknop (+) om een groep toe te voegen.</string>
<string name="exportSuccessful">De kaartgegevens zijn geëxporteerd</string>
<string name="exportSuccessful">De gegevens zijn geëxporteerd</string>
<string name="groups">Groepen</string>
<string name="enter_group_name">Voer een groepsnaam in</string>
<string name="starImage">Favoriete ster</string>
@@ -78,7 +78,7 @@
\ncopyright ©20162020 Branden Archer</string>
<string name="unstar">Verwijderen uit favorieten</string>
<string name="star">Toevoegen aan favorieten</string>
<string name="addManually">Kaartnummer handmatig invoeren</string>
<string name="addManually">ID handmatig invoeren</string>
<string name="leaveWithoutSaveConfirmation">Weet je zeker dat je niet wilt opslaan\?</string>
<string name="leaveWithoutSaveTitle">Afsluiten</string>
<string name="moveDown">Omlaag verplaatsen</string>
@@ -108,7 +108,7 @@
<string name="balanceSentence">Saldo: <xliff:g>%s</xliff:g></string>
<string name="chooseImportType">Gegevens importeren uit…\?</string>
<string name="app_loyalty_card_keychain">Klantenkaartkluis</string>
<string name="settings_disable_lockscreen_while_viewing_card">Vergrendelscherm uitschakelen</string>
<string name="settings_disable_lockscreen_while_viewing_card">Schermvergrendeling uitschakelen</string>
<string name="settings_keep_screen_on">Scherm niet uitschakelen</string>
<string name="privacy_policy_popup_text">Privacybeleid (vereist door sommige appwinkels):
\n
@@ -151,8 +151,8 @@
<string name="setFrontImage">Voorzijde kiezen</string>
<string name="setBackImage">Achterzijde kiezen</string>
<string name="photos">Afbeeldingen</string>
<string name="backImageDescription">Achterzijde van de kaart</string>
<string name="frontImageDescription">Voorzijde van de kaart</string>
<string name="backImageDescription">Achterzijde van kaart</string>
<string name="frontImageDescription">Voorzijde van kaart</string>
<string name="passwordRequired">Voer het wachtwoord in</string>
<string name="importStocardMessage">Kies het te importeren Stocard-exportbestand genaamd <i>***-sync.zip</i>.
\nStuur een e-mail naar support@stocardapp.com waarin je vraagt om een exportbestand.</string>
@@ -161,8 +161,8 @@
<string name="turn_flashlight_off">Zaklamp uitzetten</string>
<string name="turn_flashlight_on">Zaklamp aanzetten</string>
<plurals name="selectedCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> kaart geselecteerd</item>
<item quantity="other"><xliff:g>%d</xliff:g> kaarten geselecteerd</item>
<item quantity="one"><xliff:g>%d</xliff:g> geselecteerd</item>
<item quantity="other"><xliff:g>%d</xliff:g> geselecteerd</item>
</plurals>
<string name="deleteTitle">Kaart verwijderen</string>
<plurals name="deleteCardsTitle">
@@ -188,11 +188,10 @@
<string name="settings_theme_color">Themakleur</string>
<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="toggleMoreInfo">Meer informatie tonen/verbergen</string>
<string name="barcodeImageDescriptionWithType">Afbeelding van de barcode, type <xliff:g>%s</xliff:g></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="sort_by">Sorteren op</string>
<string name="reverse">Omdraaien</string>
<string name="reverse">…in omgekeerde volgorde</string>
<string name="sort_by_balance">Op saldo</string>
<string name="sort_by_expiry">Op vervaldatum</string>
<string name="sort_by_most_recently_used">Op onlangs gebruikt</string>
@@ -214,10 +213,17 @@
<string name="group_updated">De groep is bijgewerkt</string>
<string name="group_name_is_empty">Voer een groepsnaam in</string>
<string name="editGroup">Groep bewerken: <xliff:g>%s</xliff:g></string>
<string name="noGiftCardsGroup">Je hebt nog geen klantenkaarten toegevoegd. Voeg kaarten toe om ze hier te kunnen groeperen.</string>
<string name="noGiftCardsGroup">Voeg kaarten toe om ze hier te kunnen groeperen.</string>
<string name="group_edit">Groep bewerken</string>
<string name="setIcon">Kies een pictogram</string>
<string name="selectColor">Kies een kleur</string>
<string name="action_show_details">Details tonen</string>
<string name="action_hide_details">Details verbergen</string>
<string name="translate_platform">op Weblate</string>
<string name="shortcutSelectCard">Kies een kaart</string>
<string name="options">Opties</string>
<string name="showMoreInfo">Informatie tonen</string>
<string name="starred">Favoriet</string>
<string name="hideMoreInfo">Informatie verbergen</string>
<string name="set_scale">Schaal instellen</string>
</resources>

View File

@@ -2,12 +2,12 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
<string name="action_search">Szukaj</string>
<string name="action_add">Dodaj</string>
<string name="noGiftCards">Kliknij przycisk + plus, aby dodać kartę lub zaimportuj jakieś z ⋮ menu w pierwszej kolejności.</string>
<string name="noMatchingGiftCards">Nic nie znaleziono. Spróbuj zmienić wyszukiwanie.</string>
<string name="noGiftCards">Kliknij przycisk + plus, aby dodać kartę lub zaimportuj z ⋮ menu.</string>
<string name="noMatchingGiftCards">Brak wyników. Spróbuj zmienić treść zapytania.</string>
<string name="storeName">Nazwa</string>
<string name="note">Notatka</string>
<string name="cardId">Identyfikator karty</string>
<string name="barcodeNoBarcode">Ta karta nie ma kodu kreskowego</string>
<string name="barcodeNoBarcode">Bez kodu kreskowego</string>
<string name="cancel">Anuluj</string>
<string name="save">Zapisz</string>
<string name="edit">Edytuj</string>
@@ -21,16 +21,16 @@
<string name="sendLabel">Wyślij…</string>
<string name="editCardTitle">Edytuj kartę lojalnościową</string>
<string name="addCardTitle">Dodaj kartę lojalnościową</string>
<string name="scanCardBarcode">Zeskanuj kod kreskowy karty lojalnościowej</string>
<string name="scanCardBarcode">Zeskanuj kod kreskowy</string>
<string name="cardShortcut">Skrót karty</string>
<string name="noCardsMessage">Najpierw dodaj kartę</string>
<string name="noStoreError">Nie wprowadzono nazwy</string>
<string name="noCardIdError">Nie wprowadzono identyfikatora karty</string>
<string name="noCardIdError">Nie wprowadzono identyfikatora</string>
<string name="noCardExistsError">Nie można wyszukać 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">Zarchiwizowane dane umożliwiają przeniesienie kart na inne urządzenie.</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="importFailed">Nie udało się zaimportować</string>
@@ -39,7 +39,7 @@
<string name="exportFailed">Nie udało się wyeksportować</string>
<string name="importing">Importowanie…</string>
<string name="exporting">Eksportowanie…</string>
<string name="noExternalStoragePermissionError">Najpierw przyznaj uprawnienia pamięci zewnętrznej do importowania lub eksportowania kart</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>
@@ -47,14 +47,14 @@
<string name="importOptionApplicationExplanation">Użyj dowolnej aplikacji lub ulubionego menedżera plików, aby otworzyć plik.</string>
<string name="importOptionApplicationButton">Użyj innej aplikacji</string>
<string name="about">O aplikacji</string>
<string name="app_license">Wolne oprogramowanie copylefted, licencjonowane GPLv3 +.</string>
<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="selectBarcodeTitle">Wybierz kod kreskowy</string>
<string name="enterBarcodeInstructions">Wprowadź ID karty, a następnie wybierz typ kodu kreskowego, którego chcesz użyć lub wybierz „Ta karta nie ma kodu kreskowego”.</string>
<string name="copy_to_clipboard_toast">Skopiowano ID karty do schowka</string>
<string name="thumbnailDescription">Miniaturka karty</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>
<string name="thumbnailDescription">Miniaturka</string>
<string name="settings">Ustawienia</string>
<string name="settings_category_title_ui">Interfejs użytkownika</string>
<string name="settings_theme">Motyw</string>
@@ -66,14 +66,14 @@
<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">Najpierw kliknij przycisk + plus, aby dodać grupy dla kategoryzacji.</string>
<string name="noGroups">Kliknij przycisk + plus, aby dodać grupy w celu kategoryzacji.</string>
<string name="groups">Grupy</string>
<string name="enter_group_name">Wpisz nazwę grupy</string>
<string name="exportSuccessful">Dane karty zostały wyeksportowane</string>
<string name="importSuccessful">Zaimportowano dane karty</string>
<string name="exportSuccessful">Dane zostały wyeksportowane</string>
<string name="importSuccessful">Zaimportowano dane</string>
<string name="starImage">Ulubiona gwiazda</string>
<string name="app_copyright_old">Na podstawie Loyalty Card Keychain
\nWszelkie prawa zastrzeżone © 20162020 Branden Archer.</string>
\nWszelkie prawa zastrzeżone © 20162020 Branden Archer</string>
<string name="exportOptionExplanation">Dane zostaną zapisane w wybranym przez Ciebie miejscu.</string>
<string name="unstar">Usuń z ulubionych</string>
<string name="star">Dodaj do ulubionych</string>
@@ -91,7 +91,7 @@
<string name="settings_magenta_theme">Magenta</string>
<string name="settings_pink_theme">Różowy</string>
<string name="settings_catima_theme">Catima</string>
<string name="settings_theme_color">Kolor motywu</string>
<string name="settings_theme_color">Kolor akcentowy motywu</string>
<string name="settings_system_locale">System</string>
<string name="settings_locale">Język</string>
<string name="turn_flashlight_off">Wyłącz latarkę</string>
@@ -100,36 +100,36 @@
<string name="passwordRequired">Proszę wpisać hasło</string>
<string name="no">Nie</string>
<string name="yes">Tak</string>
<string name="updateBarcodeQuestionText">Zmieniłeś ID karty. Czy chcesz zaktualizować kod kreskowy, aby używał tej samej wartości\?</string>
<string name="updateBarcodeQuestionText">Zmieniłeś ID. Czy chcesz zaktualizować kod kreskowy, aby używał tej samej wartości\?</string>
<string name="updateBarcodeQuestionTitle">Zaktualizować wartość kodu kreskowego\?</string>
<string name="takePhoto">Zrób zdjęcie</string>
<string name="removeImage">Usuń zdjęcie</string>
<string name="setBackImage">Ustaw tylne zdjęcie</string>
<string name="setFrontImage">Ustaw zdjęcie przednie</string>
<string name="photos">Zdjęcia</string>
<string name="backImageDescription">Zdjęcie tylne karty</string>
<string name="frontImageDescription">Zdjęcie przednie karty</string>
<string name="backImageDescription">Zdjęcie tylne</string>
<string name="frontImageDescription">Zdjęcie przednie</string>
<string name="intent_import_card_from_url_share_multiple_text">Chcę Ci udostępnić karty</string>
<string name="copy_to_clipboard_multiple_toast">Skopiowano ID karty do schowka</string>
<string name="copy_to_clipboard_multiple_toast">Skopiowano ID do schowka</string>
<string name="wrongValueForBarcodeType">Wartość nie jest prawidłowa dla wybranego typu kodu kreskowego</string>
<string name="unsupportedBarcodeType">Nie można jeszcze wyświetlić tego typu kodu kreskowego. Być może będzie on obsługiwany w nowszej wersji aplikacji.</string>
<string name="setBarcodeId">Ustaw wartość kodu kreskowego</string>
<string name="sameAsCardId">Taki sam jak ID karty</string>
<string name="sameAsCardId">Taki sam jak ID</string>
<string name="barcodeId">Wartość kodu kreskowego</string>
<string name="importVoucherVaultMessage">Wybierz swój <i>vouchervault.json</i> z Voucher Vault, aby zaimportować.
\nLub utwórz go wpierw klikając Eksportuj w Voucher Vault.</string>
\nUtwórz go wpierw klikając Eksportuj w Voucher Vault.</string>
<string name="importVoucherVault">Importuj z Voucher Vault</string>
<string name="importStocardMessage">Wybierz swój <i>***-sync.zip</i> z Stocard, aby zaimportować.
\nLub uzyskaj go, wysyłając email na adres support@stocardapp.com, z prośbą o eksport Twoich danych.</string>
\nUzyskaj go, wysyłając email na adres support@stocardapp.com, z prośbą o eksport Twoich danych.</string>
<string name="importStocard">Importuj z Stocard</string>
<string name="importLoyaltyCardKeychainMessage">Wybierz swój <i>LoyaltyCardKeychain.csv</i> z Loyalty Card Keychain, aby zaimportować.
\nLub utwórz go z menu Importuj/Eksportuj w Loyalty Card Keychain, wpierw klikając tam Eksportuj.</string>
\nUtwórz go z menu Importuj/Eksportuj w Loyalty Card Keychain, wpierw klikając tam Eksportuj.</string>
<string name="importLoyaltyCardKeychain">Importuj z Loyalty Card Keychain</string>
<string name="importFidmeMessage">Wybierz swój <i>fidme-export-request-xxxxxx.zip</i> z FidMe, aby zaimportować, po czym wybierz typy kodów kreskowych.
\nLub stwórz go ze swojego profilu FidMe, wybierając wpierw Ochrona Danych, a następnie naciskając Wyodrębnij moje dane.</string>
\nStwórz go ze swojego profilu FidMe, wybierając wpierw Ochrona Danych, a następnie naciskając Wyodrębnij moje dane.</string>
<string name="importFidme">Importuj z FidMe</string>
<string name="importCatimaMessage">Wybierz swój <i>catima.zip</i> z Catima, aby zaimportować.
\nLub utwórz go z menu Importuj/Eksportuj innej aplikacji Catima, wpierw klikając tam Eksportuj.</string>
\nUtwórz go z menu Importuj/Eksportuj innej aplikacji Catima, wpierw klikając tam Eksportuj.</string>
<string name="importCatima">Importuj z Catima</string>
<string name="accept">Zaakceptuj</string>
<string name="privacy_policy_popup_text">Informacja o polityce prywatności (wymagana przez niektóre sklepy z aplikacjami):
@@ -146,7 +146,7 @@
<string name="noBarcodeFound">Nie znaleziono kodu kreskowego</string>
<string name="moveBarcodeToCenterOfScreen">Wyśrodkuj kod kreskowy na ekranie</string>
<string name="moveBarcodeToTopOfScreen">Przenieś kod kreskowy na górę ekranu</string>
<string name="chooseExpiryDate">Wybierz datę ważności</string>
<string name="chooseExpiryDate">Wybierz datę wygaśnięcia</string>
<string name="never">Nigdy</string>
<string name="expiryDate">Data wygaśnięcia</string>
<string name="editBarcode">Edytuj kod kreskowy</string>
@@ -158,7 +158,7 @@
<string name="expiryStateSentence">Wygasa: <xliff:g>%s</xliff:g></string>
<string name="groupsList">Grupy: <xliff:g>%s</xliff:g></string>
<string name="addFromImage">Wybierz zdjęcie z galerii</string>
<string name="addManually">Wpisz ręcznie ID karty</string>
<string name="addManually">Wpisz ręcznie ID</string>
<string name="leaveWithoutSaveConfirmation">Wyjść bez zapisywania\?</string>
<string name="leaveWithoutSaveTitle">Wyjdź</string>
<string name="moveDown">Przesuń w dół</string>
@@ -170,14 +170,14 @@
<item quantity="many"><xliff:g>%d</xliff:g> kart</item>
<item quantity="other"><xliff:g>%d</xliff:g> kart</item>
</plurals>
<string name="noGroupCards">Ta grupa nie zawiera żadnych kart</string>
<string name="settings_disable_lockscreen_while_viewing_card">Zapobiegaj blokowaniu ekranu</string>
<string name="settings_keep_screen_on">Pozostaw ekran włączony</string>
<string name="noGroupCards">Ta grupa jest pusta</string>
<string name="settings_disable_lockscreen_while_viewing_card">Zapobiegaj wyłączeniu ekranu</string>
<string name="settings_keep_screen_on">Nie wygaszaj ekranu</string>
<string name="settings_max_font_size_scale">Maks. rozmiar czcionki</string>
<string name="app_resources">Otwarte zewnętrzne zasoby: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="app_libraries">Otwarte zewnętrzne biblioteki: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Wszelkie prawa zastrzeżone © 2019<xliff:g>%d</xliff:g> Sylvia van Os.</string>
<string name="card_ids_copied">Skopiowano ID karty</string>
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Wszelkie prawa zastrzeżone © 2019<xliff:g>%d</xliff:g> Sylvia van Os</string>
<string name="card_ids_copied">Skopiowano identyfikator(y)</string>
<plurals name="deleteCardsConfirmation">
<item quantity="one">Usunąć tą <xliff:g>%d</xliff:g> kartę permamentnie\?</item>
<item quantity="few">Usunąć te <xliff:g>%d</xliff:g> karty permamentnie\?</item>
@@ -191,9 +191,43 @@
<item quantity="other">Usuń <xliff:g>%d</xliff:g> kart</item>
</plurals>
<plurals name="selectedCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> wybrana karta</item>
<item quantity="few"><xliff:g>%d</xliff:g> wybrane karty</item>
<item quantity="many"><xliff:g>%d</xliff:g> wybranych kart</item>
<item quantity="other"><xliff:g>%d</xliff:g> wybranych kart</item>
<item quantity="one"><xliff:g>%d</xliff:g> zaznaczona</item>
<item quantity="few"><xliff:g>%d</xliff:g> zaznaczone</item>
<item quantity="many"><xliff:g>%d</xliff:g> zaznaczonych</item>
<item quantity="other"><xliff:g>%d</xliff:g> zaznaczonych</item>
</plurals>
<string name="shortcutSelectCard">Wybierz kartę</string>
<string name="action_show_details">Pokaż szczegóły</string>
<string name="action_hide_details">Ukryj szczegóły</string>
<string name="sort_by_name">Nazwa</string>
<string name="sort_by_most_recently_used">Ostatnio użyte</string>
<string name="sort_by_expiry">Data wygaśnięcia</string>
<string name="sort_by_balance">Balans</string>
<string name="sort_by">Sortuj według</string>
<string name="credits">Podziękowania</string>
<string name="help_translate_this_app">Pomóż przetłumaczyć tą aplikację</string>
<string name="source_repository">Repozytorium Źródłowe</string>
<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="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="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_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>
<string name="exportPassword">Ustaw hasło, aby zabezpieczyć twoje wyeksportowane dane (opcjonalne)</string>
<string name="exportPasswordHint">Wpisz hasło</string>
<string name="options">Opcje</string>
</resources>

View File

@@ -1,2 +1,192 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
<resources xmlns:tools="http://schemas.android.com/tools" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="shortcutSelectCard">Selecione um cartão</string>
<string name="action_show_details">Mostrar detalhes</string>
<string name="action_hide_details">Ocultar detalhes</string>
<string name="lockScreen">Bloquear rotação</string>
<string name="unlockScreen">Desbloquear rotação</string>
<string name="deleteTitle">Eliminar cartão</string>
<string name="deleteConfirmation">Eliminar este cartão permanentemente\?</string>
<string name="ok">OK</string>
<string name="copy_to_clipboard">Copiar identificador para a área de transferência</string>
<string name="share">Partilhar</string>
<string name="sendLabel">Enviar…</string>
<string name="editCardTitle">Editar cartão</string>
<string name="addCardTitle">Adicionar cartão</string>
<string name="cardShortcut">Atalho do cartão</string>
<string name="noCardsMessage">Adicione primeiro um cartão</string>
<string name="noStoreError">Nenhum nome inserido</string>
<string name="failedParsingImportUriError">Não foi possível analisar o URI de importação</string>
<string name="importExport">Importar / exportar</string>
<string name="exportName">Exportar</string>
<string name="importSuccessfulTitle">Importado</string>
<string name="importFailedTitle">A importação falhou</string>
<string name="exportSuccessfulTitle">Exportado</string>
<string name="exportFailedTitle">A exportação falhou</string>
<string name="importOptionFilesystemExplanation">Escolha um ficheiro específico a partir do sistema de ficheiros.</string>
<string name="importOptionApplicationTitle">Usar outra aplicação</string>
<string name="importOptionApplicationExplanation">Utilize qualquer aplicação ou o seu gestor de ficheiros favorito para abrir um ficheiro.</string>
<string name="importOptionApplicationButton">Utilizar outra aplicação</string>
<string name="about">Sobre</string>
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Direitos de autor © 2019<xliff:g>%d</xliff:g> Sylvia van Os</string>
<string name="app_copyright_old">Baseado no Loyalty Card Keychain
\ndireitos de autor © 20162020 Branden Archer</string>
<string name="app_license">Software livre de partilha sob a mesma licença e segundo a licença GPLv3+</string>
<string name="about_title_fmt">Sobre o <xliff:g id="app_name">%s</xliff:g></string>
<string name="debug_version_fmt">Versão: <xliff:g id="version">%s</xliff:g></string>
<string name="app_revision_fmt">Informação da revisão: <xliff:g id="app_revision_url">%s</xliff:g></string>
<string name="app_libraries">Bibliotecas livres de terceiros: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="app_resources">Recursos livres de terceiros: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="selectBarcodeTitle">Selecionar código de barras</string>
<string name="starImage">Favorito</string>
<string name="settings">Configurações</string>
<string name="settings_category_title_ui">Interface do utilizador</string>
<string name="settings_theme">Tema</string>
<string name="settings_system_theme">Sistema</string>
<string name="settings_light_theme">Claro</string>
<string name="settings_dark_theme">Escuro</string>
<string name="settings_max_font_size_scale">Tamanho máximo da fonte</string>
<string name="settings_display_barcode_max_brightness">Iluminar o código de barras</string>
<string name="settings_lock_barcode_orientation">Bloquear orientação do código de barras</string>
<string name="settings_keep_screen_on">Manter ecrã ligado</string>
<string name="group_name_is_empty">O nome do grupo não pode estar vazio</string>
<string name="group_updated">Grupo atualizado</string>
<string name="all">Todos</string>
<string name="deleteConfirmationGroup">Eliminar o grupo\?</string>
<string name="failedOpeningFileManager">Instalar primeiro um gestor de ficheiros.</string>
<string name="moveUp">Subir</string>
<string name="moveDown">Descer</string>
<string name="leaveWithoutSaveTitle">Sair</string>
<string name="leaveWithoutSaveConfirmation">Sair sem guardar\?</string>
<string name="addFromImage">Selecionar imagem da galeria</string>
<string name="groupsList">Grupos: <xliff:g>%s</xliff:g></string>
<string name="editGroup">A editar grupo: <xliff:g>%s</xliff:g></string>
<string name="expiryStateSentence">Expiram: <xliff:g>%s</xliff:g></string>
<string name="expiryStateSentenceExpired">Expirados: <xliff:g>%s</xliff:g></string>
<string name="balanceSentence">Saldo: <xliff:g>%s</xliff:g></string>
<string name="balancePoints"><xliff:g>%s</xliff:g> pontos</string>
<string name="card">Cartão</string>
<string name="barcode">Código de barras</string>
<string name="editBarcode">Editar código de barras</string>
<string name="expiryDate">Validade</string>
<string name="never">Nunca</string>
<string name="chooseExpiryDate">Escolher validade</string>
<string name="moveBarcodeToTopOfScreen">Mover o código de barras para o topo do ecrã</string>
<string name="moveBarcodeToCenterOfScreen">Centrar o código de barras no ecrã</string>
<string name="noBarcodeFound">Não foi encontrado nenhum código de barras</string>
<string name="errorReadingImage">Não foi possível ler a imagem</string>
<string name="balance">Saldo</string>
<string name="currency">Moeda</string>
<string name="privacy_policy_popup_text">Aviso de política de privacidade (exigido por algumas lojas de aplicações):
\n
\nNENHUM DADO É RECOLHIDO DE FORMA ALGUMA, o que qualquer pessoa pode confirmar, já que a nossa aplicação é um software livre de código-fonte aberto.</string>
<string name="accept">Aceitar</string>
<string name="importCatima">Importar do Catima</string>
<string name="importFidme">Importar do FidMe</string>
<string name="importFidmeMessage">Selecione a exportação <i>fidme-export-request-xxxxxx.zip</i> do FidMe para importar e depois selecione os tipos de código de barras manualmente.
\nPrimeiro crie a exportação no seu perfil do FidMe escolhendo a opção \"Proteção de dados\" e em seguida pressionando \"Extrair os meus dados\".</string>
<string name="importLoyaltyCardKeychain">Importar do Loyalty Card Keychain</string>
<string name="importLoyaltyCardKeychainMessage">Selecione a exportação <i>LoyaltyCardKeychain.csv</i> do Loyalty Card Keychain para importar.
\nPrimeiro crie a exportação no menu \"Importar / exportar\" no Loyalty Card Keychain pressionando \"Exportar\".</string>
<string name="importStocard">Importar do Stocard</string>
<string name="importCatimaMessage">Selecione a exportação <i>catima.zip</i> do Catima a importar.
\nPrimeiro crie a exportação no menu \"Importar / exportar\" de outra aplicação Catima pressionando \"Exportar\" nesse menu.</string>
<string name="importStocardMessage">Selecione a exportação <i>***-sync.zip</i> do Stocard para importar.
\nObtenha-o através do e-mail support@stocardapp.com solicitando uma exportação dos seus dados.</string>
<string name="importVoucherVault">Importar do Voucher Vault</string>
<string name="importVoucherVaultMessage">Selecione a exportação <i>vouchervault.json</i> do Voucher Vault para importar.
\nCrie-a primeiro pressionando a opção \"Exportar\" no Voucher Vault.</string>
<string name="barcodeId">Valor do código de barras</string>
<string name="setBarcodeId">Definir o valor do código de barras</string>
<string name="unsupportedBarcodeType">Este tipo de código de barras ainda não pode ser mostrado. Pode vir a ser suportado numa versão posterior da aplicação.</string>
<string name="wrongValueForBarcodeType">O valor não é válido para o tipo de código de barras selecionado</string>
<string name="intent_import_card_from_url_share_multiple_text">Quero partilhar alguns cartões</string>
<string name="photos">Fotografias</string>
<string name="setFrontImage">Definir imagem frontal</string>
<string name="setBackImage">Definir imagem de trás</string>
<string name="removeImage">Remover imagem</string>
<string name="takePhoto">Tirar uma fotografia</string>
<string name="updateBarcodeQuestionTitle">Atualizar o valor do código de barras\?</string>
<string name="yes">Sim</string>
<string name="no">Não</string>
<string name="passwordRequired">Introduza a palavra-passe</string>
<string name="exportPassword">Defina uma palavra-passe para proteger a exportação (opcional)</string>
<string name="exportPasswordHint">Digite a palavra-passe</string>
<string name="failedGeneratingShareURL">Não foi possível gerar uma URL partilhável. Por favor reporte isto aos programadores.</string>
<string name="turn_flashlight_on">Ligar lanterna</string>
<string name="turn_flashlight_off">Desligar lanterna</string>
<string name="settings_locale">Idioma</string>
<string name="settings_system_locale">Sistema</string>
<string name="selectColor">Selecionar cor</string>
<string name="setIcon">Definir ícone</string>
<string name="settings_violet_theme">Violeta</string>
<string name="settings_blue_theme">Azul</string>
<string name="settings_sky_blue_theme">Azul céu</string>
<string name="settings_green_theme">Verde</string>
<string name="settings_grey_theme">Cinzento</string>
<string name="settings_brown_theme">Castanho</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="sort_by_name">Nome</string>
<string name="sort_by_most_recently_used">Mais usados recentemente</string>
<string name="sort_by_expiry">Validade</string>
<string name="sort_by_balance">Saldo</string>
<string name="sort_by">Ordenar por</string>
<string name="version_history">Histórico de versões</string>
<string name="credits">Créditos</string>
<string name="help_translate_this_app">Ajude a traduzir esta aplicação</string>
<string name="license">Licença</string>
<string name="source_repository">Repositório do código-fonte</string>
<string name="on_github">no GitHub</string>
<string name="and_data_usage">e utilização de dados</string>
<string name="rate_this_app">Avalie esta aplicação</string>
<string name="on_google_play">no Google Play</string>
<string name="report_error">Reportar erro</string>
<string name="translate_platform">no Weblate</string>
<plurals name="deleteCardsTitle">
<item quantity="one">Eliminar <xliff:g>%d</xliff:g> cartão</item>
<item quantity="other">Eliminar <xliff:g>%d</xliff:g> cartões</item>
</plurals>
<plurals name="deleteCardsConfirmation">
<item quantity="one">Eliminar o cartão <xliff:g>%d</xliff:g> permanentemente\?</item>
<item quantity="other">Eliminar os cartões <xliff:g>%d</xliff:g> permanentemente\?</item>
</plurals>
<plurals name="groupCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> cartão</item>
<item quantity="other"><xliff:g>%d</xliff:g> cartões</item>
</plurals>
<string name="action_search">Pesquisa</string>
<string name="action_add">Acrescentar</string>
<string name="storeName">Nome</string>
<string name="note">Nota</string>
<string name="cardId">Identificador do cartão</string>
<string name="barcodeType">Tipo de código de barras</string>
<string name="noBarcode">Sem código de barras</string>
<string name="star">Adicionar aos favoritos</string>
<string name="unstar">Retirar dos favoritos</string>
<string name="cancel">Cancelar</string>
<string name="save">Guardar</string>
<string name="edit">Editar</string>
<string name="delete">Eliminar</string>
<string name="confirm">Confirmar</string>
<string name="importing">A importar…</string>
<string name="exporting">A exportar…</string>
<string name="exportOptionExplanation">Os dados serão guardados num local à sua escolha.</string>
<string name="importOptionFilesystemTitle">Importar do sistema de ficheiros</string>
<string name="importOptionFilesystemButton">Do sistema de ficheiros</string>
<string name="intent_import_card_from_url_share_text">Quero partilhar um cartão</string>
<string name="enter_group_name">Introduza o nome do grupo</string>
<string name="groups">Grupos</string>
<string name="group_edit">Editar grupo</string>
<string name="group_name_already_in_use">O nome do grupo já está a ser usado</string>
<string name="points">Pontos</string>
<string name="parsingBalanceFailed"><xliff:g>%s</xliff:g> não parece ser um saldo válido.</string>
<string name="chooseImportType">De onde importar os dados\?</string>
<string name="app_loyalty_card_keychain">Loyalty Card Keychain</string>
<string name="privacy_policy">Política de privacidade</string>
<string name="settings_theme_color">Cor do tema</string>
<string name="settings_catima_theme">Catima</string>
<string name="settings_pink_theme">Rosa</string>
<string name="settings_magenta_theme">Magenta</string>
</resources>

View File

@@ -112,7 +112,7 @@
<string name="photos">Fotografias</string>
<string name="passwordRequired">Introduza a palavra-passe</string>
<string name="settings_green_theme">Verde</string>
<string name="settings_grey_theme">Cinza</string>
<string name="settings_grey_theme">Cinzento</string>
<string name="settings_brown_theme">Castanho</string>
<string name="updateBarcodeQuestionTitle">Atualizar o valor do código de barras\?</string>
<string name="updateBarcodeQuestionText">Alterou a identificação do cartão. Também quer atualizar o código de barras para usar o mesmo valor\?</string>
@@ -180,7 +180,6 @@
<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="toggleMoreInfo">Alternar mostrar mais informação</string>
<string name="swipeToSwitchImages">Deslize ou pressione prolongadamente para mudar as imagens</string>
<string name="sort_by_name">Nome</string>
<string name="sort_by_most_recently_used">Mais usados recentemente</string>
@@ -220,4 +219,6 @@
<string name="setIcon">Definir ícone</string>
<string name="action_show_details">Mostrar detalhes</string>
<string name="action_hide_details">Ocultar detalhes</string>
<string name="shortcutSelectCard">Selecione um cartão</string>
<string name="translate_platform">no Weblate</string>
</resources>

View File

@@ -8,7 +8,7 @@
<string name="note">Примечание</string>
<string name="cardId">Номер карты</string>
<string name="barcodeType">Тип штрих-кода</string>
<string name="barcodeNoBarcode">Эта карта без штрих-кода</string>
<string name="barcodeNoBarcode">Нет штрих-кода</string>
<string name="cancel">Отмена</string>
<string name="save">Сохранить</string>
<string name="edit">Изменить</string>
@@ -26,21 +26,21 @@
<string name="cardShortcut">Ярлык карты</string>
<string name="noCardsMessage">Сначала добавьте карту</string>
<string name="noStoreError">Название не указано</string>
<string name="noCardIdError">Номер карты не указан</string>
<string name="noCardIdError">Номер не указан</string>
<string name="noCardExistsError">Карта не найдена</string>
<string name="failedParsingImportUriError">Невозможно разобрать импортируемый URI</string>
<string name="importExport">Импорт/Экспорт</string>
<string name="exportName">Экспорт</string>
<string name="importExportHelp">Резервное копирование карт позволяет перенести их на другое устройство.</string>
<string name="importExportHelp">Резервное копирование данных позволяет перенести их на другое устройство.</string>
<string name="importSuccessfulTitle">Импортировано</string>
<string name="importFailedTitle">Импорт не выполнен</string>
<string name="importFailed">Невозможно импортировать карты</string>
<string name="importFailed">Невозможно выполнить импорт</string>
<string name="exportSuccessfulTitle">Экспортировано</string>
<string name="exportFailedTitle">Экспорт не выполнен</string>
<string name="exportFailed">Невозможно экспортировать карты</string>
<string name="exportFailed">Невозможно выполнить экспорт</string>
<string name="importing">Импорт…</string>
<string name="exporting">Экспорт…</string>
<string name="noExternalStoragePermissionError">Импорт или экспорт невозможен без разрешения на доступ к хранилищу</string>
<string name="noExternalStoragePermissionError">Импорт или экспорт данных невозможен без разрешения на доступ к хранилищу</string>
<string name="exportOptionExplanation">Данные будут записаны в выбранное место.</string>
<string name="importOptionFilesystemTitle">Импорт из файловой системы</string>
<string name="importOptionFilesystemExplanation">Выберете файл на файловой системе.</string>
@@ -54,9 +54,9 @@
<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="selectBarcodeTitle">Выбор штрих-кода</string>
<string name="enterBarcodeInstructions">Введите номер карты и выберите тип штрих-кода (или выберите \"Эта карта без штрих-кода\").</string>
<string name="copy_to_clipboard_toast">Номер карты скопирован в буфер обмена</string>
<string name="thumbnailDescription">Логотип карты</string>
<string name="enterBarcodeInstructions">Введите номер и выберите тип штрих-кода (или выберите \"Нет штрих-кода\").</string>
<string name="copy_to_clipboard_toast">Номер скопирован в буфер обмена</string>
<string name="thumbnailDescription">Логотип</string>
<string name="settings">Настройки</string>
<string name="settings_category_title_ui">Внешний вид</string>
<string name="settings_theme">Тема</string>
@@ -66,12 +66,12 @@
<string name="settings_display_barcode_max_brightness">Максимальная яркость при показе карты</string>
<string name="settings_lock_barcode_orientation">Портретная ориентация экрана при показе карты</string>
<string name="intent_import_card_from_url_share_text">Я хочу поделиться с вами картой</string>
<string name="exportSuccessful">Данные карт успешно экспортированы</string>
<string name="exportSuccessful">Данные успешно экспортированы</string>
<string name="all">Все</string>
<string name="noGroups">Нажмите кнопку \"+\", чтобы добавить группы для упорядочивания записей.</string>
<string name="noGroups">Нажмите кнопку \"+\", чтобы добавить группы для распределения записей.</string>
<string name="groups">Группы</string>
<string name="enter_group_name">Введите название группы</string>
<string name="importSuccessful">Данные карт успешно импортированы</string>
<string name="importSuccessful">Данные успешно импортированы</string>
<string name="starImage">Звезда избранного</string>
<string name="app_copyright_old">На основе Loyalty Card Keychain
\nавторские права © 20162020 Branden Archer</string>
@@ -88,7 +88,7 @@
<string name="expiryStateSentence">Срок действия истекает: <xliff:g>%s</xliff:g></string>
<string name="points">Баллы</string>
<string name="parsingBalanceFailed"><xliff:g>%s</xliff:g> не похож на правильный баланс.</string>
<string name="addManually">Ручной ввод номера карты</string>
<string name="addManually">Ручной ввод номера</string>
<string name="privacy_policy_popup_text">Уведомление о политике конфиденциальности (требуется некоторыми магазинами приложений):
\n
\nНИКАКИЕ ДАННЫЕ НЕ СОБИРАЮТСЯ ВООБЩЕ, что может подтвердить любой, так как наше приложение является свободным программным обеспечением.</string>
@@ -133,7 +133,7 @@
<string name="noBarcodeFound">Штрих-код не найден</string>
<string name="addFromImage">Выбрать изображение из галереи</string>
<string name="setBarcodeId">Указать значение</string>
<string name="sameAsCardId">Как номер карты</string>
<string name="sameAsCardId">Как номер</string>
<string name="barcodeId">Значение штрих-кода</string>
<string name="settings_max_font_size_scale">Максимальный размер шрифта</string>
<string name="unsupportedBarcodeType">В настоящее время данный тип штрих-кодов не отображается. Его поддержка может быть добавлена в следующих версиях приложения.</string>
@@ -142,9 +142,9 @@
<string name="app_libraries">Свободные сторонние библиотеки: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Авторские права © 2019<xliff:g>%d</xliff:g> Sylvia van Os</string>
<string name="intent_import_card_from_url_share_multiple_text">Поделиться картами</string>
<string name="card_ids_copied">Скопированные номера карт</string>
<string name="copy_to_clipboard_multiple_toast">Номера карт скопированы в буфер обмена</string>
<string name="updateBarcodeQuestionText">Вы изменили номер карты. Обновить также значение штрих-кода, чтобы использовалось одинаковое значение\?</string>
<string name="card_ids_copied">Скопированные номера</string>
<string name="copy_to_clipboard_multiple_toast">Номера скопированы в буфер обмена</string>
<string name="updateBarcodeQuestionText">Вы изменили номер. Обновить также значение штрих-кода, чтобы использовалось одинаковое значение\?</string>
<string name="no">Нет</string>
<string name="yes">Да</string>
<string name="updateBarcodeQuestionTitle">Обновить значение штрих-кода\?</string>
@@ -152,8 +152,8 @@
<string name="setFrontImage">Изображение лицевой стороны</string>
<string name="takePhoto">Сфотографировать</string>
<string name="removeImage">Удалить изображение</string>
<string name="backImageDescription">Задняя сторона карты</string>
<string name="frontImageDescription">Лицевая сторона карты</string>
<string name="backImageDescription">Задняя сторона</string>
<string name="frontImageDescription">Лицевая сторона</string>
<string name="photos">Фото</string>
<string name="importStocardMessage">Выберите для импортирования файл <i>***-sync.zip</i>.
\nЭтот файл можно получить по электронной почте от support@stocardapp.com, предварительно запросив экспорт ваших данных.</string>
@@ -163,10 +163,10 @@
<string name="turn_flashlight_off">Отключить вспышку</string>
<string name="turn_flashlight_on">Включить вспышку</string>
<plurals name="selectedCardCount">
<item quantity="one">Выбрано: <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="one"><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="deleteTitle">Удаление карты</string>
<string name="deleteConfirmation">Удалить карту\?</string>
@@ -195,13 +195,12 @@
<string name="settings_pink_theme">Розовый</string>
<string name="settings_theme_color">Цвет темы</string>
<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="toggleMoreInfo">Переключение отображения дополнительной информации</string>
<string name="noGroupCards">Группа пуста</string>
<string name="barcodeImageDescriptionWithType">Изображение штрих-кода <xliff:g>%s</xliff:g></string>
<string name="swipeToSwitchImages">Смахивание или долгое нажатие для переключения изображений</string>
<string name="sort_by_expiry">Срок действия</string>
<string name="sort_by">Сортировать по</string>
<string name="reverse">Обратный порядок</string>
<string name="reverse">…в обратном порядке</string>
<string name="sort_by_balance">Баланс</string>
<string name="sort_by_most_recently_used">Частота использования</string>
<string name="sort_by_name">Название</string>
@@ -223,9 +222,16 @@
<string name="editGroup">Редактирование группы: <xliff:g>%s</xliff:g></string>
<string name="group_edit">Изменить группу</string>
<string name="group_name_already_in_use">Такое название группы уже существует</string>
<string name="noGiftCardsGroup">У вас ещё нет ни одной карты. Как только появится несколько карт, вы сможете добавить их в группу здесь.</string>
<string name="noGiftCardsGroup">Создайте несколько карт, а затем распределите их по группам здесь.</string>
<string name="setIcon">Выбор значка</string>
<string name="selectColor">Выбрать цвет</string>
<string name="action_hide_details">Скрыть детали</string>
<string name="action_show_details">Показать детали</string>
<string name="translate_platform">на Weblate</string>
<string name="shortcutSelectCard">Выбор карты</string>
<string name="options">Параметры</string>
<string name="set_scale">Выбор масштаба</string>
<string name="hideMoreInfo">Скрыть данные</string>
<string name="showMoreInfo">Показать данные</string>
<string name="starred">Избранное</string>
</resources>

View File

@@ -4,21 +4,21 @@
<string name="settings_display_barcode_max_brightness">Gör streckkodsvyn ljusare</string>
<string name="settings_max_font_size_scale">Max. teckenstorlek</string>
<string name="settings_keep_screen_on">Håll skärmen påslagen</string>
<string name="enterBarcodeInstructions">Ange kortets ID och välj antingen streckkodstyp nedan, eller \"Detta kort har ingen streckkod\".</string>
<string name="enterBarcodeInstructions">Ange ID:t och välj antingen streckkodstyp nedan, eller \"Det finns ingen streckkod\".</string>
<string name="importFidmeMessage">Välj den exporterade <i>fidme-export-request-xxxxxx.zip</i> från FidMe som du vill importera och välj streckkodstyper manuellt efteråt.
\nSkapa den från din FidMe-profil först genom att välja \"Data Protection\" och sen trycka på \"Extract my data\".</string>
<string name="importOptionApplicationExplanation">Använd vilken app som helst eller den filhanterare du föredrar för att öppna en fil.</string>
<string name="importOptionApplicationButton">Använd en annan app</string>
<string name="intent_import_card_from_url_share_text">Jag vill dela ett kort med dig</string>
<string name="noGroups">Klicka på plus(+)-knappen för att lägga till kategorigrupper först.</string>
<string name="noGroups">Klicka på plus(+)-knappen för att lägga till kategorigrupper.</string>
<string name="groupsList">Grupper: <xliff:g>%s</xliff:g></string>
<string name="errorReadingImage">Kunde inte läsa bilden</string>
<string name="currency">Valuta</string>
<string name="failedGeneratingShareURL">Kunde inte skapa en delningsbar URL. Var snäll och rapportera detta.</string>
<string name="card_ids_copied">Kopierade kort ID:n</string>
<string name="card_ids_copied">Kopierade ID:n</string>
<plurals name="selectedCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> kort valt</item>
<item quantity="other"><xliff:g>%d</xliff:g> kort valda</item>
<item quantity="one"><xliff:g>%d</xliff:g> valt</item>
<item quantity="other"><xliff:g>%d</xliff:g> valda</item>
</plurals>
<string name="app_loyalty_card_keychain">Loyalty Card Keychain</string>
<string name="importLoyaltyCardKeychainMessage">Välj den exporterade <i>LoyaltyCardKeychain.csv</i> från Loyalty Card Keychain som du vill importera.
@@ -40,7 +40,7 @@
<string name="moveDown">Flytta nedåt</string>
<string name="leaveWithoutSaveTitle">Avsluta</string>
<string name="leaveWithoutSaveConfirmation">Avsluta utan att spara\?</string>
<string name="addManually">Ange kort-ID manuellt</string>
<string name="addManually">Ange ID manuellt</string>
<string name="addFromImage">Välj bild från galleriet</string>
<string name="balancePoints"><xliff:g>%s</xliff:g> poäng</string>
<string name="card">Kort</string>
@@ -62,21 +62,21 @@
<string name="passwordRequired">Var snäll och ange lösenordet</string>
<string name="no">Nej</string>
<string name="yes">Ja</string>
<string name="updateBarcodeQuestionText">Du ändrade kortets ID. Vill du uppdatera så att streckkoden också använder samma värde\?</string>
<string name="updateBarcodeQuestionText">Du ändrade ID:t. Vill du uppdatera streckkoden så att den också använder samma värde\?</string>
<string name="updateBarcodeQuestionTitle">Uppdatera streckkodsvärde\?</string>
<string name="takePhoto">Ta ett foto</string>
<string name="removeImage">Ta bort bild</string>
<string name="setBackImage">Ange baksidesbild</string>
<string name="setFrontImage">Ange framsidesbild</string>
<string name="photos">Foton</string>
<string name="backImageDescription">Bild av kortets baksida</string>
<string name="frontImageDescription">Bild av kortets framsida</string>
<string name="backImageDescription">Baksidesbild</string>
<string name="frontImageDescription">Framsidesbild</string>
<string name="intent_import_card_from_url_share_multiple_text">Jag vill dela några kort med dig</string>
<string name="copy_to_clipboard_multiple_toast">Kort-ID:n kopierades till Urklipp</string>
<string name="copy_to_clipboard_multiple_toast">ID:n kopierades till Urklipp</string>
<string name="wrongValueForBarcodeType">Värdet är inte giltigt för den valda streckkodstypen</string>
<string name="unsupportedBarcodeType">Denna streckkodstyp kan ännu inte visas. Den kan komma att stödjas i en senare version av appen.</string>
<string name="setBarcodeId">Ange streckkodsvärde</string>
<string name="sameAsCardId">Samma som kort-ID</string>
<string name="sameAsCardId">Samma som ID:t</string>
<string name="turn_flashlight_on">Sätt på ficklampa</string>
<string name="turn_flashlight_off">Stäng av ficklampa</string>
<string name="settings_dark_theme">Mörkt</string>
@@ -84,8 +84,8 @@
<string name="settings_theme">Tema</string>
<string name="settings_category_title_ui">Användargränssnitt</string>
<string name="settings">Inställningar</string>
<string name="thumbnailDescription">Miniatyrbild av kort</string>
<string name="copy_to_clipboard_toast">Kort-ID kopierat till Urklipp</string>
<string name="thumbnailDescription">Miniatyrbild</string>
<string name="copy_to_clipboard_toast">ID:t kopierat till Urklipp</string>
<string name="selectBarcodeTitle">Välj streckkod</string>
<string name="debug_version_fmt">Version: <xliff:g id="version">%s</xliff:g></string>
<string name="about_title_fmt">Om <xliff:g id="app_name">%s</xliff:g></string>
@@ -99,14 +99,14 @@
<string name="importOptionFilesystemTitle">Importera från filsystem</string>
<string name="exporting">Exporterar…</string>
<string name="importing">Importerar…</string>
<string name="exportFailed">Kunde inte exportera kort</string>
<string name="importFailed">Kunde inte importera kort</string>
<string name="exportFailed">Kunde inte genomföra export</string>
<string name="importFailed">Kunde inte genomföra import</string>
<string name="importSuccessfulTitle">Importen lyckades</string>
<string name="importFailedTitle">Importen misslyckades</string>
<string name="importExportHelp">Säkerhetskopiering av dina kort låter dig flytta dem till en annan enhet.</string>
<string name="importExportHelp">Säkerhetskopiering av din data möjliggör förflyttning av den till en annan enhet.</string>
<string name="importExport">Importera/Exportera</string>
<string name="noCardExistsError">Kunde inte hitta kort</string>
<string name="noCardIdError">Inget kort-ID har angivits</string>
<string name="noCardExistsError">Kunde inte hitta det kortet</string>
<string name="noCardIdError">Inget ID har angivits</string>
<string name="noStoreError">Inget namn har angivits</string>
<string name="noCardsMessage">Lägg till ett kort först</string>
<string name="cardShortcut">Kort-genväg</string>
@@ -134,19 +134,19 @@
<string name="unstar">Ta bort från favoriter</string>
<string name="star">Lägg till i favoriter</string>
<string name="noBarcode">Ingen streckkod</string>
<string name="barcodeNoBarcode">Detta kort har ingen streckkod</string>
<string name="barcodeNoBarcode">Det finns ingen streckkod</string>
<string name="barcodeType">Streckkodstyp</string>
<string name="cardId">Kort-ID</string>
<string name="storeName">Namn</string>
<string name="noMatchingGiftCards">Hittade ingenting. Försök justera din sökning.</string>
<string name="noGiftCards">Klicka på plus(+)-knappen för att lägga till ett kort, eller importera några från ⋮-menyn först.</string>
<string name="noMatchingGiftCards">Inget resultat. Försök justera din sökning.</string>
<string name="noGiftCards">Klicka på plus(+)-knappen för att lägga till ett kort, eller importera några från ⋮-menyn.</string>
<string name="action_add">Lägg till</string>
<string name="action_search">Sök</string>
<string name="exportOptionExplanation">Datan kommer att sparas till en plats som du väljer.</string>
<string name="exportName">Exportera</string>
<string name="exportFailedTitle">Exporten misslyckades</string>
<string name="exportSuccessfulTitle">Exporten lyckades</string>
<string name="scanCardBarcode">Skanna streckkod på kort</string>
<string name="scanCardBarcode">Skanna streckkod</string>
<string name="settings_system_theme">Systemtemat</string>
<string name="app_revision_fmt">Ändringsinfo: <xliff:g id="app_revision_url">%s</xliff:g></string>
<string name="privacy_policy_popup_text">Notis rörande integritetspolicy (krävs av vissa appbutiker):
@@ -169,13 +169,13 @@
<string name="importCatimaMessage">Välj den exporterade <i>catima.zip</i> från Catima som du vill importera.
\nSkapa den från Import/Export-menyn i en annan Catima-app genom att trycka på Exportera där först.</string>
<string name="expiryStateSentence">Giltigt till: <xliff:g>%s</xliff:g></string>
<string name="exportSuccessful">Kortdata exporterad</string>
<string name="importSuccessful">Kortdata importerad</string>
<string name="exportSuccessful">Data exporterad</string>
<string name="importSuccessful">Data importerad</string>
<string name="failedParsingImportUriError">Kunde inte tolka import-URI:n</string>
<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 först importera eller exportera kort</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>
@@ -187,11 +187,10 @@
<string name="settings_pink_theme">Rosa</string>
<string name="settings_catima_theme">Catima</string>
<string name="settings_theme_color">Temafärg</string>
<string name="noGroupCards">Denna grupp innehåller inga kort</string>
<string name="toggleMoreInfo">Växla mellan att visa mer info</string>
<string name="barcodeImageDescriptionWithType">Bild av kortstreckkod av typen <xliff:g>%s</xliff:g></string>
<string name="noGroupCards">Denna grupp är tom</string>
<string name="barcodeImageDescriptionWithType">Bild <xliff:g>%s</xliff:g> streckkod</string>
<string name="swipeToSwitchImages">Svep eller tryck länge för att växla bild</string>
<string name="reverse">Vänd ordning</string>
<string name="reverse">...i omvänd ordning</string>
<string name="sort_by">Sortera efter</string>
<string name="sort_by_balance">Saldo</string>
<string name="sort_by_expiry">Förfallodag</string>
@@ -219,5 +218,7 @@
<string name="action_hide_details">Dölj detaljer</string>
<string name="credits">Bidragsgivare</string>
<string name="source_repository">Källkodslager</string>
<string name="noGiftCardsGroup">Du har inga kundkort än. När du senare lägger till några kan du placera dem i den här gruppen.</string>
<string name="noGiftCardsGroup">Skapa några kort och placera dem sedan i den här gruppen.</string>
<string name="translate_platform">på Weblate</string>
<string name="shortcutSelectCard">Välj ett kort</string>
</resources>

View File

@@ -1,7 +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="toggleMoreInfo">Daha fazla bilgi göstermeyi aç/kapat</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>
@@ -21,21 +20,21 @@
<string name="passwordRequired">Lütfen parolayı girin</string>
<string name="no">Hayır</string>
<string name="yes">Evet</string>
<string name="updateBarcodeQuestionText">Kart numarasını değiştirdiniz. Aynı değeri kullanmak için barkodu da güncellemek ister misiniz\?</string>
<string name="updateBarcodeQuestionText">Numarayı değiştirdiniz. Aynı değeri kullanmak için barkodu da güncellemek ister misiniz\?</string>
<string name="updateBarcodeQuestionTitle">Barkod değeri güncellensin mi\?</string>
<string name="takePhoto">Fotoğraf çek</string>
<string name="backImageDescription">Kartın arka resmi</string>
<string name="frontImageDescription">Kartın ön resmi</string>
<string name="backImageDescription">Arka resmi</string>
<string name="frontImageDescription">Ön resmi</string>
<string name="removeImage">Resmi kaldır</string>
<string name="setBackImage">Arka resmi ayarla</string>
<string name="setFrontImage">Ön resmi ayarla</string>
<string name="photos">Fotoğraflar</string>
<string name="intent_import_card_from_url_share_multiple_text">Seninle birkaç kart paylaşmak istiyorum</string>
<string name="copy_to_clipboard_multiple_toast">Kart numaraları panoya kopyalandı</string>
<string name="copy_to_clipboard_multiple_toast">Numaralar panoya kopyalandı</string>
<string name="wrongValueForBarcodeType">Değer, seçilen barkod türü için geçerli değil</string>
<string name="unsupportedBarcodeType">Bu barkod türü henüz görüntülenemiyor. Uygulamanın sonraki bir sürümünde desteklenebilir.</string>
<string name="setBarcodeId">Barkod değerini ayarla</string>
<string name="sameAsCardId">Kart numarasıyla aynı</string>
<string name="sameAsCardId">Numarayla aynı</string>
<string name="barcodeId">Barkod değeri</string>
<string name="importVoucherVaultMessage">İçe aktarmak için Voucher Vault\'tan dışa aktardığınız <i>vouchervault.json</i> dosyasını seçin.
\nÖnce Voucher Vault\'ta \"Dışa aktar\" düğmesine basarak bir tane oluşturun.</string>
@@ -79,7 +78,7 @@
<string name="expiryStateSentence">Son kullanma tarihi: <xliff:g>%s</xliff:g></string>
<string name="groupsList">Gruplar: <xliff:g>%s</xliff:g></string>
<string name="addFromImage">Galeriden resim seç</string>
<string name="addManually">Kart numarasını elle gir</string>
<string name="addManually">Numarayı elle gir</string>
<string name="leaveWithoutSaveConfirmation">Kaydetmeden çıkılsın mı\?</string>
<string name="leaveWithoutSaveTitle">Çıkış</string>
<string name="moveDown">Aşağı git</string>
@@ -91,12 +90,12 @@
<item quantity="one"><xliff:g>%d</xliff:g> kart</item>
<item quantity="other"><xliff:g>%d</xliff:g> kart</item>
</plurals>
<string name="noGroupCards">Bu grup hiç kart içermiyor</string>
<string name="noGroups">Önce kategorilere ayırmak üzere gruplar eklemek için + artı düğmesine tıklayın.</string>
<string name="noGroupCards">Bu grup boş</string>
<string name="noGroups">Kategorilere ayırmak üzere gruplar eklemek için + artı düğmesine tıklayın.</string>
<string name="groups">Gruplar</string>
<string name="enter_group_name">Grup adını girin</string>
<string name="exportSuccessful">Kart verileri dışa aktarıldı</string>
<string name="importSuccessful">Kart verileri içe aktarıldı</string>
<string name="exportSuccessful">Veriler dışa aktarıldı</string>
<string name="importSuccessful">Veriler içe aktarıldı</string>
<string name="intent_import_card_from_url_share_text">Seninle bir kart paylaşmak istiyorum</string>
<string name="settings_disable_lockscreen_while_viewing_card">Ekran kilidini engelle</string>
<string name="settings_keep_screen_on">Ekranıık tut</string>
@@ -110,9 +109,9 @@
<string name="settings_category_title_ui">Kullanıcı arayüzü</string>
<string name="settings">Ayarlar</string>
<string name="starImage">Sık kullanılan yıldız</string>
<string name="thumbnailDescription">Kart için küçük resim</string>
<string name="copy_to_clipboard_toast">Kart numarası panoya kopyalandı</string>
<string name="enterBarcodeInstructions">Kart numarasını girin ve aşağıdan barkod türünü veya “Bu kartın barkodu yok” seçeneğini seçin.</string>
<string name="thumbnailDescription">Küçük resim</string>
<string name="copy_to_clipboard_toast">Numara panoya kopyalandı</string>
<string name="enterBarcodeInstructions">Numarasını girin ve aşağıdan barkod türünü veya “Barkod yok” seçeneğini seçin.</string>
<string name="selectBarcodeTitle">Barkod Seç</string>
<string name="app_resources">Özgür üçüncü taraf kaynakları: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="app_libraries">Özgür üçüncü taraf kütüphaneleri: <xliff:g id="app_libraries_list">%s</xliff:g></string>
@@ -131,29 +130,29 @@
<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">Kartları içe veya dışa aktarmak için önce harici depolama izni verin</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">Kartlar dışa aktarılamadı</string>
<string name="exportFailed">Dışa aktarma gerçekleştirilemedi</string>
<string name="exportFailedTitle">Dışa aktarılamadı</string>
<string name="exportSuccessfulTitle">Dışa aktarıldı</string>
<string name="importFailed">Kartlar içe aktarılamadı</string>
<string name="importFailed">İçe aktarma gerçekleştirilemedi</string>
<string name="importFailedTitle">İçe aktarılamadı</string>
<string name="importSuccessfulTitle">İçe aktarıldı</string>
<string name="importExportHelp">Kartlarınızı yedeklemek, onları başka bir aygıta taşımanıza olanak tanır.</string>
<string name="importExportHelp">Verilerinizi yedeklemek, onları başka bir aygıta taşımanıza olanak tanır.</string>
<string name="exportName">Dışa aktar</string>
<string name="importExport">İçe/Dışa aktar</string>
<string name="failedParsingImportUriError">İçe aktarma URI\'si ayrıştırılamadı</string>
<string name="noCardExistsError">Kart bulunamadı</string>
<string name="noCardIdError">Kart numarası girilmedi</string>
<string name="noCardExistsError">Bu kart bulunamadı</string>
<string name="noCardIdError">Numara girilmedi</string>
<string name="noStoreError">Ad girilmedi</string>
<string name="barcodeImageDescriptionWithType"><xliff:g>%s</xliff:g> türündeki kart barkodunun görüntüsü</string>
<string name="card_ids_copied">Kart numara(lar)ı kopyalandı</string>
<string name="barcodeImageDescriptionWithType"><xliff:g>%s</xliff:g> barkod görüntüsü</string>
<string name="card_ids_copied">Numara(lar) kopyalandı</string>
<string name="copy_to_clipboard">Numarayı panoya kopyala</string>
<string name="cardId">Kart numarası</string>
<string name="noCardsMessage">Önce bir kart ekleyin</string>
<string name="cardShortcut">Kart Kısayolu</string>
<string name="scanCardBarcode">Kart Barkodunu Tara</string>
<string name="scanCardBarcode">Barkod Tara</string>
<string name="addCardTitle">Kart Ekle</string>
<string name="editCardTitle">Kartı Düzenle</string>
<string name="sendLabel">Gönder…</string>
@@ -179,20 +178,20 @@
<string name="unstar">Sık kullanılanlardan kaldır</string>
<string name="star">Sık kullanılanlara ekle</string>
<string name="noBarcode">Barkod yok</string>
<string name="barcodeNoBarcode">Bu kartın barkodu yok</string>
<string name="barcodeNoBarcode">Barkod yok</string>
<string name="barcodeType">Barkod türü</string>
<string name="note">Not</string>
<string name="storeName">Ad</string>
<string name="noMatchingGiftCards">Hiçbir şey bulunamadı. Aramanızı değiştirmeyi deneyin.</string>
<string name="noGiftCards">Bir kart eklemek için + artı düğmesine tıklayın veya önce ⋮ menüsünden birkaçını içe aktarın.</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>
<plurals name="selectedCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> kart seçildi</item>
<item quantity="other"><xliff:g>%d</xliff:g> kart seçildi</item>
<item quantity="one"><xliff:g>%d</xliff:g> seçildi</item>
<item quantity="other"><xliff:g>%d</xliff:g> seçildi</item>
</plurals>
<string name="action_add">Ekle</string>
<string name="action_search">Ara</string>
<string name="sort_by">Sıralama ölçütü</string>
<string name="reverse">Ters</string>
<string name="reverse">…ters sırada</string>
<string name="sort_by_balance">Bakiye</string>
<string name="sort_by_expiry">Son kullanma tarihi</string>
<string name="sort_by_most_recently_used">En Son Kullanılan</string>
@@ -210,7 +209,7 @@
<string name="version_history">Sürüm Geçmişi</string>
<string name="exportPassword">Dışa aktarmanızı korumak için bir parola belirleyin (isteğe bağlı)</string>
<string name="exportPasswordHint">Parola girin</string>
<string name="noGiftCardsGroup">Henüz sadakat kartınız yok. Birkaç tane ekledikten sonra, onları burada gruba atayabilirsiniz.</string>
<string name="noGiftCardsGroup">Birkaç kart oluşturun ve ardından onları burada gruba atayın.</string>
<string name="group_name_already_in_use">Grup adı zaten kullanılıyor</string>
<string name="editGroup">Grup Düzenleniyor: <xliff:g>%s</xliff:g></string>
<string name="group_edit">Grubu Düzenle</string>
@@ -220,4 +219,11 @@
<string name="setIcon">Simge ayarla</string>
<string name="action_show_details">Ayrıntıları göster</string>
<string name="action_hide_details">Ayrıntıları gizle</string>
<string name="translate_platform">Weblate\'de</string>
<string name="shortcutSelectCard">Kart seç</string>
<string name="options">Seçenekler</string>
<string name="showMoreInfo">Bilgileri göster</string>
<string name="hideMoreInfo">Bilgileri gizle</string>
<string name="starred">Yıldızlı</string>
<string name="set_scale">Ölçeği ayarla</string>
</resources>

View File

@@ -3,13 +3,13 @@
<string name="privacy_policy_popup_text">Політика конфіденційності (вимагається деякими магазинами):
\n
\nЖОДНОЇ ІНФОРМАЦІЇ НЕ ЗБИРАЄТЬСЯ, що може підтвердити будь-хто, адже наша програма це вільне програмне забезпечення.</string>
<string name="noGiftCards">Натисніть + щоб додати карту чи спочатку імпортуйте з ⋮ меню.</string>
<string name="noGiftCards">Натисніть + щоб додати карту чи імпортуйте з ⋮ меню.</string>
<string name="settings_display_barcode_max_brightness">Яскравіший штрих-код</string>
<string name="enterBarcodeInstructions">Введіть ID карти та оберіть тип штрих-коду чи \"Ця карта не має штрих-коду\".</string>
<string name="enterBarcodeInstructions">Введіть ID та оберіть тип штрих-коду чи \"Не має штрих-коду\".</string>
<string name="selectBarcodeTitle">Оберіть штрих-код</string>
<string name="scanCardBarcode">Відсканувати штрих-код карти</string>
<string name="scanCardBarcode">Відсканувати штрих-код</string>
<string name="noBarcode">Без штрих-коду</string>
<string name="barcodeNoBarcode">Ця карта не має штрих-коду</string>
<string name="barcodeNoBarcode">Штрих-код відсутній</string>
<string name="barcodeType">Тип штрих-коду</string>
<plurals name="groupCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> картка</item>
@@ -19,12 +19,12 @@
</plurals>
<string name="no">НІ</string>
<string name="yes">Так</string>
<string name="updateBarcodeQuestionText">Ви змінили ID картки. Чи ви бажаєте оновити штрих-код для використання цього ж значення\?</string>
<string name="updateBarcodeQuestionText">Ви змінили ID. Чи ви бажаєте оновити штрих-код для використання цього ж значення\?</string>
<string name="updateBarcodeQuestionTitle">Оновити значення штрих-коду\?</string>
<string name="wrongValueForBarcodeType">Значення не дійсне для обраного типу штрих-коду</string>
<string name="unsupportedBarcodeType">Цей тип штрих-коду поки що не відображається. Підтримку може бути додано в подальших версіях програми.</string>
<string name="setBarcodeId">Встановіть значення штрих-коду</string>
<string name="sameAsCardId">Таке ж як ID картки</string>
<string name="sameAsCardId">Таке ж як ID</string>
<string name="barcodeId">Значення штрих-коду</string>
<string name="importVoucherVaultMessage">Оберіть Voucher Vault експорт-файл названий <i>vouchervault.json</i> для імпортування.
\nСтворіть його натиснувши \"Експорт\" у Voucher Vault.</string>
@@ -34,7 +34,7 @@
<string name="importCatimaMessage">Оберіть експорт-файл названий <i>catima.zip</i> для імпортування.
\nСтворіть його з меню імпорту/експорту у іншій Catima, натиснувши \"Експорт\".</string>
<string name="importLoyaltyCardKeychain">Імпорт з Loyalty Card Keychain</string>
<string name="importFidmeMessage">Оберіть FidMe експорт-файл названий <i>fidme-export-request-xxxxxx.zip</i> для імпортування і оберіть типи штрих-кодів вручну пізніше.
<string name="importFidmeMessage">Оберіть FidMe експорт-файл названий <i>fidme-export-request-xxxxxx.zip</i> для імпортування і оберіть типи штрих-кодів.
\nСтворіть його у вашому FidMe профілі обравши \"Захист даних -&gt; Витяг даних\".</string>
<string name="importFidme">Імпорт з FidMe</string>
<string name="importCatima">Імпорт з Catima</string>
@@ -62,7 +62,7 @@
<string name="expiryStateSentence">Термін дії закінчується: <xliff:g>%s</xliff:g></string>
<string name="groupsList">Групи: <xliff:g>%s</xliff:g></string>
<string name="addFromImage">Оберіть зображення з галереї</string>
<string name="addManually">Ввести ID карти вручну</string>
<string name="addManually">Ввести ID вручну</string>
<string name="leaveWithoutSaveConfirmation">Вийти без збереження\?</string>
<string name="leaveWithoutSaveTitle">Вихід</string>
<string name="moveDown">Посунути донизу</string>
@@ -70,11 +70,11 @@
<string name="failedOpeningFileManager">Спочатку встановіть файловий менеджер.</string>
<string name="deleteConfirmationGroup">Видалити групу\?</string>
<string name="all">Усі</string>
<string name="noGroups">Спочатку натисніть + щоб додати групи для категоризації.</string>
<string name="noGroups">Натисніть + щоб додати групи для категоризації.</string>
<string name="groups">Групи</string>
<string name="enter_group_name">Введіть ім\'я групи</string>
<string name="exportSuccessful">Дані картки/карток експортовано</string>
<string name="importSuccessful">Дані картки/карток імпортовано</string>
<string name="exportSuccessful">Дані експортовано</string>
<string name="importSuccessful">Дані імпортовано</string>
<string name="intent_import_card_from_url_share_text">Я хочу поділитися з тобою картою</string>
<string name="settings_disable_lockscreen_while_viewing_card">Не блокувати екран</string>
<string name="settings_keep_screen_on">Не вимикати екран</string>
@@ -87,10 +87,10 @@
<string name="settings_category_title_ui">Інтерфейс користувача</string>
<string name="settings">Налаштування</string>
<string name="starImage">Улюблена зірка</string>
<string name="thumbnailDescription">Ескіз для карти</string>
<string name="thumbnailDescription">Ескіз</string>
<string name="intent_import_card_from_url_share_multiple_text">Я хочу поділитися деякими картами з тобою</string>
<string name="copy_to_clipboard_multiple_toast">ID карток скопійовано до буферу обміну</string>
<string name="copy_to_clipboard_toast">ID карти скопійовано до буферу обміну</string>
<string name="copy_to_clipboard_multiple_toast">ID скопійовано до буферу обміну</string>
<string name="copy_to_clipboard_toast">ID скопійовано до буферу обміну</string>
<string name="app_resources">Вільні ресурси третіх сторін: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="app_libraries">Вільні бібліотеки третіх сторін: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="app_revision_fmt">Інформація про випуск: <xliff:g id="app_revision_url">%s</xliff:g></string>
@@ -108,23 +108,23 @@
<string name="importOptionFilesystemExplanation">Оберіть файл у провіднику.</string>
<string name="importOptionFilesystemTitle">Імпорт з файлу</string>
<string name="exportOptionExplanation">Дані буде записано до локації обраної вами.</string>
<string name="noExternalStoragePermissionError">Надайте дозвіл на доступ до пам\'яті пристрою для імпорту чи експорту карток</string>
<string name="noExternalStoragePermissionError">Надайте дозвіл на доступ до пам\'яті пристрою для імпорту/експорту даних</string>
<string name="exporting">Експортуємо…</string>
<string name="importing">Імпортуємо…</string>
<string name="exportFailed">Неможливо експортувати картки</string>
<string name="exportFailed">Неможливо здійснити експорт</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="importExportHelp">Створення резервної копії ваших карток дозволяє перемістити їх до іншого пристрою.</string>
<string name="importExportHelp">Резервна копія даних дозволяє перемістити їх до іншого пристрою.</string>
<string name="exportName">Експорт</string>
<string name="importExport">Імпорт/Експорт</string>
<string name="failedParsingImportUriError">Неможливо опрацювати імпорт-URI</string>
<string name="noCardExistsError">Карту не знайдено</string>
<string name="noCardIdError">ID карти не введено</string>
<string name="noCardIdError">ID не введено</string>
<string name="noStoreError">Ім\'я не введено</string>
<string name="card_ids_copied">ID карти скопійовано</string>
<string name="card_ids_copied">ID скопійовано</string>
<string name="noCardsMessage">Спочатку додайте карту</string>
<string name="cardShortcut">Швидкий виклик карти</string>
<string name="addCardTitle">Додати карту</string>
@@ -157,30 +157,30 @@
<string name="setBackImage">Встановити зображення тильної сторони</string>
<string name="setFrontImage">Встановити зображення лицьової сторони</string>
<string name="photos">Фото</string>
<string name="backImageDescription">Тильна сторона карти</string>
<string name="frontImageDescription">Лицьова сторона карти</string>
<string name="backImageDescription">Тильна сторона</string>
<string name="frontImageDescription">Лицьова сторона</string>
<string name="importStocardMessage">Виберіть експорт <i> ***-sync.zip </i> зі Stocard для імпорту.
\nОтримайте його, надіславши електронною поштою support@stocardapp.com з проханням експортувати ваші дані.</string>
\nОтримайте його, надіславши електронного листа support@stocardapp.com з проханням експортувати ваші дані.</string>
<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="many">Обрано: <xliff:g>%d</xliff:g> карток</item>
<item quantity="other">Обрано: <xliff:g>%d</xliff:g> карток</item>
<item quantity="one">Обрано: <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="deleteTitle">Видалити картку</string>
<string name="deleteConfirmation">Бажаєте видалити карту\?</string>
<plurals name="deleteCardsTitle">
<item quantity="one">Видалити <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="many">Видалити <xliff:g>%d</xliff:g> карток</item>
<item quantity="other">Видалити <xliff:g>%d</xliff:g> карток</item>
</plurals>
<plurals name="deleteCardsConfirmation">
<item quantity="one">Видаліть цю <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="one">Видалити цю <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="settings_blue_theme">Синій</string>
<string name="settings_violet_theme">Фіолетовий</string>
@@ -195,12 +195,11 @@
<string name="settings_green_theme">Зелений</string>
<string name="settings_sky_blue_theme">Небесно-синій</string>
<string name="app_contributors">Стало можливим завдяки: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="noGroupCards">Ця група не містить жодних карток</string>
<string name="toggleMoreInfo">Показувати додаткову інформацію</string>
<string name="barcodeImageDescriptionWithType">Зображення штрих-коду карти типу <xliff:g>%s</xliff:g></string>
<string name="noGroupCards">Пуста група</string>
<string name="barcodeImageDescriptionWithType">Зображення штрих-коду <xliff:g>%s</xliff:g></string>
<string name="swipeToSwitchImages">Свайп чи довге натискання для зміни зображень</string>
<string name="sort_by">Сортувати за</string>
<string name="reverse">Зворотній порядок</string>
<string name="reverse">у зворотному порядку</string>
<string name="sort_by_balance">Баланс</string>
<string name="sort_by_expiry">Термін дії</string>
<string name="sort_by_most_recently_used">Часто використовувані</string>
@@ -223,9 +222,12 @@
<string name="editGroup">Редагування групи: <xliff:g>%s</xliff:g></string>
<string name="group_edit">Змінити групу</string>
<string name="group_name_already_in_use">Група з такою назвою вже існує</string>
<string name="noGiftCardsGroup">У вас ще немає жодної картки. Коли ви додасте кілька, то зможете призначити їх до групи.</string>
<string name="noGiftCardsGroup">Створите кілька карток, та призначте їх до групи тут.</string>
<string name="selectColor">Вибір кольору</string>
<string name="setIcon">Вибір іконки</string>
<string name="action_show_details">Показати деталі</string>
<string name="action_hide_details">Сховати деталі</string>
<string name="translate_platform">на Weblate</string>
<string name="shortcutSelectCard">Оберіть карту</string>
<string name="options">Параметри</string>
</resources>

View File

@@ -1,9 +0,0 @@
<resources>
<style name="AppTheme.NoActionBar" parent="AppTheme">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
</style>
</resources>

View File

@@ -17,7 +17,7 @@
<string name="importOptionFilesystemButton">从文件系统</string>
<string name="unstar">从收藏中删除</string>
<string name="intent_import_card_from_url_share_multiple_text">我想和你分享一些卡片</string>
<string name="copy_to_clipboard_multiple_toast">已将卡号复制到剪贴板</string>
<string name="copy_to_clipboard_multiple_toast">卡号复制到剪贴板</string>
<string name="wrongValueForBarcodeType">该值对所选条形码类型无效</string>
<string name="unsupportedBarcodeType">此条形码类型尚无法显示。较新版本的应用程序可能提供支持。</string>
<string name="setBarcodeId">设置条形码值</string>
@@ -66,13 +66,13 @@
<string name="failedOpeningFileManager">请先安装文件管理器。</string>
<string name="deleteConfirmationGroup">删除群组?</string>
<string name="all">全部</string>
<string name="noGroups">\"+\" 按钮,先添加组进行分类。</string>
<string name="noGroups">“+ ” 按钮添加组进行分类。</string>
<string name="enter_group_name">输入组名</string>
<string name="groups"></string>
<string name="exportSuccessful">已导出卡片数据</string>
<string name="importSuccessful">已导入卡片数据</string>
<string name="exportSuccessful">已导出数据</string>
<string name="importSuccessful">已导入数据</string>
<string name="intent_import_card_from_url_share_text">我想和你分享一张卡</string>
<string name="settings_disable_lockscreen_while_viewing_card">禁用锁屏</string>
<string name="settings_disable_lockscreen_while_viewing_card">防止锁屏</string>
<string name="settings_keep_screen_on">保持屏幕常亮</string>
<string name="settings_lock_barcode_orientation">锁定条码方向</string>
<string name="settings_display_barcode_max_brightness">提高条码界面亮度</string>
@@ -82,9 +82,9 @@
<string name="settings_theme">主题</string>
<string name="settings_category_title_ui">用户界面</string>
<string name="settings">设置</string>
<string name="thumbnailDescription">卡片缩略图</string>
<string name="thumbnailDescription">缩略图</string>
<string name="copy_to_clipboard_toast">已复制卡号到剪贴板</string>
<string name="enterBarcodeInstructions">输入卡号,并从下面选择其条码类型,或选择\"此卡片没有条码\"。</string>
<string name="enterBarcodeInstructions">输入卡号,并从下面选择其条码类型,或选择\"条码\"。</string>
<string name="selectBarcodeTitle">选择条码</string>
<string name="app_resources">第三方自由资源:<xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="app_license">本软件为自由软件,使用 GPLv3+ 许可证</string>
@@ -105,19 +105,19 @@
<string name="importFailed">无法导入卡片</string>
<string name="importFailedTitle">导入失败</string>
<string name="importSuccessfulTitle">导入成功</string>
<string name="importExportHelp">备份卡片后你可以让你将它们转移到其他设备。</string>
<string name="importExportHelp">备份数据允许你将其移动到另一个设备</string>
<string name="exportName">导出</string>
<string name="importExport">导入/导出</string>
<string name="failedParsingImportUriError">无法解析导入的URI</string>
<string name="noCardExistsError">无法到卡片</string>
<string name="noCardExistsError">找不到卡片</string>
<string name="noCardIdError">未输入卡号</string>
<string name="noStoreError">未输入卡片名称</string>
<string name="card_ids_copied">复制卡号</string>
<string name="card_ids_copied">复制卡号</string>
<string name="noCardsMessage">请先添加一张卡片</string>
<string name="cardShortcut">卡片快捷键</string>
<string name="editCardTitle">编辑卡片</string>
<string name="addCardTitle">添加卡片</string>
<string name="scanCardBarcode">扫描卡片条码</string>
<string name="scanCardBarcode">扫描条码</string>
<string name="sendLabel">发送…</string>
<string name="share">分享</string>
<string name="copy_to_clipboard">复制卡号到剪贴板</string>
@@ -131,13 +131,13 @@
<string name="cancel">取消</string>
<string name="star">添加到收藏</string>
<string name="noBarcode">无条形码</string>
<string name="barcodeNoBarcode">此卡无条形码</string>
<string name="barcodeNoBarcode">无条形码</string>
<string name="barcodeType">条形码类型</string>
<string name="cardId">卡号</string>
<string name="note">备注</string>
<string name="storeName">名称</string>
<string name="noMatchingGiftCards">没有找到任何东西。尝试改变你的搜索。</string>
<string name="noGiftCards">点击 \"+\"加号按钮来添加卡片,或者从⋮菜单导入一些。</string>
<string name="noMatchingGiftCards">没有结果。尝试改变你的搜索。</string>
<string name="noGiftCards">点击 \"+\"加号按钮来添加卡片,或者从⋮ 菜单导入一些。</string>
<string name="action_add">添加</string>
<string name="action_search">搜索</string>
<string name="deleteConfirmation">删除此卡?</string>
@@ -149,7 +149,7 @@
<item quantity="other">确定永久删除 <xliff:g>%d</xliff:g> 这些卡片?</item>
</plurals>
<plurals name="selectedCardCount">
<item quantity="other">已选择 <xliff:g>%d</xliff:g> 张卡</item>
<item quantity="other">选中了 <xliff:g>%d</xliff:g> 张卡</item>
</plurals>
<plurals name="deleteCardsTitle">
<item quantity="other">删除 <xliff:g>%d</xliff:g> 张卡片</item>
@@ -167,10 +167,10 @@
<string name="setBackImage">设置背面图像</string>
<string name="setFrontImage">设置正面图像</string>
<string name="photos">照片</string>
<string name="backImageDescription">卡片的背面图像</string>
<string name="frontImageDescription">卡片的正面图像</string>
<string name="backImageDescription">背面图像</string>
<string name="frontImageDescription">正面图像</string>
<string name="importStocard">从Stocard导入</string>
<string name="noGiftCardsGroup">你还没有会员卡。一旦添加了一些卡,你可以将它们分配这里的组。</string>
<string name="barcodeImageDescriptionWithType"><xliff:g>%s</xliff:g>卡片条码图像</string>
<string name="noGiftCardsGroup">创建一些卡片,然后分配这里的组。</string>
<string name="barcodeImageDescriptionWithType"><xliff:g>%s</xliff:g>型条码图像</string>
<string name="group_edit">编辑组</string>
</resources>

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="app_revision_url">https://github.com/TheLastProject/Catima/releases</string>
<string name="app_revision_url">https://github.com/CatimaLoyalty/Android/releases</string>
<string name="action_search">搜尋</string>
<string name="action_add">新增</string>
<string name="noGiftCards">點選 + 按鈕以新增卡片\n或從 ⋮ 選單中匯入卡片</string>
@@ -201,7 +201,6 @@
<string name="backImageDescription">卡片 (背面)</string>
<string name="updateBarcodeQuestionText">您已更新了條碼 ID是否要更新條碼內容以匹配此 ID</string>
<string name="failedGeneratingShareURL">無法建立可分享的 URL請回報此錯誤。</string>
<string name="toggleMoreInfo">切換顯示更多內容</string>
<string name="swipeToSwitchImages">滑動或長按以切換圖片</string>
<string name="starImage">收藏標示</string>
</resources>

View File

@@ -1,26 +1,56 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Palette generated by Material IO https://material.io/color/#!/?view.left=0&view.right=0&primary.color=3F51B5&secondary.color=FFC107 -->
<resources>
<color name="colorPrimary">#B53F3F</color>
<color name="colorPrimaryLight">#E87575</color>
<color name="colorPrimaryDark">#840000</color>
<color name="colorPrimaryDisabled">#484848</color>
<color name="colorSecondary">#ffc107</color>
<color name="colorSecondaryLight">#fff350</color>
<color name="colorSecondaryDark">#c79100</color>
<color name="colorPrimaryText">#ffffff</color>
<color name="colorSecondaryText">#000000</color>
<color name="listItemHighlight">#44000000</color>
<color name="inputContrastBackground">#F8F8F8</color>
<color name="inputBackground">#FFFFFF</color>
<color name="inputBorder">#DDDDDD</color>
<color name="inputDividerBorder">#AAAAAA</color>
<color name="iconColor">#000000</color>
<color name="alert">#FF0000</color>
<color name="mainLoyaltyCardBackground">#F8F8F8</color>
<color name="md_theme_light_primary">#A83536</color>
<color name="md_theme_light_onPrimary">#FFFFFF</color>
<color name="md_theme_light_primaryContainer">#FFDAD6</color>
<color name="md_theme_light_onPrimaryContainer">#410004</color>
<color name="md_theme_light_secondary">#775654</color>
<color name="md_theme_light_onSecondary">#FFFFFF</color>
<color name="md_theme_light_secondaryContainer">#FFDAD7</color>
<color name="md_theme_light_onSecondaryContainer">#2C1514</color>
<color name="md_theme_light_tertiary">#735A2E</color>
<color name="md_theme_light_onTertiary">#FFFFFF</color>
<color name="md_theme_light_tertiaryContainer">#FFDEA7</color>
<color name="md_theme_light_onTertiaryContainer">#281900</color>
<color name="md_theme_light_error">#BA1B1B</color>
<color name="md_theme_light_errorContainer">#FFDAD4</color>
<color name="md_theme_light_onError">#FFFFFF</color>
<color name="md_theme_light_onErrorContainer">#410001</color>
<color name="md_theme_light_background">#FCFCFC</color>
<color name="md_theme_light_onBackground">#201A1A</color>
<color name="md_theme_light_surface">#FCFCFC</color>
<color name="md_theme_light_onSurface">#201A1A</color>
<color name="md_theme_light_surfaceVariant">#F4DDDB</color>
<color name="md_theme_light_onSurfaceVariant">#524342</color>
<color name="md_theme_light_outline">#857372</color>
<color name="md_theme_light_inverseOnSurface">#FBEEEC</color>
<color name="md_theme_light_inverseSurface">#362F2E</color>
<color name="md_theme_light_primaryInverse">#FFB3AE</color>
<color name="md_theme_dark_primary">#FFB3AE</color>
<color name="md_theme_dark_onPrimary">#67020E</color>
<color name="md_theme_dark_primaryContainer">#881E22</color>
<color name="md_theme_dark_onPrimaryContainer">#FFDAD6</color>
<color name="md_theme_dark_secondary">#E7BDBA</color>
<color name="md_theme_dark_onSecondary">#442928</color>
<color name="md_theme_dark_secondaryContainer">#5D3F3D</color>
<color name="md_theme_dark_onSecondaryContainer">#FFDAD7</color>
<color name="md_theme_dark_tertiary">#E3C28C</color>
<color name="md_theme_dark_onTertiary">#402D05</color>
<color name="md_theme_dark_tertiaryContainer">#594319</color>
<color name="md_theme_dark_onTertiaryContainer">#FFDEA7</color>
<color name="md_theme_dark_error">#FFB4A9</color>
<color name="md_theme_dark_errorContainer">#930006</color>
<color name="md_theme_dark_onError">#680003</color>
<color name="md_theme_dark_onErrorContainer">#FFDAD4</color>
<color name="md_theme_dark_background">#201A1A</color>
<color name="md_theme_dark_onBackground">#ECDFDE</color>
<color name="md_theme_dark_surface">#201A1A</color>
<color name="md_theme_dark_onSurface">#ECDFDE</color>
<color name="md_theme_dark_surfaceVariant">#524342</color>
<color name="md_theme_dark_onSurfaceVariant">#D8C2C0</color>
<color name="md_theme_dark_outline">#A08C8B</color>
<color name="md_theme_dark_inverseOnSurface">#201A1A</color>
<color name="md_theme_dark_inverseSurface">#ECDFDE</color>
<color name="md_theme_dark_primaryInverse">#A83536</color>
<color name="seed">#B53F3F</color>
<color name="error">#BA1B1B</color>
</resources>

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_revision_url" translatable="false">https://github.com/TheLastProject/Catima/releases</string>
<string name="app_webpage_url" translatable="false">https://github.com/TheLastProject/Catima</string>
<string name="app_revision_url" translatable="false">https://github.com/CatimaLoyalty/Android/releases</string>
<string name="app_webpage_url" translatable="false">https://github.com/CatimaLoyalty/Android</string>
<integer name="full_rotation_duration">100</integer>
<integer name="half_rotation_duration">50</integer>
</resources>

View File

@@ -12,31 +12,6 @@
<item>@string/settings_dark_theme</item>
</string-array>
<string-array name="color_values">
<item>@string/settings_key_catima_theme</item>
<item>@string/settings_key_pink_theme</item>
<item>@string/settings_key_magenta_theme</item>
<item>@string/settings_key_violet_theme</item>
<item>@string/settings_key_blue_theme</item>
<item>@string/settings_key_sky_blue_theme</item>
<item>@string/settings_key_green_theme</item>
<item>@string/settings_key_grey_theme</item>
<item>@string/settings_key_brown_theme</item>
</string-array>
<string-array name="color_value_strings">
<item>@string/settings_catima_theme</item>
<item>@string/settings_pink_theme</item>
<item>@string/settings_magenta_theme</item>
<item>@string/settings_violet_theme</item>
<item>@string/settings_blue_theme</item>
<item>@string/settings_sky_blue_theme</item>
<item>@string/settings_green_theme</item>
<item>@string/settings_grey_theme</item>
<item>@string/settings_brown_theme</item>
</string-array>
<string-array name="locale_values">
<item />
<item>bg</item>
@@ -47,6 +22,7 @@
<item>da</item>
<item>de</item>
<item>el-rGR</item>
<item>en</item>
<item>eo</item>
<item>es</item>
<item>es-rAR</item>

View File

@@ -3,17 +3,17 @@
<string name="action_search">Search</string>
<string name="action_add">Add</string>
<plurals name="selectedCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> card selected</item>
<item quantity="other"><xliff:g>%d</xliff:g> cards selected</item>
<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 first.</string>
<string name="noGiftCardsGroup">You don\'t have any loyalty cards yet. Once you\'ve added some you can assign them to the group here.</string>
<string name="noMatchingGiftCards">Didn\'t find anything. Try changing your search.</string>
<string name="noGiftCards">Click the + plus button to add a card, or import some 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>
<string name="note">Note</string>
<string name="cardId">Card ID</string>
<string name="barcodeType">Barcode type</string>
<string name="barcodeNoBarcode">This card has no barcode</string>
<string name="barcodeNoBarcode">There is no barcode</string>
<string name="noBarcode">No barcode</string>
<string name="star">Add to favorites</string>
<string name="unstar">Remove from favorites</string>
@@ -46,27 +46,28 @@
<string name="sendLabel">Send…</string>
<string name="editCardTitle">Edit Card</string>
<string name="addCardTitle">Add Card</string>
<string name="scanCardBarcode">Scan Card Barcode</string>
<string name="scanCardBarcode">Scan Barcode</string>
<string name="cardShortcut">Card Shortcut</string>
<string name="noCardsMessage">Add a card first</string>
<string name="card_ids_copied">Copied Card ID(s)</string>
<string name="barcodeImageDescriptionWithType">Image of card barcode of type <xliff:g>%s</xliff:g></string>
<string name="card_ids_copied">Copied ID(s)</string>
<!-- %s is a type of barcode here -->
<string name="barcodeImageDescriptionWithType">Image <xliff:g>%s</xliff:g> barcode</string>
<string name="noStoreError">No name entered</string>
<string name="noCardIdError">No card ID entered</string>
<string name="noCardExistsError">Could not find card</string>
<string name="noCardIdError">No ID entered</string>
<string name="noCardExistsError">Could not find that card</string>
<string name="failedParsingImportUriError">Could not parse the import URI</string>
<string name="importExport">Import/Export</string>
<string name="exportName">Export</string>
<string name="importExportHelp">Backing up your cards allows you to move them to another device.</string>
<string name="importExportHelp">Backing up your data allows moving it to another device.</string>
<string name="importSuccessfulTitle">Imported</string>
<string name="importFailedTitle">Import failed</string>
<string name="importFailed">Could not import cards</string>
<string name="importFailed">Could not perform import</string>
<string name="exportSuccessfulTitle">Exported</string>
<string name="exportFailedTitle">Export failed</string>
<string name="exportFailed">Could not export cards</string>
<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 cards first</string>
<string name="noExternalStoragePermissionError">Grant external storage permission to import or export data</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>
@@ -84,9 +85,9 @@
<string name="app_libraries">Libre third-party libraries: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="app_resources">Libre third-party resources: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="selectBarcodeTitle">Select Barcode</string>
<string name="enterBarcodeInstructions">Enter the card ID, and either pick its barcode type below, or “This card has no barcode”.</string>
<string name="copy_to_clipboard_toast">Card ID copied to clipboard</string>
<string name="thumbnailDescription">Thumbnail for card</string>
<string name="enterBarcodeInstructions">Enter the ID, and either pick a barcode type below, or “There is no barcode”.</string>
<string name="copy_to_clipboard_toast">ID copied to clipboard</string>
<string name="thumbnailDescription">Thumbnail</string>
<string name="starImage">Favorite star</string>
<string name="settings">Settings</string>
<string name="settings_category_title_ui">User interface</string>
@@ -106,7 +107,7 @@
<string name="settings_key_lock_barcode_orientation" translatable="false">pref_lock_barcode_orientation</string>
<string name="settings_keep_screen_on">Keep screen on</string>
<string name="settings_key_keep_screen_on" translatable="false">pref_keep_screen_on</string>
<string name="settings_disable_lockscreen_while_viewing_card">Prevent lock screen</string>
<string name="settings_disable_lockscreen_while_viewing_card">Prevent screen lock</string>
<string name="settings_key_disable_lockscreen_while_viewing_card" translatable="false">pref_disable_lockscreen_while_viewing_card</string>
<string name="sharedpreference_active_tab" translatable="false">sharedpreference_active_tab</string>
<string name="sharedpreference_privacy_policy_shown" translatable="false">sharedpreference_privacy_policy_shown</string>
@@ -120,13 +121,13 @@
<string name="intent_import_card_from_url_path_prefix_thelastproject" translatable="false">/Catima/share</string>
<string name="intent_import_card_from_url_host_brarcher" translatable="false">brarcher.github.io</string>
<string name="intent_import_card_from_url_path_prefix_brarcher" translatable="false">/loyalty-card-locker/share</string>
<string name="importSuccessful">Card data imported</string>
<string name="exportSuccessful">Card data exported</string>
<string name="importSuccessful">Data imported</string>
<string name="exportSuccessful">Data exported</string>
<string name="enter_group_name">Enter group name</string>
<string name="groups">Groups</string>
<string name="group_edit">Edit Group</string>
<string name="noGroups">Click the + plus button to add groups for categorization first.</string>
<string name="noGroupCards">This group does not contain any cards</string>
<string name="noGroups">Click the + plus button to add groups for categorization.</string>
<string name="noGroupCards">This group is empty</string>
<plurals name="groupCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> card</item>
<item quantity="other"><xliff:g>%d</xliff:g> cards</item>
@@ -141,7 +142,7 @@
<string name="moveDown">Move downwards</string>
<string name="leaveWithoutSaveTitle">Exit</string>
<string name="leaveWithoutSaveConfirmation">Leave without saving?</string>
<string name="addManually">Manually enter card ID</string>
<string name="addManually">Manually enter ID</string>
<string name="addFromImage">Select image from gallery</string>
<string name="groupsList">Groups: <xliff:g>%s</xliff:g></string>
<string name="editGroup">Editing Group: <xliff:g>%s</xliff:g></string>
@@ -184,21 +185,21 @@
<string name="importVoucherVaultMessage">Select your <i>vouchervault.json</i> export from Voucher Vault to import.
\nCreate it by pressing Export in Voucher Vault first.</string>
<string name="barcodeId">Barcode value</string>
<string name="sameAsCardId">Same as card ID</string>
<string name="sameAsCardId">Same as ID</string>
<string name="setBarcodeId">Set barcode value</string>
<string name="unsupportedBarcodeType">This barcode type can\'t yet be displayed. It may be supported in a later version of the app.</string>
<string name="wrongValueForBarcodeType">The value is not valid for the selected barcode type</string>
<string name="copy_to_clipboard_multiple_toast">Card IDs copied to clipboard</string>
<string name="copy_to_clipboard_multiple_toast">IDs copied to clipboard</string>
<string name="intent_import_card_from_url_share_multiple_text">I want to share some cards with you</string>
<string name="frontImageDescription">Card\'s front image</string>
<string name="backImageDescription">Card\'s back image</string>
<string name="frontImageDescription">Front image</string>
<string name="backImageDescription">Back image</string>
<string name="photos">Photos</string>
<string name="setFrontImage">Set front image</string>
<string name="setBackImage">Set back image</string>
<string name="removeImage">Remove image</string>
<string name="takePhoto">Take a photo</string>
<string name="updateBarcodeQuestionTitle">Update barcode value?</string>
<string name="updateBarcodeQuestionText">You changed the card ID. Do you want to also update the barcode to use the same value?</string>
<string name="updateBarcodeQuestionText">You changed the ID. Do you want to also update the barcode to use the same value?</string>
<string name="yes">Yes</string>
<string name="no">No</string>
<string name="passwordRequired">Please enter the password</string>
@@ -234,13 +235,15 @@
<string name="settings_key_brown_theme" translatable="false">brown_theme</string>
<string name="app_contributors">Made possible by: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="sort">Sort</string>
<string name="toggleMoreInfo">Toggle showing more info</string>
<string name="showMoreInfo">Show info</string>
<string name="hideMoreInfo">Hide info</string>
<string name="swipeToSwitchImages">Swipe or long press to switch images</string>
<string name="sort_by_name">Name</string>
<string name="sort_by_most_recently_used">Most Recently Used</string>
<string name="sort_by_expiry">Expiry</string>
<string name="sort_by_balance">Balance</string>
<string name="reverse">Reverse</string>
<!-- \"Reversed order\" is also OK. This is an option in the card sorting list -->
<string name="reverse">…in reversed order</string>
<string name="sort_by">Sort by</string>
<string name="version_history">Version History</string>
<string name="arrow" translatable="false"><![CDATA[>]]></string>
@@ -255,4 +258,9 @@
<string name="report_error">Report Error</string>
<string name="action_show_details">Show details</string>
<string name="action_hide_details">Hide details</string>
</resources>
<string name="translate_platform">on Weblate</string>
<string name="shortcutSelectCard">Select a card</string>
<string name="options">Options</string>
<string name="starred">Starred</string>
<string name="set_scale">Set scale</string>
</resources>

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