Compare commits

..
303 Commits
Author SHA1 Message Date
Sylvia van Os 22193b1872 Release Catima v2.45.0 2026-08-12 18:56:26 +02:00
Sylvia van Os 306e7b5201 Release Catima Wear OS v1.0.0 2026-08-12 18:46:49 +02:00
Sylvia van Os 0c8104af96 Merge pull request #3260 from CatimaLoyalty/create-pull-request/patch-1786549695
Update Fastlane changelogs
2026-08-12 18:40:58 +02:00
TheLastProject 3b06f7a105 Update Fastlane changelogs 2026-08-12 15:48:15 +00:00
Sylvia van Os 0869623c1d Merge pull request #3218 from CatimaLoyalty/wip/wearos
WearOS support
2026-08-12 17:48:01 +02:00
Sylvia van Os bfa79a6f68 Notify on foreground service start failure 2026-08-11 22:06:01 +02:00
Sylvia van Os cda842485f Update privacy policy 2026-08-11 22:06:01 +02:00
Sylvia van Os db35306a26 Add WearOS screenshots and description change 2026-08-11 22:06:01 +02:00
Sylvia van Os 2363861a62 Fail pipeline on bad libraries 2026-08-11 22:06:01 +02:00
Sylvia van Os 2960585250 Prepare new versioning and CHANGELOG structure 2026-08-11 22:06:01 +02:00
Sylvia van Os ff830ee50d Improve notification icons
This improves the sizing of the notification icons and uses a generic
sync icon for the Bluetooth server running (so users don't get used to
ignoring the Catima icon).

Generated throudh Android Studio New -> Image Asset -> Notification
Icons -> Path: .design/master_monochrome.svg -> Trim: Yes -> Padding: 0%
2026-08-11 22:06:01 +02:00
Sylvia van Os 3c917da56a Modify code to support minor API versions 2026-08-11 22:06:01 +02:00
Sylvia van Os 6ea1d9ec73 Fix some documentation mistakes for the Content Provider 2026-08-11 22:06:01 +02:00
Sylvia van Os 5ebd7cbb63 Add documentation for Bluetooth server 2026-08-11 22:06:01 +02:00
Sylvia van Os 0d91444ee2 Consistently use Wear OS naming 2026-08-11 22:06:01 +02:00
Sylvia van Os 9459c78e7c Migrate WearOS app to Material3
Also always display sync status on screen
2026-08-11 22:06:01 +02:00
Fabio ManganielloandSylvia van Os b326a7148d feat(bluetooth): Add trusted device pairing (#3223)
Co-authored-by: Sylvia van Os <sylvia@hackerchick.me>
2026-08-11 22:06:01 +02:00
Sylvia van Os 5ae850dbe8 Restructure smartwatch support settings 2026-08-11 22:06:01 +02:00
Fabio ManganielloandSylvia van Os 2ef9c9c68e Add WearOS companion app (#3185)
Co-authored-by: Sylvia van Os <sylvia@hackerchick.me>
2026-08-11 22:06:01 +02:00
Sylvia van Os 613bd000d2 Merge pull request #3256 from CatimaLoyalty/create-pull-request/patch-1786251663
Update contributors
2026-08-09 10:37:08 +02:00
TheLastProject f7ea5bcb7b Update contributors 2026-08-09 05:01:02 +00:00
Sylvia van Os b8b5b8ae9b Merge pull request #3252 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-08-06 12:02:55 +02:00
Sylvia van Os e6085a64be Merge pull request #3253 from CatimaLoyalty/dependabot/gradle/androidx.constraintlayout-constraintlayout-2.2.2
Bump androidx.constraintlayout:constraintlayout from 2.2.1 to 2.2.2
2026-08-06 08:08:45 +02:00
dependabot[bot] e77acf9b1e Bump androidx.constraintlayout:constraintlayout from 2.2.1 to 2.2.2
Bumps androidx.constraintlayout:constraintlayout from 2.2.1 to 2.2.2.

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

Signed-off-by: dependabot[bot] <support@github.com>
2026-08-06 02:53:46 +00:00
Joel A dc4299d315 Translated using Weblate (Swedish)
Currently translated at 100.0% (324 of 324 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sv/
2026-08-06 04:04:57 +02:00
Damjan Gerl 1c8d2ba19e Translated using Weblate (Slovenian)
Currently translated at 100.0% (166 of 166 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/sl/
2026-08-06 04:04:56 +02:00
NooB9496 d46455c021 Translated using Weblate (Polish)
Currently translated at 100.0% (166 of 166 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pl/
2026-08-06 04:04:53 +02:00
Watchman89 abd4c24138 Translated using Weblate (Dutch)
Currently translated at 100.0% (166 of 166 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/nl/
2026-08-06 04:04:53 +02:00
NooB9496 1e922ae074 Translated using Weblate (Polish)
Currently translated at 100.0% (324 of 324 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pl/
2026-08-06 04:04:47 +02:00
Watchman89 335059a681 Translated using Weblate (Dutch)
Currently translated at 100.0% (324 of 324 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2026-08-06 04:04:45 +02:00
Sylvia van Os a530991119 Merge pull request #3248 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-08-05 18:12:01 +02:00
Edgars Andersons 45130b5f85 Translated using Weblate (Latvian)
Currently translated at 100.0% (324 of 324 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lv/
2026-08-05 00:03:39 +02:00
Damjan Gerl 70fd411640 Translated using Weblate (Slovenian)
Currently translated at 94.5% (157 of 166 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/sl/
2026-08-05 00:03:37 +02:00
Sylvia van Os 4d47cd4a4a Merge pull request #3246 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-08-03 19:46:26 +02:00
Sylvia van Os bb694ca9cb Translated using Weblate (Arabic)
Currently translated at 98.4% (319 of 324 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ar/
2026-08-03 17:21:05 +02:00
Damjan Gerl 7ede8424d0 Translated using Weblate (Slovenian)
Currently translated at 78.9% (131 of 166 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/sl/
2026-08-03 17:21:04 +02:00
Sylvia van Os 1167cf51b5 Translated using Weblate (Lithuanian)
Currently translated at 8.4% (14 of 166 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/lt/
2026-08-03 17:21:01 +02:00
Eduardo Augustinho 13d2c81c5c Translated using Weblate (Portuguese (Brazil))
Currently translated at 99.3% (165 of 166 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt_BR/
2026-08-02 15:05:14 +00:00
Eduardo Augustinho 102a34a3f3 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (324 of 324 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt_BR/
2026-08-02 15:05:12 +00:00
E Ta 0c490f2bdb Translated using Weblate (Arabic)
Currently translated at 98.4% (319 of 324 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ar/
2026-08-02 15:05:11 +00:00
Zeet Baral 8f69f9cef9 Translated using Weblate (Bengali (India))
Currently translated at 62.0% (201 of 324 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bn_IN/
2026-08-02 15:05:09 +00:00
109247019824 00e65a39de Translated using Weblate (Bulgarian)
Currently translated at 100.0% (324 of 324 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2026-08-02 15:05:08 +00:00
Damjan Gerl 8698c6099c Translated using Weblate (Slovenian)
Currently translated at 64.4% (107 of 166 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/sl/
2026-08-02 15:05:07 +00:00
dukezas da3fbdb401 Translated using Weblate (Lithuanian)
Currently translated at 8.4% (14 of 166 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/lt/
2026-08-02 15:05:06 +00:00
Nik b28052c46c Translated using Weblate (Italian)
Currently translated at 100.0% (166 of 166 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/it/
2026-08-02 15:05:04 +00:00
dukezas b438a7f03d Translated using Weblate (Lithuanian)
Currently translated at 83.9% (272 of 324 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lt/
2026-08-02 15:05:03 +00:00
Nik c144035d95 Translated using Weblate (Italian)
Currently translated at 100.0% (324 of 324 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2026-08-02 15:05:02 +00:00
Sylvia van Os 7658c3980a Merge pull request #3245 from CatimaLoyalty/create-pull-request/patch-1785652221
Update contributors
2026-08-02 10:03:34 +02:00
TheLastProject c11297a733 Update contributors 2026-08-02 06:30:20 +00:00
Sylvia van Os c89e60adf6 Merge pull request #3239 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-07-31 17:07:41 +02:00
josé m. fa33f61183 Translated using Weblate (Galician)
Currently translated at 100.0% (324 of 324 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/gl/
2026-07-31 03:02:41 +00:00
bruh f3e57d816c Translated using Weblate (Vietnamese)
Currently translated at 100.0% (324 of 324 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/vi/
2026-07-31 03:02:39 +00:00
Fjuro bf2e1eface Translated using Weblate (Czech)
Currently translated at 100.0% (166 of 166 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2026-07-31 03:02:37 +00:00
Fjuro a69fff9b53 Translated using Weblate (Czech)
Currently translated at 100.0% (324 of 324 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2026-07-31 03:02:34 +00:00
Sylvia van Os 9fc0038bd5 Merge pull request #3238 from CatimaLoyalty/dependabot/github_actions/actions/setup-python-7.0.0
Bump actions/setup-python from 6.3.0 to 7.0.0
2026-07-30 08:21:46 +02:00
dependabot[bot] ffd8dd5633 Bump actions/setup-python from 6.3.0 to 7.0.0
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 6.3.0 to 7.0.0.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v6.3.0...v7.0.0)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-version: 7.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-30 06:20:46 +00:00
Sylvia van Os c3947b0f6a Merge pull request #3237 from CatimaLoyalty/dependabot/github_actions/actions/checkout-7.0.1
Bump actions/checkout from 7.0.0 to 7.0.1
2026-07-30 08:19:02 +02:00
dependabot[bot] 84b17b17fe Bump actions/checkout from 7.0.0 to 7.0.1
Bumps [actions/checkout](https://github.com/actions/checkout) from 7.0.0 to 7.0.1.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v7.0.0...v7.0.1)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: 7.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-30 02:52:41 +00:00
Sylvia van Os 3956a1123e Merge pull request #3236 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-07-29 20:55:24 +02:00
Sylvia van Os f04185f6fd Merge pull request #2580 from CatimaLoyalty/fix/weblate_missingquantity_fix
Re-enable missingQuantity lint checks
2026-07-29 20:48:07 +02:00
Sylvia van Os 10d188ee40 Re-enable missingQuantity lint checks where possible
https://github.com/WeblateOrg/weblate/issues/7520
2026-07-29 20:32:12 +02:00
Priit Jõerüüt 63e2d3740f Translated using Weblate (Estonian)
Currently translated at 100.0% (324 of 324 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/et/
2026-07-29 20:04:49 +02:00
Damjan Gerl 672173437f Translated using Weblate (Slovenian)
Currently translated at 64.4% (107 of 166 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/sl/
2026-07-29 20:04:46 +02:00
B o d o 2c851158f5 Translated using Weblate (German)
Currently translated at 100.0% (166 of 166 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2026-07-29 20:04:38 +02:00
Sylvain Pichon 367733676a Translated using Weblate (French)
Currently translated at 100.0% (166 of 166 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2026-07-29 20:04:38 +02:00
Damjan Gerl 538cd2078b Translated using Weblate (Slovenian)
Currently translated at 100.0% (324 of 324 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sl/
2026-07-29 20:04:37 +02:00
Sylvia van Os 731833d9be Release Catima 2.44.0 2026-07-28 18:21:59 +02:00
Sylvia van Os 7ebd71283f Merge pull request #3234 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-07-28 18:21:16 +02:00
Oğuz Ersen 5eb1942ad2 Translated using Weblate (Turkish)
Currently translated at 100.0% (324 of 324 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2026-07-28 18:07:24 +02:00
Jiri Grönroos 999222f3a4 Translated using Weblate (Finnish)
Currently translated at 99.3% (322 of 324 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fi/
2026-07-28 18:07:24 +02:00
Hosted Weblate user 54392 e82d726898 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (166 of 166 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/zh_Hans/
2026-07-28 18:07:21 +02:00
Hosted Weblate user 54392 0f48c75512 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (324 of 324 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hans/
2026-07-28 18:07:20 +02:00
Liner Seven 183d3ea666 Translated using Weblate (Japanese)
Currently translated at 100.0% (166 of 166 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ja/
2026-07-28 18:07:20 +02:00
Liner Seven 4e4e9123f2 Translated using Weblate (Japanese)
Currently translated at 100.0% (324 of 324 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ja/
2026-07-28 18:07:19 +02:00
solokot c09566d38a Translated using Weblate (Russian)
Currently translated at 100.0% (166 of 166 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2026-07-28 18:07:19 +02:00
B o d o 750ac6f2ec Translated using Weblate (German)
Currently translated at 100.0% (166 of 166 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2026-07-28 18:07:18 +02:00
solokot 1ed78fa680 Translated using Weblate (Russian)
Currently translated at 100.0% (324 of 324 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2026-07-28 18:07:18 +02:00
Sylvain Pichon 48a26cf1f7 Translated using Weblate (French)
Currently translated at 100.0% (324 of 324 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2026-07-28 18:07:17 +02:00
Vasilis K. bc6a63a1f0 Translated using Weblate (Greek)
Currently translated at 100.0% (324 of 324 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/el/
2026-07-28 18:07:16 +02:00
B o d o 45f360904f Translated using Weblate (German)
Currently translated at 100.0% (324 of 324 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2026-07-28 18:07:16 +02:00
Sylvia van Os bdf39a1dd7 Merge pull request #3233 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-07-28 10:49:51 +02:00
Ricardo Xavier abff198d01 Translated using Weblate (Portuguese)
Currently translated at 99.6% (322 of 323 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt/
2026-07-27 23:03:51 +00:00
Watchman89 6721ecf113 Translated using Weblate (Dutch)
Currently translated at 100.0% (165 of 165 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/nl/
2026-07-27 23:03:47 +00:00
Danny Bouwers 3899c71317 Translated using Weblate (Dutch)
Currently translated at 100.0% (323 of 323 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2026-07-27 23:03:44 +00:00
Sylvia van Os b8e4ec9c9f Merge pull request #3232 from CatimaLoyalty/create-pull-request/patch-1785086352
Update Fastlane changelogs
2026-07-26 19:19:34 +02:00
TheLastProject 92cb120dd0 Update Fastlane changelogs 2026-07-26 17:19:12 +00:00
Sylvia van Os 7a8f9c38eb Update CHANGELOG 2026-07-26 19:18:58 +02:00
KamiDaga dc7498e505 Merge pull request #3219 from KamiDaga/feature/overflow-menu-to-image-gallery
Added overflow menu to open card image in image gallery
2026-07-26 19:18:00 +02:00
Sylvia van Os 02e925f77a Merge pull request #3231 from CatimaLoyalty/create-pull-request/patch-1785047585
Update contributors
2026-07-26 09:51:28 +02:00
TheLastProject 7dc2a479b6 Update contributors 2026-07-26 06:33:05 +00:00
Sylvia van Os 1913d629e7 Merge pull request #3230 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-07-25 22:34:09 +02:00
ssantos 59a750f41c Translated using Weblate (Portuguese)
Currently translated at 99.3% (321 of 323 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt/
2026-07-25 22:02:03 +02:00
ssantos 46dfafe0b2 Translated using Weblate (Portuguese (Portugal))
Currently translated at 99.3% (321 of 323 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt_PT/
2026-07-25 22:02:02 +02:00
Sylvia van Os 1faab05032 Merge pull request #3228 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-07-24 14:43:26 +02:00
Oğuz Ersen c895f0db56 Translated using Weblate (Turkish)
Currently translated at 100.0% (323 of 323 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2026-07-24 11:02:09 +02:00
109247019824 c622df96f0 Translated using Weblate (Bulgarian)
Currently translated at 100.0% (323 of 323 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2026-07-24 11:02:08 +02:00
Sylvia van Os 30ac13ec73 Merge pull request #3227 from CatimaLoyalty/dependabot/gradle/com.android.application-9.3.1
Bump com.android.application from 9.3.0 to 9.3.1
2026-07-24 08:40:22 +02:00
dependabot[bot] efbe809982 Bump com.android.application from 9.3.0 to 9.3.1
Bumps com.android.application from 9.3.0 to 9.3.1.

---
updated-dependencies:
- dependency-name: com.android.application
  dependency-version: 9.3.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-24 02:53:57 +00:00
Sylvia van Os 92df5dd36a Merge pull request #3226 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-07-23 10:25:00 +02:00
Rizqi Putra ebdf13678a Translated using Weblate (Indonesian)
Currently translated at 95.1% (157 of 165 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/id/
2026-07-23 08:02:09 +00:00
Rizqi Putra 0a0d46033c Translated using Weblate (Indonesian)
Currently translated at 100.0% (323 of 323 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/id/
2026-07-23 08:02:08 +00:00
solokot 7f72565e24 Translated using Weblate (Russian)
Currently translated at 100.0% (165 of 165 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2026-07-23 08:02:08 +00:00
Sylvia van Os cfcf1e2fcb Merge pull request #3224 from CatimaLoyalty/dependabot/gradle/kotlin-2.4.10
Bump kotlin from 2.4.0 to 2.4.10
2026-07-22 06:31:37 +02:00
dependabot[bot] faf2f7a38c Bump kotlin from 2.4.0 to 2.4.10
Bumps `kotlin` from 2.4.0 to 2.4.10.

Updates `org.jetbrains.kotlin.android` from 2.4.0 to 2.4.10
- [Release notes](https://github.com/JetBrains/kotlin/releases)
- [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md)
- [Commits](https://github.com/JetBrains/kotlin/compare/v2.4.0...v2.4.10)

Updates `org.jetbrains.kotlin.plugin.compose` from 2.4.0 to 2.4.10
- [Release notes](https://github.com/JetBrains/kotlin/releases)
- [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md)
- [Commits](https://github.com/JetBrains/kotlin/compare/v2.4.0...v2.4.10)

---
updated-dependencies:
- dependency-name: org.jetbrains.kotlin.android
  dependency-version: 2.4.10
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: org.jetbrains.kotlin.plugin.compose
  dependency-version: 2.4.10
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-22 02:57:36 +00:00
Sylvia van Os ace7e5abdd Merge pull request #3220 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-07-21 22:10:54 +02:00
Damjan Gerl f50e547980 Translated using Weblate (Slovenian)
Currently translated at 43.0% (71 of 165 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/sl/
2026-07-21 08:02:23 +00:00
KamiDaga c05a303568 Translated using Weblate (Italian)
Currently translated at 100.0% (165 of 165 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/it/
2026-07-21 08:02:22 +00:00
Damjan Gerl 4fcd41d3cc Translated using Weblate (Slovenian)
Currently translated at 100.0% (323 of 323 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sl/
2026-07-21 08:02:22 +00:00
KamiDaga 3e6c4c1b13 Translated using Weblate (Italian)
Currently translated at 100.0% (323 of 323 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2026-07-21 08:02:21 +00:00
Sylvia van Os 55d356ea40 Merge pull request #3217 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-07-20 18:15:52 +02:00
Libre a752421efe Translated using Weblate (Spanish)
Currently translated at 95.7% (158 of 165 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/es/
2026-07-19 21:02:19 +00:00
NooB9496 aa4b41612f Translated using Weblate (Polish)
Currently translated at 100.0% (165 of 165 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pl/
2026-07-19 21:02:18 +00:00
Fjuro f576228c2d Translated using Weblate (Czech)
Currently translated at 100.0% (165 of 165 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2026-07-19 21:02:17 +00:00
NooB9496 c93add3b83 Translated using Weblate (Polish)
Currently translated at 100.0% (323 of 323 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pl/
2026-07-19 21:02:17 +00:00
Libre 117446cebb Translated using Weblate (Spanish)
Currently translated at 100.0% (323 of 323 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/es/
2026-07-19 21:02:16 +00:00
Fjuro 4bee5ec6c8 Translated using Weblate (Czech)
Currently translated at 100.0% (323 of 323 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2026-07-19 21:02:16 +00:00
Sylvia van Os 92776c9e8d Merge pull request #3215 from CatimaLoyalty/create-pull-request/patch-1784442491
Update contributors
2026-07-19 10:44:47 +02:00
TheLastProject eea3fb5c54 Update contributors 2026-07-19 06:28:11 +00:00
Sylvia van Os dbd0727af2 Merge pull request #3213 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-07-17 22:21:16 +02:00
josé m. a4cf49754a Translated using Weblate (Galician)
Currently translated at 100.0% (323 of 323 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/gl/
2026-07-17 22:02:29 +02:00
Priit Jõerüüt 587c5991f1 Translated using Weblate (Estonian)
Currently translated at 100.0% (323 of 323 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/et/
2026-07-17 22:02:28 +02:00
Gabriel 10234ffcef Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (165 of 165 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt_BR/
2026-07-17 22:02:27 +02:00
Gabriel 2a2710e391 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (323 of 323 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt_BR/
2026-07-17 22:02:03 +02:00
Joel A f1b5423d94 Translated using Weblate (Swedish)
Currently translated at 99.0% (320 of 323 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sv/
2026-07-17 22:02:02 +02:00
Hosted Weblate user 54392 1cb916d16a Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (165 of 165 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/zh_Hans/
2026-07-17 22:01:59 +02:00
Hosted Weblate user 54392 6396120fb0 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (323 of 323 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hans/
2026-07-17 22:01:53 +02:00
Liner Seven 2fe5157519 Translated using Weblate (Japanese)
Currently translated at 100.0% (165 of 165 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ja/
2026-07-17 22:01:52 +02:00
Liner Seven 4ce480defb Translated using Weblate (Japanese)
Currently translated at 100.0% (323 of 323 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ja/
2026-07-17 22:01:44 +02:00
B o d o 3ea5d16f19 Translated using Weblate (German)
Currently translated at 100.0% (165 of 165 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2026-07-17 22:01:42 +02:00
Sylvain Pichon 31fc58576c Translated using Weblate (French)
Currently translated at 100.0% (165 of 165 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2026-07-17 22:01:35 +02:00
solokot 9573799eba Translated using Weblate (Russian)
Currently translated at 100.0% (323 of 323 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2026-07-17 22:01:27 +02:00
Sylvain Pichon df94e94b31 Translated using Weblate (French)
Currently translated at 100.0% (323 of 323 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2026-07-17 22:01:25 +02:00
Vasilis K. 98b561b186 Translated using Weblate (Greek)
Currently translated at 100.0% (323 of 323 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/el/
2026-07-17 22:01:24 +02:00
B o d o 8ee469343c Translated using Weblate (German)
Currently translated at 100.0% (323 of 323 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2026-07-17 22:01:22 +02:00
Sylvia van Os e54d129577 Merge pull request #3210 from CatimaLoyalty/dependabot/github_actions/ReactiveCircus/android-emulator-runner-2.38.0
Bump ReactiveCircus/android-emulator-runner from 2.37.0 to 2.38.0
2026-07-16 08:21:01 +02:00
dependabot[bot] a7a3237f4f Bump ReactiveCircus/android-emulator-runner from 2.37.0 to 2.38.0
Bumps [ReactiveCircus/android-emulator-runner](https://github.com/reactivecircus/android-emulator-runner) from 2.37.0 to 2.38.0.
- [Release notes](https://github.com/reactivecircus/android-emulator-runner/releases)
- [Changelog](https://github.com/ReactiveCircus/android-emulator-runner/blob/main/CHANGELOG.md)
- [Commits](https://github.com/reactivecircus/android-emulator-runner/compare/v2.37.0...v2.38.0)

---
updated-dependencies:
- dependency-name: ReactiveCircus/android-emulator-runner
  dependency-version: 2.38.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-16 02:53:16 +00:00
Sylvia van Os 4b17c3963f Merge pull request #3207 from CatimaLoyalty/dependabot/gradle/com.android.application-9.3.0
Bump com.android.application from 9.2.1 to 9.3.0
2026-07-15 07:58:49 +02:00
dependabot[bot] 93925a03b9 Bump com.android.application from 9.2.1 to 9.3.0
Bumps com.android.application from 9.2.1 to 9.3.0.

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

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-15 02:52:26 +00:00
Sylvia van Os a74707ee82 Bump Fastlane version 2026-07-14 19:12:23 +02:00
Sylvia van Os 909034d4f3 Release Catima 2.43.0 2026-07-12 18:55:29 +02:00
Sylvia van Os c261d33980 Merge pull request #3203 from CatimaLoyalty/create-pull-request/patch-1783871664
Update Fastlane changelogs
2026-07-12 17:55:35 +02:00
TheLastProject e9654c9b04 Update Fastlane changelogs 2026-07-12 15:54:23 +00:00
Sylvia van Os 4742a290c8 Update CHANGELOG 2026-07-12 17:54:11 +02:00
Ilya ZarubinandSylvia van Os bbae3351a5 Add internal image viewer for zooming (#3184)
Co-authored-by: Sylvia van Os <sylvia@hackerchick.me>
2026-07-12 17:52:24 +02:00
Sylvia van Os db149cd3aa Merge pull request #3199 from CatimaLoyalty/dependabot/gradle/androidx.test.uiautomator-uiautomator-2.4.0
Bump androidx.test.uiautomator:uiautomator from 2.3.0 to 2.4.0
2026-07-09 13:17:43 +02:00
dependabot[bot] 1a94748958 Bump androidx.test.uiautomator:uiautomator from 2.3.0 to 2.4.0
Bumps androidx.test.uiautomator:uiautomator from 2.3.0 to 2.4.0.

---
updated-dependencies:
- dependency-name: androidx.test.uiautomator:uiautomator
  dependency-version: 2.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-09 09:01:14 +00:00
Sylvia van Os a20ad88532 Merge pull request #3201 from CatimaLoyalty/dependabot/gradle/androidx.compose-compose-bom-2026.06.01
Bump androidx.compose:compose-bom from 2026.06.00 to 2026.06.01
2026-07-09 10:59:36 +02:00
dependabot[bot] 93b4ba1167 Bump androidx.compose:compose-bom from 2026.06.00 to 2026.06.01
Bumps androidx.compose:compose-bom from 2026.06.00 to 2026.06.01.

---
updated-dependencies:
- dependency-name: androidx.compose:compose-bom
  dependency-version: 2026.06.01
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-09 07:18:13 +00:00
Sylvia van Os 693d6d6663 Merge pull request #3200 from CatimaLoyalty/dependabot/github_actions/ReactiveCircus/android-emulator-runner-2.37.0
Bump ReactiveCircus/android-emulator-runner from 2 to 2.37.0
2026-07-09 09:06:38 +02:00
dependabot[bot] 67bb1a2627 Bump ReactiveCircus/android-emulator-runner from 2 to 2.37.0
Bumps [ReactiveCircus/android-emulator-runner](https://github.com/reactivecircus/android-emulator-runner) from 2 to 2.37.0.
- [Release notes](https://github.com/reactivecircus/android-emulator-runner/releases)
- [Changelog](https://github.com/ReactiveCircus/android-emulator-runner/blob/main/CHANGELOG.md)
- [Commits](https://github.com/reactivecircus/android-emulator-runner/compare/v2...v2.37.0)

---
updated-dependencies:
- dependency-name: ReactiveCircus/android-emulator-runner
  dependency-version: 2.37.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-09 02:53:10 +00:00
Sylvia van Os d20f91018d Merge pull request #3198 from ilyaZar/refine-contributing-md
Refine contributing md
2026-07-06 18:55:09 +02:00
Sylvia van Os 9414627772 Update CONTRIBUTING.md 2026-07-06 18:54:23 +02:00
Sylvia van Os 6134fb26c6 Merge pull request #3195 from CatimaLoyalty/dependabot/gradle/gradle-wrapper-9.6.1
Bump gradle-wrapper from 9.6.0 to 9.6.1
2026-07-06 18:51:32 +02:00
IlyaZar 6445df4d2f docs: highlight llm usage note
its two paragraphs, so this might deserve a seperate lvl 3 header given
that the bottom paragraphs are shorter, and lvl 3 as well

also its worth highlighting a bit more
2026-07-06 16:06:12 +02:00
IlyaZar 1069803681 docs: note on migration for contributors
wording might be improved
2026-07-06 16:04:36 +02:00
dependabot[bot] 60f9d19c6c Bump gradle-wrapper from 9.6.0 to 9.6.1
Bumps [gradle-wrapper](https://github.com/gradle/gradle) from 9.6.0 to 9.6.1.
- [Release notes](https://github.com/gradle/gradle/releases)
- [Commits](https://github.com/gradle/gradle/compare/v9.6.0...v9.6.1)

---
updated-dependencies:
- dependency-name: gradle-wrapper
  dependency-version: 9.6.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-06 02:55:14 +00:00
Sylvia van Os b2d001d238 Merge pull request #3194 from CatimaLoyalty/create-pull-request/patch-1783196989
Update Fastlane changelogs
2026-07-04 22:30:44 +02:00
TheLastProject ea26cdbb9f Update Fastlane changelogs 2026-07-04 20:29:49 +00:00
Sylvia van Os f3154081f4 Update CHANGELOG 2026-07-04 22:27:48 +02:00
J. Bhargava Gopal 5388bbfc16 Merge pull request #3191 from Bhargav-24/add-most-recently-added-sort
Add most-recently-added card sort option
2026-07-04 22:27:08 +02:00
Sylvia van Os 48284acf06 Merge pull request #3193 from CatimaLoyalty/create-pull-request/patch-1783195711
Update Fastlane changelogs
2026-07-04 22:09:48 +02:00
TheLastProject 852830c894 Update Fastlane changelogs 2026-07-04 20:08:30 +00:00
Sylvia van Os 97b2c8f080 Update CHANGELOG 2026-07-04 22:08:17 +02:00
Matt Van Horn 888869d5fc Merge pull request #3174 from mvanhorn/feat/2742-display-card-id
Add option to display card ID in card list
2026-07-04 22:07:12 +02:00
Sylvia van Os 9452c65438 Merge pull request #3192 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-07-04 18:57:00 +02:00
Alireza Rashidi 08db580076 Translated using Weblate (Persian)
Currently translated at 90.0% (289 of 321 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fa/
2026-07-04 16:01:28 +00:00
Sylvia van Os 649135e6d4 Merge pull request #3190 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-07-03 16:48:41 +02:00
lexar-systems fb255fd46a Translated using Weblate (Russian)
Currently translated at 100.0% (164 of 164 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2026-07-03 14:01:51 +00:00
Sylvia van Os ba01e9f0fe Check for non-free libraries (#3189) 2026-07-02 22:30:50 +02:00
Sylvia van Os c6b6a4012e Merge pull request #3187 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-07-02 21:30:27 +02:00
Sylvia van Os 964c1a82db Merge pull request #3186 from CatimaLoyalty/dependabot/github_actions/actions/setup-python-6.3.0
Bump actions/setup-python from 6.2.0 to 6.3.0
2026-07-02 21:27:07 +02:00
Libre 6eb2a8db45 Translated using Weblate (Spanish)
Currently translated at 100.0% (321 of 321 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/es/
2026-07-02 10:01:29 +02:00
dependabot[bot] abf5466883 Bump actions/setup-python from 6.2.0 to 6.3.0
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 6.2.0 to 6.3.0.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v6.2.0...v6.3.0)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-version: 6.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-02 02:52:23 +00:00
Sylvia van Os c40fcdee9e Merge pull request #3182 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-06-30 12:39:53 +02:00
Arif Budiman ca66205493 Translated using Weblate (Indonesian)
Currently translated at 100.0% (321 of 321 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/id/
2026-06-30 08:01:24 +02:00
Sylvia van Os 8bdea4a3cd Merge pull request #3181 from CatimaLoyalty/create-pull-request/patch-1782632954
Update contributors
2026-06-28 09:55:12 +02:00
TheLastProject d11797be41 Update contributors 2026-06-28 07:49:14 +00:00
Sylvia van Os 332a5df506 Merge pull request #3180 from CatimaLoyalty/dependabot/gradle/gradle-wrapper-9.6.0
Bump gradle-wrapper from 9.5.1 to 9.6.0
2026-06-26 20:40:05 +02:00
dependabot[bot] 024125cf52 Bump gradle-wrapper from 9.5.1 to 9.6.0
Bumps [gradle-wrapper](https://github.com/gradle/gradle) from 9.5.1 to 9.6.0.
- [Release notes](https://github.com/gradle/gradle/releases)
- [Commits](https://github.com/gradle/gradle/compare/v9.5.1...v9.6.0)

---
updated-dependencies:
- dependency-name: gradle-wrapper
  dependency-version: 9.6.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-26 02:53:59 +00:00
Sylvia van Os 5b747d6fea Merge pull request #3177 from CatimaLoyalty/dependabot/github_actions/gradle/actions-6.2.0
Bump gradle/actions from 6.1.1 to 6.2.0
2026-06-25 12:43:38 +02:00
Sylvia van Os f4b2597d95 Merge pull request #3179 from CatimaLoyalty/dependabot/gradle/androidx.compose-compose-bom-2026.06.00
Bump androidx.compose:compose-bom from 2026.05.01 to 2026.06.00
2026-06-25 10:35:38 +02:00
dependabot[bot] 4a24b98868 Bump gradle/actions from 6.1.1 to 6.2.0
Bumps [gradle/actions](https://github.com/gradle/actions) from 6.1.1 to 6.2.0.
- [Release notes](https://github.com/gradle/actions/releases)
- [Commits](https://github.com/gradle/actions/compare/v6.1.1...v6.2.0)

---
updated-dependencies:
- dependency-name: gradle/actions
  dependency-version: 6.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-25 06:25:34 +00:00
Sylvia van Os 932f82a08b Merge pull request #3178 from CatimaLoyalty/dependabot/github_actions/actions/checkout-7.0.0
Bump actions/checkout from 6.0.3 to 7.0.0
2026-06-25 08:23:11 +02:00
dependabot[bot] c20709b377 Bump androidx.compose:compose-bom from 2026.05.01 to 2026.06.00
Bumps androidx.compose:compose-bom from 2026.05.01 to 2026.06.00.

---
updated-dependencies:
- dependency-name: androidx.compose:compose-bom
  dependency-version: 2026.06.00
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-25 02:53:57 +00:00
dependabot[bot] f1fd813ddc Bump actions/checkout from 6.0.3 to 7.0.0
Bumps [actions/checkout](https://github.com/actions/checkout) from 6.0.3 to 7.0.0.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v6.0.3...v7.0.0)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: 7.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-25 02:53:16 +00:00
Sylvia van Os dfb8089db3 Merge pull request #3176 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-06-24 20:38:29 +02:00
தமிழ்நேரம் cf6cd74e8f Translated using Weblate (Tamil)
Currently translated at 100.0% (321 of 321 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ta/
2026-06-24 16:01:29 +00:00
Sylvia van Os 5b93bd79a9 Merge pull request #3175 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-06-23 13:37:41 +02:00
தமிழ்நேரம் 5831adbcc6 Translated using Weblate (Tamil)
Currently translated at 92.6% (152 of 164 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ta/
2026-06-23 04:01:46 +00:00
Sylvia van Os 133b6df382 Merge pull request #3173 from CatimaLoyalty/create-pull-request/patch-1782030522
Update contributors
2026-06-21 10:56:38 +02:00
TheLastProject 0e9abac8a2 Update contributors 2026-06-21 08:28:42 +00:00
Sylvia van Os b6b172ebfd Merge pull request #3172 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-06-21 10:12:49 +02:00
Joel A 561f508e02 Translated using Weblate (Swedish)
Currently translated at 100.0% (321 of 321 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sv/
2026-06-21 03:01:29 +00:00
Sylvia van Os b36a29a5c7 Merge pull request #3170 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-06-20 09:45:44 +02:00
Joel A 938f17b559 Translated using Weblate (Swedish)
Currently translated at 98.7% (317 of 321 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sv/
2026-06-20 00:01:25 +02:00
Sylvia van Os 9feec7f6e3 Merge pull request #3169 from CatimaLoyalty/dependabot/github_actions/gradle/actions-6.1.1
Bump gradle/actions from 6.1.0 to 6.1.1
2026-06-18 08:30:08 +02:00
dependabot[bot] b1f0e7bbfd Bump gradle/actions from 6.1.0 to 6.1.1
Bumps [gradle/actions](https://github.com/gradle/actions) from 6.1.0 to 6.1.1.
- [Release notes](https://github.com/gradle/actions/releases)
- [Commits](https://github.com/gradle/actions/compare/v6.1.0...v6.1.1)

---
updated-dependencies:
- dependency-name: gradle/actions
  dependency-version: 6.1.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-18 02:53:18 +00:00
Sylvia van Os 24335cb2fc Merge pull request #3168 from CatimaLoyalty/create-pull-request/patch-1781424787
Update contributors
2026-06-14 11:30:00 +02:00
TheLastProject 4d41ae9448 Update contributors 2026-06-14 08:13:07 +00:00
Sylvia van Os d380560ff0 Merge pull request #3167 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-06-13 17:38:04 +02:00
Cosmin Humeniuc aa649ca9a9 Translated using Weblate (Romanian)
Currently translated at 100.0% (321 of 321 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ro/
2026-06-13 15:01:31 +00:00
Libre 754f9c51ea Translated using Weblate (Spanish)
Currently translated at 95.7% (157 of 164 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/es/
2026-06-13 15:01:30 +00:00
Sylvia van Os c6a2f79946 Merge pull request #3165 from CatimaLoyalty/dependabot/gradle/kotlin-2.4.0
Bump kotlin from 2.3.21 to 2.4.0
2026-06-12 16:24:03 +02:00
Sylvia van Os 3e6a735217 Merge pull request #3166 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-06-12 14:42:26 +02:00
E Sa d0d9d70445 Translated using Weblate (Arabic)
Currently translated at 100.0% (321 of 321 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ar/
2026-06-12 11:01:21 +02:00
Sylvia van Os 9db715b916 Merge pull request #3164 from CatimaLoyalty/dependabot/github_actions/actions/checkout-6.0.3
Bump actions/checkout from 6.0.2 to 6.0.3
2026-06-11 10:32:49 +02:00
dependabot[bot] 7c88c004b6 Bump actions/checkout from 6.0.2 to 6.0.3
Bumps [actions/checkout](https://github.com/actions/checkout) from 6.0.2 to 6.0.3.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v6.0.2...v6.0.3)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: 6.0.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-11 07:29:37 +00:00
Sylvia van Os 6215d77b72 Merge pull request #3163 from CatimaLoyalty/dependabot/github_actions/gradle/actions-6.1.0
Bump gradle/actions from 6 to 6.1.0
2026-06-11 09:27:58 +02:00
dependabot[bot] c947f53d2c Bump kotlin from 2.3.21 to 2.4.0
Bumps `kotlin` from 2.3.21 to 2.4.0.

Updates `org.jetbrains.kotlin.android` from 2.3.21 to 2.4.0
- [Release notes](https://github.com/JetBrains/kotlin/releases)
- [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md)
- [Commits](https://github.com/JetBrains/kotlin/compare/v2.3.21...v2.4.0)

Updates `org.jetbrains.kotlin.plugin.compose` from 2.3.21 to 2.4.0
- [Release notes](https://github.com/JetBrains/kotlin/releases)
- [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md)
- [Commits](https://github.com/JetBrains/kotlin/compare/v2.3.21...v2.4.0)

---
updated-dependencies:
- dependency-name: org.jetbrains.kotlin.android
  dependency-version: 2.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
- dependency-name: org.jetbrains.kotlin.plugin.compose
  dependency-version: 2.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-11 02:55:24 +00:00
dependabot[bot] d9029284c3 Bump gradle/actions from 6 to 6.1.0
Bumps [gradle/actions](https://github.com/gradle/actions) from 6 to 6.1.0.
- [Release notes](https://github.com/gradle/actions/releases)
- [Commits](https://github.com/gradle/actions/compare/v6...v6.1.0)

---
updated-dependencies:
- dependency-name: gradle/actions
  dependency-version: 6.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-11 02:53:05 +00:00
Sylvia van Os 48b099e182 Merge pull request #3160 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-06-10 09:59:48 +02:00
Hosted Weblate cbac258a6a Update translation files
Updated by "Remove blank strings" hook in Weblate.

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/
2026-06-10 02:04:07 +00:00
dukezas 256a39643b Translated using Weblate (Lithuanian)
Currently translated at 8.5% (14 of 164 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/lt/
2026-06-10 02:04:07 +00:00
Sylvia van Os 9dc21315b8 Merge pull request #3159 from CatimaLoyalty/create-pull-request/patch-1780821725
Update contributors
2026-06-07 11:50:49 +02:00
TheLastProject d27ada63b1 Update contributors 2026-06-07 08:42:05 +00:00
Sylvia van Os 97a2874218 Merge pull request #3158 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-06-06 23:13:49 +02:00
Jozef 1c3471f7b9 Translated using Weblate (Slovenian)
Currently translated at 100.0% (321 of 321 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sl/
2026-06-06 14:01:16 +00:00
Sylvia van Os b8b677e7a8 Merge pull request #3157 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-06-04 16:02:20 +02:00
Oğuz Ersen 986873e945 Translated using Weblate (Turkish)
Currently translated at 100.0% (321 of 321 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2026-06-04 12:01:15 +00:00
cirrro 7e90a439a6 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (321 of 321 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/uk/
2026-06-04 12:01:14 +00:00
Sylvia van Os ba2dab02a6 Merge pull request #3156 from CatimaLoyalty/dependabot/github_actions/actions/checkout-6.0.2
Bump actions/checkout from 6 to 6.0.2
2026-06-04 07:23:53 +02:00
dependabot[bot] 5aad361ebd Bump actions/checkout from 6 to 6.0.2
Bumps [actions/checkout](https://github.com/actions/checkout) from 6 to 6.0.2.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v6...v6.0.2)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: 6.0.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-04 04:18:57 +00:00
Sylvia van Os 418443300c Merge pull request #3154 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-06-02 22:56:55 +02:00
Cristi 3958a48137 Translated using Weblate (Romanian)
Currently translated at 100.0% (321 of 321 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ro/
2026-06-02 17:01:13 +00:00
jaraandres176-oss c829b2d9bf Translated using Weblate (Spanish (Argentina))
Currently translated at 86.2% (277 of 321 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/es_AR/
2026-06-02 17:01:12 +00:00
Sylvia van Os 12d78786f0 Merge pull request #3153 from CatimaLoyalty/create-pull-request/patch-1780255717
Update feature graphic
2026-05-31 21:51:21 +02:00
TheLastProject 87655c9e28 Update feature graphic 2026-05-31 19:28:37 +00:00
Sylvia van Os eb54d7c250 Merge pull request #3152 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-05-31 21:27:09 +02:00
dukezas 78a7b93c21 Translated using Weblate (Lithuanian)
Currently translated at 78.8% (253 of 321 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lt/
2026-05-31 21:01:28 +02:00
dukezas 4da8378aef Translated using Weblate (Lithuanian)
Currently translated at 2.4% (4 of 164 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/lt/
2026-05-31 21:01:27 +02:00
hugoalh 2f6687ec90 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (321 of 321 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hant/
2026-05-31 21:01:26 +02:00
Sylvia van Os 38b2584153 Translated using Weblate (Icelandic)
Currently translated at 38.0% (122 of 321 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/is/
2026-05-31 21:01:25 +02:00
Sylvia van Os a25d36da29 Merge pull request #3151 from CatimaLoyalty/create-pull-request/patch-1780213395
Update contributors
2026-05-31 16:00:34 +02:00
TheLastProject 6f7c3ec39c Update contributors 2026-05-31 07:43:15 +00:00
Sylvia van Os d9e94d52f5 Merge pull request #3150 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-05-30 20:07:18 +02:00
Sylvia van Os 035f651b9f Merge pull request #3076 from CatimaLoyalty/dependabot/github_actions/gradle/actions-6
Bump gradle/actions from 5 to 6
2026-05-30 20:00:03 +02:00
dependabot[bot] 98d2c69640 Bump gradle/actions from 5 to 6
Bumps [gradle/actions](https://github.com/gradle/actions) from 5 to 6.
- [Release notes](https://github.com/gradle/actions/releases)
- [Commits](https://github.com/gradle/actions/compare/v5...v6)

---
updated-dependencies:
- dependency-name: gradle/actions
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-30 17:46:58 +00:00
Hosted Weblate 0dfeb2dcc8 Update translation files
Updated by "Remove blank strings" hook in Weblate.

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/
2026-05-30 07:56:47 +00:00
Seongho 645e7780f3 Translated using Weblate (Korean)
Currently translated at 100.0% (164 of 164 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ko/
2026-05-30 07:56:47 +00:00
Seongho d635e31afc Translated using Weblate (Korean)
Currently translated at 100.0% (321 of 321 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ko/
2026-05-30 07:56:46 +00:00
Саша Петровић 91d0882ad8 Translated using Weblate (Serbian)
Currently translated at 100.0% (321 of 321 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sr/
2026-05-30 07:56:46 +00:00
Pjetur G. Hjaltason 4ab4ac7668 Translated using Weblate (Icelandic)
Currently translated at 37.6% (121 of 321 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/is/
2026-05-30 07:56:45 +00:00
Sylvia van Os 48115b3f2d Merge pull request #3149 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-05-28 20:08:57 +02:00
Spell f55559d6d6 Translated using Weblate (Portuguese)
Currently translated at 100.0% (321 of 321 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt/
2026-05-27 23:12:52 +00:00
Sylvia van Os 0bf1afd7af Merge pull request #3147 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-05-27 20:00:31 +02:00
Watchman89 1ff4f47102 Translated using Weblate (Dutch)
Currently translated at 89.6% (147 of 164 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/nl/
2026-05-27 15:24:51 +00:00
Sylvia van Os 70dbd7eac1 Translated using Weblate (Korean)
Currently translated at 99.6% (320 of 321 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ko/
2026-05-27 15:24:50 +00:00
MizoWNA ff7ebe0629 Translated using Weblate (Arabic)
Currently translated at 100.0% (321 of 321 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ar/
2026-05-27 15:24:49 +00:00
Sérgio Santos 0d847607a2 Translated using Weblate (Portuguese (Portugal))
Currently translated at 100.0% (321 of 321 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt_PT/
2026-05-27 15:24:48 +00:00
Trash Soul dd53862d37 Translated using Weblate (Korean)
Currently translated at 99.6% (320 of 321 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ko/
2026-05-27 15:24:47 +00:00
Trash Soul 9df5366fc6 Translated using Weblate (Korean)
Currently translated at 92.0% (151 of 164 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ko/
2026-05-27 15:24:47 +00:00
MizoWNA 69f888fe29 Translated using Weblate (Arabic)
Currently translated at 42.0% (69 of 164 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ar/
2026-05-27 15:24:46 +00:00
Sylvia van Os bdc08ef95c Merge pull request #3148 from CatimaLoyalty/dependabot/gradle/androidx.compose-compose-bom-2026.05.01
Bump androidx.compose:compose-bom from 2026.05.00 to 2026.05.01
2026-05-27 07:57:57 +02:00
dependabot[bot] 7b098bb6dd Bump androidx.compose:compose-bom from 2026.05.00 to 2026.05.01
Bumps androidx.compose:compose-bom from 2026.05.00 to 2026.05.01.

---
updated-dependencies:
- dependency-name: androidx.compose:compose-bom
  dependency-version: 2026.05.01
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-27 04:46:54 +00:00
Sylvia van Os 43085d0c13 Merge pull request #3146 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-05-26 14:29:16 +02:00
Roberto Chiarella 89885f5e9d Translated using Weblate (Italian)
Currently translated at 100.0% (164 of 164 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/it/
2026-05-26 01:11:57 +02:00
Roberto Chiarella 3d48bdeee6 Translated using Weblate (Italian)
Currently translated at 100.0% (321 of 321 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2026-05-26 01:11:56 +02:00
Sylvia van Os e331f2e293 Merge pull request #3145 from CatimaLoyalty/create-pull-request/patch-1779605853
Update contributors
2026-05-24 10:22:43 +02:00
TheLastProject 0a605d518b Update contributors 2026-05-24 06:57:32 +00:00
Sylvia van Os 72f02bd16d Merge pull request #3144 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-05-23 13:06:20 +02:00
Watchman89 ff9a6884a9 Translated using Weblate (Dutch)
Currently translated at 79.8% (131 of 164 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/nl/
2026-05-23 12:12:09 +02:00
Watchman89 9fd6c89c5b Translated using Weblate (Dutch)
Currently translated at 100.0% (321 of 321 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2026-05-23 12:12:09 +02:00
Sylvia van Os 73d2644e96 Merge pull request #3143 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-05-22 17:18:56 +02:00
Libre e8de07bdb8 Translated using Weblate (Spanish)
Currently translated at 100.0% (321 of 321 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/es/
2026-05-22 05:12:21 +02:00
Liner Seven 3003acdc81 Translated using Weblate (Japanese)
Currently translated at 100.0% (321 of 321 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ja/
2026-05-22 05:12:20 +02:00
Balázs Meskó 350241f517 Translated using Weblate (Hungarian)
Currently translated at 100.0% (321 of 321 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/hu/
2026-05-22 05:12:20 +02:00
Vincze Dorottya ed6289341a Translated using Weblate (Hungarian)
Currently translated at 100.0% (321 of 321 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/hu/
2026-05-22 05:12:19 +02:00
delvani 0811eb75df Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (321 of 321 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt_BR/
2026-05-22 05:12:19 +02:00
Liner Seven 619408e272 Translated using Weblate (Japanese)
Currently translated at 100.0% (164 of 164 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ja/
2026-05-22 05:12:18 +02:00
Watchman89 c43ff9dc95 Translated using Weblate (Dutch)
Currently translated at 68.9% (113 of 164 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/nl/
2026-05-22 05:12:18 +02:00
Thu Trang Pham 7fd461ef61 Translated using Weblate (Vietnamese)
Currently translated at 100.0% (321 of 321 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/vi/
2026-05-22 05:12:15 +02:00
Sylvia van Os 3b17a24f29 Merge pull request #3141 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-05-21 17:10:59 +02:00
Sylvia van Os 95358bf16b Merge pull request #3142 from CatimaLoyalty/dependabot/gradle/com.google.android.material-material-1.14.0
Bump com.google.android.material:material from 1.13.0 to 1.14.0
2026-05-21 09:26:30 +02:00
dependabot[bot] d8de262111 Bump com.google.android.material:material from 1.13.0 to 1.14.0
Bumps [com.google.android.material:material](https://github.com/material-components/material-components-android) from 1.13.0 to 1.14.0.
- [Release notes](https://github.com/material-components/material-components-android/releases)
- [Commits](https://github.com/material-components/material-components-android/compare/1.13.0...1.14.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-21 02:52:02 +00:00
Edgars Andersons 5f78ee7f95 Translated using Weblate (Latvian)
Currently translated at 100.0% (321 of 321 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lv/
2026-05-20 11:12:06 +02:00
Edgars Andersons c3cbdf5a24 Translated using Weblate (Latvian)
Currently translated at 12.1% (20 of 164 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/lv/
2026-05-20 11:12:05 +02:00
ssantos ac1f7d158a Translated using Weblate (Portuguese (Portugal))
Currently translated at 100.0% (164 of 164 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt_PT/
2026-05-20 11:12:05 +02:00
ssantos bdf8823855 Translated using Weblate (Portuguese)
Currently translated at 100.0% (164 of 164 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt/
2026-05-20 11:12:04 +02:00
Sylvia van Os 17693ec3f2 Merge pull request #3140 from CatimaLoyalty/dependabot/gradle/com.android.application-9.2.1
Bump com.android.application from 9.1.0 to 9.2.1
2026-05-19 17:13:21 +02:00
Sylvia van Os 1afea8f39c Merge pull request #3139 from CatimaLoyalty/dependabot/gradle/gradle-wrapper-9.5.1
Bump gradle-wrapper from 9.5.0 to 9.5.1
2026-05-19 17:13:02 +02:00
Sylvia van Os f0068144dc Merge pull request #3138 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-05-19 17:12:20 +02:00
dependabot[bot] 90a4de1343 Bump com.android.application from 9.1.0 to 9.2.1
Bumps com.android.application from 9.1.0 to 9.2.1.

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

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-19 13:43:01 +00:00
dependabot[bot] e83a8ef7e7 Bump gradle-wrapper from 9.5.0 to 9.5.1
Bumps [gradle-wrapper](https://github.com/gradle/gradle) from 9.5.0 to 9.5.1.
- [Release notes](https://github.com/gradle/gradle/releases)
- [Commits](https://github.com/gradle/gradle/compare/v9.5.0...v9.5.1)

---
updated-dependencies:
- dependency-name: gradle-wrapper
  dependency-version: 9.5.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-19 13:42:15 +00:00
大王叫我来巡山 2526cb65ba Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (164 of 164 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/zh_Hans/
2026-05-19 10:12:45 +02:00
NooB9496 4f419b86e2 Translated using Weblate (Polish)
Currently translated at 100.0% (321 of 321 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pl/
2026-05-19 10:12:45 +02:00
josé m. 6c1baa9ec1 Translated using Weblate (Galician)
Currently translated at 100.0% (321 of 321 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/gl/
2026-05-19 10:12:44 +02:00
Fjuro b499d540dc Translated using Weblate (Czech)
Currently translated at 100.0% (164 of 164 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2026-05-19 10:12:43 +02:00
Sylvain Pichon 522bd5d4b0 Translated using Weblate (French)
Currently translated at 100.0% (164 of 164 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2026-05-19 10:12:43 +02:00
Vasilis K. d3d6d1a565 Translated using Weblate (Greek)
Currently translated at 100.0% (321 of 321 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/el/
2026-05-19 10:12:42 +02:00
Fjuro e6b639040b Translated using Weblate (Czech)
Currently translated at 100.0% (321 of 321 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2026-05-19 10:12:42 +02:00
大王叫我来巡山 64259502db Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (321 of 321 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hans/
2026-05-19 10:12:41 +02:00
B o d o a5a9c1330b Translated using Weblate (German)
Currently translated at 100.0% (321 of 321 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2026-05-19 10:12:40 +02:00
NooB9496 c9fb6ad2ac Translated using Weblate (Polish)
Currently translated at 100.0% (164 of 164 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pl/
2026-05-19 10:12:40 +02:00
Alyx.dev 3ecc752c6c Translated using Weblate (French)
Currently translated at 100.0% (321 of 321 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2026-05-19 10:12:39 +02:00
B o d o db0f97542f Translated using Weblate (German)
Currently translated at 100.0% (164 of 164 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2026-05-19 10:12:39 +02:00
Priit Jõerüüt c9d372223e Translated using Weblate (Estonian)
Currently translated at 100.0% (321 of 321 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/et/
2026-05-19 10:12:38 +02:00
solokot d5be79198c Translated using Weblate (Russian)
Currently translated at 100.0% (321 of 321 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2026-05-19 10:12:38 +02:00
109247019824 b75a5b56d2 Translated using Weblate (Bulgarian)
Currently translated at 100.0% (321 of 321 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2026-05-19 10:12:37 +02:00
Sylvia van Os a1da000157 Update fastlane 2026-05-18 21:43:43 +02:00
Sylvia van Os 965d1fd2b7 Merge pull request #3137 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-05-18 21:04:27 +02:00
Саша Петровић bc34cd9b5e Translated using Weblate (Serbian)
Currently translated at 100.0% (320 of 320 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sr/
2026-05-18 09:11:40 +02:00
Sylvia van Os d3d2368be0 Merge pull request #3135 from CatimaLoyalty/create-pull-request/patch-1779002926
Update contributors
2026-05-17 10:42:22 +02:00
TheLastProject afb78ac8b8 Update contributors 2026-05-17 07:28:45 +00:00
584 changed files with 4960 additions and 599 deletions

No files matched your search

+30 -15
View File
@@ -4,11 +4,7 @@ on:
push:
branches:
- main
- staging
- trying
pull_request:
branches:
- main
permissions:
actions: none
checks: none
@@ -30,41 +26,60 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
flavor: [Foss, Gplay]
flavor: [fdroidLegacy, foss, gplay]
steps:
- uses: actions/checkout@v6
- uses: gradle/actions/wrapper-validation@v5
- uses: actions/checkout@v7.0.1
- name: Ensure sentence-cased flavor variables
run: |
flavor="$(echo ${{ matrix.flavor }})"
echo "sentenceCasedFlavor=${flavor^}" >> "$GITHUB_ENV"
- uses: gradle/actions/wrapper-validation@v6.2.0
- name: set up OpenJDK 25
run: |
sudo apt-get update
sudo apt-get install -y openjdk-25-jdk-headless
sudo update-alternatives --auto java
- name: Build
run: ./gradlew assemble${{ matrix.flavor }}Release
run: ./gradlew assemble${sentenceCasedFlavor}Release
- name: Check for non-free libraries
run: |
# Get Katastima APK scanner
wget -q https://codeberg.org/Katastima/apkscanner/releases/download/v0.0.9/apk-scanner_v0.0.9.jar
# Print pretty result
java -jar apk-scanner_v0.0.9.jar scan-apk "$(echo 'app/build/outputs/apk/${{ matrix.flavor }}/release/app-${{ matrix.flavor }}-release-unsigned.apk')"
# Check for offending libraries
# Exit code 4 = no result, which is what we want
set +e
java -jar apk-scanner_v0.0.9.jar scan-apk --json=yes "$(echo 'app/build/outputs/apk/${{ matrix.flavor }}/release/app-${{ matrix.flavor }}-release-unsigned.apk')" | jq --exit-status '.libraryCheckResult.offendingLibraries[] | select((.libraryId == "/org/acra" and .license == "Apache-2.0")|not)'
if [ "$?" -ne 4 ]; then
echo "Bad libraries found!"
exit 1
fi
set -e
- name: Check lint
run: ./gradlew lint${{ matrix.flavor }}Release
run: ./gradlew lint${sentenceCasedFlavor}Release
- name: Run unit tests
run: timeout 5m ./gradlew test${{ matrix.flavor }}DebugUnitTest || { ./gradlew --stop && timeout 5m ./gradlew test${{ matrix.flavor }}DebugUnitTest; }
run: timeout 5m ./gradlew test${sentenceCasedFlavor}DebugUnitTest || { ./gradlew --stop && timeout 5m ./gradlew test${sentenceCasedFlavor}DebugUnitTest; }
- name: Enable KVM
run: |
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
sudo udevadm control --reload-rules
sudo udevadm trigger --name-match=kvm
- name: Run instrumented tests (API 23)
uses: ReactiveCircus/android-emulator-runner@v2
uses: ReactiveCircus/android-emulator-runner@v2.38.0
with:
api-level: 23
arch: x86_64
script: ./gradlew connected${{ matrix.flavor }}DebugAndroidTest
script: ./gradlew connected${sentenceCasedFlavor}DebugAndroidTest
- name: Run instrumented tests (API 35)
uses: ReactiveCircus/android-emulator-runner@v2
uses: ReactiveCircus/android-emulator-runner@v2.38.0
with:
api-level: 35
arch: x86_64
script: ./gradlew connected${{ matrix.flavor }}DebugAndroidTest
script: ./gradlew connected${sentenceCasedFlavor}DebugAndroidTest
- name: Archive test results
if: always()
uses: actions/upload-artifact@v7.0.1
with:
name: test-results-flavor${{ matrix.flavor }}
name: test-results-flavor-${{ matrix.flavor }}
path: app/build/reports
+2 -2
View File
@@ -19,9 +19,9 @@ jobs:
steps:
- name: Checkout repo
id: checkout
uses: actions/checkout@v6
uses: actions/checkout@v7.0.1
- name: Setup Python
uses: actions/setup-python@v6.2.0
uses: actions/setup-python@v7.0.0
with:
python-version: '3.x'
- name: Run converter script
+1 -1
View File
@@ -17,7 +17,7 @@ jobs:
steps:
- name: Checkout repo
id: checkout
uses: actions/checkout@v6
uses: actions/checkout@v7.0.1
- name: Update contributors
id: update_contributors
uses: TheLastProject/contributors-to-file-action@v3.2.0
@@ -17,7 +17,7 @@ jobs:
generate-feature-graphic:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7.0.1
- name: Install requirements
run: |
sudo apt-get update
+1 -5
View File
@@ -4,11 +4,7 @@ on:
push:
branches:
- main
- staging
- trying
pull_request:
branches:
- main
permissions:
actions: none
checks: none
@@ -27,7 +23,7 @@ jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7.0.1
- name: Fail on bad translations
run: if grep -ri "&lt;xliff" app/src/main/res/values*/strings.xml; then echo "Invalidly escaped translations found"; exit 1; fi
- name: Check app_name consistency
+1 -1
View File
@@ -17,7 +17,7 @@ jobs:
update-locales:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7.0.1
- name: Add new locales
run: .scripts/new-locales.py
- name: Update locales
+53
View File
@@ -0,0 +1,53 @@
name: Android Wear CI
on:
workflow_dispatch:
push:
branches:
- main
pull_request:
permissions:
actions: none
checks: none
contents: read
deployments: none
discussions: none
id-token: none
issues: none
packages: none
pages: none
pull-requests: none
repository-projects: none
security-events: none
statuses: none
env:
JAVA_HOME: /usr/lib/jvm/java-25-openjdk-amd64
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7.0.0
- uses: gradle/actions/wrapper-validation@v6.2.0
- name: set up OpenJDK 25
run: |
sudo apt-get update
sudo apt-get install -y openjdk-25-jdk-headless
sudo update-alternatives --auto java
- name: Build
run: ./gradlew :wear:assembleRelease
- name: Check for non-free libraries
run: |
# Get Katastima APK scanner
wget -q https://codeberg.org/Katastima/apkscanner/releases/download/v0.0.9/apk-scanner_v0.0.9.jar
# Print pretty result
java -jar apk-scanner_v0.0.9.jar scan-apk "wear/build/outputs/apk/release/wear-release-unsigned.apk"
# Check for offending libraries
# Exit code 4 = no result, which is what we want
set +e
java -jar apk-scanner_v0.0.9.jar scan-apk --json=yes "wear/build/outputs/apk/release/wear-release-unsigned.apk" | jq --exit-status '.libraryCheckResult.offendingLibraries[]'
if [ "$?" -ne 4 ]; then
echo "Bad libraries found!"
exit 1
fi
set -e
- name: Check lint
run: ./gradlew :wear:lintRelease
+3
View File
@@ -19,6 +19,8 @@
/app/*.log
/app/build
/app/release
/wear/build
/wear/release
/.idea/*
!/.idea/icon.svg
# Bundle
@@ -28,3 +30,4 @@
# Catima-specific
SHA256SUMS
/shared/build
+1 -1
View File
@@ -15,7 +15,7 @@ with open('CHANGELOG.md') as changelog:
changelogs[version_code] = text
text = []
match = re.match("## \S* - (\d*).*", line)
match = re.match("## .+ - (\d*).*", line)
if not match:
raise ValueError(f"Invalid version line: {line}")
version_code = match.group(1)
+19
View File
@@ -1,5 +1,24 @@
# Changelog
## v2.45.0 (Android) - 1002
- Add a Bluetooth server for Wear OS companion app support
- Remove embedded CHANGELOG
## v1.0.0 (Wear OS) - 200
- Initial release of Wear OS companion app
## v2.44.0 - 168 (2026-07-28)
- Add option to open image in internal image viewer in gallery
## v2.43.0 - 167 (2026-07-12)
- Add support for showing the card ID in the card list
- Add support to sort by most recently added
- Add internal image viewer for zooming card front/back/icon images
## v2.42.1 - 166 (2026-05-16)
- Prevent crash on devices with misbehaving NFC
+11 -1
View File
@@ -23,7 +23,9 @@ for good reason.
## Code Changes
Note: submitting LLM ("AI") generated code is strongly discouraged, as such
### LLM ("AI") and coding agents
**Note:** submitting LLM ("AI") generated code is strongly discouraged, as such
code is often (subtly) incorrect or overcomplicated (for example: unnecessarily
pulling in extra libraries for functionality already covered by existing
libraries). It also often makes unrelated changes that increase the risk of
@@ -47,6 +49,14 @@ risk.
Please never submit LLM-generated code as-is.
### Kotlin and Compose migration
Catima uses a lot of "legacy" tech, Java, Android XML. This will be ported to Kotlin,
then Jetpack Compose; for further details, see
<https://github.com/CatimaLoyalty/Android/issues/2483>.
Thus, prefer Kotlin and Jetpack Compose for new code/UI where practical, especially new files/features.
### Test Your Code
There are four possible tests you can run to verify your code. The first
+66 -49
View File
@@ -8,8 +8,8 @@ GEM
artifactory (3.0.17)
atomos (0.1.3)
aws-eventstream (1.4.0)
aws-partitions (1.1246.0)
aws-sdk-core (3.246.0)
aws-partitions (1.1269.0)
aws-sdk-core (3.254.0)
aws-eventstream (~> 1, >= 1.3.0)
aws-partitions (~> 1, >= 1.992.0)
aws-sigv4 (~> 1.9)
@@ -17,17 +17,18 @@ GEM
bigdecimal
jmespath (~> 1, >= 1.6.1)
logger
aws-sdk-kms (1.124.0)
aws-sdk-core (~> 3, >= 3.244.0)
aws-sdk-kms (1.130.0)
aws-sdk-core (~> 3, >= 3.254.0)
aws-sigv4 (~> 1.5)
aws-sdk-s3 (1.221.0)
aws-sdk-core (~> 3, >= 3.244.0)
aws-sdk-s3 (1.227.0)
aws-sdk-core (~> 3, >= 3.254.0)
aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.5)
aws-sigv4 (1.12.1)
aws-eventstream (~> 1, >= 1.0.2)
babosa (1.0.4)
base64 (0.3.0)
benchmark (0.5.0)
bigdecimal (4.1.2)
claide (1.1.0)
colored (1.2)
@@ -41,8 +42,9 @@ GEM
domain_name (0.6.20240107)
dotenv (2.8.1)
emoji_regex (3.2.3)
excon (0.112.0)
faraday (1.10.5)
excon (1.5.0)
logger
faraday (1.10.6)
faraday-em_http (~> 1.0)
faraday-em_synchrony (~> 1.0)
faraday-excon (~> 1.1)
@@ -71,39 +73,45 @@ GEM
faraday_middleware (1.2.1)
faraday (~> 1.0)
fastimage (2.4.1)
fastlane (2.229.0)
CFPropertyList (>= 2.3, < 4.0.0)
abbrev (~> 0.1.2)
addressable (>= 2.8, < 3.0.0)
fastlane (2.237.0)
CFPropertyList (>= 2.3, < 5.0.0)
abbrev (~> 0.1)
addressable (>= 2.9.0, < 3.0.0)
artifactory (~> 3.0)
aws-sdk-s3 (~> 1.0)
aws-sdk-s3 (~> 1.197)
babosa (>= 1.0.3, < 2.0.0)
bundler (>= 1.12.0, < 3.0.0)
base64 (~> 0.2)
benchmark (>= 0.1.0)
bundler (>= 2.4.0, < 5.0.0)
colored (~> 1.2)
commander (~> 4.6)
csv (~> 3.3)
dotenv (>= 2.1.1, < 3.0.0)
emoji_regex (>= 0.1, < 4.0)
excon (>= 0.71.0, < 1.0.0)
excon (>= 0.71.0, < 2.0.0)
faraday (~> 1.0)
faraday-cookie_jar (~> 0.0.6)
faraday_middleware (~> 1.0)
fastimage (>= 2.1.0, < 3.0.0)
fastlane-sirp (>= 1.0.0)
fastlane-sirp (>= 1.1.0)
gh_inspector (>= 1.1.2, < 2.0.0)
google-apis-androidpublisher_v3 (~> 0.3)
google-apis-playcustomapp_v1 (~> 0.1)
google-cloud-env (>= 1.6.0, < 2.0.0)
google-cloud-env (>= 1.6.0, < 2.3.0)
google-cloud-storage (~> 1.31)
highline (~> 2.0)
http-cookie (~> 1.0.5)
json (< 3.0.0)
jwt (>= 2.1.0, < 3)
jwt (>= 2.10.3, < 4)
logger (>= 1.6, < 2.0)
mini_magick (>= 4.9.4, < 5.0.0)
multi_json (~> 1.12)
multipart-post (>= 2.0.0, < 3.0.0)
mutex_m (~> 0.3.0)
mutex_m (~> 0.3)
naturally (~> 2.2)
nkf (~> 0.2)
optparse (>= 0.1.1, < 1.0.0)
ostruct (>= 0.1.0)
plist (>= 3.1.0, < 4.0.0)
rubyzip (>= 2.0.0, < 3.0.0)
security (= 0.1.5)
@@ -118,41 +126,46 @@ GEM
xcpretty-travis-formatter (>= 0.0.3, < 2.0.0)
fastlane-sirp (1.1.0)
gh_inspector (1.1.3)
google-apis-androidpublisher_v3 (0.54.0)
google-apis-core (>= 0.11.0, < 2.a)
google-apis-core (0.11.3)
google-apis-androidpublisher_v3 (0.104.0)
google-apis-core (>= 0.15.0, < 2.a)
google-apis-core (0.18.0)
addressable (~> 2.5, >= 2.5.1)
googleauth (>= 0.16.2, < 2.a)
httpclient (>= 2.8.1, < 3.a)
googleauth (~> 1.9)
httpclient (>= 2.8.3, < 3.a)
mini_mime (~> 1.0)
mutex_m
representable (~> 3.0)
retriable (>= 2.0, < 4.a)
rexml
google-apis-iamcredentials_v1 (0.17.0)
google-apis-core (>= 0.11.0, < 2.a)
google-apis-playcustomapp_v1 (0.13.0)
google-apis-core (>= 0.11.0, < 2.a)
google-apis-storage_v1 (0.31.0)
google-apis-core (>= 0.11.0, < 2.a)
google-cloud-core (1.8.0)
google-apis-iamcredentials_v1 (0.28.0)
google-apis-core (>= 0.15.0, < 2.a)
google-apis-playcustomapp_v1 (0.18.0)
google-apis-core (>= 0.15.0, < 2.a)
google-apis-storage_v1 (0.64.0)
google-apis-core (>= 0.15.0, < 2.a)
google-cloud-core (1.9.0)
google-cloud-env (>= 1.0, < 3.a)
google-cloud-errors (~> 1.0)
google-cloud-env (1.6.0)
faraday (>= 0.17.3, < 3.0)
google-cloud-errors (1.6.0)
google-cloud-storage (1.47.0)
google-cloud-env (2.2.2)
base64 (~> 0.2)
faraday (>= 1.0, < 3.a)
google-cloud-errors (1.7.0)
google-cloud-storage (1.62.0)
addressable (~> 2.8)
digest-crc (~> 0.4)
google-apis-iamcredentials_v1 (~> 0.1)
google-apis-storage_v1 (~> 0.31.0)
google-apis-core (>= 0.18, < 2)
google-apis-iamcredentials_v1 (~> 0.18)
google-apis-storage_v1 (>= 0.42)
google-cloud-core (~> 1.6)
googleauth (>= 0.16.2, < 2.a)
googleauth (~> 1.9)
mini_mime (~> 1.0)
googleauth (1.8.1)
faraday (>= 0.17.3, < 3.a)
jwt (>= 1.4, < 3.0)
multi_json (~> 1.11)
google-logging-utils (0.2.0)
googleauth (1.17.1)
faraday (>= 1.0, < 3.a)
google-cloud-env (~> 2.2)
google-logging-utils (~> 0.1)
jwt (>= 1.4, < 4.0)
os (>= 0.9, < 2.0)
pstore (~> 0.1)
signet (>= 0.16, < 2.a)
highline (2.0.3)
http-cookie (1.0.8)
@@ -160,8 +173,8 @@ GEM
httpclient (2.9.0)
mutex_m
jmespath (1.6.2)
json (2.19.5)
jwt (2.10.2)
json (2.21.1)
jwt (3.2.0)
base64
logger (1.7.0)
mini_magick (4.13.2)
@@ -171,26 +184,28 @@ GEM
mutex_m (0.3.0)
nanaimo (0.4.0)
naturally (2.3.0)
nkf (0.3.0)
optparse (0.8.1)
os (1.1.4)
ostruct (0.6.3)
plist (3.7.2)
pstore (0.2.1)
public_suffix (7.0.5)
rake (13.4.2)
representable (3.2.0)
declarative (< 0.1.0)
trailblazer-option (>= 0.1.1, < 0.2.0)
uber (< 0.2.0)
retriable (3.4.1)
retriable (3.8.0)
rexml (3.4.4)
rouge (3.28.0)
ruby2_keywords (0.0.5)
rubyzip (2.4.1)
security (0.1.5)
signet (0.21.0)
signet (0.22.0)
addressable (~> 2.8)
faraday (>= 0.17.5, < 3.a)
jwt (>= 1.5, < 4.0)
multi_json (~> 1.10)
simctl (1.6.10)
CFPropertyList
naturally
@@ -205,12 +220,14 @@ GEM
uber (0.1.0)
unicode-display_width (2.6.0)
word_wrap (1.0.0)
xcodeproj (1.27.0)
xcodeproj (1.28.1)
CFPropertyList (>= 2.3.3, < 4.0)
atomos (~> 0.1.3)
base64
claide (>= 1.0.2, < 2.0)
colored2 (~> 3.1)
nanaimo (~> 0.4.0)
nkf
rexml (>= 3.3.6, < 4.0)
xcpretty (0.4.1)
rouge (~> 3.28.0)
+2 -1
View File
@@ -1,11 +1,12 @@
**Last updated**
April 29 2026
August 7 2026
# Privacy Policy
Catima does not collect or transmit any personal information.
To ensure correct app functionality, we require access to the following:
- Bluetooth: When using Catima together with the Wear OS companion app, Bluetooth access is needed to be able to communicate to Wear OS. This may show up as "find, connect to, and determine the relative position of nearby devices" because Android considers Bluetooth as part of location, but location information is never collected or used. The app can still be used when Bluetooth permission is denied, but you will not be able to use the Wear OS companion app.
- Camera: We need access to your camera to be able to scan barcodes. The app can still be used when camera access is denied, but you will have to manually type the barcode information.
- NFC: We need NFC access to temporarily disable NFC while showing a barcode to prevent NFC payment apps from triggering (such as when using a check-in gates which support both barcodes and NFC payments). This functionality can be disabled in settings.
- Storage (Android 5 and 6 only): We need access to your device storage to create or import backups. The app can still be used when storage access is denied, but you will not be able to create or import backups.
+11 -4
View File
@@ -19,8 +19,8 @@ android {
applicationId = "me.hackerchick.catima"
minSdk = 23
targetSdk = 36
versionCode = 166
versionName = "2.42.1"
versionCode = 1002
versionName = "2.45.0"
vectorDrawables.useSupportLibrary = true
multiDexEnabled = true
@@ -59,8 +59,14 @@ android {
dimension = "type"
isDefault = true
}
create("fdroidLegacy") {
dimension = "type"
versionNameSuffix = " (F-Droid)"
versionCode = defaultConfig.versionCode!! - 1
}
create("gplay") {
dimension = "type"
versionNameSuffix = " (Google)"
// Google doesn't allow donation links
buildConfigField("boolean", "showDonate", "false")
@@ -113,6 +119,8 @@ android {
}
dependencies {
implementation(project(":shared"))
// AndroidX
implementation(libs.androidx.appcompat.appcompat)
implementation(libs.androidx.constraintlayout.constraintlayout)
@@ -165,7 +173,6 @@ dependencies {
tasks.register("copyRawResFiles", Copy::class) {
from(
layout.projectDirectory.file("../CHANGELOG.md"),
layout.projectDirectory.file("../PRIVACY.md")
)
into(layout.projectDirectory.dir("src/main/res/raw"))
@@ -173,7 +180,7 @@ tasks.register("copyRawResFiles", Copy::class) {
}.also {
tasks.preBuild.dependsOn(it)
tasks.getByName<Delete>("clean") {
val filesNamesToDelete = listOf("CHANGELOG", "PRIVACY")
val filesNamesToDelete = listOf("PRIVACY")
filesNamesToDelete.forEach { fileName ->
delete(layout.projectDirectory.file("src/main/res/raw/${fileName.lowercase()}.md"))
}
+30
View File
@@ -13,6 +13,12 @@
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.NFC" />
<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_CONNECTED_DEVICE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="23" />
<uses-feature
@@ -101,6 +107,9 @@
android:name=".cardview.LoyaltyCardViewActivity"
android:exported="true"
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name=".cardimageview.LoyaltyCardImageViewActivity"
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name=".LoyaltyCardEditActivity"
android:exported="true"
@@ -223,5 +232,26 @@
<action android:name="android.service.controls.ControlsProviderService" />
</intent-filter>
</service>
<service
android:name=".wearos.BluetoothServerService"
android:exported="false"
android:foregroundServiceType="connectedDevice" />
<activity
android:name=".wearos.BluetoothPairingActivity"
android:exported="false"
android:excludeFromRecents="true"
android:launchMode="singleTop"
android:theme="@style/AppTheme.Transparent" />
<receiver
android:name=".wearos.BluetoothPairingReceiver"
android:exported="false">
<intent-filter>
<action android:name="protect.card_locker.wearos.action.ALLOW_DEVICE" />
<action android:name="protect.card_locker.wearos.action.BLOCK_DEVICE" />
</intent-filter>
</receiver>
</application>
</manifest>
@@ -69,16 +69,7 @@ fun AboutScreenContent(
stringResource(R.string.version_history),
content.versionHistory,
modifier = Modifier.testTag("card_version_history"),
onClickUrl = "https://catima.app/changelog/",
onClickDialogText = AnnotatedString.fromHtml(
htmlString = content.historyHtml,
linkStyles = TextLinkStyles(
style = SpanStyle(
textDecoration = TextDecoration.Underline,
color = MaterialTheme.colorScheme.primary
)
)
)
onClickUrl = "https://catima.app/changelog/"
)
CatimaAboutSection(
stringResource(R.string.credits),
@@ -62,18 +62,6 @@ public class AboutContent {
return contributors.replace("\n", "<br />");
}
public String getHistoryHtml() {
String versionHistory;
try {
versionHistory = Utils.readTextFile(context, R.raw.changelog)
.replace("# Changelog\n\n", "");
} catch (IOException ignored) {
return "";
}
return Utils.linkify(Utils.basicMDToHTML(versionHistory))
.replace("\n", "<br />");
}
public String getLicenseHtml() {
try {
return Utils.readTextFile(context, R.raw.license);
@@ -76,6 +76,7 @@ public class DBHelper extends SQLiteOpenHelper {
public enum LoyaltyCardOrder {
Alpha,
LastAdded,
LastUsed,
ValidFrom,
Expiry
@@ -1089,6 +1090,10 @@ public class DBHelper extends SQLiteOpenHelper {
return LoyaltyCardDbIds.STORE;
}
if (order == LoyaltyCardOrder.LastAdded) {
return LoyaltyCardDbIds.ID;
}
if (order == LoyaltyCardOrder.LastUsed) {
return LoyaltyCardDbIds.LAST_USED;
}
@@ -1105,8 +1110,8 @@ public class DBHelper extends SQLiteOpenHelper {
}
private static String getDbDirection(LoyaltyCardOrder order, LoyaltyCardOrderDirection direction) {
if (order == LoyaltyCardOrder.LastUsed) {
// We want the default sorting to put the most recently used first
if (order == LoyaltyCardOrder.LastAdded || order == LoyaltyCardOrder.LastUsed) {
// We want the default sorting to put the most recently added/used first
return direction == LoyaltyCardOrderDirection.Descending ? "ASC" : "DESC";
}
@@ -14,6 +14,7 @@ import android.widget.RemoteViews
import androidx.core.widget.RemoteViewsCompat
import protect.card_locker.DBHelper.LoyaltyCardArchiveFilter
import protect.card_locker.cardview.LoyaltyCardViewActivity
import protect.card_locker.shared.ForegroundColorHelper
class ListWidget : AppWidgetProvider() {
fun updateAll(context: Context) {
@@ -100,7 +101,7 @@ class ListWidget : AppWidgetProvider() {
// Note: Android 5 will not use bitmaps
val remoteViews = RemoteViews(context.packageName, R.layout.list_widget_item).apply {
val headerColor = Utils.getHeaderColor(context, loyaltyCard)
val foreground = if (Utils.needsDarkForeground(headerColor)) Color.BLACK else Color.WHITE
val foreground = if (ForegroundColorHelper.needsDarkForeground(headerColor)) Color.BLACK else Color.WHITE
setInt(R.id.item_container_foreground, "setBackgroundColor", headerColor)
val icon = loyaltyCard.getImageThumbnail(context)
// FIXME: The icon flow causes a crash up to Android 12L, so force anything below 33 down this path
@@ -105,6 +105,12 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
inputHolder.setNoteField(null);
}
if (mLoyaltyCardListDisplayOptions.showingCardId() && !loyaltyCard.cardId.isEmpty()) {
inputHolder.setExtraField(inputHolder.mCardIdField, loyaltyCard.cardId, null, showDivider);
} else {
inputHolder.setExtraField(inputHolder.mCardIdField, null, null, false);
}
if (mLoyaltyCardListDisplayOptions.showingBalance() && !loyaltyCard.balance.equals(new BigDecimal("0"))) {
inputHolder.setExtraField(inputHolder.mBalanceField, Utils.formatBalance(mContext, loyaltyCard.balance, loyaltyCard.balanceType), null, showDivider);
} else {
@@ -211,7 +217,7 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
public class LoyaltyCardListItemViewHolder extends RecyclerView.ViewHolder {
public TextView mCardText, mStoreField, mNoteField, mBalanceField, mValidFromField, mExpiryField;
public TextView mCardText, mStoreField, mNoteField, mCardIdField, mBalanceField, mValidFromField, mExpiryField;
public ImageView mCardIcon, mTickIcon;
public MaterialCardView mRow;
public ConstraintLayout mStar, mArchived;
@@ -224,6 +230,7 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
mDivider = loyaltyCardLayoutBinding.infoDivider;
mStoreField = loyaltyCardLayoutBinding.store;
mNoteField = loyaltyCardLayoutBinding.note;
mCardIdField = loyaltyCardLayoutBinding.cardId;
mBalanceField = loyaltyCardLayoutBinding.balance;
mValidFromField = loyaltyCardLayoutBinding.validFrom;
mExpiryField = loyaltyCardLayoutBinding.expiry;
@@ -91,6 +91,7 @@ import java.util.concurrent.Callable;
import protect.card_locker.async.TaskHandler;
import protect.card_locker.databinding.LayoutChipChoiceBinding;
import protect.card_locker.databinding.LoyaltyCardEditActivityBinding;
import protect.card_locker.shared.ForegroundColorHelper;
import protect.card_locker.viewmodels.LoyaltyCardEditActivityViewModel;
public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements BarcodeImageWriterResultCallback, ColorPickerDialogListener {
@@ -896,8 +897,8 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements
Integer headerColor = viewModel.getLoyaltyCard().headerColor;
if (headerColor != null) {
thumbnail.setOnClickListener(new ChooseCardImage());
thumbnailEditIcon.setBackgroundColor(Utils.needsDarkForeground(headerColor) ? Color.BLACK : Color.WHITE);
thumbnailEditIcon.setColorFilter(Utils.needsDarkForeground(headerColor) ? Color.WHITE : Color.BLACK);
thumbnailEditIcon.setBackgroundColor(ForegroundColorHelper.Companion.needsDarkForeground(headerColor) ? Color.BLACK : Color.WHITE);
thumbnailEditIcon.setColorFilter(ForegroundColorHelper.Companion.needsDarkForeground(headerColor) ? Color.WHITE : Color.BLACK);
}
onResuming = false;
@@ -919,18 +920,18 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements
setLoyaltyCardHeaderColor(headerColor);
thumbnail.setBackgroundColor(Utils.needsDarkForeground(headerColor) ? Color.BLACK : Color.WHITE);
thumbnail.setBackgroundColor(ForegroundColorHelper.Companion.needsDarkForeground(headerColor) ? Color.BLACK : Color.WHITE);
thumbnailEditIcon.setBackgroundColor(Utils.needsDarkForeground(headerColor) ? Color.BLACK : Color.WHITE);
thumbnailEditIcon.setColorFilter(Utils.needsDarkForeground(headerColor) ? Color.WHITE : Color.BLACK);
thumbnailEditIcon.setBackgroundColor(ForegroundColorHelper.Companion.needsDarkForeground(headerColor) ? Color.BLACK : Color.WHITE);
thumbnailEditIcon.setColorFilter(ForegroundColorHelper.Companion.needsDarkForeground(headerColor) ? Color.WHITE : Color.BLACK);
} else {
generateIcon(storeFieldEdit.getText().toString().trim());
Integer headerColor = viewModel.getLoyaltyCard().headerColor;
if (headerColor != null) {
thumbnailEditIcon.setBackgroundColor(Utils.needsDarkForeground(headerColor) ? Color.BLACK : Color.WHITE);
thumbnailEditIcon.setColorFilter(Utils.needsDarkForeground(headerColor) ? Color.WHITE : Color.BLACK);
thumbnailEditIcon.setBackgroundColor(ForegroundColorHelper.Companion.needsDarkForeground(headerColor) ? Color.BLACK : Color.WHITE);
thumbnailEditIcon.setColorFilter(ForegroundColorHelper.Companion.needsDarkForeground(headerColor) ? Color.WHITE : Color.BLACK);
}
}
}
@@ -35,6 +35,7 @@ public class LoyaltyCardListDisplayOptionsManager {
private boolean mShowNameBelowThumbnail;
private boolean mShowNote;
private boolean mShowCardId;
private boolean mShowBalance;
private boolean mShowValidity;
private boolean mShowArchivedCards;
@@ -50,6 +51,7 @@ public class LoyaltyCardListDisplayOptionsManager {
Context.MODE_PRIVATE);
mShowNameBelowThumbnail = mCardDetailsPref.getBoolean(mContext.getString(R.string.sharedpreference_card_details_show_name_below_thumbnail), false);
mShowNote = mCardDetailsPref.getBoolean(mContext.getString(R.string.sharedpreference_card_details_show_note), true);
mShowCardId = mCardDetailsPref.getBoolean(mContext.getString(R.string.sharedpreference_card_details_show_card_id), false);
mShowBalance = mCardDetailsPref.getBoolean(mContext.getString(R.string.sharedpreference_card_details_show_balance), true);
mShowValidity = mCardDetailsPref.getBoolean(mContext.getString(R.string.sharedpreference_card_details_show_validity), true);
mShowArchivedCards = mCardDetailsPref.getBoolean(mContext.getString(R.string.sharedpreference_card_details_show_archived_cards), true);
@@ -83,6 +85,17 @@ public class LoyaltyCardListDisplayOptionsManager {
return mShowNote;
}
public void showCardId(boolean show) {
mShowCardId = show;
mRefreshCardsCallback.run();
saveDetailState(R.string.sharedpreference_card_details_show_card_id, show);
}
public boolean showingCardId() {
return mShowCardId;
}
public void showBalance(boolean show) {
mShowBalance = show;
mRefreshCardsCallback.run();
@@ -137,6 +150,11 @@ public class LoyaltyCardListDisplayOptionsManager {
showingNote(),
this::showNote
));
displayOptions.add(new LoyaltyCardDisplayOption(
mContext.getString(R.string.show_card_id),
showingCardId(),
this::showCardId
));
displayOptions.add(new LoyaltyCardDisplayOption(
mContext.getString(R.string.show_balance),
showingBalance(),
@@ -1,9 +1,9 @@
package protect.card_locker;
import android.app.Application;
import android.content.Intent;
import androidx.appcompat.app.AppCompatDelegate;
import org.acra.ACRA;
import org.acra.config.CoreConfigurationBuilder;
import org.acra.config.DialogConfigurationBuilder;
@@ -11,6 +11,7 @@ import org.acra.config.MailSenderConfigurationBuilder;
import org.acra.data.StringFormat;
import protect.card_locker.preferences.Settings;
import protect.card_locker.wearos.WearSyncServiceManager;
public class LoyaltyCardLockerApplication extends Application {
@@ -41,5 +42,10 @@ public class LoyaltyCardLockerApplication extends Application {
// Set theme
Settings settings = new Settings(this);
AppCompatDelegate.setDefaultNightMode(settings.getTheme());
// Start Bluetooth server for Wear OS companion if enabled.
// The service checks BLUETOOTH_CONNECT itself and stops if the permission is missing.
// The permission is requested from the launcher Activity when the UI resumes.
WearSyncServiceManager.INSTANCE.synchronize(this, null);
}
}
@@ -37,6 +37,7 @@ import protect.card_locker.databinding.MainActivityBinding
import protect.card_locker.databinding.SortingOptionBinding
import protect.card_locker.preferences.Settings
import protect.card_locker.preferences.SettingsActivity
import protect.card_locker.wearos.WearSyncPermissionRequester
import java.io.UnsupportedEncodingException
import java.util.concurrent.atomic.AtomicInteger
import androidx.core.content.edit
@@ -61,6 +62,7 @@ class MainActivity : CatimaAppCompatActivity(), CardAdapterListener {
private lateinit var mUpdateLoyaltyCardListRunnable: Runnable
private lateinit var mBarcodeScannerLauncher: ActivityResultLauncher<Intent>
private lateinit var mSettingsLauncher: ActivityResultLauncher<Intent>
private lateinit var mWearSyncPermissionRequester: WearSyncPermissionRequester
private val mCurrentActionModeCallback: ActionMode.Callback = object : ActionMode.Callback {
override fun onCreateActionMode(inputMode: ActionMode, inputMenu: Menu?): Boolean {
@@ -318,6 +320,8 @@ class MainActivity : CatimaAppCompatActivity(), CardAdapterListener {
}
}
mWearSyncPermissionRequester = WearSyncPermissionRequester(this, this)
onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
if (mSearchView != null && !mSearchView!!.isIconified) {
@@ -394,6 +398,8 @@ class MainActivity : CatimaAppCompatActivity(), CardAdapterListener {
val settings = Settings(this)
layoutManager.setSpanCount(settings.getPreferredColumnCount())
}
mWearSyncPermissionRequester.synchronize()
}
private fun displayCardSetupOptions(menu: Menu, shouldShow: Boolean) {
@@ -467,11 +473,7 @@ class MainActivity : CatimaAppCompatActivity(), CardAdapterListener {
ShortcutHelper.updateShortcuts(mAdapter.mContext)
}
private fun processParseResultList(
parseResultList: MutableList<ParseResult?>,
group: String?,
closeAppOnNoBarcode: Boolean
) {
private fun processParseResultList(parseResultList: MutableList<ParseResult?>) {
require(!parseResultList.isEmpty()) { "parseResultList may not be empty" }
Utils.makeUserChooseParseResultFromList(
@@ -482,17 +484,12 @@ class MainActivity : CatimaAppCompatActivity(), CardAdapterListener {
val intent =
Intent(applicationContext, LoyaltyCardEditActivity::class.java)
val bundle = parseResult.toLoyaltyCardBundle(this@MainActivity)
if (group != null) {
bundle.putString(LoyaltyCardEditActivity.BUNDLE_ADDGROUP, group)
}
intent.putExtras(bundle)
startActivity(intent)
}
override fun onUserDismissedSelector() {
if (closeAppOnNoBarcode) {
finish()
}
finish()
}
})
}
@@ -556,7 +553,7 @@ class MainActivity : CatimaAppCompatActivity(), CardAdapterListener {
return
}
processParseResultList(parseResultList, null, true)
processParseResultList(parseResultList)
}
private fun extractIntentFields(intent: Intent) {
@@ -0,0 +1,11 @@
package protect.card_locker
object NotificationInfo {
object WearBluetooth {
const val NOTIFICATION_ID = 1001
const val CHANNEL_ID = "catima_wear_bt"
const val PAIRING_CHANNEL_ID = "catima_wear_bt_pairing"
const val CRITICAL_ERROR_NOTIFICATION_ID = 1002
const val CRITICAL_ERROR_CHANNEL_ID = "catima_wear_bt_critical_error"
}
}
@@ -18,6 +18,7 @@ import org.jetbrains.annotations.NotNull;
import java.util.LinkedList;
import protect.card_locker.cardview.LoyaltyCardViewActivity;
import protect.card_locker.shared.ForegroundColorHelper;
public class ShortcutHelper {
/**
@@ -102,7 +103,7 @@ public class ShortcutHelper {
if (iconBitmap == null) {
iconBitmap = Utils.generateIcon(context, loyaltyCard, true).getLetterTile();
} else {
iconBitmap = createAdaptiveBitmap(iconBitmap, Utils.needsDarkForeground(Utils.getHeaderColor(context, loyaltyCard)) ? Color.BLACK : Color.WHITE);
iconBitmap = createAdaptiveBitmap(iconBitmap, ForegroundColorHelper.Companion.needsDarkForeground(Utils.getHeaderColor(context, loyaltyCard)) ? Color.BLACK : Color.WHITE);
}
IconCompat icon = IconCompat.createWithAdaptiveBitmap(iconBitmap);
@@ -39,7 +39,6 @@ import androidx.annotation.Nullable;
import androidx.annotation.RawRes;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.app.AppCompatDelegate;
import androidx.core.graphics.ColorUtils;
import androidx.core.graphics.Insets;
import androidx.core.os.LocaleListCompat;
import androidx.core.view.ViewCompat;
@@ -95,6 +94,7 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern;
import protect.card_locker.preferences.Settings;
import protect.card_locker.shared.ForegroundColorHelper;
public class Utils {
private static final String TAG = "Catima";
@@ -115,8 +115,6 @@ public class Utils {
public static final String CARD_IMAGE_FILENAME_REGEX = "^(card_)(\\d+)(_(?:front|back|icon)\\.png)$";
static final double LUMINANCE_MIDPOINT = 0.5;
static final int BITMAP_SIZE_SMALL = 512;
static final int BITMAP_SIZE_BIG = 1600;
@@ -147,11 +145,7 @@ public class Utils {
}
return new LetterBitmap(context, store, store,
tileLetterFontSize, pixelSize, pixelSize, backgroundColor, needsDarkForeground(backgroundColor) ? Color.BLACK : Color.WHITE);
}
static public boolean needsDarkForeground(Integer backgroundColor) {
return ColorUtils.calculateLuminance(backgroundColor) > LUMINANCE_MIDPOINT;
tileLetterFontSize, pixelSize, pixelSize, backgroundColor, ForegroundColorHelper.Companion.needsDarkForeground(backgroundColor) ? Color.BLACK : Color.WHITE);
}
static public List<ParseResult> retrieveBarcodesFromImage(Context context, Uri uri) {
@@ -1070,7 +1064,7 @@ public class Utils {
if (icon != null) {
// Use header colour to decide if this image will need a white or black background
backgroundOrIcon.setBackgroundColor(needsDarkForeground(headerColor) ? Color.BLACK : Color.WHITE);
backgroundOrIcon.setBackgroundColor(ForegroundColorHelper.Companion.needsDarkForeground(headerColor) ? Color.BLACK : Color.WHITE);
// Ensure correct cropping style
backgroundOrIcon.setScaleType(Utils.getRecommendedScaleTypeForThumbnailImage(icon));
@@ -1100,7 +1094,7 @@ public class Utils {
// Actually set the text and colour
textWhenNoImage.setVisibility(View.VISIBLE);
textWhenNoImage.setText(loyaltyCard.store);
textWhenNoImage.setTextColor(Utils.needsDarkForeground(headerColor) ? Color.BLACK : Color.WHITE);
textWhenNoImage.setTextColor(ForegroundColorHelper.Companion.needsDarkForeground(headerColor) ? Color.BLACK : Color.WHITE);
}
return headerColor;
@@ -0,0 +1,240 @@
package protect.card_locker.cardimageview
import android.content.Context
import android.content.Intent
import android.content.Intent.FLAG_GRANT_READ_URI_PERMISSION
import android.graphics.Bitmap
import android.os.Bundle
import android.view.WindowManager
import android.widget.Toast
import androidx.activity.OnBackPressedDispatcher
import androidx.activity.compose.setContent
import androidx.annotation.StringRes
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.gestures.detectTapGestures
import androidx.compose.foundation.gestures.rememberTransformableState
import androidx.compose.foundation.gestures.transformable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.MoreVert
import androidx.compose.material3.DropdownMenu
import androidx.compose.material3.DropdownMenuItem
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableFloatStateOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.graphics.asImageBitmap
import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.layout.onSizeChanged
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.IntSize
import androidx.core.content.FileProvider
import protect.card_locker.CatimaComponentActivity
import protect.card_locker.ImageLocationType
import protect.card_locker.R
import protect.card_locker.Utils
import protect.card_locker.compose.CatimaTopAppBar
import protect.card_locker.compose.theme.CatimaTheme
import protect.card_locker.preferences.Settings
class LoyaltyCardImageViewActivity : CatimaComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
fixedEdgeToEdge()
applyWindowPreferences()
val imageLocationType = intent.imageLocationType()
val loyaltyCardId = intent.getIntExtra(BUNDLE_ID, 0)
val bitmap = imageLocationType?.let {
Utils.retrieveCardImage(this, loyaltyCardId, it)
}
if (loyaltyCardId == 0 || imageLocationType == null || bitmap == null) {
Toast.makeText(this, R.string.failedToRetrieveImageFile, Toast.LENGTH_SHORT).show()
finish()
return
}
title = getString(imageLocationType.descriptionRes())
setContent {
CatimaTheme {
LoyaltyCardImageViewScreen(
bitmap = bitmap,
imageLocationType = imageLocationType,
cardId = loyaltyCardId,
contentDescriptionRes = imageLocationType.descriptionRes(),
onBackPressedDispatcher = onBackPressedDispatcher
)
}
}
}
private fun applyWindowPreferences() {
val settings = Settings(this)
val currentWindow = window ?: return
val attributes = currentWindow.attributes
if (settings.useMaxBrightnessDisplayingBarcode()) {
attributes.screenBrightness = 1F
}
if (settings.keepScreenOn) {
currentWindow.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
}
currentWindow.attributes = attributes
}
private fun Intent.imageLocationType(): ImageLocationType? {
val name = getStringExtra(BUNDLE_IMAGE_LOCATION_TYPE) ?: return null
return runCatching { ImageLocationType.valueOf(name) }.getOrNull()
}
private fun ImageLocationType.descriptionRes(): Int {
return when (this) {
ImageLocationType.icon -> R.string.thumbnailDescription
ImageLocationType.front -> R.string.frontImageDescription
ImageLocationType.back -> R.string.backImageDescription
}
}
companion object {
const val BUNDLE_ID = "id"
const val BUNDLE_IMAGE_LOCATION_TYPE = "imageLocationType"
@JvmStatic
fun createIntent(
context: Context,
loyaltyCardId: Int,
imageLocationType: ImageLocationType
): Intent {
return Intent(context, LoyaltyCardImageViewActivity::class.java)
.putExtra(BUNDLE_ID, loyaltyCardId)
.putExtra(BUNDLE_IMAGE_LOCATION_TYPE, imageLocationType.name)
}
}
}
@Composable
fun LoyaltyCardImageViewScreen(
bitmap: Bitmap,
imageLocationType: ImageLocationType,
cardId: Int,
@StringRes contentDescriptionRes: Int,
onBackPressedDispatcher: OnBackPressedDispatcher,
) {
val context = LocalContext.current
var scale by remember { mutableFloatStateOf(1F) }
var offset by remember { mutableStateOf(Offset.Zero) }
var size by remember { mutableStateOf(IntSize.Zero) }
val zoomState = rememberTransformableState { _, zoomChange, panChange, _ ->
val nextScale = (scale * zoomChange).coerceIn(1F, MAX_IMAGE_SCALE)
scale = nextScale
offset = if (nextScale == 1F) {
Offset.Zero
} else {
(offset + panChange).clampTo(size, nextScale)
}
}
Scaffold(
topBar = {
CatimaTopAppBar(
title = stringResource(contentDescriptionRes),
onBackPressedDispatcher = onBackPressedDispatcher,
actions = {
var expanded by remember { mutableStateOf(false) }
IconButton(onClick = { expanded = !expanded }) {
Icon(
imageVector = Icons.Filled.MoreVert,
contentDescription = stringResource(R.string.action_more_options)
)
}
DropdownMenu(
expanded = expanded,
onDismissRequest = { expanded = false }
) {
DropdownMenuItem(onClick = { openInImageGallery(context, cardId, imageLocationType) },
text = { Text(stringResource(R.string.open_in_gallery)) },
)
}
}
)
}
) { innerPadding ->
Box(
modifier = Modifier
.fillMaxSize()
.padding(innerPadding)
.background(MaterialTheme.colorScheme.background)
.testTag("card_image_zoom")
) {
Image(
bitmap = bitmap.asImageBitmap(),
contentDescription = stringResource(contentDescriptionRes),
contentScale = ContentScale.Fit,
modifier = Modifier
.fillMaxSize()
.onSizeChanged { size = it }
.pointerInput(bitmap) {
detectTapGestures(
onDoubleTap = {
scale = 1F
offset = Offset.Zero
}
)
}
.transformable(zoomState)
.graphicsLayer {
scaleX = scale
scaleY = scale
translationX = offset.x
translationY = offset.y
}
.testTag("card_image")
)
}
}
}
private fun Offset.clampTo(size: IntSize, scale: Float): Offset {
if (size.width == 0 || size.height == 0) {
return this
}
val maxX = size.width * (scale - 1F) / 2F
val maxY = size.height * (scale - 1F) / 2F
return Offset(
x = x.coerceIn(-maxX, maxX),
y = y.coerceIn(-maxY, maxY)
)
}
private fun openInImageGallery(context: Context, cardId: Int, imageLocationType: ImageLocationType){
val imagePath = Utils.getCardImageFileName(cardId, imageLocationType)
val viewInGalleryIntent = Intent(Intent.ACTION_VIEW).apply {
setDataAndType(FileProvider.getUriForFile(context, context.packageName, context.getFileStreamPath(imagePath)), "image/*")
flags = FLAG_GRANT_READ_URI_PERMISSION
}
context.startActivity(viewInGalleryIntent)
}
private const val MAX_IMAGE_SCALE = 5F
@@ -1,6 +1,5 @@
package protect.card_locker.cardview;
import android.content.ActivityNotFoundException;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Intent;
@@ -34,7 +33,6 @@ import androidx.activity.OnBackPressedCallback;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.FileProvider;
import androidx.core.graphics.BlendModeColorFilterCompat;
import androidx.core.graphics.BlendModeCompat;
import androidx.core.graphics.ColorUtils;
@@ -44,7 +42,6 @@ import androidx.core.view.accessibility.AccessibilityNodeInfoCompat;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.snackbar.Snackbar;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.nio.charset.Charset;
@@ -53,9 +50,11 @@ import java.util.Arrays;
import java.util.List;
import protect.card_locker.*;
import protect.card_locker.cardimageview.LoyaltyCardImageViewActivity;
import protect.card_locker.databinding.LoyaltyCardViewLayoutBinding;
import protect.card_locker.preferences.Settings;
import protect.card_locker.preferences.SettingsActivity;
import protect.card_locker.shared.ForegroundColorHelper;
public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements BarcodeImageWriterResultCallback {
private LoyaltyCardViewLayoutBinding binding;
@@ -136,46 +135,27 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
return;
}
// If this is an image, open it in the gallery.
openImageInGallery(imageType);
openImage(imageType);
}
private void openImageInGallery(LoyaltyCardImageType imageType) {
File file = null;
private void openImage(LoyaltyCardImageType imageType) {
switch (imageType) {
case NONE:
return;
case ICON:
file = Utils.retrieveCardImageAsFile(this, loyaltyCardId, ImageLocationType.icon);
startImageActivity(ImageLocationType.icon);
break;
case IMAGE_FRONT:
file = Utils.retrieveCardImageAsFile(this, loyaltyCardId, ImageLocationType.front);
startImageActivity(ImageLocationType.front);
break;
case IMAGE_BACK:
file = Utils.retrieveCardImageAsFile(this, loyaltyCardId, ImageLocationType.back);
startImageActivity(ImageLocationType.back);
break;
case BARCODE:
Toast.makeText(this, R.string.barcodeLongPressMessage, Toast.LENGTH_SHORT).show();
return;
default:
Log.w(TAG, "openImage called with unsupported image type!");
}
}
// Do nothing if there is no file
if (file == null) {
Toast.makeText(this, R.string.failedToRetrieveImageFile, Toast.LENGTH_SHORT).show();
return;
}
try {
Intent intent = new Intent(Intent.ACTION_VIEW)
.setDataAndType(FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID, file), "image/*")
.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(intent);
} catch (ActivityNotFoundException e) {
// Display a toast message if an image viewer is not installed on device
Toast.makeText(this, R.string.failedLaunchingPhotoPicker, Toast.LENGTH_SHORT).show();
e.printStackTrace();
}
private void startImageActivity(ImageLocationType imageLocationType) {
startActivity(LoyaltyCardImageViewActivity.createIntent(this, loyaltyCardId, imageLocationType));
}
@Override
@@ -291,7 +271,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
binding.iconContainer.setOnClickListener(view -> {
if (loyaltyCard.getImageThumbnail(this) != null) {
openImageInGallery(LoyaltyCardImageType.ICON);
openImage(LoyaltyCardImageType.ICON);
} else {
Toast.makeText(LoyaltyCardViewActivity.this, R.string.icon_header_click_text, Toast.LENGTH_LONG).show();
}
@@ -619,20 +599,20 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
// Set bottomAppBar and system navigation bar color
binding.bottomAppBar.setBackgroundColor(darkenedColor);
Utils.setNavigationBarColor(null, window, darkenedColor, Utils.needsDarkForeground(darkenedColor));
Utils.setNavigationBarColor(null, window, darkenedColor, ForegroundColorHelper.Companion.needsDarkForeground(darkenedColor));
int complementaryColor = Utils.getComplementaryColor(darkenedColor);
binding.fabEdit.setBackgroundTintList(ColorStateList.valueOf(complementaryColor));
Drawable editButtonIcon = binding.fabEdit.getDrawable();
editButtonIcon.mutate();
editButtonIcon.setTint(Utils.needsDarkForeground(complementaryColor) ? Color.BLACK : Color.WHITE);
editButtonIcon.setTint(ForegroundColorHelper.Companion.needsDarkForeground(complementaryColor) ? Color.BLACK : Color.WHITE);
binding.fabEdit.setImageDrawable(editButtonIcon);
Bitmap icon = loyaltyCard.getImageThumbnail(this);
Utils.setIconOrTextWithBackground(this, loyaltyCard, icon, binding.iconImage, binding.iconText, 1);
// If the background is very bright, we should use dark icons
backgroundNeedsDarkIcons = Utils.needsDarkForeground(backgroundHeaderColor);
backgroundNeedsDarkIcons = ForegroundColorHelper.Companion.needsDarkForeground(backgroundHeaderColor);
fixBottomAppBarImageButtonColor(binding.bottomAppBarInfoButton);
fixBottomAppBarImageButtonColor(binding.bottomAppBarPreviousButton);
@@ -887,9 +867,9 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
int accessibilityClickAction;
LoyaltyCardImageType currentImageType = cardNavigator.getCurrent();
if (currentImageType == LoyaltyCardImageType.IMAGE_FRONT) {
accessibilityClickAction = R.string.openFrontImageInGalleryApp;
accessibilityClickAction = R.string.zoomFrontImage;
} else if (currentImageType == LoyaltyCardImageType.IMAGE_BACK) {
accessibilityClickAction = R.string.openBackImageInGalleryApp;
accessibilityClickAction = R.string.zoomBackImage;
} else {
accessibilityClickAction = R.string.moveBarcodeToTopOfScreen;
}
@@ -3,6 +3,7 @@ package protect.card_locker.compose
import androidx.activity.OnBackPressedDispatcher
import androidx.appcompat.app.AppCompatDelegate
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.foundation.layout.RowScope
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material3.ExperimentalMaterial3Api
@@ -22,7 +23,9 @@ import protect.card_locker.preferences.Settings
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun CatimaTopAppBar(title: String, onBackPressedDispatcher: OnBackPressedDispatcher?) {
fun CatimaTopAppBar(title: String,
onBackPressedDispatcher: OnBackPressedDispatcher?,
actions : @Composable RowScope.() -> Unit = {}) {
// Use pure black in OLED theme
val context = LocalContext.current
val settings = Settings(context)
@@ -51,6 +54,7 @@ fun CatimaTopAppBar(title: String, onBackPressedDispatcher: OnBackPressedDispatc
)
}
}
}
},
actions = actions
)
}
@@ -112,4 +112,8 @@ public class Settings {
public boolean useVolumeKeysForNavigation() {
return getBoolean(R.string.settings_key_use_volume_keys_navigation, false);
}
public boolean getWearSyncEnabled() {
return getBoolean(R.string.settings_key_wear_sync, false);
}
}
@@ -1,22 +1,42 @@
package protect.card_locker.preferences
import android.app.Activity
import android.annotation.SuppressLint
import android.bluetooth.BluetoothDevice
import android.bluetooth.BluetoothManager
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.provider.Settings
import android.view.LayoutInflater
import android.view.View
import android.view.MenuItem
import android.widget.LinearLayout
import android.widget.TextView
import androidx.activity.OnBackPressedCallback
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatDelegate
import androidx.core.content.ContextCompat
import androidx.core.os.LocaleListCompat
import androidx.preference.ListPreference
import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat
import androidx.preference.SwitchPreferenceCompat
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.snackbar.Snackbar
import protect.card_locker.BuildConfig
import protect.card_locker.CatimaAppCompatActivity
import protect.card_locker.MainActivity
import protect.card_locker.R
import protect.card_locker.Utils
import protect.card_locker.databinding.SettingsActivityBinding
import protect.card_locker.shared.BluetoothPermissionHelper
import protect.card_locker.shared.WearBluetoothSecurity
import protect.card_locker.wearos.BluetoothPairingNotificationManager
import protect.card_locker.wearos.WearSyncPermissionRequester
class SettingsActivity : CatimaAppCompatActivity() {
@@ -81,11 +101,62 @@ class SettingsActivity : CatimaAppCompatActivity() {
class SettingsFragment : PreferenceFragmentCompat() {
var mReloadMain: Boolean = false
private lateinit var wearSyncPermissionRequester: WearSyncPermissionRequester
private var currentDevicesDialog: AlertDialog? = null
private var currentDevicesDialogIsBlocked: Boolean = false
private val devicesChangedReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
if (intent.action != BluetoothPairingNotificationManager.ACTION_DEVICES_CHANGED) {
return
}
findPreference<Preference>(getString(R.string.settings_key_wear_sync_devices))?.let { updateWearSyncAllowedDevicesSummary(it) }
findPreference<Preference>(getString(R.string.settings_key_wear_sync_blocked_devices))?.let { updateWearSyncBlockedDevicesSummary(it) }
if (currentDevicesDialog?.isShowing != true) {
return
}
val isBlocked = currentDevicesDialogIsBlocked
currentDevicesDialog?.dismiss()
if (isBlocked) {
showWearSyncBlockedDevicesDialog()
} else {
showWearSyncAllowedDevicesDialog()
}
}
}
override fun onResume() {
super.onResume()
wearSyncPermissionRequester.synchronize()
findPreference<Preference>(getString(R.string.settings_key_wear_sync_devices))?.let { updateWearSyncAllowedDevicesSummary(it) }
findPreference<Preference>(getString(R.string.settings_key_wear_sync_blocked_devices))?.let { updateWearSyncBlockedDevicesSummary(it) }
ContextCompat.registerReceiver(
requireContext(),
devicesChangedReceiver,
IntentFilter(BluetoothPairingNotificationManager.ACTION_DEVICES_CHANGED),
ContextCompat.RECEIVER_NOT_EXPORTED
)
}
override fun onPause() {
super.onPause()
requireContext().unregisterReceiver(devicesChangedReceiver)
}
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
wearSyncPermissionRequester = WearSyncPermissionRequester(this, requireContext())
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.preferences)
// Show pretty names and summaries
setupThemePreference()
setupOledDarkPreference()
setupLocalePreference()
setupCrashReporterPreference()
setupWearSyncPreference()
setupWearSyncDevicePreferences()
}
private fun setupThemePreference() {
val themePreference = findPreference<ListPreference>(getString(R.string.settings_key_theme))
themePreference!!.setOnPreferenceChangeListener { _, o ->
when (o.toString()) {
@@ -101,13 +172,17 @@ class SettingsActivity : CatimaAppCompatActivity() {
}
true
}
}
private fun setupOledDarkPreference() {
val oledDarkPreference = findPreference<Preference>(getString(R.string.settings_key_oled_dark))
oledDarkPreference!!.setOnPreferenceChangeListener { _, _ ->
refreshActivity(true)
refreshActivity()
true
}
}
private fun setupLocalePreference() {
val localePreference =
findPreference<ListPreference>(getString(R.string.settings_key_locale))!!
localePreference.let {
@@ -148,7 +223,7 @@ class SettingsActivity : CatimaAppCompatActivity() {
localePreference.setOnPreferenceChangeListener { _, newValue ->
// See corresponding comment in Utils.updateBaseContextLocale for Android 6- notes
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
refreshActivity(true)
refreshActivity()
return@setOnPreferenceChangeListener true
}
val newLocale = newValue as String
@@ -156,14 +231,205 @@ class SettingsActivity : CatimaAppCompatActivity() {
AppCompatDelegate.setApplicationLocales(if (newLocale.isEmpty()) LocaleListCompat.getEmptyLocaleList() else LocaleListCompat.create(Utils.stringToLocale(newLocale)))
true
}
}
private fun setupCrashReporterPreference() {
// Hide crash reporter settings on builds it's not enabled on
val crashReporterPreference = findPreference<Preference>("acra.enable")
crashReporterPreference!!.isVisible = BuildConfig.useAcraCrashReporter
}
private fun refreshActivity(reloadMain: Boolean) {
mReloadMain = reloadMain || mReloadMain
private fun setupWearSyncPreference() {
val wearSyncPreference = findPreference<SwitchPreferenceCompat>(getString(R.string.settings_key_wear_sync))
wearSyncPreference!!.setOnPreferenceChangeListener { preference, newValue ->
val enabled = newValue as Boolean
if (enabled) {
wearSyncPermissionRequester.onWearSyncChanged(true) { granted ->
if (granted) {
(preference as? SwitchPreferenceCompat)?.isChecked = true
} else {
showWearSyncPermissionDeniedSnackbar()
}
}
false
} else {
wearSyncPermissionRequester.onWearSyncChanged(false)
true
}
}
}
private fun setupWearSyncDevicePreferences() {
val allowedPreference = findPreference<Preference>(getString(R.string.settings_key_wear_sync_devices))
allowedPreference!!.setOnPreferenceClickListener {
showWearSyncAllowedDevicesDialog()
true
}
updateWearSyncAllowedDevicesSummary(allowedPreference)
val blockedPreference = findPreference<Preference>(getString(R.string.settings_key_wear_sync_blocked_devices))
blockedPreference!!.setOnPreferenceClickListener {
showWearSyncBlockedDevicesDialog()
true
}
updateWearSyncBlockedDevicesSummary(blockedPreference)
}
private fun updateWearSyncAllowedDevicesSummary(preference: Preference) {
val count = WearBluetoothSecurity.listTrustedDevices(requireContext()).size
preference.summary = if (count == 0) {
getString(R.string.settings_wear_sync_no_devices)
} else {
resources.getQuantityString(R.plurals.settings_wear_sync_devices_summary_count, count, count)
}
}
private fun updateWearSyncBlockedDevicesSummary(preference: Preference) {
val count = WearBluetoothSecurity.listBlockedDevices(requireContext()).size
preference.summary = if (count == 0) {
getString(R.string.settings_wear_sync_no_blocked_devices)
} else {
resources.getQuantityString(R.plurals.settings_wear_sync_blocked_devices_summary_count, count, count)
}
}
@SuppressLint("MissingPermission")
private fun showWearSyncDeviceListDialog(
titleRes: Int,
noDevicesRes: Int,
messageRes: Int,
addresses: Set<String>,
isBlocked: Boolean,
onRemove: (String, String) -> Unit
) {
val context = requireContext()
if (!BluetoothPermissionHelper.isBluetoothConnectGranted(context)) {
showWearSyncPermissionDeniedSnackbar()
return
}
val knownAddresses = addresses.toList()
currentDevicesDialog?.dismiss()
currentDevicesDialogIsBlocked = isBlocked
if (knownAddresses.isEmpty()) {
currentDevicesDialog = MaterialAlertDialogBuilder(context)
.setTitle(titleRes)
.setMessage(noDevicesRes)
.setOnDismissListener {
currentDevicesDialog = null
currentDevicesDialogIsBlocked = false
}
.setPositiveButton(android.R.string.ok) { dialog, _ -> dialog.dismiss() }
.show()
return
}
val adapter = context.getSystemService(BLUETOOTH_SERVICE) as? BluetoothManager
val bondedDevices = try {
adapter?.adapter?.bondedDevices ?: emptySet()
} catch (_: SecurityException) {
emptySet<BluetoothDevice>()
}
val deviceMap = bondedDevices.associateBy { it.address }
val content = View.inflate(context, R.layout.wear_sync_device_list, null)
content.findViewById<TextView>(R.id.wear_sync_device_list_message).text = getString(messageRes)
val container = content.findViewById<LinearLayout>(R.id.wear_sync_device_list_container)
knownAddresses.forEach { address ->
val name = deviceName(deviceMap[address], address)
val itemView = LayoutInflater.from(context).inflate(R.layout.wear_sync_device_list_item, container, false) as TextView
itemView.text = getString(R.string.settings_wear_sync_device_name, name, address)
itemView.setOnClickListener { onRemove(address, name) }
container.addView(itemView)
}
currentDevicesDialog = MaterialAlertDialogBuilder(context)
.setTitle(titleRes)
.setView(content)
.setOnDismissListener {
currentDevicesDialog = null
currentDevicesDialogIsBlocked = false
}
.setNegativeButton(android.R.string.cancel) { dialog, _ -> dialog.dismiss() }
.show()
}
private fun showWearSyncAllowedDevicesDialog() {
showWearSyncDeviceListDialog(
R.string.settings_wear_sync_devices,
R.string.settings_wear_sync_no_devices,
R.string.settings_wear_sync_tap_to_remove,
WearBluetoothSecurity.listTrustedDevices(requireContext()),
isBlocked = false
) { address, name -> confirmRemoveAllowedDevice(address, name) }
}
private fun showWearSyncBlockedDevicesDialog() {
showWearSyncDeviceListDialog(
R.string.settings_wear_sync_blocked_devices,
R.string.settings_wear_sync_no_blocked_devices,
R.string.settings_wear_sync_tap_to_remove,
WearBluetoothSecurity.listBlockedDevices(requireContext()),
isBlocked = true
) { address, name -> confirmRemoveBlockedDevice(address, name) }
}
private fun confirmRemoveAllowedDevice(address: String, name: String) {
confirmRemoveDevice(
address,
name,
R.string.settings_wear_sync_unpair_message,
onRemove = { WearBluetoothSecurity.untrustDevice(requireContext(), address) }
)
}
private fun confirmRemoveBlockedDevice(address: String, name: String) {
confirmRemoveDevice(
address,
name,
R.string.settings_wear_sync_unblock_message,
onRemove = { WearBluetoothSecurity.unblockDevice(requireContext(), address) }
)
}
private fun confirmRemoveDevice(address: String, name: String, messageRes: Int, onRemove: () -> Unit) {
val context = requireContext()
MaterialAlertDialogBuilder(context)
.setTitle(R.string.settings_wear_sync_unpair_title)
.setMessage(getString(messageRes, name))
.setPositiveButton(R.string.settings_wear_sync_unpair) { dialog, _ ->
onRemove()
BluetoothPairingNotificationManager.cancel(context, address)
BluetoothPairingNotificationManager.notifyDevicesChanged(context)
findPreference<Preference>(getString(R.string.settings_key_wear_sync_devices))?.let { updateWearSyncAllowedDevicesSummary(it) }
findPreference<Preference>(getString(R.string.settings_key_wear_sync_blocked_devices))?.let { updateWearSyncBlockedDevicesSummary(it) }
dialog.dismiss()
}
.setNegativeButton(android.R.string.cancel) { dialog, _ -> dialog.dismiss() }
.show()
}
private fun deviceName(device: BluetoothDevice?, fallback: String): String {
return try { device?.name } catch (_: SecurityException) { null } ?: fallback
}
private fun showWearSyncPermissionDeniedSnackbar() {
Snackbar.make(
requireView(),
R.string.wear_sync_permission_required,
Snackbar.LENGTH_LONG
).setAction(R.string.open_settings) {
startActivity(
Intent(
Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
Uri.fromParts("package", requireContext().packageName, null)
)
)
}.show()
}
private fun refreshActivity() {
mReloadMain = true
activity?.recreate()
}
}
@@ -0,0 +1,68 @@
package protect.card_locker.wearos
import android.content.Intent
import android.os.Bundle
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import protect.card_locker.R
import protect.card_locker.shared.WearBluetoothSecurity
class BluetoothPairingActivity : AppCompatActivity() {
private var currentDialog: AlertDialog? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
showPairingDialog(intent)
}
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
showPairingDialog(intent)
}
override fun onDestroy() {
currentDialog?.dismiss()
currentDialog = null
super.onDestroy()
}
private fun showPairingDialog(intent: Intent) {
val address = intent.getStringExtra(BluetoothPairingConstants.DEVICE_ADDRESS) ?: return finish()
val deviceName = intent.getStringExtra(BluetoothPairingConstants.DEVICE_NAME) ?: address
val token = intent.getStringExtra(BluetoothPairingConstants.DEVICE_TOKEN)
val isMismatch = intent.getBooleanExtra(BluetoothPairingConstants.IS_MISMATCH, false)
val titleRes = if (isMismatch) {
R.string.wear_bt_pairing_mismatch_title
} else {
R.string.wear_bt_pairing_title
}
val messageRes = if (isMismatch) {
R.string.wear_bt_pairing_mismatch_message
} else {
R.string.wear_bt_pairing_message
}
currentDialog?.dismiss()
currentDialog = MaterialAlertDialogBuilder(this)
.setTitle(getString(titleRes, deviceName))
.setMessage(getString(messageRes, deviceName))
.setPositiveButton(R.string.wear_bt_pairing_allow) { _, _ ->
WearBluetoothSecurity.trustDevice(this, address, token)
BluetoothPairingNotificationManager.updateResultNotification(this, address, deviceName, true)
BluetoothPairingNotificationManager.notifyDevicesChanged(this)
finish()
}
.setNegativeButton(R.string.wear_bt_pairing_block) { _, _ ->
WearBluetoothSecurity.blockDevice(this, address)
BluetoothPairingNotificationManager.updateResultNotification(this, address, deviceName, false)
BluetoothPairingNotificationManager.notifyDevicesChanged(this)
finish()
}
.setOnCancelListener { finish() }
.setCancelable(true)
.show()
}
}
@@ -0,0 +1,8 @@
package protect.card_locker.wearos
object BluetoothPairingConstants {
const val DEVICE_ADDRESS = "device_address"
const val DEVICE_NAME = "device_name"
const val DEVICE_TOKEN = "device_token"
const val IS_MISMATCH = "is_mismatch"
}
@@ -0,0 +1,122 @@
package protect.card_locker.wearos
import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.os.Build
import android.widget.Toast
import androidx.core.app.NotificationCompat
import protect.card_locker.NotificationInfo
import protect.card_locker.R
object BluetoothPairingNotificationManager {
const val ACTION_DEVICES_CHANGED = "protect.card_locker.wearos.ACTION_DEVICES_CHANGED"
fun notifyDevicesChanged(context: Context) {
context.sendBroadcast(Intent(ACTION_DEVICES_CHANGED).apply { setPackage(context.packageName) })
}
fun showAuthorizationNotification(
context: Context,
deviceName: String,
address: String,
token: String,
isMismatch: Boolean = false
) {
val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val channel = NotificationChannel(
NotificationInfo.WearBluetooth.PAIRING_CHANNEL_ID,
context.getString(R.string.wear_bt_pairing_channel_name),
NotificationManager.IMPORTANCE_HIGH
)
notificationManager.createNotificationChannel(channel)
}
val titleRes = if (isMismatch) {
R.string.wear_bt_pairing_mismatch_title
} else {
R.string.wear_bt_pairing_title
}
val messageRes = if (isMismatch) {
R.string.wear_bt_pairing_mismatch_message
} else {
R.string.wear_bt_pairing_message
}
val allowIntent = Intent(context, BluetoothPairingReceiver::class.java).apply {
action = BluetoothPairingReceiver.ACTION_ALLOW
putExtra(BluetoothPairingConstants.DEVICE_ADDRESS, address)
putExtra(BluetoothPairingConstants.DEVICE_NAME, deviceName)
putExtra(BluetoothPairingConstants.DEVICE_TOKEN, token)
}
val blockIntent = Intent(context, BluetoothPairingReceiver::class.java).apply {
action = BluetoothPairingReceiver.ACTION_BLOCK
putExtra(BluetoothPairingConstants.DEVICE_ADDRESS, address)
putExtra(BluetoothPairingConstants.DEVICE_NAME, deviceName)
putExtra(BluetoothPairingConstants.IS_MISMATCH, isMismatch)
}
val allowPendingIntent = PendingIntent.getBroadcast(
context,
address.hashCode(),
allowIntent,
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)
val blockPendingIntent = PendingIntent.getBroadcast(
context,
address.hashCode() + 1,
blockIntent,
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)
val contentIntent = PendingIntent.getActivity(
context,
address.hashCode() + 2,
Intent(context, BluetoothPairingActivity::class.java).apply {
putExtra(BluetoothPairingConstants.DEVICE_ADDRESS, address)
putExtra(BluetoothPairingConstants.DEVICE_NAME, deviceName)
putExtra(BluetoothPairingConstants.DEVICE_TOKEN, token)
putExtra(BluetoothPairingConstants.IS_MISMATCH, isMismatch)
},
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)
val notification = NotificationCompat.Builder(context, NotificationInfo.WearBluetooth.PAIRING_CHANNEL_ID)
.setSmallIcon(R.drawable.ic_notification_catima)
.setContentTitle(context.getString(titleRes, deviceName))
.setContentText(context.getString(messageRes, deviceName))
.setStyle(NotificationCompat.BigTextStyle().bigText(context.getString(messageRes, deviceName)))
.addAction(0, context.getString(R.string.wear_bt_pairing_allow), allowPendingIntent)
.addAction(0, context.getString(R.string.wear_bt_pairing_block), blockPendingIntent)
.setContentIntent(contentIntent)
.setAutoCancel(false)
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setCategory(NotificationCompat.CATEGORY_STATUS)
.build()
notificationManager.notify(notificationId(address), notification)
}
fun cancel(context: Context, address: String) {
val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
notificationManager.cancel(notificationId(address))
}
fun updateResultNotification(context: Context, address: String, deviceName: String, allowed: Boolean) {
cancel(context, address)
val message = if (allowed) {
context.getString(R.string.wear_bt_pairing_allowed, deviceName)
} else {
context.getString(R.string.wear_bt_pairing_blocked, deviceName)
}
Toast.makeText(context, message, Toast.LENGTH_SHORT).show()
}
fun notificationId(address: String): Int = address.hashCode()
}
@@ -0,0 +1,33 @@
package protect.card_locker.wearos
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import protect.card_locker.shared.WearBluetoothSecurity
class BluetoothPairingReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val address = intent.getStringExtra(BluetoothPairingConstants.DEVICE_ADDRESS) ?: return
val deviceName = intent.getStringExtra(BluetoothPairingConstants.DEVICE_NAME) ?: address
val token = intent.getStringExtra(BluetoothPairingConstants.DEVICE_TOKEN)
when (intent.action) {
ACTION_ALLOW -> {
WearBluetoothSecurity.trustDevice(context, address, token)
BluetoothPairingNotificationManager.updateResultNotification(context, address, deviceName, true)
BluetoothPairingNotificationManager.notifyDevicesChanged(context)
}
ACTION_BLOCK -> {
WearBluetoothSecurity.blockDevice(context, address)
BluetoothPairingNotificationManager.updateResultNotification(context, address, deviceName, false)
BluetoothPairingNotificationManager.notifyDevicesChanged(context)
}
}
}
companion object {
const val ACTION_ALLOW = "protect.card_locker.wearos.action.ALLOW_DEVICE"
const val ACTION_BLOCK = "protect.card_locker.wearos.action.BLOCK_DEVICE"
}
}
@@ -0,0 +1,310 @@
package protect.card_locker.wearos
import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.Service
import android.bluetooth.BluetoothAdapter
import android.bluetooth.BluetoothManager
import android.bluetooth.BluetoothServerSocket
import android.bluetooth.BluetoothSocket
import android.content.Intent
import android.os.Build
import android.os.IBinder
import android.util.Log
import androidx.core.app.NotificationCompat
import org.json.JSONArray
import org.json.JSONObject
import protect.card_locker.DBHelper
import protect.card_locker.NotificationInfo
import protect.card_locker.R
import protect.card_locker.Utils
import protect.card_locker.shared.BluetoothPermissionHelper
import protect.card_locker.shared.WearBluetoothProtocol
import protect.card_locker.shared.WearBluetoothSecurity
import java.io.BufferedReader
import java.io.IOException
import java.io.InputStreamReader
import java.io.OutputStreamWriter
import java.io.PrintWriter
class BluetoothServerService : Service() {
companion object {
private const val TAG = "CatimaBtServer"
private const val NOTIFICATION_ID = NotificationInfo.WearBluetooth.NOTIFICATION_ID
private const val CHANNEL_ID = NotificationInfo.WearBluetooth.CHANNEL_ID
}
private var serverThread: AcceptThread? = null
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
if (!BluetoothPermissionHelper.isBluetoothConnectGranted(this)) {
Log.w(TAG, "BLUETOOTH_CONNECT permission not granted, stopping")
stopSelf()
return START_NOT_STICKY
}
val adapter = (getSystemService(BLUETOOTH_SERVICE) as? BluetoothManager)?.adapter
if (adapter == null || !adapter.isEnabled) {
Log.w(TAG, "Bluetooth not available or disabled")
stopSelf()
return START_NOT_STICKY
}
// Avoid tearing down a working accept socket every time Settings is resumed.
if (serverThread?.isAlive == true) {
Log.d(TAG, "Bluetooth server already listening")
return START_STICKY
}
startForegroundWithNotification()
serverThread?.cancel()
serverThread = AcceptThread(adapter).also { it.start() }
Log.d(TAG, "Bluetooth server started")
return START_STICKY
}
private fun startForegroundWithNotification() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val channel = NotificationChannel(
CHANNEL_ID,
getString(R.string.wear_bt_channel_name),
NotificationManager.IMPORTANCE_MIN
).apply { setShowBadge(false) }
getSystemService(NotificationManager::class.java).createNotificationChannel(channel)
}
val notification = NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle(getString(R.string.wear_bt_notification_title))
.setSmallIcon(R.drawable.ic_notification_sync)
.setPriority(NotificationCompat.PRIORITY_MIN)
.setSilent(true)
.build()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
startForeground(NOTIFICATION_ID, notification,
android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE)
} else {
startForeground(NOTIFICATION_ID, notification)
}
}
override fun onDestroy() {
serverThread?.cancel()
serverThread = null
super.onDestroy()
}
override fun onBind(intent: Intent?): IBinder? = null
private inner class AcceptThread(adapter: BluetoothAdapter) : Thread() {
private var serverSocket: BluetoothServerSocket? = null
@Volatile private var running = true
init {
try {
if (BluetoothPermissionHelper.isBluetoothConnectGranted(this@BluetoothServerService)) {
serverSocket = adapter.listenUsingRfcommWithServiceRecord(
WearBluetoothProtocol.BT_SERVICE_NAME,
WearBluetoothProtocol.BT_SERVICE_UUID
)
} else {
Log.w(TAG, "BLUETOOTH_CONNECT permission missing, cannot open server socket")
running = false
}
} catch (e: SecurityException) {
Log.e(TAG, "BLUETOOTH_CONNECT permission missing, cannot create server socket", e)
running = false
} catch (e: Exception) {
Log.e(TAG, "Failed to create server socket", e)
running = false
}
}
override fun run() {
Log.d(TAG, "Listening for Bluetooth connections")
while (running) {
val socket: BluetoothSocket = try {
serverSocket?.accept() ?: break
} catch (e: Exception) {
if (running) Log.e(TAG, "Accept failed", e)
break
}
// Handle each client on its own thread so a slow/stuck client
// cannot block the accept loop.
Thread { handleConnection(socket) }.start()
}
Log.d(TAG, "Accept loop ended")
if (running) {
Log.w(TAG, "Accept loop exited unexpectedly, restarting service")
stopSelf()
}
}
private fun handleConnection(socket: BluetoothSocket) {
val address = try { socket.remoteDevice.address } catch (_: SecurityException) { null } ?: return
val deviceName = try { socket.remoteDevice.name } catch (_: SecurityException) { address }
Log.d(TAG, "Connected to $deviceName ($address)")
try {
val reader = BufferedReader(InputStreamReader(socket.inputStream, "UTF-8"))
val writer = PrintWriter(OutputStreamWriter(socket.outputStream, "UTF-8"), false)
val firstLine = reader.readLine()?.trim() ?: return
if (firstLine == WearBluetoothProtocol.BT_CMD_VERSIONS) {
val versions = JSONArray().put("${WearBluetoothProtocol.PROTOCOL_VERSION}.${WearBluetoothProtocol.PROTOCOL_MINOR_VERSION}").toString()
writer.println(versions)
writer.flush()
Log.d(TAG, "Sent supported versions to $deviceName: $versions")
return
}
var commandLine: String? = firstLine
while (commandLine != null) {
val command = commandLine
Log.d(TAG, "Received command: $command from $deviceName")
if (!command.startsWith(WearBluetoothProtocol.BT_CMD_VERSION_PREFIX)) {
notAuthorized(writer)
Log.w(TAG, "Unsupported command from $deviceName: $command")
break
}
val tokenLine = reader.readLine()?.trim()
if (tokenLine == null || !tokenLine.startsWith(WearBluetoothProtocol.BT_CMD_TOKEN_PREFIX)) {
notAuthorized(writer)
Log.w(TAG, "Malformed token line from $deviceName: $tokenLine")
break
}
val token = tokenLine.removePrefix(WearBluetoothProtocol.BT_CMD_TOKEN_PREFIX)
val isTrusted = WearBluetoothSecurity.isDeviceTrusted(this@BluetoothServerService, address)
val storedToken = WearBluetoothSecurity.getDeviceToken(this@BluetoothServerService, address)
val tokenMatches = storedToken != null && storedToken == token
when {
WearBluetoothSecurity.isDeviceBlocked(this@BluetoothServerService, address) -> {
notAuthorized(writer)
Log.w(TAG, "Rejected blocked device $deviceName")
break
}
isTrusted && tokenMatches -> {
if (!serveCommand(writer, deviceName, command)) {
break
}
}
isTrusted && !tokenMatches -> {
BluetoothPairingNotificationManager.showAuthorizationNotification(
this@BluetoothServerService,
deviceName,
address,
token,
isMismatch = true
)
notAuthorized(writer)
Log.w(TAG, "Token mismatch for $deviceName")
break
}
else -> {
BluetoothPairingNotificationManager.showAuthorizationNotification(
this@BluetoothServerService,
deviceName,
address,
token,
isMismatch = false
)
notAuthorized(writer)
Log.d(TAG, "Requested authorization for $deviceName")
break
}
}
commandLine = reader.readLine()?.trim()
}
} catch (_: IOException) {
// Client closed the socket; this is a normal end-of-stream after
// the watch has received the pages it needs.
Log.d(TAG, "Connection closed by $deviceName")
} catch (e: Exception) {
Log.e(TAG, "Error handling connection from $deviceName", e)
} finally {
try { socket.close() } catch (_: Exception) { }
}
}
private fun notAuthorized(writer: PrintWriter) {
writer.println(WearBluetoothProtocol.BT_RESPONSE_NOT_AUTHORIZED)
writer.flush()
}
private fun serveCommand(
writer: PrintWriter,
deviceName: String,
command: String
): Boolean {
when {
command.startsWith(WearBluetoothProtocol.BT_CMD_CARDS_PAGE_PREFIX) -> {
val pageIndex = command.removePrefix(WearBluetoothProtocol.BT_CMD_CARDS_PAGE_PREFIX).toIntOrNull()
if (pageIndex == null || pageIndex < 0) {
Log.w(TAG, "Invalid page index from $deviceName: $command")
notAuthorized(writer)
return false
}
val json = buildCardsPageJson(pageIndex)
writer.println(json)
writer.flush()
Log.d(TAG, "Sent page $pageIndex to $deviceName")
return true
}
else -> {
Log.w(TAG, "Unsupported command from $deviceName: $command")
notAuthorized(writer)
return false
}
}
}
private fun buildCardsPageJson(pageIndex: Int): String {
val dbHelper = DBHelper(this@BluetoothServerService)
val db = dbHelper.readableDatabase
val order = Utils.getLoyaltyCardOrder(this@BluetoothServerService)
val orderDirection = Utils.getLoyaltyCardOrderDirection(this@BluetoothServerService)
val cursor = DBHelper.getLoyaltyCardCursor(
db, "", null, order, orderDirection,
DBHelper.LoyaltyCardArchiveFilter.Unarchived
)
val totalCards = cursor.count
val totalPages = if (totalCards == 0) 1 else (totalCards + WearBluetoothProtocol.PAGE_SIZE - 1) / WearBluetoothProtocol.PAGE_SIZE
val offset = pageIndex * WearBluetoothProtocol.PAGE_SIZE
val array = JSONArray()
cursor.use {
if (it.move(offset + 1)) {
val idIdx = it.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.ID)
val storeIdx = it.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.STORE)
val cardIdIdx = it.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.CARD_ID)
val barcodeIdIdx = it.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.BARCODE_ID)
val barcodeTypeIdx = it.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.BARCODE_TYPE)
val headerColorIdx = it.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.HEADER_COLOR)
var count = 0
do {
array.put(JSONObject().apply {
put("id", it.getInt(idIdx))
put("store", it.getString(storeIdx) ?: "")
put("cardId", it.getString(cardIdIdx) ?: "")
put("barcodeId", if (it.isNull(barcodeIdIdx)) JSONObject.NULL else it.getString(barcodeIdIdx))
put("barcodeType", if (it.isNull(barcodeTypeIdx)) JSONObject.NULL else it.getString(barcodeTypeIdx))
put("headerColor", if (it.isNull(headerColorIdx)) JSONObject.NULL else it.getInt(headerColorIdx))
})
count++
} while (count < WearBluetoothProtocol.PAGE_SIZE && it.moveToNext())
}
}
return JSONObject().apply {
put("page", pageIndex)
put("totalPages", totalPages)
put("cards", array)
}.toString()
}
fun cancel() {
running = false
try { serverSocket?.close() } catch (_: Exception) { }
}
}
}
@@ -0,0 +1,167 @@
package protect.card_locker.wearos
import android.Manifest
import android.app.ForegroundServiceStartNotAllowedException
import android.app.NotificationChannel
import android.app.NotificationManager
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.os.Build
import android.util.Log
import androidx.activity.result.ActivityResultCaller
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.app.ActivityCompat
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
import androidx.core.content.ContextCompat
import androidx.core.content.edit
import androidx.preference.PreferenceManager
import protect.card_locker.NotificationInfo
import protect.card_locker.R
import protect.card_locker.preferences.Settings
import protect.card_locker.shared.BluetoothPermissionHelper
class WearSyncPermissionRequester(
caller: ActivityResultCaller,
context: Context
) {
private val context = context.applicationContext
private var pendingResultCallback: ((Boolean) -> Unit)? = null
private val permissionLauncher = caller.registerForActivityResult(
ActivityResultContracts.RequestMultiplePermissions()
) { results ->
val allGranted = results.all { it.value }
pendingResultCallback?.invoke(allGranted)
WearSyncServiceManager.onPermissionResult(this.context, allGranted)
pendingResultCallback = null
}
fun synchronize() {
WearSyncServiceManager.synchronize(context) {
permissionLauncher.launch(getRequiredPermissions())
}
}
fun onWearSyncChanged(enabled: Boolean, onPermissionResult: ((Boolean) -> Unit)? = null) {
val applied = WearSyncServiceManager.onWearSyncChanged(context, enabled) {
pendingResultCallback = onPermissionResult
permissionLauncher.launch(getRequiredPermissions())
}
if (applied) {
onPermissionResult?.invoke(true)
}
}
private fun getRequiredPermissions(): Array<String> = buildList {
if (BluetoothPermissionHelper.isBluetoothConnectRequired()) {
add(Manifest.permission.BLUETOOTH_CONNECT)
}
if (BluetoothPermissionHelper.isPostNotificationsRequired()) {
add(Manifest.permission.POST_NOTIFICATIONS)
}
}.toTypedArray()
}
object WearSyncServiceManager {
private const val TAG = "CatimaWearSyncServiceManager"
fun synchronize(context: Context, requestPermission: (() -> Unit)? = null) {
if (!Settings(context).wearSyncEnabled) {
stop(context)
} else if (arePermissionsGranted(context)) {
start(context)
} else if (requestPermission != null) {
requestPermission()
} else {
stop(context)
}
}
fun onWearSyncChanged(
context: Context,
enabled: Boolean,
requestPermission: () -> Unit
): Boolean {
return if (enabled) {
if (arePermissionsGranted(context)) {
start(context)
true
} else {
requestPermission()
false
}
} else {
stop(context)
true
}
}
private fun arePermissionsGranted(context: Context): Boolean {
return BluetoothPermissionHelper.isBluetoothConnectGranted(context) &&
BluetoothPermissionHelper.isPostNotificationsGranted(context)
}
fun onPermissionResult(context: Context, granted: Boolean) {
if (granted && Settings(context).wearSyncEnabled) {
start(context)
} else {
stop(context)
if (!granted) {
PreferenceManager.getDefaultSharedPreferences(context).edit {
putBoolean(context.getString(R.string.settings_key_wear_sync), false)
}
}
}
}
private fun start(context: Context) {
// Exception can only throw on API level 31 and up
if (Build.VERSION.SDK_INT >= 31) {
try {
ContextCompat.startForegroundService(
context,
Intent(context, BluetoothServerService::class.java)
)
} catch (e: ForegroundServiceStartNotAllowedException) {
// We naively assume we have enough permissions to show a notification as the service should never try to start
// before the user gave notification access anyway
Log.d(TAG, "Foreground service failed to launch: $e")
val channel = NotificationChannel(
NotificationInfo.WearBluetooth.CRITICAL_ERROR_CHANNEL_ID,
context.getString(R.string.wear_bt_critical_error_channel_name),
NotificationManager.IMPORTANCE_HIGH
).apply { setShowBadge(false) }
context.getSystemService(NotificationManager::class.java).createNotificationChannel(channel)
val notification = NotificationCompat.Builder(context, NotificationInfo.WearBluetooth.CRITICAL_ERROR_CHANNEL_ID)
.setSmallIcon(R.drawable.ic_notification_error)
.setContentTitle(context.getString(R.string.wear_bt_failed_foreground_notification_title))
.setContentText(e.message)
.build()
with(NotificationManagerCompat.from(context)) {
if (ActivityCompat.checkSelfPermission(
context,
Manifest.permission.POST_NOTIFICATIONS
) != PackageManager.PERMISSION_GRANTED
) {
return@with
}
notify(
NotificationInfo.WearBluetooth.CRITICAL_ERROR_NOTIFICATION_ID,
notification
)
}
}
} else {
ContextCompat.startForegroundService(
context,
Intent(context, BluetoothServerService::class.java)
)
}
}
private fun stop(context: Context) {
context.stopService(Intent(context, BluetoothServerService::class.java))
}
}
File diff suppressed because one or more lines are too long.
@@ -0,0 +1,30 @@
<!--
~ Copyright (C) 2026 The Android Open Source Project
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960"
android:tint="#FFFFFF">
<group android:scaleX="1.104"
android:scaleY="1.104"
android:translateX="-49.92"
android:translateY="-49.92">
<path
android:fillColor="@android:color/white"
android:pathData="M508.5,668.5Q520,657 520,640Q520,623 508.5,611.5Q497,600 480,600Q463,600 451.5,611.5Q440,623 440,640Q440,657 451.5,668.5Q463,680 480,680Q497,680 508.5,668.5ZM440,520L520,520L520,280L440,280L440,520ZM480,880Q397,880 324,848.5Q251,817 197,763Q143,709 111.5,636Q80,563 80,480Q80,397 111.5,324Q143,251 197,197Q251,143 324,111.5Q397,80 480,80Q563,80 636,111.5Q709,143 763,197Q817,251 848.5,324Q880,397 880,480Q880,563 848.5,636Q817,709 763,763Q709,817 636,848.5Q563,880 480,880ZM480,800Q614,800 707,707Q800,614 800,480Q800,346 707,253Q614,160 480,160Q346,160 253,253Q160,346 160,480Q160,614 253,707Q346,800 480,800ZM480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Z"/>
</group>
</vector>
@@ -0,0 +1,30 @@
<!--
~ Copyright (C) 2026 The Android Open Source Project
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960"
android:tint="#FFFFFF">
<group android:scaleX="0.92"
android:scaleY="0.92"
android:translateX="38.4"
android:translateY="38.4">
<path
android:fillColor="@android:color/white"
android:pathData="M160,800L160,720L270,720L254,706Q202,660 181,601Q160,542 160,482Q160,371 226.5,284.5Q293,198 400,170L400,254Q328,280 284,342.5Q240,405 240,482Q240,527 257,569.5Q274,612 310,648L320,658L320,560L400,560L400,800L160,800ZM560,790L560,706Q632,680 676,617.5Q720,555 720,478Q720,433 703,390.5Q686,348 650,312L640,302L640,400L560,400L560,160L800,160L800,240L690,240L706,254Q755,303 777.5,360.5Q800,418 800,478Q800,589 733.5,675.5Q667,762 560,790Z"/>
</group>
</vector>
Binary file not shown.

After

Width:  |  Height:  |  Size: 790 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 752 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 499 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 509 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 478 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 346 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 919 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 656 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 918 B

@@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M2,6h2v12L2,18L2,6zM5,6h1v12L5,18L5,6zM7,6h3v12L7,18L7,6zM11,6h1v12h-1L11,6zM13,6h2v12h-2L13,6zM16,6h2v12h-2L16,6zM19,6h1v12h-1L19,6zM21,6h1v12h-1L21,6z"/>
</vector>
@@ -158,10 +158,31 @@
android:visibility="gone"
tools:visibility="visible"
app:layout_constraintTop_toBottomOf="@+id/note"
app:layout_constraintBottom_toTopOf="@+id/balance"
app:layout_constraintBottom_toTopOf="@+id/cardId"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"/>
<TextView
android:id="@+id/cardId"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="4dp"
android:textAppearance="?attr/textAppearanceBody2"
app:drawableLeftCompat="@drawable/ic_card_id_24dp"
android:drawablePadding="4dp"
android:maxLines="1"
android:ellipsize="end"
android:visibility="gone"
app:layout_constraintTop_toBottomOf="@+id/info_divider"
app:layout_constraintBottom_toTopOf="@+id/balance"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
tools:visibility="visible"
tools:text="1234567890"/>
<TextView
android:id="@+id/balance"
android:layout_width="match_parent"
@@ -174,7 +195,7 @@
app:drawableLeftCompat="@drawable/ic_baseline_payments_24"
android:drawablePadding="4dp"
android:visibility="gone"
app:layout_constraintTop_toBottomOf="@+id/info_divider"
app:layout_constraintTop_toBottomOf="@+id/cardId"
app:layout_constraintBottom_toTopOf="@+id/validFrom"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clipToPadding="false">
<LinearLayout
android:id="@+id/wear_sync_device_list_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/wear_sync_device_list_message"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="?attr/dialogPreferredPadding"
android:paddingEnd="?attr/dialogPreferredPadding"
style="?attr/materialAlertDialogBodyTextStyle" />
</LinearLayout>
</androidx.core.widget.NestedScrollView>
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?attr/listPreferredItemHeightSmall"
android:gravity="center_vertical"
android:paddingStart="?attr/listPreferredItemPaddingLeft"
android:paddingEnd="?attr/listPreferredItemPaddingRight"
android:background="?attr/selectableItemBackground"
android:ellipsize="marquee"
android:focusable="true"
android:clickable="true"
style="?attr/materialAlertDialogBodyTextStyle" />
+40 -34
View File
@@ -3,92 +3,98 @@ Branden Archer
J. Lavoie
solokot
Allan Nordhøy
Heimen Stoffels
Oğuz Ersen
Heimen Stoffels
B o d o
FC (Fay) Stegerman
大王叫我来巡山
B o d o
StoyanDimitrov
SlavekB
Katharine Chui / Katie
Silvério Santos
mondstern
IllusiveMan196
Silvério Santos
Максим Горпиніч
Edgars Andersons
Liner Seven
Altonss
Fjuro
Joel A
GitSpoon
Michael Moroni
Joel A
Altonss
Priit Jõerüüt
Michael Moroni
Eric
GM
laralem
Petr Novák
laralem
Vasilis
Taco
Milo Ivir
nadiafekihahmed
pfaffenrodt
Vasilis
josé m
Scrambled777
Aayush Gupta
Giovanni Donisi
Nyatsuki
damjang
Scrambled777
josé m
ikanakova
Kachelkaiser
Nyatsuki
Jiri Grönroos
Giovanni Donisi
Kachelkaiser
109247019824
HudobniVolk
Warder
109247019824
Balázs Meskó
Traductor
Samantaz Fox
Balázs Meskó
mdvhimself
AMIR-G98
Feike
Arno-github
Cliff Heraldo
Sergio Paredes
Ankit Tiwari
Feike
Arno-github
Jose Delvani
Robin
Milan Šalka
damjang
Gideon
Govindgopalyadav
Skrripy
huuhaa
Robin
தமிழ்நேரம்
huuhaa
Skrripy
NooB9496
Govindgopalyadav
Gideon
waffshappen
Marnick L'Eau
JungHee Lee
pacavarn
ngocanhtve
aradxxx
Watchman89
StellarSand
Quentin PAGÈS
Projjal Moitra
Aliaksandr Trush
e-michalak
தமிழ் நேரம்
josé m.
hajertabbane
inavleb
Denis Shilin
Renko
Ricky Tigg
Robin Liu
Ziad OUALHADJ
Robin Liu
Ricky Tigg
Renko
Denis Shilin
しいたけ
Alexander Ivanov
Miha Frangež
stavpup
mrestivill
ezn24
ehrt74
Virginie
Thu-Trang Pham
Tim Trek
Virginie
dukezas
ehrt74
ezn24
mrestivill
stavpup
Miha Frangež
Alì Mortacci
Andre Costa
arshbeerSingh
@@ -96,10 +102,10 @@ Augustin LAVILLE
Freddo espresso
Govind S Nair
Kim Seohyun
Libre
echo r"0xX4H" | rev
rudy3
Michael Gangolf
PRATHAMESH BHAGAT
Peter Dave Hello
Thomas Bertels
Patrik
+17 -17
View File
@@ -2,21 +2,21 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
<string name="action_search">بحث</string>
<string name="action_add">إضافة</string>
<string name="noGiftCards">اضغط على زر + لإضافة بطاقة، أو استورد من خلال قائمة ⋮</string>
<string name="noGiftCards">انقر على زر + لإضافة بطاقة، أو استوردها من قائمة ⋮</string>
<string name="noMatchingGiftCards">لا توجد نتائج. حاول تغيير بحثك.</string>
<string name="storeName">اسم</string>
<string name="storeName">الاسم</string>
<string name="note">ملاحظة</string>
<string name="cardId">معرّف البطاقة</string>
<string name="barcodeType">نوع الباركود</string>
<string name="noBarcode">لا يوجد باركود</string>
<string name="star">إضافة إلى المفضّلة</string>
<string name="unstar">حذف من المفضّلة</string>
<string name="star">إضافة إلى المفضلة</string>
<string name="unstar">إزالة من المفضلة</string>
<string name="cancel">إلغاء</string>
<string name="save">حفظ</string>
<string name="edit">تعديل</string>
<string name="delete">حذف</string>
<string name="confirm">تأكيد</string>
<string name="deleteConfirmation">حذف هذه البطاقة نهائيًا؟</string>
<string name="deleteConfirmation">هل ترغب في حذف هذه البطاقة نهائيًّا؟</string>
<string name="ok">حسنًا</string>
<string name="share">مشاركة</string>
<string name="sendLabel">إرسال…</string>
@@ -122,15 +122,15 @@
<string name="archived">تمت أرشفة البطاقة</string>
<string name="unarchived">البطاقة غير مؤرشفة</string>
<string name="failedLaunchingPhotoPicker">تعذر العثور على تطبيق معرض مدعوم</string>
<string name="noGiftCardsGroup">أنشئ بعض البطاقات، ثم عيّنهم لهذه المجموعة</string>
<string name="noGiftCardsGroup">أنشئ بعض البطاقات، ثم عيّنها للمجموعة هنا</string>
<string name="deleteTitle">حذف البطاقة</string>
<plurals name="selectedCardCount">
<item quantity="zero"><xliff:g>%d</xliff:g> محدد</item>
<item quantity="zero"><xliff:g>%d</xliff:g> محددة</item>
<item quantity="one"><xliff:g>%d</xliff:g> محددة</item>
<item quantity="two"><xliff:g>%d</xliff:g> محدد</item>
<item quantity="few"><xliff:g>%d</xliff:g> محدد</item>
<item quantity="many"><xliff:g>%d</xliff:g> محدد</item>
<item quantity="other"><xliff:g>%d</xliff:g> محدد</item>
<item quantity="two"><xliff:g>%d</xliff:g> محددتين</item>
<item quantity="few"><xliff:g>%d</xliff:g> محددة</item>
<item quantity="many"><xliff:g>%d</xliff:g> محددة</item>
<item quantity="other"><xliff:g>%d</xliff:g> محددة</item>
</plurals>
<string name="importing">جارٍ الاستيراد…</string>
<string name="exportName">تصدير</string>
@@ -161,9 +161,9 @@
<item quantity="zero">حذف هذه <xliff:g>%d</xliff:g> البطاقة نهائيًا؟</item>
<item quantity="one">حذف هذه <xliff:g>%d</xliff:g> البطاقة نهائيًا؟</item>
<item quantity="two">حذف هذه <xliff:g>%d</xliff:g> البطاقتين نهائيًا؟</item>
<item quantity="few">حذف هذه <xliff:g>%d</xliff:g> البطاقات نهائيًا؟</item>
<item quantity="many">حذف هذه <xliff:g>%d</xliff:g> البطاقات نهائيًا؟</item>
<item quantity="other">حذف هذه <xliff:g>%d</xliff:g> البطاقات نهائيًا؟</item>
<item quantity="few">هل ترغب في حذف هذه البطاقات الـ <xliff:g>%d</xliff:g> نهائيًّا؟</item>
<item quantity="many">هل ترغب في حذف هذه البطاقات الـ <xliff:g>%d</xliff:g> نهائيًّا؟</item>
<item quantity="other">هل ترغب في حذف هذه البطاقات الـ <xliff:g>%d</xliff:g> نهائيًا؟</item>
</plurals>
<string name="importOptionFilesystemTitle">الاستيراد من نظام الملفات</string>
<string name="importOptionFilesystemExplanation">اختر ملفًا محددًا من نظام الملفات</string>
@@ -220,7 +220,6 @@
<string name="previousCard">السابق</string>
<string name="nextCard">التالي</string>
<string name="failedToRetrieveImageFile">فشل في استخراج ملف الصورة</string>
<string name="barcodeLongPressMessage">يمكن فتح صور فقط في تطبيق معرض الصور</string>
<string name="failedToOpenUrl">ثبت متصفح ويب أولاً</string>
<string name="welcome">مرحبًا بك في كاتيما</string>
<string name="updateBalanceTitle">كم أنفقت أو استلمت؟</string>
@@ -243,7 +242,6 @@
<string name="permissionReadCardsLabel">اقرأ بطاقات كاتيما</string>
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">حقوق النشر © 2019<xliff:g>%d</xliff:g> Sylvia van Os والمساهمون</string>
<string name="app_copyright_short">حقوق النشر © Sylvia van Os والمساهمون</string>
<string name="openFrontImageInGalleryApp">افتح الصورة الأمامية في تطبيق المعرض</string>
<string name="show_name_below_image_thumbnail">إظهار الاسم أسفل الصورة المصغرة</string>
<string name="show_validity">إظهار الصلاحية</string>
<string name="view_online">مشاهدة حية</string>
@@ -259,7 +257,6 @@
<string name="switchToFrontImage">التبديل إلى الصورة الأمامية</string>
<string name="settings_allow_content_provider_read_summary">سيظل يتعين على التطبيقات طلب الإذن لمنحها حق الوصول</string>
<string name="setBarcodeHeight">ضبط ارتفاع الباركود</string>
<string name="openBackImageInGalleryApp">فتح الصورة الخلفية في تطبيق المعرض</string>
<string name="settings_allow_content_provider_read_title">السماح للتطبيقات الأخرى بالوصول إلى بياناتي</string>
<string name="donate">تبرّع</string>
<string name="show_archived_cards">عرض البطاقات المؤرشفة</string>
@@ -327,4 +324,7 @@
<string name="pref_enable_acra_summary">عند التفعيل, سيتم سؤالك للابلاغ بالاعطال عندما تحدث. لا ولن يتم الابلاغ بالاعطال تلفائيا.</string>
<string name="settings_disable_nfc_while_viewing_card">وقف NFC</string>
<string name="settings_disable_nfc_while_viewing_card_summary">وقف NFC لمنع NFC من العمل أثناء عرض بطاقة</string>
<string name="nfc_blocked_while_viewing_card">NFC موقوف</string>
<string name="change_settings">تغير الاعدادات</string>
<string name="nfc_block_system_error">فشل في ايقاف NFC</string>
</resources>
-3
View File
@@ -163,7 +163,6 @@
<string name="showMoreInfo">Паказаць інфармацыю</string>
<string name="updateBalance">Абнавіць баланс</string>
<string name="failedToRetrieveImageFile">Не ўдалося атрымаць файл відарысу</string>
<string name="barcodeLongPressMessage">У галерэі можна адкрываць толькі відарысы</string>
<string name="sort_by_name">Назва</string>
<string name="sort_by_most_recently_used">Частата выкарыстання</string>
<string name="sort_by_valid_from">Дзейнічае ад</string>
@@ -203,7 +202,6 @@
<string name="validFromSentence">Дзейнічае з: <xliff:g>%s</xliff:g></string>
<string name="height">Вышыня</string>
<string name="switchToFrontImage">Пераключыцца на пярэдні відарыс</string>
<string name="openBackImageInGalleryApp">Адкрыць задні відарыс у галерэі</string>
<string name="setBarcodeHeight">Задаць вышыню штрыхкода</string>
<string name="donate">Ахвяраваць</string>
<string name="icon_header_click_text">Доўгі націск для рэдагавання мініяцюры</string>
@@ -288,7 +286,6 @@
<string name="report_error">Паведаміць пра памылку</string>
<string name="failedLaunchingPhotoPicker">Не атрымалася знайсці праграму для галерэі, якая падтрымліваецца</string>
<string name="unsupportedFile">Гэты файл не падтрымліваецца</string>
<string name="openFrontImageInGalleryApp">Адкрыць пярэдні відарыс у галерэі</string>
<string name="field_must_not_be_empty">Поле не павінна быць пустым</string>
<string name="add_manually_warning_title">Рэкамендуецца сканаванне</string>
<string name="errorReadingFile">Не атрымалася прачытаць файл</string>
+6 -3
View File
@@ -198,7 +198,6 @@
<string name="nextCard">Следваща</string>
<string name="failedToOpenUrl">Първо инсталирайте уеб браузър</string>
<string name="welcome">Добре дошли при Катима</string>
<string name="barcodeLongPressMessage">В приложението галерия могат да бъдат отваряни само изображения</string>
<string name="failedToRetrieveImageFile">Не е възможно извличане на изображение</string>
<string name="noCameraPermissionDirectToSystemSetting">За да сканирате щрихкодове с Catima е необходим достъп до камерата. За да промените разрешението докоснете тук.</string>
<string name="updateBalanceTitle">Колко е похарчено или получено?</string>
@@ -218,8 +217,6 @@
<string name="switchToFrontImage">Показване на предната страна</string>
<string name="switchToBackImage">Показване на задната страна</string>
<string name="switchToBarcode">Показване на щрихкода</string>
<string name="openFrontImageInGalleryApp">Отваряне на изображението на предната страна в приложение за преглед за изображения</string>
<string name="openBackImageInGalleryApp">Отваряне на изображението на задната страна в приложение за преглед за изображения</string>
<string name="setBarcodeHeight">Задаване на височина на щрихкода</string>
<string name="donate">Даряване</string>
<string name="icon_header_click_text">Задръжте, за да промените миниатюрата</string>
@@ -305,4 +302,10 @@
<string name="settings_disable_nfc_while_viewing_card_summary">Спира NFC, за да бъдат предотвратени безконтактни плащания при преглед на карта</string>
<string name="nfc_blocked_while_viewing_card">NFC е на пауза</string>
<string name="change_settings">Настройки</string>
<string name="nfc_block_system_error">Грешка при спиране на NFC</string>
<string name="sort_by_most_recently_added">Поредност на добавяне</string>
<string name="zoomFrontImage">Увеличаване на предното изображение</string>
<string name="zoomBackImage">Увеличаване на задното изображение</string>
<string name="show_card_id">Показване номера на картата</string>
<string name="open_in_gallery">Отваряне в галерията</string>
</resources>
+5 -8
View File
@@ -3,13 +3,13 @@
<string name="save">সংরক্ষণ</string>
<string name="cancel">বাতিল</string>
<string name="unstar">তারা মুক্ত</string>
<string name="star">তারা</string>
<string name="barcodeType">বারকোড ধরন</string>
<string name="note">বিঃদ্রঃ</string>
<string name="storeName">দোকানের নাম</string>
<string name="star">পছন্দের তালিকায় যোগ করুন</string>
<string name="barcodeType">বারকোডের ধরন</string>
<string name="note">উল্লেখ্য</string>
<string name="storeName">নাম</string>
<string name="noMatchingGiftCards">কোনো ফলাফল পাওয়া যায়নি। অনুসন্ধানের বাক্যটি বদলে দেখুন।</string>
<string name="noGiftCards">প্লাস বোতামটি টিপে একটি কার্ড যোগ করুন বা ⋮ মেনু থেকে কিছু নিয়ে আসুন।</string>
<string name="action_add">কর্ম যোগ</string>
<string name="action_add">যোগ করুন</string>
<string name="all">সব</string>
<string name="noGroupCards">এই গ্রুপটি খালি</string>
<string name="noGroups">+ যোগ বোতামটি টিপে গ্রুপ যোগ করুন যাতে তাদের শ্রেণীকরণ করা যায়।</string>
@@ -193,7 +193,6 @@
<string name="settings_oled_dark">অন্ধকার থিমের জন্য খাঁটি কালো পটভূমি</string>
<string name="setIcon">আইকন সেট করুন</string>
<string name="updateBalance">ব্যালেন্স আপডেট করুন</string>
<string name="barcodeLongPressMessage">গ্যালারি অ্যাপে শুধুমাত্র ছবি খোলা যাবে</string>
<string name="translate_platform">Weblate-এ</string>
<string name="on_google_play">Google Play-তে</string>
<string name="shortcutSelectCard">একটি কার্ড নির্বাচন করুন</string>
@@ -225,8 +224,6 @@
<string name="switchToBackImage">পিছনের ছবিটিতে সুইচ করুন</string>
<string name="switchToFrontImage">সামনের ছবিটিতে সুইচ করুন</string>
<string name="switchToBarcode">বারকোডে সুইচ করুন</string>
<string name="openFrontImageInGalleryApp">সামনের ছবিটি গ্যালারি অ্যাপে খুলুন</string>
<string name="openBackImageInGalleryApp">পিছনের ছবিটি গ্যালারি অ্যাপে খুলুন</string>
<string name="setBarcodeHeight">বারকোডের উচ্চতা সেট করুন</string>
<string name="icon_header_click_text">দীর্ঘক্ষন টাচ করে থাম্বনেইল এডিট করবেন</string>
<string name="show_balance">ব্যালান্স দেখান</string>
-3
View File
@@ -174,7 +174,6 @@
<string name="importLoyaltyCardKeychainMessage">Odaberite svoj izvoz iz Privjeska za ključeve s karticom vjernosti za uvoz.\nKreirajte ga iz menija Uvoz/Izvoz u Privjesku za ključeve s karticom vjernosti pritiskom na Izvoz.</string>
<string name="importVoucherVaultMessage">Odaberite izvoz iz Voucher Vaulta za uvoz. \nKreirajte ga pritiskom na Izvoz u Voucher Vaultu.</string>
<string name="switchToBarcode">Prebaci na barkod</string>
<string name="openFrontImageInGalleryApp">Otvorite prednju sliku u aplikaciji za pregled slika</string>
<string name="switchToBackImage">Prebaci na sliku iz pozadine</string>
<string name="switchToFrontImage">Prebaci na prednju sliku</string>
<string name="height">Visina</string>
@@ -213,7 +212,6 @@
<string name="credits">Zasluge</string>
<string name="version_history">Historija verzija</string>
<string name="sort_by_valid_from">Vrijedi od</string>
<string name="barcodeLongPressMessage">U aplikaciji galerija mogu se otvoriti samo slike</string>
<string name="failedToRetrieveImageFile">Neuspjevam preuzimanje slikovne datoteke</string>
<string name="updateBalance">Ažuriraj stanje</string>
<string name="showMoreInfo">Prikaži informacije</string>
@@ -241,7 +239,6 @@
<string name="group_name_is_empty">Naziv grupe ne smije biti prazan</string>
<string name="group_updated">Grupa ažurirana</string>
<string name="deleteConfirmationGroup">Izbrisati grupu?</string>
<string name="openBackImageInGalleryApp">Otvori sliku pozadi u aplikaciji za pregled slika</string>
<string name="setBarcodeHeight">Postavi visinu barkoda</string>
<string name="donate">Donirajte</string>
<string name="icon_header_click_text">Dugo pritisnite za uređivanje sličice</string>
-3
View File
@@ -72,7 +72,6 @@
<string name="no">No</string>
<string name="sort">Ordenar</string>
<string name="failedToRetrieveImageFile">Ha fallat l\'obtenció del fitxer d\'imatge</string>
<string name="barcodeLongPressMessage">Les imatges només es poden obrir desde la app galeria</string>
<string name="settings_category_title_privacy">Privacitat</string>
<plurals name="deleteCardsTitle">
<item quantity="one">Eliminar <xliff:g>%d</xliff:g> targeta</item>
@@ -167,7 +166,6 @@
<string name="noCardsMessage">Afegeix primer una targeta</string>
<string name="noCardExistsError">No s\'ha pogut trobar aquesta targeta</string>
<string name="failedParsingImportUriError">No s\'ha pogut analitzar l\'URI d\'importació</string>
<string name="openFrontImageInGalleryApp">Obrir la imatge frontal a l\'app de galeria</string>
<string name="settings_use_volume_keys_navigation_summary">Utilitza els botons de volum per canviar la targeta que es mostra</string>
<string name="updateBarcodeQuestionText">Ha canviat el valor ID. Vol actualitzar també el codi de barres per uter utilitzar el mateix valor?</string>
<string name="starred">Preferides</string>
@@ -183,7 +181,6 @@
<string name="on_github">al Github</string>
<string name="include_if_asking_support">Si vol demanar suport tècnic, inclogui la següent informació:</string>
<string name="newBalanceSentence">Nou balanç: <xliff:g>%s</xliff:g></string>
<string name="openBackImageInGalleryApp">Obrir la imatge posterior a l\'app de la galeria</string>
<string name="generic_error_please_retry">Perdoni, alguna cosa ha anat malament, siusplau torni-ho a provar...</string>
<string name="settings_column_count_6">6</string>
<string name="useBackImage">Utilitzar la imatge posterior</string>
+6 -3
View File
@@ -203,7 +203,6 @@
<string name="nextCard">Následující</string>
<string name="failedToOpenUrl">Nejprve nainstalujte webový prohlížeč</string>
<string name="welcome">Vítejte v Catima</string>
<string name="barcodeLongPressMessage">V aplikaci pro galerii mohou být otevírány pouze obrázky</string>
<string name="failedToRetrieveImageFile">Nepodařilo se získat soubor obrázku</string>
<string name="cameraPermissionDeniedTitle">Nepodařilo se získat přístup k fotoaparátu</string>
<string name="importCards">Importovat karty</string>
@@ -223,8 +222,6 @@
<string name="switchToFrontImage">Přepnout na přední obrázek</string>
<string name="switchToBackImage">Přepnout na zadní obrázek</string>
<string name="switchToBarcode">Přepnout na čárový kód</string>
<string name="openFrontImageInGalleryApp">Otevřít přední obrázek v aplikaci prohlížeče obrázků</string>
<string name="openBackImageInGalleryApp">Otevřít zadní obrázek v aplikaci prohlížeče obrázků</string>
<string name="setBarcodeHeight">Nastavit výšku čárového kódu</string>
<string name="donate">Přispět</string>
<string name="icon_header_click_text">Dlouhým stisknutím miniaturu upravíte</string>
@@ -311,4 +308,10 @@
<string name="settings_disable_nfc_while_viewing_card_summary">Pozastaví NFC pro zabránění spuštění NFC plateb při zobrazování karty</string>
<string name="nfc_blocked_while_viewing_card">NFC je pozastaveno</string>
<string name="change_settings">Změnit nastavení</string>
<string name="nfc_block_system_error">Nepodařilo se pozastavit NFC</string>
<string name="sort_by_most_recently_added">Nedávno přidáno</string>
<string name="zoomFrontImage">Přiblížit přední obrázek</string>
<string name="zoomBackImage">Přiblížit zadní obrázek</string>
<string name="show_card_id">Zobrazit ID karty</string>
<string name="open_in_gallery">Otevřít v galerii</string>
</resources>
+6 -3
View File
@@ -197,7 +197,6 @@
<string name="nextCard">Nächste</string>
<string name="failedToOpenUrl">Bitte installiere zuerst einen Webbrowser</string>
<string name="welcome">Willkommen bei Catima</string>
<string name="barcodeLongPressMessage">In der Galerie können nur Bilder geöffnet werden</string>
<string name="failedToRetrieveImageFile">Bilddatei konnte nicht abgerufen werden</string>
<string name="updateBalanceTitle">Wie viel hast du ausgegeben oder erhalten?</string>
<string name="cameraPermissionDeniedTitle">Kein Zugriff auf die Kamera</string>
@@ -215,8 +214,6 @@
<string name="anyDate">Beliebiges Datum</string>
<string name="icon_header_click_text">Zum Bearbeiten des Vorschaubildes lang drücken</string>
<string name="switchToBarcode">Zum Barcode wechseln</string>
<string name="openFrontImageInGalleryApp">Vorderseite in Bildbetrachter öffnen</string>
<string name="openBackImageInGalleryApp">Rückseite in Bildbetrachter öffnen</string>
<string name="height">Höhe</string>
<string name="switchToFrontImage">Zur Vorderseite wechseln</string>
<string name="switchToBackImage">Zur Rückseite wechseln</string>
@@ -305,4 +302,10 @@
<string name="nfc_blocked_while_viewing_card">NFC ist vorübergehend deaktiviert</string>
<string name="settings_disable_nfc_while_viewing_card_summary">Deaktiviert vorübergehend NFC, sodass keine NFC-Zahlungen ausgelöst werden können, während eine Karte angezeigt wird</string>
<string name="settings_disable_nfc_while_viewing_card">NFC vorübergehend deaktivieren</string>
<string name="nfc_block_system_error">Pausieren von NFC ist fehlgeschlagen</string>
<string name="show_card_id">Karten-ID anzeigen</string>
<string name="zoomBackImage">Rückseite vergrößern</string>
<string name="zoomFrontImage">Vorderseite vergrößern</string>
<string name="sort_by_most_recently_added">Zuletzt hinzugefügt</string>
<string name="open_in_gallery">In Bildergalerie öffnen</string>
</resources>
+6 -3
View File
@@ -200,7 +200,6 @@
<string name="previousCard">Προηγούμενη</string>
<string name="nextCard">Επόμενη</string>
<string name="updateBalance">Ενημέρωση υπολοίπου</string>
<string name="barcodeLongPressMessage">Μόνο εικόνες μπορούν να ανοιχτούν στην εφαρμογή φωτογραφιών</string>
<string name="noCameraPermissionDirectToSystemSetting">Για να σκανάρετε γραμμωτούς κώδικες, θα χρειαστεί πρόσβαση στην κάμερα από το Catima. Πατήστε εδώ για να δώσετε πρόσβαση.</string>
<string name="importCards">Εισαγωγή καρτών</string>
<string name="updateBalanceHint">Εισάγετε ποσό</string>
@@ -219,11 +218,9 @@
<string name="switchToBarcode">Μετάβαση σε γραμμωτό κώδικα</string>
<string name="validFromSentence">Ισχύει από: <xliff:g>%s</xliff:g></string>
<string name="permissionReadCardsLabel">Διαβάστε τις κάρτες Catima</string>
<string name="openBackImageInGalleryApp">Ανοίξτε την οπίσθια εικόνα στη συλλογή εικόνων</string>
<string name="permissionReadCardsDescription">Διάβασε τις Κάρτες σου Catima και όλες τους τις λεπτομέρειες, συμπεριλαμβανομένων των σημειώσεων και των εικόνων</string>
<string name="donate">Δωρεά</string>
<string name="icon_header_click_text">Πατήστε παρατεταμένα για επεξεργασία του εικονιδίου</string>
<string name="openFrontImageInGalleryApp">Ανοίξτε την εμπρόσθια εικόνα στη συλλογή εικόνων</string>
<string name="storageReadPermissionRequired">Δικαίωμα ανάγνωσης του χώρου αποθήκευσης απαραίτητο για αυτήν την ενέργεια…</string>
<string name="validFromDate">Ισχύει από</string>
<string name="anyDate">Οποιαδήποτε ημερομηνία</string>
@@ -305,4 +302,10 @@
<string name="settings_disable_nfc_while_viewing_card_summary">Παύση του NFC για την αποτροπή ενεργοποίησης πληρωμών NFC κατά την προβολή μιας κάρτας</string>
<string name="nfc_blocked_while_viewing_card">Το NFC είναι σε παύση</string>
<string name="change_settings">Αλλαγή ρυθμίσεων</string>
<string name="nfc_block_system_error">Αποτυχία παύσης NFC</string>
<string name="sort_by_most_recently_added">Πρόσφατα προστεθέντα</string>
<string name="zoomFrontImage">Μεγέθυνση μπροστινής εικόνας</string>
<string name="zoomBackImage">Μεγέθυνση πίσω εικόνας</string>
<string name="show_card_id">Εμφάνιση ταυτότητας κάρτας</string>
<string name="open_in_gallery">Άνοιγμα στη συλλογή εικόνων</string>
</resources>
-3
View File
@@ -165,7 +165,6 @@
<string name="chooseImportType">Importi datumojn de</string>
<string name="importCatima">Importi el Catima</string>
<string name="updateBalance">Ĝisdatigi saldon</string>
<string name="barcodeLongPressMessage">Nur bildoj povas esti malfermitaj en la galeria apo</string>
<string name="sort_by_name">Nomo</string>
<string name="sort_by_most_recently_used">Plej laste uzitaj</string>
<string name="sort_by_expiry">Dato de eksvalidiĝo</string>
@@ -180,8 +179,6 @@
<string name="newBalanceSentence">Nova saldo: <xliff:g>%s</xliff:g></string>
<string name="anyDate">Iam ajn</string>
<string name="switchToFrontImage">Ŝanĝi al antaŭa bildo</string>
<string name="openFrontImageInGalleryApp">Malfermi la antaŭan bildon en galeria apo</string>
<string name="openBackImageInGalleryApp">Malfermi la malantaŭan bildon en galeria apo</string>
<string name="show_name_below_image_thumbnail">Montri nomon sub la bildeto</string>
<string name="show_note">Montri noton</string>
<string name="settings_category_title_cards">Kartoj</string>
+1 -3
View File
@@ -182,7 +182,6 @@
<string name="selectColor">Seleccionar color</string>
<string name="sort">Ordenar</string>
<string name="app_contributors">Hecho posible por: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="barcodeLongPressMessage">Solo se puede abrir imágenes en la aplicación de galería</string>
<string name="yes">Si</string>
<string name="no">No</string>
<string name="passwordRequired">Ingresa la contraseña</string>
@@ -236,8 +235,6 @@
<string name="switchToFrontImage">Cambiar a imagen frontal</string>
<string name="switchToBackImage">Cambiar a imagen trasera</string>
<string name="switchToBarcode">Cambiar a código de barras</string>
<string name="openFrontImageInGalleryApp">Abrir imagen frontal en aplicación para ver imágenes</string>
<string name="openBackImageInGalleryApp">Abrir imagen trasera en galería de fotos</string>
<string name="setBarcodeHeight">Definir altura de código de barras</string>
<string name="show_name_below_image_thumbnail">Mostrar nombre de la imagen bajo su miniatura</string>
<string name="show_balance">Mostrar saldo</string>
@@ -263,4 +260,5 @@
<string name="show_archived_cards">Mostrar tarjetas archivadas</string>
<string name="view_online">Ver Online</string>
<string name="action_more_options">Más Opciones</string>
<string name="settings_disable_nfc_while_viewing_card">Pause NFC</string>
</resources>
+11 -9
View File
@@ -16,7 +16,7 @@
<string name="addCardTitle">Añadir tarjeta</string>
<string name="scanCardBarcode">Escanear código de barras</string>
<string name="cardShortcut">Atajo de tarjeta</string>
<string name="noCardsMessage">Añada una tarjeta primero</string>
<string name="noCardsMessage">Añada una primera tarjeta</string>
<string name="noCardExistsError">No se ha podido encontrar esa tarjeta</string>
<string name="importExport">Importar/Exportar</string>
<string name="exportName">Exportar</string>
@@ -25,7 +25,7 @@
<string name="importFailedTitle">Falló la importación</string>
<string name="importFailed">No se ha podido realizar la importación</string>
<string name="exportSuccessfulTitle">Exportado</string>
<string name="exportFailedTitle">Falló la exportación</string>
<string name="exportFailedTitle">Exportación incorrecta</string>
<string name="exportFailed">No se han podido exportar</string>
<string name="importing">Importando…</string>
<string name="exporting">Exportando…</string>
@@ -47,7 +47,7 @@
<string name="settings_theme">Tema</string>
<string name="app_copyright_old">Basado en Loyalty Card Keychain
\nderechos de autor © 2016-2020 de Branden Archer</string>
<string name="exportOptionExplanation">Los datos se guardarán en la ubicación que elija</string>
<string name="exportOptionExplanation">Los datos serán escritos en el lugar que elija</string>
<string name="failedParsingImportUriError">No se pudo procesar el URI de importación</string>
<string name="share">Compartir</string>
<string name="barcodeType">Tipo de código de barras</string>
@@ -205,13 +205,12 @@
</plurals>
<string name="starred">Estrellado</string>
<string name="failedToRetrieveImageFile">No se pudo recuperar el archivo de imagen</string>
<string name="barcodeLongPressMessage">Solo se pueden abrir imágenes en la aplicación de galería</string>
<string name="updateBalanceTitle">¿Cuánto has gastado o recibido?</string>
<string name="currentBalanceSentence">Saldo actual: <xliff:g>%s</xliff:g></string>
<string name="noCameraPermissionDirectToSystemSetting">Para escanear códigos de barras, Catima necesitará acceso a su cámara. Toque aquí para cambiar la configuración de sus permisos.</string>
<string name="noCameraPermissionDirectToSystemSetting">Para escanear códigos de barras, Catima necesitará acceso a su cámara. Toque aquí para cambiar los ajustes de su permiso.</string>
<string name="updateBalanceHint">Introduzca el importe</string>
<string name="newBalanceSentence">Nuevo balance: <xliff:g>%s</xliff:g></string>
<string name="cameraPermissionDeniedTitle">No se pudo acceder a la cámara</string>
<string name="cameraPermissionDeniedTitle">No pudo acceder a la cámara</string>
<string name="updateBalance">Actualizar el balance</string>
<string name="importCards">Importar tarjetas</string>
<string name="storageReadPermissionRequired">Se necesita permiso para leer el almacenamiento para esta acción…</string>
@@ -222,8 +221,6 @@
<string name="validFromSentence">Válido desde: <xliff:g>%s</xliff:g></string>
<string name="height">Alto</string>
<string name="switchToFrontImage">Cambiar a imagen frontal</string>
<string name="openFrontImageInGalleryApp">Abrir imagen frontal en la aplicación de la galería</string>
<string name="openBackImageInGalleryApp">Abrir imagen trasera en la aplicación de visor de imagen</string>
<string name="setBarcodeHeight">Ajustar la altura del código de barras</string>
<string name="donate">Donar</string>
<string name="switchToBarcode">Cambiar a código de barras</string>
@@ -234,7 +231,7 @@
<string name="show_validity">Mostrar la validez</string>
<string name="show_balance">Mostrar el saldo</string>
<string name="permissionReadCardsLabel">Leer Tarjetas Catima</string>
<string name="permissionReadCardsDescription">leer tus tarjetas Catima y todos sus detalles, incluidas notas e imágenes</string>
<string name="permissionReadCardsDescription">lea sus tarjetas Catima y todos sus detalles, incluyendo notas e imágenes</string>
<string name="settings_allow_content_provider_read_title">Permite a otras aplicaciones acceder a mis datos</string>
<string name="settings_display_barcode_max_brightness_summary">Necesario para que funcione en algunos escáneres</string>
<string name="settings_keep_screen_on_summary">Deshabilita el tiempo de espera de la pantalla mientras se ve una tarjeta</string>
@@ -311,4 +308,9 @@
<string name="settings_disable_nfc_while_viewing_card_summary">Pausa NFC para prevenir abonaciones NFC desde disparador mientras vea una tarjeta</string>
<string name="nfc_blocked_while_viewing_card">NFC está pausado</string>
<string name="change_settings">Cambiar ajustes</string>
<string name="nfc_block_system_error">Incorrecto al pausar NFC</string>
<string name="sort_by_most_recently_added">Más recientemente añadido</string>
<string name="zoomFrontImage">Imagen frontal de zoom</string>
<string name="zoomBackImage">Imagen trasera de zoom</string>
<string name="show_card_id">Mostrar ID de tarjeta</string>
</resources>
+6 -3
View File
@@ -118,7 +118,6 @@
<string name="updateBarcodeQuestionTitle">Kas uuendame triipkoodi väärtust?</string>
<string name="yes">Jah</string>
<string name="no">Ei</string>
<string name="barcodeLongPressMessage">Galeriirakenduses saad avada vaid pilte</string>
<string name="sort_by_most_recently_used">Viimati kasutatud</string>
<string name="sort_by_expiry">Aegumine</string>
<string name="reverse">…tagurpidi järjekorras</string>
@@ -230,8 +229,6 @@
<string name="switchToFrontImage">Vaata esikülje pilti</string>
<string name="switchToBackImage">Vaata tagakülje pilti</string>
<string name="switchToBarcode">Vaata triipkoodi</string>
<string name="openFrontImageInGalleryApp">Ava esikülje pilt pildivalijas</string>
<string name="openBackImageInGalleryApp">Ava tagakülje pilt pildivalijas</string>
<string name="setBarcodeHeight">Määra triipkoodi kõrgus</string>
<string name="donate">Toeta rahaliselt</string>
<string name="icon_header_click_text">Pisipildi muutmiseks vajuta pikalt</string>
@@ -305,4 +302,10 @@
<string name="nfc_blocked_while_viewing_card">Lähiväljaside (NFC) on peatatud</string>
<string name="change_settings">Muuda seadistusi</string>
<string name="settings_disable_nfc_while_viewing_card_summary">Vältimaks, et lähiväljaside (NFC) abil toimiv makseliides käivitub, lülitatakse kaardi vaatamisel lähiväljaside (NFC) välja</string>
<string name="nfc_block_system_error">Lähiväljaside (NFC) peatamine ei õnnestunud</string>
<string name="sort_by_most_recently_added">Viimasena lisatud</string>
<string name="zoomFrontImage">Suumi esikaane pilti</string>
<string name="zoomBackImage">Suumi tagakaane pilti</string>
<string name="show_card_id">Näita kaardi tunnust</string>
<string name="open_in_gallery">Ava pildigaleriis</string>
</resources>
+9 -8
View File
@@ -139,7 +139,7 @@
<string name="group_updated">گروه به روز شد</string>
<string name="all">همه</string>
<string name="deleteConfirmationGroup">حذف گروه؟</string>
<string name="failedOpeningFileManager">ابتدا یک مدیریت فایل نصب کنید.</string>
<string name="failedOpeningFileManager">نمی توان مدیر پرونده را باز کرد</string>
<string name="moveUp">به بالا حرکت کن</string>
<string name="moveDown">به پایین حرکت کن</string>
<string name="leaveWithoutSaveConfirmation">بدون ذخیره ترک می‌کنید؟</string>
@@ -179,7 +179,7 @@
<string name="importCards">واردات کارت ها</string>
<string name="height">ارتفاع</string>
<string name="add_manually_warning_message">برای برخی از فروشگاه‌ها، مقدار بارکد با عدد نوشته شده روی کارت متفاوت است. به همین دلیل، وارد کردن دستی بارکد ممکن است همیشه کار نکند. اکیداً توصیه می‌شود که به جای آن، بارکد را با دوربین خود اسکن کنید. آیا هنوز می‌خواهید ادامه دهید؟</string>
<string name="generic_error_please_retry">ببخشید، مشکلی پیش آمده، لطفا دوباره امتحان کنید...</string>
<string name="generic_error_please_retry">مشکلی پیش آمده</string>
<string name="welcome">یه کتیما خوش آمدید</string>
<string name="chooseValidFromDate">مقداری درست از تاریخ برگزینید</string>
<string name="intent_import_card_from_url_share_multiple_text">می‌خواهم چند کارت به شما بدهم</string>
@@ -191,7 +191,7 @@
<string name="no">نه</string>
<string name="updateBarcodeQuestionTitle">مقدار بارکد را به‌روز می‌کنید؟</string>
<string name="updateBarcodeQuestionText">شما شناسه را تغییر دادید. می‌خواهید بارکد را هم به‌روز کنید تا همین مقدار را به‌کار ببرید؟</string>
<string name="failedGeneratingShareURL">نتوانستم آدرس هم‌رسانی‌پذیر بسازم. لطفن این را گزارش کنید.</string>
<string name="failedGeneratingShareURL">نتوانستم نشانی هم‌رسانی‌پذیر بسازم.</string>
<string name="turn_flashlight_on">چراغ‌قوه را روشن کنید</string>
<string name="settings_locale">زبان</string>
<string name="settings_oled_dark">پس‌زمینه‌ی یک‌دست سیاه برای حالت تاریک</string>
@@ -209,11 +209,10 @@
<string name="wrongValueForBarcodeType">مقدار برای نوع بارکد برگزیده درست نیست</string>
<string name="setBackImage">عکس پشتِ‌سر را بگذارید</string>
<string name="removeImage">عکس را برچینید</string>
<string name="passwordRequired">لطفا گذرواژه را وارد کنید</string>
<string name="passwordRequired">گذرواژه را وارد کنید</string>
<string name="previousCard">پیشین</string>
<string name="turn_flashlight_off">چراغ‌قوه را خاموش کنید</string>
<string name="updateBalance">به‌روزرسانی موجودی</string>
<string name="barcodeLongPressMessage">تنها عکس می‌تواند در گالری برنامه باز شود</string>
<string name="sort_by_name">نام</string>
<string name="sort_by_most_recently_used">به‌تازگی استفاده‌شده</string>
<string name="sort_by_expiry">انقضا</string>
@@ -221,7 +220,6 @@
<string name="include_if_asking_support">اگر می‌خواهید پشتیبانی درخواست کنید، اطلاعات زیر را پر کنید:</string>
<string name="unarchive">برچیدن بایگانی</string>
<string name="switchToBackImage">به عکس پشتِ‌سر جابه‌جا کنید</string>
<string name="openBackImageInGalleryApp">عکس پشتِ‌سر را در برنامه‌ی گالری باز کنید</string>
<string name="setBarcodeHeight">ارتفاع بارگد را بگمارید</string>
<string name="donate">کمک مالی کنید</string>
<string name="icon_header_click_text">برای ویرایش قاب پیش‌نمایه فشار داده و نگه‌دارید</string>
@@ -235,7 +233,7 @@
<string name="settings_column_count_4">۴</string>
<string name="settings_column_count_5">۵</string>
<string name="settings_column_count_6">۶</string>
<string name="failedLaunchingPhotoPicker">نتوانستم یک برنامه‌ی گالری پشتیبانی‌شده بیابم</string>
<string name="failedLaunchingPhotoPicker">نتوانستم یک برنامه‌ی انتخاب تصویر پشتیبانی‌شده بیابم</string>
<string name="show_balance">موجودی را نشان دهید</string>
<string name="settings_column_count_landscape">ستون‌ها در حالت لنداسکیپ</string>
<string name="settings_column_count_1">۱</string>
@@ -265,7 +263,6 @@
<string name="failedToOpenUrl">نخست یک مرورگر وب نصب کنید</string>
<string name="updateBalanceTitle">چقدر خرج یا دریافت کردید؟</string>
<string name="switchToBarcode">به بارکد جابه‌جا کنید</string>
<string name="openFrontImageInGalleryApp">عکس روبه‌رو را در برنامه‌ی گالری باز کنید</string>
<string name="add_a_card_in_a_different_way">یک کارت به روشی متفاوت بیافزایید</string>
<string name="takePhoto">عکس بگیرید</string>
<string name="settings_column_count_7">۷</string>
@@ -286,4 +283,8 @@
<string name="addFromPkpass">یک فایل دفترچه حساب (.pkpass) انتخاب کنید</string>
<string name="noCameraFoundGuideText">به نظر نمی‌رسد دستگاه شما دوربین داشته باشد. اگر دارد، دستگاه را مجدداً راه‌اندازی کنید. در غیر این صورت، از دکمه گزینه‌های بیشتر در زیر برای افزودن بارکد به روش دیگری استفاده کنید.</string>
<string name="card_list_widget_empty">بعد از اینکه چند کارت وفاداری در کاتیما اضافه کردید، آنها اینجا ظاهر می‌شوند. اگر کارت دارید، مطمئن شوید که همه آنها بایگانی نشده‌اند.</string>
<string name="card_list_widget_name">فهرست کارت</string>
<string name="cardWithNumber">کارت <xliff:g>%d</xliff:g></string>
<string name="cardWithNumberAndLocale">کارت <xliff:g>%d</xliff:g> (<xliff:g>%s</xliff:g>)</string>
<string name="pleaseDoNotRotateTheDevice">لطفا دستگاه‌تان را نچرخوانید، زیرا کار در حال انجام را لغو میکند</string>
</resources>
+10 -3
View File
@@ -200,7 +200,6 @@
<string name="welcome">Tervetuloa Catimaan</string>
<string name="updateBalanceTitle">Kuinka paljon kulutit tai tienasit?</string>
<string name="updateBalanceHint">Syötä summa</string>
<string name="barcodeLongPressMessage">Vain kuvia on mahdollista avata galleriasovelluksessa</string>
<string name="archive">Arkistoi</string>
<string name="importCards">Tuo kortteja</string>
<string name="failedToRetrieveImageFile">Kuvatiedoston noutaminen epäonnistui</string>
@@ -223,14 +222,12 @@
<string name="height">Korkeus</string>
<string name="switchToFrontImage">Vaihda etukuvaan</string>
<string name="switchToBarcode">Vaihda viivakoodiin</string>
<string name="openFrontImageInGalleryApp">Avaa etukuva kuvankatselusovelluksessa</string>
<string name="settings_display_barcode_max_brightness_summary">Välttämätön, jotta jotkin skannerit toimivat</string>
<string name="settings_keep_screen_on_summary">Poistaa näytön aikakatkaisun korttia katsellessa</string>
<string name="settings_disable_lockscreen_while_viewing_card_summary">Poistaa näyttölukituksen käytöstä korttia katsellessa</string>
<string name="settings_allow_content_provider_read_title">Salli muiden sovellusten käyttää omaa dataa</string>
<string name="settings_oled_dark_summary">Vähentää akun käyttöä OLED-näytöillä</string>
<string name="switchToBackImage">Vaihda takakuvaan</string>
<string name="openBackImageInGalleryApp">Avaa takakuva kuvankatselusovelluksessa</string>
<string name="setBarcodeHeight">Aseta viivakoodin korkeus</string>
<string name="icon_header_click_text">Pitkä painallus pikkukuvan muokkaamiseksi</string>
<string name="show_name_below_image_thumbnail">Näytä nimi pikkukuvan alapuolella</string>
@@ -302,4 +299,14 @@
<string name="back">Takaisin</string>
<string name="acra_explain_crash">Jos mahdollista lisää tietoja toiminnastasi täällä:</string>
<string name="acra_crash_email_subject"><xliff:g id="app_name">%s</xliff:g> pysähtymisraportti</string>
<string name="settings_disable_nfc_while_viewing_card">Keskeytä NFC</string>
<string name="settings_disable_nfc_while_viewing_card_summary">Keskeyttää NFC:n, jotta NFC-maksut eivät aktivoituisi korttia katsoessa</string>
<string name="sort_by_most_recently_added">Viimeksi lisätty</string>
<string name="zoomFrontImage">Suurenna etukuvaa</string>
<string name="zoomBackImage">Suurenna takakuvaa</string>
<string name="show_card_id">Näytä kortin tunniste</string>
<string name="nfc_blocked_while_viewing_card">NFC on keskeytetty</string>
<string name="change_settings">Muuta asetuksia</string>
<string name="nfc_block_system_error">NFC:n keskeyttäminen epäonnistui</string>
<string name="open_in_gallery">Avaa kuvagalleriassa</string>
</resources>
+6 -3
View File
@@ -203,7 +203,6 @@
<string name="previousCard">Précédent</string>
<string name="failedToOpenUrl">Installez d\'abord un navigateur web</string>
<string name="welcome">Bienvenue dans Catima</string>
<string name="barcodeLongPressMessage">Seules les images peuvent être ouvertes dans lapplication galerie</string>
<string name="failedToRetrieveImageFile">Impossible de récupérer le fichier image</string>
<string name="currentBalanceSentence">Solde actuel : <xliff:g>%s</xliff:g></string>
<string name="updateBalanceHint">Entrez le montant</string>
@@ -223,8 +222,6 @@
<string name="switchToFrontImage">Passer à l\'image avant</string>
<string name="switchToBackImage">Passer à l\'image arrière</string>
<string name="switchToBarcode">Passer au code barre</string>
<string name="openFrontImageInGalleryApp">Ouvrir l\'image du recto dans l\'application de visualisation des images</string>
<string name="openBackImageInGalleryApp">Ouvrir l\'image du verso dans l\'application de visualisation des images</string>
<string name="setBarcodeHeight">Définir la hauteur du code-barres</string>
<string name="donate">Faire un don</string>
<string name="icon_header_click_text">Appuyez longuement pour modifier la vignette</string>
@@ -311,4 +308,10 @@
<string name="settings_disable_nfc_while_viewing_card_summary">Mettre en pause le NFC pour éviter le déclenchement de paiements NFC lors de la consultation d\'une carte</string>
<string name="nfc_blocked_while_viewing_card">Le NFC est en pause</string>
<string name="change_settings">Modifier les paramètres</string>
<string name="nfc_block_system_error">Erreur lors de la mise en pause du NFC</string>
<string name="sort_by_most_recently_added">Récemment ajoutés</string>
<string name="zoomFrontImage">Grossir l\'image avant</string>
<string name="zoomBackImage">Grossir l\'image arrière</string>
<string name="show_card_id">Afficher l\'ID de carte</string>
<string name="open_in_gallery">Ouvrir dans la galerie d\'images</string>
</resources>
+6 -3
View File
@@ -150,7 +150,6 @@
<string name="showMoreInfo">Ver info</string>
<string name="updateBalance">Actualizar saldo</string>
<string name="failedToRetrieveImageFile">Fallou a obtención do ficheiro de imaxe</string>
<string name="barcodeLongPressMessage">Só imaxes que se abren na app de galería</string>
<string name="sort_by_name">Nome</string>
<string name="sort_by_most_recently_used">Usadas recentemente</string>
<string name="sort_by_expiry">Caducidade</string>
@@ -194,8 +193,6 @@
<string name="height">Altura</string>
<string name="switchToFrontImage">Cambiar á imaxe frontal</string>
<string name="switchToBackImage">Cambiar á imaxe posterior</string>
<string name="openFrontImageInGalleryApp">Abrir imaxe frontal no visor de imaxes</string>
<string name="openBackImageInGalleryApp">Abrir imaxe posterior no visor de imaxes</string>
<string name="setBarcodeHeight">Establecer altura do código de barras</string>
<string name="icon_header_click_text">Pulsación longa para editar a miniatura</string>
<string name="show_name_below_image_thumbnail">Mostrar nome debaixo da miniatura</string>
@@ -304,4 +301,10 @@
<string name="settings_disable_nfc_while_viewing_card_summary">Detén o NFC para evitar a activación de pago con NFC cando se mira unha tarxeta</string>
<string name="nfc_blocked_while_viewing_card">NFC está en pausa</string>
<string name="change_settings">Cambiar axustes</string>
<string name="nfc_block_system_error">Non se detivo NFC</string>
<string name="sort_by_most_recently_added">Máis recentes</string>
<string name="zoomFrontImage">Zoom na imaxe frontal</string>
<string name="zoomBackImage">Zoom na imaxe posterior</string>
<string name="show_card_id">Mostrar ID da tarxeta</string>
<string name="open_in_gallery">Abrir na galería de imaxes</string>
</resources>
-3
View File
@@ -212,7 +212,6 @@
<string name="version_history">वर्जन तिहास</string>
<string name="archive">पुरालेख/संग्रहित (Archive)</string>
<string name="archived">कार्ड संग्रहीत (Archived)</string>
<string name="barcodeLongPressMessage">गैलरी ऐप में केवल छवियां ही खोली जा सकती हैं</string>
<string name="license">अनुज्ञप्ति (लाइसेंस)</string>
<string name="source_repository">स्रोत रिपोजिटरी</string>
<string name="include_if_asking_support">यदि आप सहायता का अनुरोध करना चाहते हैं, तो निम्नलिखित जानकारी शामिल करें:</string>
@@ -245,8 +244,6 @@
<string name="switchToFrontImage">सामने वाली छवि पर स्विच करें</string>
<string name="switchToBackImage">पिछली छवि पर स्विच करें</string>
<string name="switchToBarcode">बारकोड पर स्विच करें</string>
<string name="openFrontImageInGalleryApp">इमेज दर्शक सामने वाली इमेज खोलें</string>
<string name="openBackImageInGalleryApp">पिछली इमेज खोलें</string>
<string name="setBarcodeHeight">बारकोड ऊंचाई सेट करें</string>
<string name="icon_header_click_text">छोटी छवि (थंबनेल) संपादित करने के लिए देर तक दबाएँ</string>
<string name="enter_card_id">अपने कार्ड पर आईडी नंबर या टेक्स्ट दर्ज करें</string>
-3
View File
@@ -128,8 +128,6 @@
<string name="switchToFrontImage">Prebaci na prednju sliku</string>
<string name="switchToBackImage">Prebaci na stražnju sliku</string>
<string name="switchToBarcode">Prebaci na crtični kod</string>
<string name="openFrontImageInGalleryApp">Otvori prednju sliku u aplikaciji prikazivača slika</string>
<string name="openBackImageInGalleryApp">Otvori stražnju sliku u aplikaciji prikazivača slika</string>
<string name="setBarcodeHeight">Postavi visinu crtičnog koda</string>
<plurals name="selectedCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> odabrana</item>
@@ -159,7 +157,6 @@
<string name="importVoucherVaultMessage">Odaberi tvoj izvoz iz Voucher Vault za uvoz. \nStvori ga u aplikaciji Voucher Vault pritiskom na „Izvoz”.</string>
<string name="failedToRetrieveImageFile">Neuspjelo dohvaćanje slikovne datoteke</string>
<string name="license">Licenca</string>
<string name="barcodeLongPressMessage">U aplikaciji galerije se mogu otvoriiti samo slike</string>
<string name="source_repository">Izvorni repozitorij</string>
<string name="on_github">na GitHubu</string>
<string name="on_google_play">na stranici Google Play</string>
+27 -29
View File
@@ -33,9 +33,9 @@
<string name="editCardTitle">Kártya szerkesztése</string>
<string name="addCardTitle">Kártya hozzáadása</string>
<string name="scanCardBarcode">Vonalkód beolvasása</string>
<string name="cardShortcut">Kártya parancsikon</string>
<string name="cardShortcut">Kártya indítóikon</string>
<string name="failedParsingImportUriError">Az importálási URI nem értelmezhető</string>
<string name="importExport">Importálás/Exportálás</string>
<string name="importExport">Importálás/exportálás</string>
<string name="exportName">Exportálás</string>
<string name="importExportHelp">Az adatok mentése lehetővé teszi, hogy egy másik eszközre helyezze át</string>
<string name="importSuccessfulTitle">Importálva</string>
@@ -49,9 +49,9 @@
</plurals>
<string name="deleteTitle">Kártya törlése</string>
<string name="barcodeImageDescriptionWithType">A(z) <xliff:g>%s</xliff:g> vonalkód képe</string>
<string name="noCardExistsError">Kártya nem található</string>
<string name="noCardExistsError">Ez a kártya nem található</string>
<string name="importVoucherVault">Importálás a Voucher Vaultból</string>
<string name="wrongValueForBarcodeType">Ez az érték meg megfelelő a kiválasztott vonalkódtípushoz</string>
<string name="wrongValueForBarcodeType">Ez az érték nem felel meg a kiválasztott vonalkódtípushoz</string>
<string name="setBackImage">Hátlapi kép beállítása</string>
<string name="no">Nem</string>
<string name="passwordRequired">Adja meg a jelszót</string>
@@ -74,7 +74,7 @@
<string name="app_license">Copyleft licencű szabad szoftver, GPLv3+ alatt közzétéve</string>
<string name="about_title_fmt">A <xliff:g id="app_name">%s</xliff:g> névjegye</string>
<string name="debug_version_fmt">Verzió: <xliff:g id="version">%s</xliff:g></string>
<string name="app_resources">Szabad külső erőforrások: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="app_resources">Külső erőforrások: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="selectBarcodeTitle">Vonalkód kiválasztása</string>
<string name="starImage">Kedvencek csillag</string>
<string name="settings">Beállítások</string>
@@ -91,14 +91,14 @@
<string name="groups">Csoportok</string>
<string name="group_edit">Csoport szerkesztése</string>
<string name="group_name_is_empty">A csoportnév nem lehet üres</string>
<string name="failedOpeningFileManager">Fájl böngésző nem elérhető</string>
<string name="failedOpeningFileManager">Nem sikerült a fájlkezelő megnyitása</string>
<string name="moveUp">Mozgatás felfelé</string>
<string name="moveDown">Mozgatás lefelé</string>
<string name="leaveWithoutSaveTitle">Kilépés</string>
<string name="leaveWithoutSaveConfirmation">Kilépés mentés nélkül\?</string>
<string name="addManually">A vonalkód kézi beírása</string>
<string name="addFromImage">Kép kiválasztása a galériából</string>
<string name="editGroup">Csoportok szerkesztése: <xliff:g>%s</xliff:g></string>
<string name="editGroup">Csoport szerkesztése: <xliff:g>%s</xliff:g></string>
<string name="expiryStateSentence">Lejárat: <xliff:g>%s</xliff:g></string>
<string name="balanceSentence">Egyenleg: <xliff:g>%s</xliff:g></string>
<string name="card">Kártya</string>
@@ -108,7 +108,7 @@
<string name="chooseExpiryDate">Lejárati dátum kiválasztása</string>
<string name="moveBarcodeToTopOfScreen">Vonalkód feltolása a képernyő tetejére</string>
<string name="noBarcodeFound">Nem található vonalkód</string>
<string name="errorReadingImage">Kép nem olvasható</string>
<string name="errorReadingImage">A kép nem olvasható</string>
<string name="balance">Egyenleg</string>
<string name="currency">Pénznem</string>
<string name="points">Pontok</string>
@@ -118,8 +118,8 @@
<string name="importCatima">Importálás a Catimából</string>
<string name="importFidme">Importálás a FidMeből</string>
<string name="importLoyaltyCardKeychain">Importálás a Loyalty Card Keychainből</string>
<string name="importLoyaltyCardKeychainMessage">Jelölje ki az importálandó Loyalty Card Keychain exportot. \nLétre tudja hozni a Loyalty Card Keychain Importálás/Exportálás menün belül az Exportálásra koppintva.</string>
<string name="importVoucherVaultMessage">Jelölje ki az importálandó Voucher Vault exportot. \nLétre tudja hozni a Voucher Vault-on belüli Exportálás menüben.</string>
<string name="importLoyaltyCardKeychainMessage">Jelölje ki az importálandó Loyalty Card Keychain exportot. \nA Loyalty Card Keychain Importálás/Exportálás menüjéből hozhatja létre, az Exportálásra koppintva.</string>
<string name="importVoucherVaultMessage">Jelölje ki az importálandó Voucher Vault exportot. \nA Voucher Vault-on belül az Exportálás gombra koppintva hozhatja létre.</string>
<string name="barcodeId">Vonalkód értéke</string>
<string name="sameAsCardId">Ugyanaz, mint az azonosító</string>
<string name="setBarcodeId">Vonalkód értékének beállítása</string>
@@ -169,7 +169,7 @@
<string name="about">Névjegy</string>
<string name="app_copyright_old">Készült a Loyalty Card Keychain alapján
\nCopyright © 20162020 Branden Archer</string>
<string name="app_libraries">Szabad külső programkönyvtárak: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="app_libraries">Külső programkönyvtárak: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="settings_dark_theme">Sötét</string>
<string name="deleteConfirmationGroup">Csoport törlése\?</string>
<string name="noGroups">Koppintson a + gombra a csoportok kategorizálásához</string>
@@ -179,8 +179,8 @@
<string name="group_updated">Csoport frissítve</string>
<string name="expiryStateSentenceExpired">Lejárt: <xliff:g>%s</xliff:g></string>
<string name="groupsList">Csoportok: <xliff:g>%s</xliff:g></string>
<string name="importCatimaMessage">Válassza ki a megfelelő exportált Catima elemet importálásra. \nA menüben található Importálás/Exportálásl importálhat egy korábbi Catima exportot.</string>
<string name="importFidmeMessage">Jelölje ki az importálandó FidMe exportot, ezt követően adja meg kézileg a vonalkód típust. \nLétre tudja hozni a FidMe profiljából az Adatvédelmen belül a Adatom kinyerése opcióval.</string>
<string name="importCatimaMessage">Válassza ki a megfelelő exportált Catima elemet importálásra. \nAz Importálás/exportálás menüelemmel importálhat egy korábbi Catima exportot.</string>
<string name="importFidmeMessage">Jelölje ki az importálandó FidMe exportot, ezt követően adja meg kézileg a vonalkód típusát. \nA FidMe profiljából tudja létrehozni, az Adatvédelem, majd a Saját adatok kinyerése lehetőséggel.</string>
<plurals name="groupCardCountWithArchived">
<item quantity="one"><xliff:g>%1$d</xliff:g> kártya (<xliff:g id="archivedCount">%2$d</xliff:g> archiválva)</item>
<item quantity="other"><xliff:g>%1$d</xliff:g> kártya (<xliff:g id="archivedCount">%2$d</xliff:g> archiválva)</item>
@@ -202,7 +202,6 @@
<string name="newBalanceSentence">Új egyenleg: <xliff:g>%s</xliff:g></string>
<string name="cameraPermissionDeniedTitle">Nem sikerült hozzáférni a kamerához</string>
<string name="failedToRetrieveImageFile">Nem sikerült lekérni a képfájlt</string>
<string name="barcodeLongPressMessage">Csak képek nyithatók meg a galéria alkalmazásban</string>
<string name="unarchived">Kártya archiválása megszüntetve</string>
<string name="welcome">Üdvözöljük a Catimában</string>
<string name="updateBalance">Egyenleg frissítése</string>
@@ -218,8 +217,6 @@
<string name="switchToBackImage">Hátulnézeti képre váltás</string>
<string name="switchToBarcode">Vonalkódra váltás</string>
<string name="donate">Adományozás</string>
<string name="openBackImageInGalleryApp">Hátulnézeti kép megnyitása a galéria alkalmazásban</string>
<string name="openFrontImageInGalleryApp">Elölnézeti kép megnyitása a galéria alkalmazásban</string>
<string name="setBarcodeHeight">Vonalkód magasságának megadása</string>
<string name="icon_header_click_text">Hosszan nyomja meg a miniatűr szerkesztéséhez</string>
<string name="show_note">Megjegyzés megjelenítése</string>
@@ -253,7 +250,7 @@
<string name="app_name">Catima</string>
<string name="amountParsingFailed">Hibás érték</string>
<string name="add_manually_warning_title">Szkennelés ajánlott</string>
<string name="add_manually_warning_message">Egyes kártyákon levő számsor különbözik a vonalkód számától. Emiatt a manuális szám beírás nem minden esetben működni. Ajánlott tehát a vonalkód beolvasása kamerával. Biztosan folytatja?</string>
<string name="add_manually_warning_message">Az egyes kártyákon levő számsor különbözik a vonalkód számától. Emiatt a kézi számbeírás nem minden esetben fog működni. Ajánlott tehát a vonalkód kamerával történő beolvasása. Biztos, hogy folytatja?</string>
<string name="continue_">Tovább</string>
<string name="spend">Költött</string>
<string name="receive">Megkapott</string>
@@ -285,24 +282,25 @@
<string name="settings_column_count_7">7</string>
<string name="sort_by_valid_from">Érvényesség kezdete</string>
<string name="width">Szélesség</string>
<string name="setBarcodeWidth">Vonalkód szélesség beállítása</string>
<string name="settings_disable_nfc_while_viewing_card">NFC leállítása</string>
<string name="settings_disable_nfc_while_viewing_card_summary">Az NFC leállítása a kártya megtekintés erejéig, hogy ne indítsa be az NFC fizetést</string>
<string name="card_list_widget_name">Kártya lista</string>
<string name="card_list_widget_empty">Miután hozzáadja a kártyákat a Catima-hoz, itt fognak megjelenni. Ha vannak kártyái, győződjön meg, hogy nincsenek e archiválva.</string>
<string name="setBarcodeWidth">Vonalkódszélesség beállítása</string>
<string name="settings_disable_nfc_while_viewing_card">NFC szüneteltetése</string>
<string name="settings_disable_nfc_while_viewing_card_summary">Az NFC szüneteltetése a kártya megtekintése idejére, hogy ne indítsa be az NFC-s fizetést</string>
<string name="card_list_widget_name">Kártyalista</string>
<string name="card_list_widget_empty">Miután hozzáadja a kártyákat a Catimához, itt fognak megjelenni. Ha vannak kártyái, győződjön meg arról, hogy nincsenek-e archiválva.</string>
<string name="cardWithNumber"><xliff:g>%d</xliff:g> kártya</string>
<string name="cardWithNumberAndLocale"><xliff:g>%d</xliff:g> (<xliff:g>%s</xliff:g>) kártya</string>
<string name="pleaseDoNotRotateTheDevice">Kérem ne forgassa el az eszközt, mert az megszakítja a műveletet</string>
<string name="acra_catima_has_crashed">Sajnos a <xliff:g id="app_name">%s</xliff:g> összeomlott. Segítsen ezt a hibát megoldani, azzal, hogy elküldi a jelentést számunkra.</string>
<string name="acra_explain_crash">Ha lehetséges adja meg, hogy éppen milyen műveletet végzett:</string>
<string name="pleaseDoNotRotateTheDevice">Ne forgassa el az eszközt, mert az megszakítja a műveletet</string>
<string name="acra_catima_has_crashed">Sajnos a <xliff:g id="app_name">%s</xliff:g> összeomlott. Segítsen a hiba megoldásában azzal, hogy küld nekünk egy jelentést.</string>
<string name="acra_explain_crash">Ha lehetséges, adja meg, hogy éppen milyen műveletet végzett:</string>
<string name="acra_crash_email_subject"><xliff:g id="app_name">%s</xliff:g> összeomlási jelentés</string>
<string name="pref_enable_acra">Kérje az összeomlási jelentéseket</string>
<string name="pref_enable_acra_summary">Bekapcsolása esetén mindig kéri az összeomlási jelentés küldését. A jelentések sosem kerülnek küldésre automatikusan.</string>
<string name="pref_enable_acra">Rákérdezés az összeomlási jelentések elküldésére</string>
<string name="pref_enable_acra_summary">Ha be van kapcsolva, akkor mindig kérdez az összeomlási jelentés elküldésére. A jelentések sosem kerülnek küldésre automatikusan.</string>
<string name="copy_value">Érték másolása</string>
<string name="copied_to_clipboard">Vágólapra másolva</string>
<string name="nothing_to_copy">Nem található érték</string>
<string name="barcodeEncoding">Vonalkód kódolás</string>
<string name="barcodeEncoding">Vonalkód kódolása</string>
<string name="back">Vissza</string>
<string name="nfc_blocked_while_viewing_card">NFC leállítva</string>
<string name="nfc_blocked_while_viewing_card">NFC szüneteltetve</string>
<string name="change_settings">Beállítások változtatása</string>
<string name="nfc_block_system_error">Nem sikerült szüneteltetni az NFC-t</string>
</resources>
+9 -3
View File
@@ -189,7 +189,6 @@
<string name="archive">Arsip</string>
<string name="archived">Kartu diarsipkan</string>
<string name="failedToRetrieveImageFile">Gagal mengambil file gambar</string>
<string name="barcodeLongPressMessage">Hanya gambar yang dapat dibuka di aplikasi galeri</string>
<string name="unarchive">Ekstrak</string>
<string name="unarchived">Kartu tidak diarsipkan</string>
<string name="options">Opsi</string>
@@ -212,8 +211,6 @@
<string name="switchToFrontImage">Ubah ke depan gambar</string>
<string name="switchToBackImage">Ubah ke belakang gambar</string>
<string name="switchToBarcode">Ubah ke kode batang</string>
<string name="openFrontImageInGalleryApp">Buka gambar depan di aplikasi penampil gambar</string>
<string name="openBackImageInGalleryApp">Buka gambar di aplikasi penampil gambar</string>
<string name="setBarcodeHeight">Atur tinggi kode batang</string>
<string name="donate">Donasi</string>
<string name="show_validity">Tunjukkan validitas</string>
@@ -295,4 +292,13 @@
<string name="nothing_to_copy">Tidak ditemukan nilai</string>
<string name="barcodeEncoding">Pengkodean barcode</string>
<string name="back">Kembali</string>
<string name="settings_disable_nfc_while_viewing_card">Jeda NFC</string>
<string name="settings_disable_nfc_while_viewing_card_summary">Menjeda NFC untuk mencegah pembayaran NFC terpicu saat melihat kartu</string>
<string name="nfc_blocked_while_viewing_card">NFC dijeda</string>
<string name="change_settings">Ubah pengaturan</string>
<string name="nfc_block_system_error">Gagal menjeda NFC</string>
<string name="show_card_id">Tampilkan ID Kartu</string>
<string name="sort_by_most_recently_added">Terakhir ditambahkan</string>
<string name="zoomFrontImage">Perbesar gambar depan</string>
<string name="zoomBackImage">Perbesar gambar belakang</string>
</resources>
+1 -1
View File
@@ -86,7 +86,6 @@
<string name="barcodeImageDescriptionWithType">Mynd <xliff:g>%s</xliff:g> strikamerki</string>
<string name="importExport">Flytja inn/út</string>
<string name="importFailed">Gat ekki flutt inn</string>
<string name="app_name">Catima</string>
<plurals name="deleteCardsTitle">
<item quantity="one">Eyða <xliff:g>%d</xliff:g> korti</item>
<item quantity="other">Eyða <xliff:g>%d</xliff:g> kortum</item>
@@ -103,4 +102,5 @@
<string name="failedToOpenUrl">Settu inn vef-vafra fyrst</string>
<string name="welcome">Velkomin að Catima</string>
<string name="importCards">Flytja inn kort</string>
<string name="app_name">Catima</string>
</resources>
+8 -5
View File
@@ -110,8 +110,8 @@
<string name="addFromImage">Seleziona un\'immagine dalla galleria</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 di terze parti: <xliff:g id="app_resources_list"> %s </xliff:g></string>
<string name="app_libraries">Librerie di terze parti: <xliff:g id="app_libraries_list"> %s </xliff:g></string>
<string name="app_resources">Risorse di terze parti: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="app_libraries">Librerie di terze parti: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="intent_import_card_from_url_share_multiple_text">Voglio condividere alcune carte con te</string>
<string name="no">No</string>
<string name="yes"></string>
@@ -204,7 +204,6 @@
<string name="welcome">Benvenuti su Catima</string>
<string name="failedToOpenUrl">Installa prima un browser web</string>
<string name="failedToRetrieveImageFile">Impossibile ottenere il file dell\'immagine</string>
<string name="barcodeLongPressMessage">Si possono aprire solo immagini dell\'app della galleria</string>
<string name="cameraPermissionDeniedTitle">Impossibile accedere alla fotocamera</string>
<string name="noCameraPermissionDirectToSystemSetting">Per poter scansionare i codici a barre, Catima ha bisogno di accedere alla tua fotocamera. Premi qui per poter cambiare le impostazioni dei permessi.</string>
<string name="updateBalance">Aggiorna bilancio</string>
@@ -223,9 +222,7 @@
<string name="switchToFrontImage">Passa all\'immagine frontale</string>
<string name="switchToBackImage">Passa all\'immagine dietro</string>
<string name="switchToBarcode">Passa al codice a barre</string>
<string name="openFrontImageInGalleryApp">Apri immagine frontale nell\'app per la visualizzazione di immagini</string>
<string name="donate">Dona</string>
<string name="openBackImageInGalleryApp">Apri l\'immagine retro nell\'app per la visualizzazione di immagini</string>
<string name="setBarcodeHeight">Imposta l\'altezza del codice a barre</string>
<string name="icon_header_click_text">Premi a lungo per modificare l\'immagine</string>
<string name="show_note">Mostra nota</string>
@@ -311,4 +308,10 @@
<string name="settings_disable_nfc_while_viewing_card_summary">Sospende la funzione NFC per impedire che i pagamenti NFC vengano attivati durante la visualizzazione di una carta</string>
<string name="nfc_blocked_while_viewing_card">La funzione NFC è disattivata</string>
<string name="change_settings">Modifica impostazioni</string>
<string name="nfc_block_system_error">Impossibile mettere in pausa l\'NFC</string>
<string name="sort_by_most_recently_added">Aggiunte più di recente</string>
<string name="show_card_id">Mostra ID carta</string>
<string name="zoomFrontImage">Zoom immagine fronte</string>
<string name="zoomBackImage">Zoom immagine retro</string>
<string name="open_in_gallery">Apri nella galleria immagini</string>
</resources>
+6 -3
View File
@@ -233,7 +233,6 @@
<string name="showMoreInfo">情報を確認</string>
<string name="updateBalance">残高を更新</string>
<string name="failedToRetrieveImageFile">画像ファイルを取得できませんでした</string>
<string name="barcodeLongPressMessage">ギャラリーアプリは画像のみ開けます</string>
<string name="sort_by_valid_from">有効期限</string>
<string name="starred">スター付き</string>
<string name="include_if_asking_support">サポートを依頼する場合、以下の情報を含めて下さい:</string>
@@ -250,8 +249,6 @@
<string name="switchToFrontImage">前面画像へ切り替え</string>
<string name="switchToBackImage">背面画像へ切り替え</string>
<string name="switchToBarcode">バーコードへ切り替え</string>
<string name="openFrontImageInGalleryApp">前面画像を画像ビューワーアプリで開く</string>
<string name="openBackImageInGalleryApp">背面画像を画像ビューワーアプリで開く</string>
<string name="setBarcodeHeight">バーコードの高さを設定</string>
<string name="icon_header_click_text">サムネイルを長押しして編集</string>
<string name="settings_category_title_cards_overview">カードの概要</string>
@@ -298,4 +295,10 @@
<string name="settings_disable_nfc_while_viewing_card_summary">カードの表示中にNFC決済が誤って実行されないようにNFCを一時停止します</string>
<string name="nfc_blocked_while_viewing_card">NFCは停止中です</string>
<string name="change_settings">設定を変更する</string>
<string name="nfc_block_system_error">NFCの一時停止に失敗</string>
<string name="sort_by_most_recently_added">最近追加されたもの</string>
<string name="zoomFrontImage">券面を拡大</string>
<string name="zoomBackImage">背面を拡大</string>
<string name="show_card_id">カードIDを表示</string>
<string name="open_in_gallery">ギャラリーを開く</string>
</resources>
-1
View File
@@ -37,7 +37,6 @@
<string name="donate">ದಾನ ಮಾಡಿ</string>
<string name="action_more_options">ಹೆಚ್ಚಿನ ಆಯ್ಕೆಗಳು</string>
<string name="add_a_card_in_a_different_way">ಬೇರೆ ರೀತಿಯಲ್ಲಿ ಕಾರ್ಡ್ ಸೇರಿಸಿ</string>
<string name="barcodeLongPressMessage">ಗ್ಯಾಲರಿ ಅಪ್ಲಿಕೇಶನ್‌ನಲ್ಲಿ ಚಿತ್ರಗಳನ್ನು ಮಾತ್ರ ತೆರೆಯಬಹುದು</string>
<string name="all">ಎಲ್ಲವೂ</string>
<string name="chooseValidFromDate">ದಿನಾಂಕದಿಂದ ಮಾನ್ಯವಾಗಿ ಆಯ್ಕೆಮಾಡಿ</string>
<string name="delete">ಅಳಿಸಿ</string>
+23 -7
View File
@@ -82,7 +82,7 @@
<string name="takePhoto">사진 찍기</string>
<string name="yes"></string>
<string name="no">아니오</string>
<string name="failedGeneratingShareURL">공유 가능한 URL을 생성할 수 없습니다. 이를 개발자에게 알려 주십시오.</string>
<string name="failedGeneratingShareURL">공유 가능한 URL을 생성할 수 없습니다</string>
<string name="turn_flashlight_off">손전등 끄기</string>
<string name="settings_locale">언어</string>
<string name="settings_system_locale">시스템</string>
@@ -91,7 +91,6 @@
<string name="showMoreInfo">정보 보기</string>
<string name="updateBalance">잔액 업데이트</string>
<string name="failedToRetrieveImageFile">이미지 파일을 검색하지 못했습니다</string>
<string name="barcodeLongPressMessage">갤러리 앱에서는 이미지만 열 수 있습니다</string>
<string name="sort_by_name">이름</string>
<string name="reverse">... 역순으로</string>
<string name="sort_by">정렬 기준</string>
@@ -138,8 +137,6 @@
<string name="group_updated">그룹 업데이트됨</string>
<string name="moveBarcodeToTopOfScreen">바코드를 화면 상단으로 이동</string>
<string name="height"></string>
<string name="openFrontImageInGalleryApp">갤러리 앱에서 전면 이미지 열기</string>
<string name="openBackImageInGalleryApp">갤러리 앱에서 다시 이미지 열기</string>
<string name="setBarcodeHeight">바코드 높이 설정</string>
<string name="setFrontImage">전면 이미지 설정</string>
<plurals name="selectedCardCount">
@@ -149,12 +146,12 @@
<string name="noCameraPermissionDirectToSystemSetting">바코드를 스캔하려면 Catima가 카메라에 접근해야 합니다. 권한 설정을 변경하려면 여기를 탭하세요.</string>
<string name="exportOptionExplanation">데이터는 선택한 위치에 기록됩니다</string>
<string name="app_license">GPL v3+로 라이선스된 카피레프트 자유 소프트웨어</string>
<string name="failedOpeningFileManager">먼저 파일 관리자를 설치하십시오.</string>
<string name="failedOpeningFileManager">파일 관리자를 열 수 없습니다</string>
<string name="importSuccessful">데이터 들여옴</string>
<string name="group_name_is_empty">그룹 이름은 필수임</string>
<string name="chooseExpiryDate">만료일 선택</string>
<string name="settings_oled_dark">어두운 테마를 위한 검정색 배경</string>
<string name="noGroups">+ 더하기 버튼을 클릭하여 분류할 그룹 추가합니다.</string>
<string name="noGroups">+ 더하기 버튼을 눌러 카테고리 그룹 추가</string>
<string name="deleteConfirmationGroup">그룹을 삭제하시겠습니까\?</string>
<string name="errorReadingImage">이미지를 읽을 수 없습니다</string>
<string name="expiryStateSentence">만료: <xliff:g>%s</xliff:g></string>
@@ -262,7 +259,7 @@
<string name="useFrontImage">전면 이미지 사용</string>
<string name="useBackImage">후면 이미지 사용</string>
<string name="addFromPkpass">Passbook 파일 선택하기 (.pkpass)</string>
<string name="generic_error_please_retry">죄송합니다, 문제가 발생했습니다. 다시 시도해 주세요...</string>
<string name="generic_error_please_retry">오류가 발생했습니다</string>
<string name="settings_use_volume_keys_navigation">볼륨 버튼을 사용하여 카드 전환하기</string>
<string name="unsupportedFile">이 파일은 지원되지 않습니다</string>
<string name="settings_use_volume_keys_navigation_summary">볼륨 버튼을 사용하여 표시되는 카드를 변경합니다</string>
@@ -281,4 +278,23 @@
<string name="width">너비</string>
<string name="setBarcodeWidth">바코드 너비를 설정하세요</string>
<string name="card_list_widget_name">카드 목록</string>
<string name="settings_disable_nfc_while_viewing_card">NFC 일시 중지</string>
<string name="card_list_widget_empty">Catima에 멤버십 카드를 추가하면 여기에 표시됩니다. 카드가 있는데도 보이지 않는다면 모두 보관 처리되어 있지 않은지 확인해 보세요.</string>
<string name="pleaseDoNotRotateTheDevice">기기를 회전하지 마세요. 진행 중인 작업이 취소될 수 있습니다</string>
<string name="acra_catima_has_crashed">죄송합니다. <xliff:g id="app_name">%s</xliff:g> 앱이 종료되었습니다. 문제 해결을 위해 오류 리포트를 보내주세요.</string>
<string name="acra_crash_email_subject"><xliff:g id="app_name">%s</xliff:g> 크래시 리포트</string>
<string name="pref_enable_acra">오류 리포트 전송 요청</string>
<string name="pref_enable_acra_summary">이 기능을 켜면 오류가 발생했을 때 보고서 전송 여부를 확인합니다. 오류 리포트는 절대 자동으로 전송되지 않습니다.</string>
<string name="copy_value">값 복사</string>
<string name="copied_to_clipboard">클립보드에 복사됨</string>
<string name="nothing_to_copy">데이터를 찾을 수 없습니다</string>
<string name="back">돌아가기</string>
<string name="nfc_blocked_while_viewing_card">NFC 일시 중지됨</string>
<string name="change_settings">설정 변경</string>
<string name="nfc_block_system_error">NFC 일시 중지에 실패</string>
<string name="settings_disable_nfc_while_viewing_card_summary">카드를 보는 동안 NFC 결제가 실행되는 것을 방지하기 위해 NFC 기능을 일시 중지합니다</string>
<string name="cardWithNumber"><xliff:g>%d</xliff:g>번 카드</string>
<string name="cardWithNumberAndLocale"><xliff:g>%d</xliff:g> 번 카드 (<xliff:g>%s</xliff:g>)</string>
<string name="acra_explain_crash">가능하다면, 오류가 발생했을 때 어떤 작업을 하고 계셨는지 자세히 적어주세요:</string>
<string name="barcodeEncoding">바코드 인코딩</string>
</resources>
+21 -24
View File
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
<string name="action_add">Pridėti</string>
<string name="noGiftCards">Norėdami pridėti kortelę, spustelėkite mygtuką + arba importuokite kortelę iš ⋮ meniu.</string>
<string name="noGiftCards">Norėdami pridėti kortelę, spustelėkite mygtuką + arba importuokite iš ⋮ meniu</string>
<string name="storeName">Pavadinimas</string>
<string name="note">Užrašas</string>
<string name="cardId">Kortelės ID</string>
@@ -11,10 +11,10 @@
<string name="delete">Ištrinti</string>
<string name="confirm">Patvirtinti</string>
<string name="ok">Gerai</string>
<string name="editCardTitle">Redaguoti lojalumo kortelę</string>
<string name="addCardTitle">Pridėti lojalumo kortelę</string>
<string name="editCardTitle">Redaguoti kortelę</string>
<string name="addCardTitle">Pridėti kortelę</string>
<string name="scanCardBarcode">Nuskaityti brūkšninį kodą</string>
<string name="importExport">Importuoti/Exportuoti</string>
<string name="importExport">Importas/Exportas</string>
<string name="exportName">Exportuoti</string>
<string name="importFailed">Nepavyko importuoti</string>
<string name="exportFailed">Nepavyko eksportuoti</string>
@@ -43,10 +43,10 @@
<string name="app_loyalty_card_keychain">Lojalumo kortelės</string>
<string name="moveBarcodeToTopOfScreen">Perkelti brūkšninį kodą į ekrano viršų</string>
<string name="settings_display_barcode_max_brightness">Šviesinti ekraną</string>
<string name="failedParsingImportUriError">Nepavyko iššifruoti importo URI</string>
<string name="failedParsingImportUriError">Nepavyko nuskaityti importo URI</string>
<string name="turn_flashlight_off">Išjunkti žibintuvėlį</string>
<string name="turn_flashlight_on">Įjunkti žibintuvėlį</string>
<string name="failedGeneratingShareURL">Nepavyko sugeneruoti bendrinamo URL. Praneškite apie tai.</string>
<string name="failedGeneratingShareURL">Nepavyko sugeneruoti bendrinamo URL</string>
<string name="passwordRequired">Įveskite slaptažodį</string>
<string name="no">Ne</string>
<string name="yes">Taip</string>
@@ -65,11 +65,9 @@
<string name="setBarcodeId">Nustatyti brūkšninio kodo reikšmę</string>
<string name="sameAsCardId">Tokia pat kaip ID</string>
<string name="barcodeId">Brūkšninio kodo reikšmė</string>
<string name="importFidmeMessage">Pasirinkite <i>fidme-export-request-xxxxxx.zip</i> eksportą iš FidMe, kurį norite importuoti, ir po to brūkšninių kodų tipus pasirinkite rankiniu būdu.
\nSukurkite jį iš savo FidMe profilio, pasirinkę Duomenų apsauga ir pirmiausia paspaudę Išgauti mano duomenis.</string>
<string name="importFidmeMessage">Importavimui pasirinkite eksportą iš FidMe ir po to brūkšninių kodų tipus pasirinkite rankiniu būdu. \nSukurkite jį iš savo FidMe profilio pasirinkę \"Duomenų apsauga\" ir po to paspausdami \"Išgauti mano duomenis\".</string>
<string name="importFidme">Importuoti iš FidMe</string>
<string name="importCatimaMessage">Norėdami importuoti, pasirinkite savo <i> catima.zip </i> eksportavimą iš Catima.
\nSukurkite ją iš kitos Catima programos importavimo / eksportavimo meniu, pirmiausia ten paspausdami Eksportuoti.</string>
<string name="importCatimaMessage">Norėdami importuoti, pasirinkite savo <i> catima.zip </i> eksportavimą iš Catima. \nSukurkite ją iš kitos Catima programos importavimo/eksportavimo meniu paspausdami \"Eksportuoti\".</string>
<string name="importCatima">Importuoti iš Catima</string>
<string name="accept">Priimti</string>
<string name="privacy_policy">Privatumo politika</string>
@@ -87,14 +85,14 @@
<string name="balanceSentence">Balansas: <xliff:g>%s</xliff:g></string>
<string name="expiryStateSentenceExpired">Galiojimas baigėsi: <xliff:g>%s</xliff:g></string>
<string name="expiryStateSentence">Nustoja galioti: <xliff:g>%s</xliff:g></string>
<string name="groupsList">Grupės: <xliff:g> %s </xliff:g></string>
<string name="groupsList">Grupės: <xliff:g>%s</xliff:g></string>
<string name="addFromImage">Pasirinkti vaizdą iš galerijos</string>
<string name="addManually">Rankiniu būdu įvesti ID</string>
<string name="addManually">Įvesti barcodą rankiniu būdu</string>
<string name="leaveWithoutSaveConfirmation">Išeiti neišsaugojus\?</string>
<string name="leaveWithoutSaveTitle">Išeiti</string>
<string name="moveDown">Judėti žemyn</string>
<string name="moveUp">Judėti aukštyn</string>
<string name="failedOpeningFileManager">Pirmiausia įdiekite failų tvarkyklę.</string>
<string name="failedOpeningFileManager">Nepavyko atidaryti failų tvarkyklės</string>
<string name="deleteConfirmationGroup">Ištrinti grupę\?</string>
<string name="all">Visos</string>
<plurals name="groupCardCount">
@@ -102,7 +100,7 @@
<item quantity="few"><xliff:g>%d</xliff:g> kortelės</item>
<item quantity="other"><xliff:g>%d</xliff:g> kortelių</item>
</plurals>
<string name="noGroups">Spustelėkite mygtuką +, kad pridėtumėte grupes kategorizavimui.</string>
<string name="noGroups">Spustelėkite mygtuką +, kad pridėtumėte grupes kategorizavimui</string>
<string name="groups">Grupės</string>
<string name="enter_group_name">Įvesti grupės pavadinimą</string>
<string name="exportSuccessful">Duomenys eksportuoti</string>
@@ -117,20 +115,20 @@
<string name="settings">Nustatymai</string>
<string name="starImage">Mėgstamiausia žvaigždė</string>
<string name="thumbnailDescription">Miniatiūra</string>
<string name="app_resources">Laisvosios trečiųjų šalių ištekliai: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="app_libraries">Laisvosios trečiųjų šalių bibliotekos: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="app_resources">Trečiųjų šalių ištekliai: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="app_libraries">Trečiųjų šalių bibliotekos: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="app_copyright_old">Paremta Loyalty Card Keychain
\nautorinės teisės © 20162020 Branden Archer</string>
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Autorinės teisės © 2019<xliff:g>%d</xliff:g> Sylvia van Os</string>
<string name="importOptionFilesystemButton">Iš failų sistemos</string>
<string name="importOptionFilesystemExplanation">Pasirinkite konkretų failą iš failų sistemos.</string>
<string name="importOptionFilesystemExplanation">Pasirinkite konkretų failą iš failų sistemos</string>
<string name="importOptionFilesystemTitle">Importuoti iš failų sistemos</string>
<string name="exportOptionExplanation">Duomenys bus įrašyti į jūsų pasirinktą vietą.</string>
<string name="exportOptionExplanation">Duomenys bus įrašyti į jūsų pasirinktą vietą</string>
<string name="exportFailedTitle">Eksportuoti nepavyko</string>
<string name="exportSuccessfulTitle">Eksportuota</string>
<string name="importFailedTitle">Importuoti nepavyko</string>
<string name="importSuccessfulTitle">Importuota</string>
<string name="importExportHelp">Duomenų atsarginių kopijų darymas leidžia perkelti juos į kitą įrenginį.</string>
<string name="importExportHelp">Duomenų atsarginių kopijų darymas leidžia perkelti juos į kitą įrenginį</string>
<string name="noCardExistsError">Nepavyko rasti šios kortelės</string>
<string name="share">Dalintis</string>
<plurals name="selectedCardCount">
@@ -178,7 +176,7 @@
<string name="editGroup">Redaguojama grupė: <xliff:g>%s</xliff:g></string>
<string name="group_updated">Grupė atnaujinta</string>
<string name="group_edit">Redaguoti grupę</string>
<string name="noGiftCardsGroup">Sukurkite keletą kortelių ir priskirkite jas grupei čia.</string>
<string name="noGiftCardsGroup">Sukurkite keletą kortelių ir priskirkite jas grupei čia</string>
<string name="setIcon">Nustatyti piktogramą</string>
<string name="selectColor">Pasirinkti spalvą</string>
<string name="failedLaunchingPhotoPicker">Nepavyko rasti palaikomos galerijos programėlės</string>
@@ -191,7 +189,6 @@
</plurals>
<string name="updateBalance">Atnaujinti balansą</string>
<string name="failedToRetrieveImageFile">Nepavyko gauti vaizdo failo</string>
<string name="barcodeLongPressMessage">Galerijos programėlėje galima atidaryti tik vaizdus</string>
<string name="translate_platform">Weblate svetainėje</string>
<string name="shortcutSelectCard">Pasirinkti kortelę</string>
<string name="options">Parinktys</string>
@@ -220,7 +217,6 @@
<string name="importCards">Importuoti korteles</string>
<string name="storageReadPermissionRequired">Šio veiksmo atlikimui reikalinga prieiga prie saugyklos…</string>
<string name="cameraPermissionRequired">Šio veiksmo atlikimui reikalinga prieiga prie kameros…</string>
<string name="openBackImageInGalleryApp">Atidarykite galinį vaizdą galerijos programėlėje</string>
<string name="setBarcodeHeight">Nustatyti brūkšninio kodo aukštį</string>
<string name="validFromDate">Galioja nuo</string>
<string name="anyDate">Bet kuri data</string>
@@ -230,7 +226,6 @@
<string name="switchToBarcode">Perjungti į brūkšninį kodą</string>
<string name="height">Aukštis</string>
<string name="switchToFrontImage">Perjungti į priekinį vaizdą</string>
<string name="openFrontImageInGalleryApp">Atidarykite priekinį vaizdą galerijos programėlėje</string>
<string name="donate">Aukoti</string>
<string name="settings_keep_screen_on_summary">Išjungti ekrano užmigdymą kol peržiūrite kortelę</string>
<string name="manually_enter_barcode_instructions">Įveskite ID numerį arba tekstą ant jūsų kortelės ir paspauskite brūkšninį kodą, kuris atrodo kaip ant jūsų kortelės.</string>
@@ -251,7 +246,7 @@
<string name="add_manually_warning_title">Rekomenduojama skenuoti</string>
<string name="continue_">Tęsti</string>
<string name="add_manually_warning_message">Kai kuriuose parduotuvėse brūkšninio kodo vertė gali skirtis nuo kortelėje nurodyto numerio. Dėlto įvedus brūkšninį kodą rankiniu būdu gali nepavykti. Vietoj to, labai rekomenduojama nuskaityti brūkšninį kodą naudojant kamerą. Ar vis tiek norite tęsti?</string>
<string name="permissionReadCardsLabel">Skenuoti Catima Korteles</string>
<string name="permissionReadCardsLabel">Skaityti Catima korteles</string>
<string name="settings_category_title_cards">Kortelių peržiūra</string>
<string name="settings_category_title_general">Bendri</string>
<string name="settings_category_title_privacy">Privatumąi</string>
@@ -284,4 +279,6 @@
<string name="settings_column_count_portrait">Stulpeliai vertikaliame režime</string>
<string name="settings_column_count_landscape">Stulpeliai horizontaliame režime</string>
<string name="settings_automatic_column_count">Automatiškai</string>
<string name="settings_disable_nfc_while_viewing_card">NFC pauzė</string>
<string name="settings_disable_nfc_while_viewing_card_summary">Pristabdo NFC, kad peržiūrint kortelę nebūtų suaktyvinti NFC mokėjimai</string>
</resources>
+10 -3
View File
@@ -80,7 +80,6 @@
<string name="never">Nekad</string>
<string name="chooseExpiryDate">Izvēlēties beigu datumu</string>
<string name="failedToRetrieveImageFile">Neizdevās iegūt attēla datni</string>
<string name="barcodeLongPressMessage">Galerijas lietotnē var atvērt tikai attēlus</string>
<string name="sort_by_expiry">Derīgums</string>
<string name="reverse">...apgrieztā secībā</string>
<string name="credits">Pateicības</string>
@@ -215,7 +214,6 @@
<string name="icon_header_click_text">Ilgi piespiest, lai labotu sīktēlu</string>
<string name="anyDate">Jebkurš datums</string>
<string name="height">Augstums</string>
<string name="openBackImageInGalleryApp">Atvērt aizmugures attēlu attēlu skatītāja lietotnē</string>
<string name="donate">Ziedot</string>
<string name="field_must_not_be_empty">Lauks nedrīkst būt tukšs</string>
<string name="card_id_must_not_be_empty">Kartes identifikators nedrīkst būt tukšs</string>
@@ -224,7 +222,6 @@
<string name="noCameraFoundGuideText">Šķiet, ka ierīcei nav kameras. Ja tā tomēr ir, jāmēģina pārsāknēt ierīci. Pretējā gadījumā jāizmanto zemāk esošā poga \"Vairāk iespēju\", lai pievienot svītrkodu citā veidā.</string>
<string name="settings_allow_content_provider_read_title">Ļaut citām lietotnēm piekļūt maniem datiem</string>
<string name="settings_allow_content_provider_read_summary">Lietotnēm joprojām būs jāpieprasa atļauja, lai nodrošinātu piekļuvi</string>
<string name="openFrontImageInGalleryApp">Atvērt priekšpuses attēlu attēlu skatītāja lietotnē</string>
<string name="show_note">Rādīt piezīmi</string>
<string name="show_balance">Rādīt atlikumu</string>
<string name="settings_category_title_privacy">Privātums</string>
@@ -307,4 +304,14 @@
<string name="nothing_to_copy">Nav atrasta vērtība</string>
<string name="barcodeEncoding">Svītrkoda šifrēšana</string>
<string name="back">Atpakaļ</string>
<string name="nfc_block_system_error">Neizdevās apturēt NFC</string>
<string name="settings_disable_nfc_while_viewing_card">Apturēt NFC</string>
<string name="settings_disable_nfc_while_viewing_card_summary">Aptur NFC, lai novērstu NFC maksājumu izsaukšanu kartes apskatīšanas laikā</string>
<string name="nfc_blocked_while_viewing_card">NFC ir apturēts</string>
<string name="change_settings">Mainīt iestatījumus</string>
<string name="open_in_gallery">Atvērt attēlu galerijā</string>
<string name="sort_by_most_recently_added">Visnesenāk pievienotās</string>
<string name="zoomFrontImage">Pietuvināt priekšpuses attēlu</string>
<string name="zoomBackImage">Pietuvināt aizmugures attēlu</string>
<string name="show_card_id">Rādīt kartes Id</string>
</resources>
@@ -203,7 +203,6 @@
<string name="failedToOpenUrl">Installer en nettleser først</string>
<string name="welcome">Velkommen til Catima</string>
<string name="failedToRetrieveImageFile">Kunne ikke hente bildefil</string>
<string name="barcodeLongPressMessage">Kun bilder kan åpnes i galleriprogrammet</string>
<string name="cameraPermissionDeniedTitle">Fikk ikke tilgang til kameraet</string>
<string name="noCameraPermissionDirectToSystemSetting">Catima trenger kameratilgang for å skanne strekkoder. Trykk her for å endre tilgangsinnstillingene.</string>
<string name="importCards">Importer kort</string>
@@ -227,8 +226,6 @@
<string name="show_balance">Vis saldo</string>
<string name="show_note">Vis notat</string>
<string name="show_validity">Vis gyldighet</string>
<string name="openFrontImageInGalleryApp">Åpne frontbilde i galleriprogrammet</string>
<string name="openBackImageInGalleryApp">Åpne baksidebilde i galleriprogram</string>
<string name="setBarcodeHeight">Sett strekkodehøyde</string>
<string name="donate">Doner</string>
<string name="permissionReadCardsLabel">Les Catima-kort</string>
+6 -3
View File
@@ -199,7 +199,6 @@
<string name="welcome">Welkom bij Catima</string>
<string name="failedToOpenUrl">Installeer een webbrowser</string>
<string name="failedToRetrieveImageFile">De afbeelding kan niet worden opgehaald</string>
<string name="barcodeLongPressMessage">Alleen afbeeldingen kunnen worden geopend in de galerij-app</string>
<string name="cameraPermissionDeniedTitle">Geen cameratoegang</string>
<string name="updateBalanceTitle">Hoeveel heb je uitgegeven of ontvangen?</string>
<string name="noCameraPermissionDirectToSystemSetting">Catima heeft toegang tot je camera nodig om barcodes te kunnen scannen. Druk hier om toegang te verlenen.</string>
@@ -219,8 +218,6 @@
<string name="switchToFrontImage">Voorzijde tonen</string>
<string name="switchToBackImage">Achterzijde tonen</string>
<string name="switchToBarcode">Barcode tonen</string>
<string name="openFrontImageInGalleryApp">Voorzijde openen in afbeeldingsweergave-app</string>
<string name="openBackImageInGalleryApp">Achterzijde openen in afbeeldingsweergave-app</string>
<string name="donate">Doneren</string>
<string name="icon_header_click_text">Houd lang ingedrukt om miniatuur te bewerken</string>
<string name="show_balance">Saldo tonen</string>
@@ -305,4 +302,10 @@
<string name="settings_disable_nfc_while_viewing_card">Pauzeer NFC</string>
<string name="settings_disable_nfc_while_viewing_card_summary">Pauzeert NFC om te voorkomen dat NFC-betalingen activeren tijdens het bekijken van een kaart</string>
<string name="nfc_blocked_while_viewing_card">NFC is gepauzeerd</string>
<string name="nfc_block_system_error">Pauzeren van NFC mislukt</string>
<string name="sort_by_most_recently_added">Op onlangs toegevoegd</string>
<string name="show_card_id">Kaart ID tonen</string>
<string name="zoomFrontImage">Voorzijde inzoomen</string>
<string name="zoomBackImage">Achterzijde inzoomen</string>
<string name="open_in_gallery">Open in afbeeldingsgalerij</string>
</resources>
-3
View File
@@ -179,7 +179,6 @@
<string name="showMoreInfo">دیدن اطلاعات</string>
<string name="updateBalance">به‌روزرسانی موجودی</string>
<string name="failedToRetrieveImageFile">فایل تصویر بازیابی نشد</string>
<string name="barcodeLongPressMessage">فقط عکس میتونه تو گالری برنامه باز بشه</string>
<string name="sort_by_name">اسم</string>
<string name="sort_by_most_recently_used">جدیدا استفاده شده</string>
<string name="sort_by_valid_from">معتبر از</string>
@@ -228,8 +227,6 @@
<string name="switchToFrontImage">تغییر به عکس جلو</string>
<string name="switchToBackImage">تغییر به عکس عقب</string>
<string name="switchToBarcode">به بارکد تغییر بده</string>
<string name="openFrontImageInGalleryApp">عکس جلویی رو تو image viewer app باز کن</string>
<string name="openBackImageInGalleryApp">باز کردن عکس تو image viewer app</string>
<string name="setBarcodeHeight">تنظیم ارتفاع بارکد</string>
<string name="donate">کمک مالی کن</string>
<string name="icon_header_click_text">برای ویرایش عکس کوچیک، فشار طولانی بده</string>
+10 -3
View File
@@ -209,7 +209,6 @@
<item quantity="other"><xliff:g>%1$d</xliff:g> kart (<xliff:g id="archivedCount">%2$d</xliff:g> zarchwizowanych)</item>
</plurals>
<string name="failedToRetrieveImageFile">Nie udało się pobrać pliku obrazu</string>
<string name="barcodeLongPressMessage">W galerii możesz otworzyć tylko obrazy</string>
<string name="failedToOpenUrl">Najpierw zainstaluj przeglądarkę</string>
<string name="welcome">Witaj w Catima</string>
<string name="currentBalanceSentence">Bieżące saldo: <xliff:g>%s</xliff:g></string>
@@ -230,10 +229,8 @@
<string name="switchToFrontImage">Przełącz na obraz z przodu</string>
<string name="switchToBackImage">Przełącz na obraz z tyłu</string>
<string name="switchToBarcode">Przełącz na kod kreskowy</string>
<string name="openFrontImageInGalleryApp">Otwórz obraz z przodu w galerii</string>
<string name="setBarcodeHeight">Ustaw wysokość kodu kreskowego</string>
<string name="donate">Darowizna</string>
<string name="openBackImageInGalleryApp">Otwórz obraz z powrotem w galerii</string>
<string name="icon_header_click_text">Przytrzymaj, aby edytować miniaturę</string>
<string name="show_name_below_image_thumbnail">Pokaż nazwę pod miniaturką zdjęcia</string>
<string name="show_balance">Pokaż balans</string>
@@ -313,4 +310,14 @@
<string name="nothing_to_copy">Nie znaleziono wartości</string>
<string name="back">Wstecz</string>
<string name="barcodeEncoding">Kodowanie kodów kreskowych</string>
<string name="settings_disable_nfc_while_viewing_card">Zatrzymaj NFC</string>
<string name="settings_disable_nfc_while_viewing_card_summary">Wstrzymuje działanie funkcji NFC, aby zapobiec uruchomieniu płatności NFC podczas przeglądania karty</string>
<string name="nfc_blocked_while_viewing_card">NFC zostało zatrzymane</string>
<string name="change_settings">Zmień ustawienia</string>
<string name="nfc_block_system_error">Błąd podczas zatrzymania NFC</string>
<string name="sort_by_most_recently_added">Najnowsze dodane</string>
<string name="zoomFrontImage">Powiększ zdjęcie z przodu</string>
<string name="zoomBackImage">Powiększ zdjęcie z tyłu</string>
<string name="show_card_id">Pokaż ID karty</string>
<string name="open_in_gallery">Otwórz zdjęcie w galerii</string>
</resources>
+6 -3
View File
@@ -129,7 +129,6 @@
<string name="showMoreInfo">Mostrar informações</string>
<string name="updateBalance">Atualizar saldo</string>
<string name="failedToRetrieveImageFile">Falha ao recuperar o arquivo de imagem</string>
<string name="barcodeLongPressMessage">Apenas imagens podem ser abertas na galeria</string>
<string name="sort_by_most_recently_used">Usado mais recentemente</string>
<string name="reverse">...em ordem inversa</string>
<string name="sort_by">Ordenar por</string>
@@ -152,8 +151,6 @@
<string name="switchToBarcode">Mudar para código de barras</string>
<string name="switchToFrontImage">Mudar para imagem frontal</string>
<string name="switchToBackImage">Mudar para imagem traseira</string>
<string name="openFrontImageInGalleryApp">Abrir imagem frontal no visualizador de imagens</string>
<string name="openBackImageInGalleryApp">Abrir imagem traseira no visualizador de imagens</string>
<string name="setBarcodeHeight">Definir altura do código de barras</string>
<string name="donate">Doar</string>
<string name="icon_header_click_text">Pressione e segure para editar a miniatura</string>
@@ -311,4 +308,10 @@
<string name="settings_disable_nfc_while_viewing_card_summary">Suspende a tecnologia NFC para impedir que pagamentos NFC sejam acionados enquanto o cartão estiver sendo visualizado</string>
<string name="nfc_blocked_while_viewing_card">NFC está pausado</string>
<string name="change_settings">Alterar configurações</string>
<string name="nfc_block_system_error">Falha ao pausar o NFC</string>
<string name="sort_by_most_recently_added">Adicionados mais recentemente</string>
<string name="zoomFrontImage">Ampliar imagem frontal</string>
<string name="zoomBackImage">Reduzir o zoom da imagem</string>
<string name="show_card_id">Mostrar ID do cartão</string>
<string name="open_in_gallery">Abrir na galeria de imagens</string>
</resources>
+3 -3
View File
@@ -205,7 +205,6 @@
<string name="failedToOpenUrl">Instale primeiro um navegador de Internet</string>
<string name="welcome">Bem-vindo ao Catima</string>
<string name="failedToRetrieveImageFile">Falha ao recuperar o ficheiro de imagem</string>
<string name="barcodeLongPressMessage">Só podem ser abertas imagens na aplicação da galeria</string>
<string name="noCameraPermissionDirectToSystemSetting">Para digitalizar códigos de barras, o Catima tem de aceder à câmara. Clique aqui para mudar as configurações de permissão.</string>
<string name="cameraPermissionDeniedTitle">Não foi possível aceder à câmara</string>
<string name="importCards">Importar cartões</string>
@@ -224,8 +223,6 @@
<string name="height">Altura</string>
<string name="switchToBackImage">Mudar para a imagem de trás</string>
<string name="switchToBarcode">Mudar para o código de barras</string>
<string name="openFrontImageInGalleryApp">Abrir imagem frontal na app visualizadora de imagens</string>
<string name="openBackImageInGalleryApp">Abrir imagem traseira na app visualizadora de imagens</string>
<string name="setBarcodeHeight">Definir altura do código de barras</string>
<string name="donate">Doar</string>
<string name="show_validity">Mostrar validade</string>
@@ -311,4 +308,7 @@
<string name="settings_disable_nfc_while_viewing_card_summary">Pausa NFC para evitar que pagamentos de NFC sejam acionados enquanto visualiza um cartão</string>
<string name="nfc_blocked_while_viewing_card">NFC está pausado</string>
<string name="change_settings">Alterar configurações</string>
<string name="nfc_block_system_error">Falha ao pausar o NFC</string>
<string name="zoomFrontImage">Ampliar imagem frontal</string>
<string name="show_card_id">Mostrar ID do cartão</string>
</resources>
+4 -3
View File
@@ -194,7 +194,6 @@
<string name="showMoreInfo">Mostrar informações</string>
<string name="updateBalance">Atualizar saldo</string>
<string name="failedToRetrieveImageFile">Falha ao recuperar o arquivo de imagem</string>
<string name="barcodeLongPressMessage">Apenas imagens podem ser abertas na galeria</string>
<string name="sort_by_name">Nome</string>
<string name="sort_by_most_recently_used">Usado mais recentemente</string>
<string name="sort_by_valid_from">Válido a partir de</string>
@@ -244,8 +243,6 @@
<string name="switchToFrontImage">Mudar para imagem frontal</string>
<string name="switchToBackImage">Mudar para imagem traseira</string>
<string name="switchToBarcode">Mudar para código de barras</string>
<string name="openFrontImageInGalleryApp">Abrir imagem frontal no visualizador de imagens</string>
<string name="openBackImageInGalleryApp">Abrir imagem traseira no visualizador de imagens</string>
<string name="setBarcodeHeight">Definir altura do código de barras</string>
<string name="donate">Doar</string>
<string name="icon_header_click_text">Pressione e segure para editar a miniatura</string>
@@ -310,4 +307,8 @@
<string name="settings_disable_nfc_while_viewing_card_summary">Pausa NFC para evitar que pagamentos de NFC sejam acionados enquanto visualiza um cartão</string>
<string name="nfc_blocked_while_viewing_card">NFC está pausado</string>
<string name="change_settings">Alterar configurações</string>
<string name="nfc_block_system_error">Erro ao pausar o NFC</string>
<string name="zoomFrontImage">Ampliar imagem frontal</string>
<string name="show_card_id">Mostrar ID do cartão</string>
<string name="sort_by_most_recently_added">Adicionados mais recentemente</string>
</resources>
+57 -41
View File
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
<string name="barcodeType">Tip cod de bare</string>
<string name="cardId">Identificatorul cardului</string>
<string name="note">Notă</string>
<string name="cardId">ID-ul cardului</string>
<string name="note">Nota</string>
<string name="storeName">Numele</string>
<string name="noMatchingGiftCards">Nu au fost găsite rezultate. Încercați să schimbați termenii de căutare.</string>
<string name="noGiftCards">Faceți clic pe butonul + plus pentru a adăuga o carte sau mai întâi importați una din meniu.</string>
<string name="noGiftCards">Faceți clic pe butonul + plus pentru a adăuga un card sau importă din meniu</string>
<string name="action_add">Adăugați</string>
<string name="action_search">Căutare</string>
<string name="sendLabel">Trimiteți…</string>
@@ -25,17 +25,17 @@
<string name="settings_theme">Tema</string>
<string name="all">Toate</string>
<string name="noCardsMessage">Adăugați mai întâi un card</string>
<string name="noCardExistsError">Cardul nu a putut fi găsit</string>
<string name="noCardExistsError">N-am găsit cardul respectiv</string>
<string name="failedParsingImportUriError">Nu s-a putut analiza URI-ul de import</string>
<string name="importExport">Importă/Exportă</string>
<string name="importExport">Importă/exportă</string>
<string name="exportName">Exportați</string>
<string name="importSuccessfulTitle">Importat</string>
<string name="importFailedTitle">Importul a eșuat</string>
<string name="importFailed">Nu s-a putut efectua importarea</string>
<string name="exportFailed">Nu s-a putut efectua exportarea</string>
<string name="importing">Importul</string>
<string name="exporting">Exportul</string>
<string name="exportOptionExplanation">Datele vor fi scrise într-o locație aleasă de dumneavoastră.</string>
<string name="importing">Importare</string>
<string name="exporting">Exportare</string>
<string name="exportOptionExplanation">Datele vor fi scrise într-o locație aleasă de dumneavoastră</string>
<string name="importOptionFilesystemTitle">Import din sistemul de fișiere</string>
<string name="starImage">Stea de preferintă</string>
<string name="settings">Setări</string>
@@ -56,15 +56,15 @@
<string name="balance">Balanță</string>
<string name="importSuccessful">Date importate</string>
<string name="exportSuccessful">Date exportate</string>
<string name="noGroups">Faceți clic pe butonul + plus pentru a adăuga grupuri pentru clasificare.</string>
<string name="noGroups">Faceți clic pe butonul + plus pentru a adăuga grupuri pentru clasificare</string>
<string name="deleteConfirmationGroup">Ștergeți grupul\?</string>
<string name="failedOpeningFileManager">Instalați mai întâi un manager de fișiere.</string>
<string name="failedOpeningFileManager">Eșec în a deschide managerul de fișiere</string>
<string name="leaveWithoutSaveTitle">Ieșire</string>
<string name="addManually">Introduceți codul de bare manual</string>
<string name="currency">Monedă</string>
<string name="editBarcode">Editarea codului de bare</string>
<string name="chooseExpiryDate">Alegeți data de expirare</string>
<string name="selectBarcodeTitle">Selectare cod de bare</string>
<string name="selectBarcodeTitle">Selectează codul de bare</string>
<string name="noGroupCards">Acest grup este gol</string>
<string name="addFromImage">Selectați o imagine din galerie</string>
<string name="never">Niciodată</string>
@@ -74,21 +74,21 @@
<string name="moveBarcodeToTopOfScreen">Mutați codul de bare în partea de sus a ecranului</string>
<string name="errorReadingImage">Nu s-a putut citi imaginea</string>
<string name="points">Puncte</string>
<string name="cardShortcut">Scurtătură de card</string>
<string name="cardShortcut">Comandă rapidă pentru card</string>
<string name="scanCardBarcode">Scanați codul de bare</string>
<string name="importExportHelp">Copia de rezervă a datelor vă permite să le mutați pe un alt dispozitiv.</string>
<string name="importExportHelp">Copia de rezervă a datelor vă permite să le mutați pe un alt dispozitiv</string>
<string name="exportSuccessfulTitle">Exportat</string>
<string name="exportFailedTitle">Export eșuat</string>
<string name="importOptionFilesystemExplanation">Alegeți un anumit fișier din sistemul de fișiere.</string>
<string name="importOptionFilesystemExplanation">Alegeți un anumit fișier din sistemul de fișiere</string>
<string name="thumbnailDescription">Miniatură</string>
<string name="enter_group_name">Introduceți numele grupului</string>
<string name="yes">Da</string>
<string name="no">Nu</string>
<string name="archive">Arhivare</string>
<string name="passwordRequired">Vă rugăm, introduceți parola</string>
<string name="passwordRequired">Introduceți parola</string>
<string name="unsupportedBarcodeType">Acest tip de cod de bare nu poate fi afișat. Este posibil ca acesta să se poată afișa într-o versiune mai nouă a aplicației.</string>
<string name="photos">Imagini</string>
<string name="noGiftCardsGroup">Creați câteva carduri, iar apoi atribuiți-le grupului de aici.</string>
<string name="noGiftCardsGroup">Creați câteva carduri, iar apoi atribuiți-le grupului de aici</string>
<string name="importCatima">Importați din Catima</string>
<string name="intent_import_card_from_url_share_multiple_text">Aș dori să partajez niște carduri cu tine</string>
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Drepturi de autor © 2019<xliff:g>%d</xliff:g> Sylvia van Os și contribuitorii</string>
@@ -99,7 +99,6 @@
<string name="exportPasswordHint">Introduceți o parolă</string>
<string name="about_title_fmt">Despre <xliff:g id="app_name">%s</xliff:g></string>
<string name="barcodeImageDescriptionWithType">Imagine <xliff:g>%s</xliff:g> cod de bare</string>
<string name="openFrontImageInGalleryApp">Deschideți imaginea frontală în aplicația galerie</string>
<string name="show_name_below_image_thumbnail">Afișați numele sub imaginea miniaturii</string>
<string name="removeImage">Ștergeți imaginea</string>
<string name="help_translate_this_app">Ajutați la traducerea aplicației</string>
@@ -107,7 +106,7 @@
<string name="add_a_card_in_a_different_way">Adăugați un card într-o altă modalitate</string>
<string name="takePhoto">Faceți o poză</string>
<string name="validFromDate">Valid de la data de</string>
<string name="cameraPermissionDeniedTitle">Camera nu a putut fi accesată</string>
<string name="cameraPermissionDeniedTitle">Camera n-a putut fi accesată</string>
<string name="wrongValueForBarcodeType">Valoarea nu este validă pentru tipul de cod de bare selectat</string>
<string name="welcome">Bine ați venit la Catima</string>
<string name="and_data_usage">și utilizarea datelor</string>
@@ -122,7 +121,6 @@
<string name="height">Înălțime</string>
<string name="expiryStateSentence">Expiră: <xliff:g>%s</xliff:g></string>
<string name="setIcon">Setați miniatura</string>
<string name="barcodeLongPressMessage">Doar imagini pot fi deschise în aplicația galerie</string>
<string name="settings_category_title_general">General</string>
<string name="manually_enter_barcode_instructions">Introduceți numărul de identificare sau textul de pe cardul dumneavoastră iar apoi selectați codul de bare ce arată ca și cel de pe cardul dumneavoastră.</string>
<string name="balanceSentence">Sold: <xliff:g>%s</xliff:g></string>
@@ -132,7 +130,7 @@
<string name="action_more_options">Mai multe opțiuni</string>
<string name="app_copyright_old">Bazat pe Loyalty Card Keychain
\ndrepturi de autor rezervate © 2016-2020 Branden Archer</string>
<string name="importVoucherVaultMessage">Selectați exportul dvs. <i>vouchervault.json</i> din Voucher Vault pentru a-l importa.\nCreați întâi fișierul prin apăsarea butonului Export în Voucher Vault.</string>
<string name="importVoucherVaultMessage">Selectați exportul dumneavoastră din Voucher Vault pentru import.\nCreați întâi fișierul prin apăsarea butonului Export în Voucher Vault.</string>
<string name="chooseImportType">Importați date din</string>
<string name="frontImageDescription">Imagine frontală</string>
<string name="showMoreInfo">Afișați informații</string>
@@ -140,9 +138,9 @@
<string name="setBackImage">Setați imaginea din spate</string>
<string name="permissionReadCardsDescription">citiți cardurile dumneavoastră Catima și toate detaliile lor, inclusiv notițele și imaginile</string>
<string name="anyDate">Orice dată</string>
<string name="failedLaunchingPhotoPicker">Nu a putut fi găsită o aplicație galerie suportată</string>
<string name="failedLaunchingPhotoPicker">N-a putut fi găsită o aplicație galerie suportată</string>
<string name="expiryStateSentenceExpired">Expirat: <xliff:g>%s</xliff:g></string>
<string name="source_repository">Repozitor Sursă</string>
<string name="source_repository">Depozit sursă</string>
<string name="groupsList">Grupuri: <xliff:g>%s</xliff:g></string>
<string name="enter_card_id">Introduceți numărul de identificare sau textul de pe cardul dumneavoastră</string>
<string name="unarchived">Card dezarhivat</string>
@@ -181,19 +179,18 @@
<string name="settings_allow_content_provider_read_summary">Aplicațiile vor trebui totuși să solicite permisiunea pentru a primi acces</string>
<string name="license">Licență</string>
<string name="newBalanceSentence">Balanța nouă: <xliff:g>%s</xliff:g></string>
<string name="editGroup">Editarea grupului: <xliff:g>%s</xliff:g></string>
<string name="editGroup">Grup de editare: <xliff:g>%s</xliff:g></string>
<plurals name="groupCardCountWithArchived">
<item quantity="one"><xliff:g>%1$d</xliff:g> card (<xliff:g id="archivedCount">%2$d</xliff:g> arhivat)</item>
<item quantity="few"><xliff:g>%1$d</xliff:g> carduri (<xliff:g id="archivedCount">%2$d</xliff:g> arhivate)</item>
<item quantity="other"><xliff:g>%1$d</xliff:g> de carduri (<xliff:g id="archivedCount">%2$d</xliff:g> arhivate)</item>
</plurals>
<string name="sameAsCardId">Acelașil cu identificatorul</string>
<string name="sameAsCardId">Același cu identificatorul</string>
<string name="options">Opțiuni</string>
<string name="failedGeneratingShareURL">Nu s-a putut genera un URL partajabil. Vă rugăm să raportați aceasta eroare.</string>
<string name="failedGeneratingShareURL">Nu s-a putut genera o adresă URL care poate fi partajată.</string>
<string name="selectColor">Selectați o culoare</string>
<string name="setBarcodeHeight">Setați înălțimea codului de bare</string>
<string name="privacy_policy">Politica de Confidențialitate</string>
<string name="openBackImageInGalleryApp">Deschideți imaginea din spate în aplicația galerie</string>
<string name="privacy_policy">Politica de confidențialitate</string>
<string name="settings_system_locale">Sistem</string>
<string name="updateBalance">Actualizați balanța</string>
<string name="sort_by_most_recently_used">Cele mai recent utilizate</string>
@@ -202,10 +199,10 @@
<string name="settings_locale">Limbă</string>
<string name="sort_by_name">Nume</string>
<string name="setFrontImage">Setați imaginea din față</string>
<string name="cameraPermissionRequired">Pentru această acțiune este necesară permisiunea de acces la camera </string>
<string name="cameraPermissionRequired">Permisiunea de acces la cameră este necesară pentru această acțiune</string>
<string name="settings_allow_content_provider_read_title">Permiteți altor aplicații să acceseze datele mele</string>
<string name="updateBarcodeQuestionText">Ați schimbat identificatorul. Doriți să actualizați și codul de bare pentru a utiliza aceeași valoare?</string>
<string name="importLoyaltyCardKeychainMessage">Selectați exportul dvs. <i>LoyaltyCardKeychain.csv</i> din Loyalty Card Keychain pentru a-l importa. \nCreați întâi fișierul din meniul Import/Export în Loyalty Card Keychain prin apăsarea butonului Export.</string>
<string name="importLoyaltyCardKeychainMessage">Selectați exportul dumneavoastră din Loyalty Card Keychain pentru import.\nCreați întâi fișierul din meniul Import/Export în Loyalty Card Keychain prin apăsarea butonului Export.</string>
<string name="currentBalanceSentence">Balanța curentă: <xliff:g>%s</xliff:g></string>
<string name="importLoyaltyCardKeychain">Importați din Loyalty Card Keychain</string>
<string name="group_updated">Grup actualizat</string>
@@ -213,7 +210,7 @@
<string name="on_github">pe GitHub</string>
<string name="sort">Sortați</string>
<string name="permissionReadCardsLabel">Citiți cardurile Catima</string>
<string name="storageReadPermissionRequired">Pentru această acțiune este necesară permisiunea de citire a mediului de stocare …</string>
<string name="storageReadPermissionRequired">Permisiunea de citire a spațiului de stocare este necesară pentru această acțiune</string>
<plurals name="deleteCardsConfirmation">
<item quantity="one">Ștergeți acest <xliff:g>%d</xliff:g> card permanent?</item>
<item quantity="few">Ștergeți aceste <xliff:g>%d</xliff:g> carduri permanent?</item>
@@ -226,9 +223,9 @@
<string name="group_name_already_in_use">Acest nume de grup este deja utilizat</string>
<string name="include_if_asking_support">Dacă doriți să cereți ajutor, includeți informațiile următoare:</string>
<string name="show_archived_cards">Afișați cardurile arhivate</string>
<string name="app_libraries">Listă de biblioteci libere de la terți: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="app_libraries">Biblioteci terțe: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="updateBalanceTitle">Cât de mult ați cheltuit sau primit?</string>
<string name="app_resources">Listă de resurse gratuite de la terți: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="app_resources">Resurse terțe: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="app_name">Catima</string>
<string name="shortcutSelectCard">Selectați un card</string>
<string name="accept">Acceptă</string>
@@ -245,26 +242,26 @@
<item quantity="few"><xliff:g>%d</xliff:g> selectate</item>
<item quantity="other"><xliff:g>%d</xliff:g> selectate</item>
</plurals>
<string name="version_history">Istoric versiuni</string>
<string name="importCatimaMessage">Selectați exportul dvs. <i>catima.zip</i> din Catima pentru a importa. \nCreați întâi fișierul din meniul Import/Export al unei alte aplicații Catima apăsând acolo butonul de Export.</string>
<string name="version_history">Istoricul versiunilor</string>
<string name="importCatimaMessage">Selectați exportul dumneavoastră din Catima pentru import.\nCreați întâi fișierul din meniul Import/Export al unei alte aplicații Catima apăsând butonul de Export.</string>
<plurals name="balancePoints">
<item quantity="one"><xliff:g>%s</xliff:g> punct</item>
<item quantity="few"><xliff:g>%s</xliff:g> puncte</item>
<item quantity="other"><xliff:g>%s</xliff:g> de puncte</item>
</plurals>
<string name="importFidmeMessage">Selectați exportul dvs. <i>fidme-export-request-xxxxx.zip</i> din FidMe pentru a-l importa, și apoi selectați tipurile de cod de bare manual.\nCreați întâi fișierul din profilul dvs. FidMe prin alegerea Protecție Date și apoi apăsând Extrageți datele mele.</string>
<string name="importFidmeMessage">Selectați exportul dumneavoastră din FidMe pentru import si selectați manual tipurile de coduri de bare dupa.\nCreați întâi fișierul din profilul dvs. FidMe prin alegerea Protecție Date și apoi apăsând Extrageți datele mele.</string>
<string name="updateBarcodeQuestionTitle">Actualizați valoarea codului de bare?</string>
<string name="settings_keep_screen_on_summary">Dezactivează temporizatorul de ecran când vizualizați un card</string>
<string name="rate_this_app">Acordați o recenzie acestei aplicații</string>
<string name="credits">Contribuitori</string>
<string name="continue_">Continua</string>
<string name="add_manually_warning_title">Se recomandă scanarea</string>
<string name="add_manually_warning_message">Pentru unele magazine, valoarea codului de bare diferă de numărul scris pe card. Din acest motiv, este posibil ca introducerea manuală a unui cod de bare să nu funcționeze întotdeauna. În schimb, este recomandat să scanați codul de bare cu camera dvs. Mai vrei să continui?</string>
<string name="add_manually_warning_message">Pentru unele carduri, valoarea codului de bare diferă de numărul scris pe card. Din acest motiv, este posibil ca introducerea manuală a unui cod de bare să nu funcționeze întotdeauna. În schimb, este recomandat să scanați codul de bare cu camera dvs. Mai vrei să continui?</string>
<string name="spend">Cheltuie</string>
<string name="receive">Primește</string>
<string name="amountParsingFailed">Sumă invalidă</string>
<string name="addFromPdfFile">Selectați un fișier PDF</string>
<string name="errorReadingFile">Nu am putut citi fișierul</string>
<string name="errorReadingFile">N-am putut citi fișierul</string>
<string name="failedLaunchingFileManager">Nu s-a găsit un manager de fișiere suportat</string>
<string name="multipleBarcodesFoundPleaseChooseOne">Care dintre codurile de bare găsite dorești să-l folosești?</string>
<string name="pageWithNumber">Pagina <xliff:g>%d</xliff:g></string>
@@ -285,12 +282,31 @@
<string name="settings_column_count_7">7</string>
<string name="settings_column_count_landscape">Coloane in mod orizontal</string>
<string name="settings_category_title_cards_overview">Vedere de ansamblu al cardlui</string>
<string name="sort_by_valid_from">Forma validă</string>
<string name="sort_by_valid_from">Valabil de la</string>
<string name="settings_column_count_portrait">Coloane in mod portret</string>
<string name="addFromPkpass">Selectează un fișier de tip Passbook (.pkpass)</string>
<string name="addFromPkpass">Selectează un fișier de tip Passbook (.pkpass / .pkpasses)</string>
<string name="unsupportedFile">Acest fișier nu este suportat</string>
<string name="generic_error_please_retry">Scuze, ceva nu a funționat. Încearcă din nou ...</string>
<string name="generic_error_please_retry">A apărut o eroare</string>
<string name="width">Lățime</string>
<string name="setBarcodeWidth">Setează Lățimea Codului de Bare</string>
<string name="setBarcodeWidth">Setează lățimea codului de bare</string>
<string name="card_list_widget_name">Listă de carduri</string>
<string name="settings_disable_nfc_while_viewing_card">Pauză NFC</string>
<string name="settings_disable_nfc_while_viewing_card_summary">Pauză NFC pentru a preveni declanșarea plăților NFC în timpul vizualizării unui card</string>
<string name="card_list_widget_empty">După ce adăugați carduri de fidelitate în Catima, ele vor apărea aici. Dacă aveți carduri, fi-ți sigur că ele nu sunt arhivate.</string>
<string name="cardWithNumber">Card <xliff:g>%d</xliff:g></string>
<string name="cardWithNumberAndLocale">Card <xliff:g>%d</xliff:g> (<xliff:g>%s</xliff:g>)</string>
<string name="pleaseDoNotRotateTheDevice">Vă rog să nu rotiți dispozitivul, deoarece acest lucru va anula acțiunea</string>
<string name="acra_catima_has_crashed">Ne cerem scuze, dar <xliff:g id="app_name">%s</xliff:g> s-a oprit. Vă rog să ne ajutați să rezolvăm problema, trimițându-ne un raport de eroare.</string>
<string name="acra_explain_crash">Dacă este posibil, vă rog să adăugați mai multe detalii despre ce ați făcut aici:</string>
<string name="acra_crash_email_subject"><xliff:g id="app_name">%s</xliff:g> raport de crash</string>
<string name="pref_enable_acra">Cere să trimiți rapoarte de crash</string>
<string name="pref_enable_acra_summary">Când este activat, veți fi întrebat să raportați crash-ul când se întâmpla. Raporturile de crash nu sunt niciodata trimise automat.</string>
<string name="copy_value">Copiază valoarea</string>
<string name="copied_to_clipboard">Copiat în clipboard</string>
<string name="nothing_to_copy">Nicio valoare găsită</string>
<string name="barcodeEncoding">Codarea codului de bare</string>
<string name="back">Înapoi</string>
<string name="nfc_blocked_while_viewing_card">NFC este pus pe pauza</string>
<string name="change_settings">Schimbă setările</string>
<string name="nfc_block_system_error">Nu s-a putut întrerupe NFC-ul</string>
</resources>
+6 -3
View File
@@ -211,7 +211,6 @@
<string name="welcome">Добро пожаловать в Catima</string>
<string name="failedToOpenUrl">Сначала необходимо установить браузер</string>
<string name="failedToRetrieveImageFile">Невозможно получить файл изображения</string>
<string name="barcodeLongPressMessage">В приложении галереи можно открывать только изображения</string>
<string name="noCameraPermissionDirectToSystemSetting">Для сканирования штрих-кодов Catima требуется доступ к камере устройства. Нажмите здесь, чтобы изменить настройки разрешений.</string>
<string name="updateBalance">Обновить баланс</string>
<string name="newBalanceSentence">Новый баланс: <xliff:g>%s</xliff:g></string>
@@ -231,8 +230,6 @@
<string name="switchToBarcode">Переключить на штрих-код</string>
<string name="switchToFrontImage">Переключить на лицевую сторону</string>
<string name="switchToBackImage">Переключить на заднюю сторону</string>
<string name="openFrontImageInGalleryApp">Открыть лицевое изображение в приложении просмотра изображений</string>
<string name="openBackImageInGalleryApp">Открыть заднее изображение в приложении просмотра изображений</string>
<string name="donate">Пожертвовать</string>
<string name="icon_header_click_text">Долгое нажатие для редактирования</string>
<string name="show_note">Показывать примечание</string>
@@ -317,4 +314,10 @@
<string name="settings_disable_nfc_while_viewing_card">Отключать NFC</string>
<string name="nfc_blocked_while_viewing_card">NFC приостановлен</string>
<string name="change_settings">Изменить настройки</string>
<string name="nfc_block_system_error">Приостановка NFC невозможна</string>
<string name="sort_by_most_recently_added">Порядок добавления</string>
<string name="show_card_id">Показывать номер карты</string>
<string name="zoomFrontImage">Масштабирование лицевого изображения</string>
<string name="zoomBackImage">Масштабирование заднего изображения</string>
<string name="open_in_gallery">Открыть в галерее</string>
</resources>
-3
View File
@@ -210,7 +210,6 @@
<item quantity="few"><xliff:g>%1$d</xliff:g> karty (<xliff:g id="archivedCount">%2$d</xliff:g> archivované)</item>
<item quantity="other"><xliff:g>%1$d</xliff:g> kariet (<xliff:g id="archivedCount">%2$d</xliff:g> archivovaných)</item>
</plurals>
<string name="barcodeLongPressMessage">V aplikácii galéria je možné otvoriť iba obrázky</string>
<string name="cameraPermissionDeniedTitle">Nepodarilo sa získať prístup k fotoaparátu</string>
<string name="storageReadPermissionRequired">Pre túto akciu je potrebné oprávnenie na čítanie úložiska…</string>
<string name="importFidmeMessage">Vyberte svoj export zo služby FidMe pre import a potom vyberte typy čiarových kódov ručne.\nVytvorte ho z profilu FidMe tak, že vyberiete položku Ochrana údajov a potom stlačíte tlačidlo Extrahovať moje údaje.</string>
@@ -226,8 +225,6 @@
<string name="settings_keep_screen_on_summary">Ponechať obrazovku aktívnu počas prezerania karty</string>
<string name="settings_display_barcode_max_brightness_summary">Pre zaistenie čitateľnosti pre niektoré skenery</string>
<string name="settings_allow_content_provider_read_summary">Aplikácie budú musieť stále žiadať o povolenie, aby im bol udelený prístup</string>
<string name="openBackImageInGalleryApp">Otvorenie zadného obrázka v prehliadači obrázkov</string>
<string name="openFrontImageInGalleryApp">Otvorenie predného obrázka v prehliadači obrázkov</string>
<string name="setBarcodeHeight">Nastavenie výšky čiarového kódu</string>
<string name="show_balance">Ukážte zostatok</string>
<string name="show_name_below_image_thumbnail">Zobraziť názov pod miniatúrou obrázka</string>
+10 -3
View File
@@ -211,7 +211,6 @@
<string name="settings_oled_dark">Čisto črno ozadje za temno temo</string>
<string name="selectColor">Izberi barvo</string>
<string name="app_contributors">Omogočeno od: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="barcodeLongPressMessage">V aplikaciji za gledanje slik lahko odpremo samo slike</string>
<plurals name="groupCardCountWithArchived">
<item quantity="one"><xliff:g>%1$d</xliff:g> kartica (<xliff:g id="archivedCount">%2$d</xliff:g> arhivirana)</item>
<item quantity="two"><xliff:g>%1$d</xliff:g> kartici (<xliff:g id="archivedCount">%2$d</xliff:g> arhivirani)</item>
@@ -287,8 +286,6 @@
<string name="switchToFrontImage">Preklopi na prednjo sliko</string>
<string name="switchToBackImage">Preklopi na zadnjo sliko</string>
<string name="switchToBarcode">Preklopi na črtno kodo</string>
<string name="openFrontImageInGalleryApp">Odpri sprednjo sliko v aplikaciji za slike</string>
<string name="openBackImageInGalleryApp">Odpri zadnjo sliko v aplikaciji za slike</string>
<string name="setBarcodeHeight">Nastavi višino črtne kode</string>
<string name="useFrontImage">Uporabi prednjo sliko</string>
<string name="useBackImage">Uporabi zadnjo sliko</string>
@@ -312,4 +309,14 @@
<string name="nothing_to_copy">Nobena vrednost ni najdena</string>
<string name="barcodeEncoding">Kodiranje črtne kode</string>
<string name="back">Nazaj</string>
<string name="settings_disable_nfc_while_viewing_card">Pavza NFC</string>
<string name="settings_disable_nfc_while_viewing_card_summary">Začasno ustavi NFC, da prepreči sprožitev plačil NFC med ogledovanjem kartice</string>
<string name="nfc_blocked_while_viewing_card">NFC je zaustavljen</string>
<string name="change_settings">Spremeni nastavitve</string>
<string name="nfc_block_system_error">ustavitev NFC-ja ni uspela</string>
<string name="sort_by_most_recently_added">Nazadnje dodane</string>
<string name="zoomFrontImage">Povečaj sprednjo sliko</string>
<string name="zoomBackImage">Povečaj zadnjo sliko</string>
<string name="show_card_id">Prikaži ID kartice</string>
<string name="open_in_gallery">Odpri v galeriji slik</string>
</resources>
+5 -3
View File
@@ -169,7 +169,6 @@
<string name="height">Visina</string>
<string name="switchToFrontImage">Prebaci na prednju fotografiju</string>
<string name="switchToBarcode">Prebaci na bar-kod</string>
<string name="openFrontImageInGalleryApp">Otvori prednju fotografiju u prikazivaču fotografija</string>
<string name="setBarcodeHeight">Postavi visinu bar-koda</string>
<string name="donate">Doniraj</string>
<string name="icon_header_click_text">Dugi pritisak za izmenu naslovne fotografije</string>
@@ -239,7 +238,6 @@
<string name="updateBarcodeQuestionText">Promenio si broj kartice. Da li želiš da ažuriraš i bar-kod da bude iste vrednosti?</string>
<string name="no">Ne</string>
<string name="app_contributors">Saradnici: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="barcodeLongPressMessage">Samo fotografije mogu da se otvore u galerija aplikaciji</string>
<string name="translate_platform">na Weblate-u</string>
<plurals name="groupCardCountWithArchived">
<item quantity="one"><xliff:g>%1$d</xliff:g> kartica (<xliff:g id="archivedCount">%2$d</xliff:g> arhivirana)</item>
@@ -249,7 +247,6 @@
<string name="include_if_asking_support">Ako želiš da zatražiš podršku, ubaci sledeće informacije:</string>
<string name="newBalanceSentence">Novo stanje: <xliff:g>%s</xliff:g></string>
<string name="switchToBackImage">Prebaci na zadnju fotografiju</string>
<string name="openBackImageInGalleryApp">Otvori zadnju fotografiju u prikazivaču fotografija</string>
<string name="settings_category_title_cards">Pregled kartica</string>
<string name="addWithoutBarcode">Dodaj karticu bez bar-koda</string>
<string name="enter_card_id">Unesite broj ili tekst sa kartice</string>
@@ -307,4 +304,9 @@
<string name="nothing_to_copy">Nije pronađena vrednost</string>
<string name="barcodeEncoding">Enkodiranje bar-koda</string>
<string name="back">Nazad</string>
<string name="settings_disable_nfc_while_viewing_card">Застани НФЦ</string>
<string name="settings_disable_nfc_while_viewing_card_summary">Застани НФЦ ради спречавања окидања плаћања НФЦ-ом приликом прегледа картице</string>
<string name="nfc_blocked_while_viewing_card">НФЦ је заустављен</string>
<string name="change_settings">Измени поставке</string>
<string name="nfc_block_system_error">Нисам успео застанути НФЦ</string>
</resources>
+10 -3
View File
@@ -209,11 +209,9 @@
<string name="cameraPermissionRequired">Behörighet att komma åt kameran krävs för denna åtgärd…</string>
<string name="updateBalance">Uppdatera balans</string>
<string name="failedToRetrieveImageFile">Misslyckades att hämta bildfil</string>
<string name="barcodeLongPressMessage">Endast bilder kan öppnas i galleriappen</string>
<string name="updateBalanceTitle">Hur mycket spenderade du eller fick du?</string>
<string name="updateBalanceHint">Ange summa</string>
<string name="newBalanceSentence">Ny balans: <xliff:g>%s</xliff:g></string>
<string name="openFrontImageInGalleryApp">Öppna bilden på framsidan i bildvisningsappen</string>
<string name="show_name_below_image_thumbnail">Visa namnet nedanför bildens miniatyr</string>
<string name="show_validity">Visa giltighet</string>
<string name="view_online">Visa på internet</string>
@@ -233,7 +231,6 @@
<string name="switchToFrontImage">Byt till bilden på framsidan</string>
<string name="settings_allow_content_provider_read_summary">Appar måste fortfarande begära åtkomst för att få tillgång</string>
<string name="setBarcodeHeight">Ställ in streckkodens höjd</string>
<string name="openBackImageInGalleryApp">Öppna bilden på baksidan i bildvisningsappen</string>
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Kopieringsskydd © 2019<xliff:g>%d</xliff:g> Sylvia van Os och medverkande</string>
<string name="settings_allow_content_provider_read_title">Tillåt andra appar att komma åt min data</string>
<string name="permissionReadCardsLabel">Läsa Catima-kort</string>
@@ -301,4 +298,14 @@
<string name="nothing_to_copy">Inget värde hittades</string>
<string name="barcodeEncoding">Streckkods-kodning</string>
<string name="back">Tillbaka</string>
<string name="settings_disable_nfc_while_viewing_card">Pausa NFC</string>
<string name="nfc_blocked_while_viewing_card">NFC är pausad</string>
<string name="change_settings">Ändra inställningar</string>
<string name="nfc_block_system_error">Lyckades inte pausa NFC</string>
<string name="settings_disable_nfc_while_viewing_card_summary">Pausar NFC för att förhindra att NFC-betalningar genomförs av misstag medan du tittar på ett kort</string>
<string name="sort_by_most_recently_added">Senast tillagda</string>
<string name="zoomFrontImage">Zooma framsidesbilden</string>
<string name="zoomBackImage">Zooma baksidesbilden</string>
<string name="show_card_id">Visa kort-ID</string>
<string name="open_in_gallery">Öppna i bildgalleriet</string>
</resources>
+15 -13
View File
@@ -8,7 +8,7 @@
<item quantity="other"><xliff:g>%d</xliff:g> தேர்ந்தெடுக்கப்பட்டன</item>
</plurals>
<string name="noGiftCards">ஒரு அட்டையைச் சேர்க்க + சேர் பொத்தானைக் சொடுக்கு செய்க அல்லது ⋮ பட்டியலிருந்து இறக்குமதி செய்</string>
<string name="noGiftCardsGroup">சில அட்டைகளை உருவாக்கி, பின்னர் அவற்றை இங்கே குழுவிற்கு ஒதுக்குங்கள்.</string>
<string name="noGiftCardsGroup">சில அட்டைகளை உருவாக்கி, பின்னர் அவற்றை இங்கே குழுவிற்கு ஒதுக்குங்கள்</string>
<string name="storeName">பெயர்</string>
<string name="note">குறிப்பு</string>
<string name="cardId">அட்டை ஐடி</string>
@@ -58,7 +58,7 @@
<string name="errorReadingImage">படத்தைப் படிக்க முடியவில்லை</string>
<string name="balance">இருப்பு</string>
<string name="currency">நாணயம்</string>
<string name="importFidme">FIDME இலிருந்து இறக்குமதி</string>
<string name="importFidme">FidMe இலிருந்து இறக்குமதி</string>
<string name="barcodeId">பார்கோடு மதிப்பு</string>
<string name="backImageDescription">பின் படம்</string>
<string name="photos">புகைப்படங்கள்</string>
@@ -138,7 +138,7 @@
<string name="importCatima">கேட்டிமாவில் இருந்து இறக்குமதி செய்</string>
<string name="importCatimaMessage">நீங்கள் பூனையம்மாவிலிருந்து ஏற்றுமதியை தேர்ந்துஎடுத்து இறக்குமதி செய்.\nமற்றொரு பூனையம்மா செயலியில் இறக்குமதி/ஏற்றுமதி பட்டியலிலிருந்து ஏற்றுமதியை தேர்ந்துஎடுத்து இக்கோப்பை உருவாக்கு.</string>
<string name="importLoyaltyCardKeychain">விசுவாச அட்டை கீச்சினிலிருந்து இறக்குமதி செய்யுங்கள்</string>
<string name="importFidmeMessage">"உங்கள் இறக்குமதியை FIDME இலிருந்து ஏற்றுமதி செய்து, பின்னர் பட்டைகோடு வகைகளைக் கைமுறையாகத் தேர்ந்தெடு.\n தரவு பாதுகாப்பைத் தேர்ந்தெடுப்பதன் மூலம் உங்கள் FIDME தன்விவரத்திலிருந்து அதை உருவாக்கவும், பின்னர் எனது தரவைப் பிரித்தெடு அழுத்தவும்."</string>
<string name="importFidmeMessage">உங்கள் இறக்குமதியை FidMe இலிருந்து ஏற்றுமதி செய்து, பின்னர் பட்டைகோடு வகைகளைக் கைமுறையாகத் தேர்ந்தெடு.\n தரவு பாதுகாப்பைத் தேர்ந்தெடுப்பதன் மூலம் உங்கள் FidMe தன்விவரத்திலிருந்து அதை உருவாக்கவும், பின்னர் எனது தரவைப் பிரித்தெடு அழுத்தவும்.</string>
<string name="importVoucherVault">வவுச்சர் பெட்டகத்திலிருந்து இறக்குமதி</string>
<string name="sameAsCardId">ஐடி அதே</string>
<string name="setBarcodeId">பார்கோடு மதிப்பை அமைக்கவும்</string>
@@ -166,7 +166,6 @@
<string name="updateBalance">இருப்பு புதுப்பிக்கவும்</string>
<string name="failedToRetrieveImageFile">படக் கோப்பை மீட்டெடுப்பதில் தோல்வி</string>
<string name="sort_by">வரிசைப்படுத்தவும்</string>
<string name="barcodeLongPressMessage">கேலரி பயன்பாட்டில் படங்களை மட்டுமே திறக்க முடியும்</string>
<string name="version_history">பதிப்பு வரலாறு</string>
<string name="credits">வரவு</string>
<string name="on_google_play">கூகிள் பிளேயில்</string>
@@ -201,8 +200,6 @@
<string name="switchToFrontImage">முன் படத்திற்கு மாறவும்</string>
<string name="switchToBackImage">பின் படத்திற்கு மாறவும்</string>
<string name="switchToBarcode">பார்கோடு மாறவும்</string>
<string name="openFrontImageInGalleryApp">இமேச் வியூவர் ஆப்சில் முன் படத்தைத் திறக்கவும்</string>
<string name="openBackImageInGalleryApp">இமேச் வியூவர் ஆப்சில் மீண்டும் படத்தைத் திறக்கவும்</string>
<string name="setBarcodeHeight">பார்கோடு உயரத்தை அமைக்கவும்</string>
<string name="donate">நன்கொடை</string>
<string name="icon_header_click_text">சிறுபடத்தைத் திருத்த நீண்ட அழுத்தவும்</string>
@@ -246,18 +243,18 @@
<string name="addFromPkpass">பாச்புக் கோப்பைத் தேர்ந்தெடுக்கவும் (.pkpass / .pkpasses)</string>
<string name="useFrontImage">முன் படத்தைப் பயன்படுத்தவும்</string>
<plurals name="deleteCardsTitle">
<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>
<plurals name="deleteCardsConfirmation">
<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="editGroup">திருத்துதல் குழு: <xliff:g>%s</xliff:g></string>
<string name="debug_version_fmt">பதிப்பு: <xliff:g id="version">%s</xliff:g></string>
<plurals name="groupCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> அட்டை</item>
<item quantity="other"><xliff:g>%d</xliff:g> அட்டகள்</item>
<item quantity="other"><xliff:g>%d</xliff:g> கார்டகள்</item>
</plurals>
<string name="expiryStateSentenceExpired">காலாவதியானது: <xliff:g>%s</xliff:g></string>
<plurals name="balancePoints">
@@ -277,7 +274,7 @@
<string name="balanceSentence">இருப்பு: <xliff:g>%s</xliff:g></string>
<plurals name="groupCardCountWithArchived">
<item quantity="one"><xliff:g>%1$d</xliff:g> அட்டை (<xliff:g id="archivedCount">%2$d</xliff:g> காப்பகப்படுத்தப்பட்டது)</item>
<item quantity="other"><xliff:g>%1$d</xliff:g> அட்டகள் (<xliff:g id="archivedCount">%2$d</xliff:g> காப்பகப்படுத்தப்பட்டது)</item>
<item quantity="other"><xliff:g>%1$d</xliff:g> கார்டகள் (<xliff:g id="archivedCount">%2$d</xliff:g> காப்பகப்படுத்தப்பட்டது)</item>
</plurals>
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">பதிப்புரிமை © 2019<xliff:g>%d</xliff:g> சில்வியா வான் ஓஎச் மற்றும் பங்களிப்பாளர்கள்</string>
<string name="app_resources">மூன்றாம் தரப்பு வளங்கள்: <xliff:g id="app_resources_list">%s</xliff:g></string>
@@ -289,7 +286,7 @@
<string name="card_list_widget_empty">கேட்டிமாவில் நீங்கள் விசுவாச அட்டைகளை சேர்த்த பிறகு, அவை இங்கு தோன்றும். அட்டைகள் காப்பகப்படுத்த படவில்லை என உறுதி செய்க.</string>
<string name="cardWithNumber">அட்டை <xliff:g>%d</xliff:g></string>
<string name="cardWithNumberAndLocale">அட்டை<xliff:g>%d</xliff:g> (<xliff:g>%s</xliff:g>)</string>
<string name="pleaseDoNotRotateTheDevice">தயவுசெய்து சாதனத்தை சுழற்றாதீர்கள், இது செயலை ரத்து செய்யும்.</string>
<string name="pleaseDoNotRotateTheDevice">தயவுசெய்து சாதனத்தை சுழற்றாதீர்கள், இது செயலை கைவிடும்</string>
<string name="acra_catima_has_crashed">மன்னிக்கவும், <xliff:g id="app_name">%s</xliff:g> செயலி செயலிழந்துள்ளது. தயவுசெய்து பிழை அறிக்கையை அனுப்பி, இந்த பிரச்சினையை சரிசெய்ய எங்களுக்கு உதவுங்கள்.</string>
<string name="acra_explain_crash">சாத்தியமானால், நீங்கள் இங்கே என்ன செய்தீர்கள் என்பதைப் பற்றிய மேலும் விவரங்களைச் சேர்க்கவும்:</string>
<string name="acra_crash_email_subject"><xliff:g id="app_name">%s</xliff:g> செயலிழப்பு அறிக்கை</string>
@@ -300,4 +297,9 @@
<string name="nothing_to_copy">மதிப்பு இல்லை</string>
<string name="barcodeEncoding">பார்கோடு குறியாக்கம்</string>
<string name="back">பின்</string>
<string name="settings_disable_nfc_while_viewing_card">NFC ஐ இடைநிறுத்து</string>
<string name="settings_disable_nfc_while_viewing_card_summary">கார்டைப் பார்க்கும்போது NFC பேமெண்ட்கள் தூண்டப்படுவதைத் தடுக்க NFCஐ இடைநிறுத்துகிறது</string>
<string name="nfc_blocked_while_viewing_card">NFC இடைநிறுத்தப்பட்டது</string>
<string name="change_settings">அமைப்புகளை மாற்றவும்</string>
<string name="nfc_block_system_error">NFC ஐ இடைநிறுத்த முடியவில்லை</string>
</resources>
Loaded 100 of 584 files, more files were not shown because too many files have changed in this diff. Show more