mirror of
https://github.com/CatimaLoyalty/Android.git
synced 2025-12-24 15:47:53 -05:00
Compare commits
334 Commits
fix/barcod
...
v2.21.2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
36e7ea5b20 | ||
|
|
85d53ae3c7 | ||
|
|
e9b6b5682e | ||
|
|
0abc583d10 | ||
|
|
8c91d30b4c | ||
|
|
76e8715ab2 | ||
|
|
f5f2edca75 | ||
|
|
e648e22ecc | ||
|
|
02b020e9e5 | ||
|
|
e7dc3cd511 | ||
|
|
eb3ac53e46 | ||
|
|
dd683b4a8c | ||
|
|
e90ba5d2db | ||
|
|
07cff7eac4 | ||
|
|
3eea18fc82 | ||
|
|
5d3ceb6d49 | ||
|
|
3dc7a25d88 | ||
|
|
95e02d1646 | ||
|
|
81ecf8ba92 | ||
|
|
bf0e1a2e77 | ||
|
|
4d1c9244fd | ||
|
|
1f1e523100 | ||
|
|
cb32cf9e52 | ||
|
|
af812d8cda | ||
|
|
c8a7addc52 | ||
|
|
3e64d7c5ad | ||
|
|
277462a939 | ||
|
|
24623d5c58 | ||
|
|
4b25b7ad39 | ||
|
|
4016d5499b | ||
|
|
d8b96a8c5f | ||
|
|
614753303f | ||
|
|
50a344b97f | ||
|
|
2cd6da6ffc | ||
|
|
c03fba133f | ||
|
|
f3cba588f6 | ||
|
|
ad364ad0ac | ||
|
|
f4cff85d93 | ||
|
|
cbc86ff131 | ||
|
|
5f733474a9 | ||
|
|
89a13cecf5 | ||
|
|
fd2400eaf5 | ||
|
|
9598f2f4ff | ||
|
|
acca53787c | ||
|
|
060e360344 | ||
|
|
9ef014e05c | ||
|
|
4cb27d3bd5 | ||
|
|
95e21cc112 | ||
|
|
d5f915a290 | ||
|
|
42e89bb5cc | ||
|
|
048fb48300 | ||
|
|
b1c82dbae0 | ||
|
|
ea8c6f96f7 | ||
|
|
201ec78694 | ||
|
|
05a03455c1 | ||
|
|
63f4cbb8ca | ||
|
|
a444607476 | ||
|
|
89102ad0bf | ||
|
|
d2623b8690 | ||
|
|
80ddd48184 | ||
|
|
410a619a70 | ||
|
|
1771f42860 | ||
|
|
1e7af7ab4e | ||
|
|
f4c5af04e3 | ||
|
|
5bcd2cdc32 | ||
|
|
c69a5ae4d2 | ||
|
|
6bd750a60b | ||
|
|
8d77cc3565 | ||
|
|
7a99e0056d | ||
|
|
03e07bc48d | ||
|
|
460d6c2b71 | ||
|
|
9f946094db | ||
|
|
4e92f82176 | ||
|
|
7b905ac120 | ||
|
|
55c5ec929c | ||
|
|
5441231f03 | ||
|
|
1818d24bc0 | ||
|
|
ca88c070c3 | ||
|
|
1be387c4ec | ||
|
|
fa3a956d69 | ||
|
|
8fd244e3a3 | ||
|
|
a0e2fe11dd | ||
|
|
893f34e72a | ||
|
|
cf13a9fc60 | ||
|
|
c6e6d96313 | ||
|
|
20ed9cac88 | ||
|
|
ae6bd937a9 | ||
|
|
e4b69e5cc5 | ||
|
|
5b1062b8d1 | ||
|
|
e06009852e | ||
|
|
50268f6bd1 | ||
|
|
a85e28d46d | ||
|
|
78b6be911f | ||
|
|
bb80478650 | ||
|
|
e0c06cc480 | ||
|
|
b8a508649c | ||
|
|
a8ce37d936 | ||
|
|
43015abbad | ||
|
|
47c8dff52d | ||
|
|
436cf7a068 | ||
|
|
31cc3cd5d0 | ||
|
|
3c11c2ef1e | ||
|
|
fac70f0210 | ||
|
|
6e99a29312 | ||
|
|
5b67ecf157 | ||
|
|
312470cf20 | ||
|
|
4371f46ff8 | ||
|
|
5468415b04 | ||
|
|
6a68ad5d19 | ||
|
|
7576505044 | ||
|
|
b34a43902a | ||
|
|
d3524a50a3 | ||
|
|
6508a6d5f7 | ||
|
|
49a6cf8ae3 | ||
|
|
b4238e0072 | ||
|
|
374170bf05 | ||
|
|
ab11345c3d | ||
|
|
10498ce1a4 | ||
|
|
28901487ff | ||
|
|
8414f51ee8 | ||
|
|
94f8adb6d7 | ||
|
|
844a921a1a | ||
|
|
ae8be3eda8 | ||
|
|
c4c15dbef8 | ||
|
|
ac72035500 | ||
|
|
abff3bcd39 | ||
|
|
05aea28602 | ||
|
|
e4c4dbf5a0 | ||
|
|
bb2393b6c6 | ||
|
|
fb330d16b5 | ||
|
|
c8f1b986ec | ||
|
|
49a2c93d28 | ||
|
|
0992ac4099 | ||
|
|
9ff29af616 | ||
|
|
fbc696047b | ||
|
|
08a4d4b114 | ||
|
|
329056301b | ||
|
|
fac8da69e7 | ||
|
|
fad9eed43e | ||
|
|
58a18bdd7b | ||
|
|
90cb524560 | ||
|
|
ef4c57ce29 | ||
|
|
8872fad73e | ||
|
|
63c3330571 | ||
|
|
37d1bb9477 | ||
|
|
8a67d1d02b | ||
|
|
6f777068ab | ||
|
|
8607e1c23c | ||
|
|
04a319066c | ||
|
|
39f89ca943 | ||
|
|
1092d7a9ba | ||
|
|
b54052182d | ||
|
|
b971c392cf | ||
|
|
cec9306387 | ||
|
|
f6a5cbbf80 | ||
|
|
4b55c414f3 | ||
|
|
1aafcdc6ae | ||
|
|
332e37b2eb | ||
|
|
dff33d3bab | ||
|
|
85ddc9689c | ||
|
|
d91c207b60 | ||
|
|
653606fae3 | ||
|
|
f5a0c8f375 | ||
|
|
c71019951c | ||
|
|
ed7b79ce17 | ||
|
|
08cfb490d4 | ||
|
|
7d284a85bc | ||
|
|
77ef0a2833 | ||
|
|
80130654ec | ||
|
|
e97f7c8645 | ||
|
|
e489ff6a22 | ||
|
|
de549d724c | ||
|
|
5fb2dbd252 | ||
|
|
20013cf7b7 | ||
|
|
78c3146c78 | ||
|
|
ddd7bb9968 | ||
|
|
68935f1489 | ||
|
|
d9a25e1eb9 | ||
|
|
73a837bab5 | ||
|
|
03be45f5a2 | ||
|
|
692adafd8e | ||
|
|
4ff9eb5219 | ||
|
|
286e9fa315 | ||
|
|
e0b6773d2a | ||
|
|
a7cb8a51a3 | ||
|
|
56c7ffa4df | ||
|
|
1498f902c2 | ||
|
|
eea0dd9081 | ||
|
|
1a8c8c07aa | ||
|
|
3901172757 | ||
|
|
3c9507cb7f | ||
|
|
bfc38807c8 | ||
|
|
6dc3a28026 | ||
|
|
eeb507f04e | ||
|
|
2746547194 | ||
|
|
c9a8e81047 | ||
|
|
d87b8ddd4b | ||
|
|
7dfa7071e3 | ||
|
|
92f0091b1d | ||
|
|
54d8f30bf1 | ||
|
|
f7ef13d594 | ||
|
|
2a1157256b | ||
|
|
213ef5060f | ||
|
|
bc24e263b9 | ||
|
|
8da70c41b2 | ||
|
|
4d81846fe0 | ||
|
|
2afdedd0b6 | ||
|
|
8d944cbb24 | ||
|
|
3ffec94b47 | ||
|
|
9176dc98ee | ||
|
|
9881854d13 | ||
|
|
2e4d1fa448 | ||
|
|
97ca1440b0 | ||
|
|
a4688c4450 | ||
|
|
a7ae2a333a | ||
|
|
823e99bd90 | ||
|
|
e32fccc694 | ||
|
|
dd568ab51d | ||
|
|
17f55e577b | ||
|
|
3f77223e65 | ||
|
|
28aad933c5 | ||
|
|
52ca8396db | ||
|
|
bc941544ae | ||
|
|
e3c3b176eb | ||
|
|
3b0b92b954 | ||
|
|
bfcae03420 | ||
|
|
ad4db1ef37 | ||
|
|
fa1a7fd2f1 | ||
|
|
7eac08d0a1 | ||
|
|
dab984b0d4 | ||
|
|
66361dede2 | ||
|
|
628c62fd4b | ||
|
|
84a7e95856 | ||
|
|
fc256d2c4a | ||
|
|
7f81ceeb7e | ||
|
|
3179644fbc | ||
|
|
274a58bcb0 | ||
|
|
dc7f42b0b6 | ||
|
|
f859627d7f | ||
|
|
ccf12bf028 | ||
|
|
c34e2fdd70 | ||
|
|
ea482c6fad | ||
|
|
54f223b5b0 | ||
|
|
74e083bb62 | ||
|
|
a9c36cd171 | ||
|
|
876b0beb2f | ||
|
|
1f73beb895 | ||
|
|
b13aaacdff | ||
|
|
ba67c122fa | ||
|
|
f16550aa9c | ||
|
|
ba57fbbf85 | ||
|
|
ebedb43e72 | ||
|
|
c10f859919 | ||
|
|
8e6e83dfc6 | ||
|
|
326379d222 | ||
|
|
105e85cc63 | ||
|
|
e21dbc85e8 | ||
|
|
78348a6f9c | ||
|
|
f98b98b4f3 | ||
|
|
d362305a25 | ||
|
|
623cfc671c | ||
|
|
456e2112b8 | ||
|
|
af2fbd1ce3 | ||
|
|
91211f07cb | ||
|
|
9c183e84dd | ||
|
|
5e3cebf4a1 | ||
|
|
9437d23e6e | ||
|
|
925a66a12a | ||
|
|
5db8af72a1 | ||
|
|
2b605eb193 | ||
|
|
f16d10995c | ||
|
|
3ef17404b7 | ||
|
|
1316ac731c | ||
|
|
6283a90217 | ||
|
|
84e8857067 | ||
|
|
05a53d7985 | ||
|
|
94b13b7145 | ||
|
|
3e55a147c7 | ||
|
|
f05ed2571f | ||
|
|
c1a37eb2a4 | ||
|
|
4d8d863780 | ||
|
|
d56eec4ba9 | ||
|
|
a05356d0e1 | ||
|
|
4eea6f7f53 | ||
|
|
24e19cc5f8 | ||
|
|
cd7631451b | ||
|
|
d140130b0d | ||
|
|
f0453943da | ||
|
|
42152ccbb5 | ||
|
|
27f8647243 | ||
|
|
b7d520ded6 | ||
|
|
04088ff366 | ||
|
|
d4dcec1a9b | ||
|
|
c8306616e3 | ||
|
|
b34bdebb5c | ||
|
|
9643cb9f94 | ||
|
|
645b29226e | ||
|
|
c56faba922 | ||
|
|
55a19eacc9 | ||
|
|
464a2350ae | ||
|
|
c44f737c99 | ||
|
|
a8794ce60c | ||
|
|
11329ba786 | ||
|
|
e568bd1af9 | ||
|
|
b3fbfdbf9d | ||
|
|
aec4292203 | ||
|
|
82733ca414 | ||
|
|
887424af80 | ||
|
|
f63a25f582 | ||
|
|
635ec748b3 | ||
|
|
fa510e3ffa | ||
|
|
24a5efd5f8 | ||
|
|
547dd55240 | ||
|
|
774705d9ad | ||
|
|
3d756e271c | ||
|
|
2da9a9c1a8 | ||
|
|
cd67d3c919 | ||
|
|
c080fdb244 | ||
|
|
9ee61812b8 | ||
|
|
bccf0a656b | ||
|
|
47ca66e9c7 | ||
|
|
972315ad00 | ||
|
|
0aa8b63c0c | ||
|
|
e77cf403eb | ||
|
|
df89ab29eb | ||
|
|
6c6829bfd5 | ||
|
|
fa531dce81 | ||
|
|
61bc7ad24a | ||
|
|
ce0964e6a7 | ||
|
|
4979ac9d34 | ||
|
|
912bcdf7f7 | ||
|
|
09174e646b | ||
|
|
0c729cb092 | ||
|
|
61faa4aa09 |
4
.github/workflows/android.yml
vendored
4
.github/workflows/android.yml
vendored
@@ -3,12 +3,12 @@ name: Android CI
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
- main
|
||||
- staging
|
||||
- trying
|
||||
pull_request:
|
||||
branches:
|
||||
- master
|
||||
- main
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
name: Compress Images on Push to Master
|
||||
name: Compress Images on Push to Main
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
- main
|
||||
paths:
|
||||
- '**.jpg'
|
||||
- '**.jpeg'
|
||||
|
||||
2
.github/workflows/changelog-to-fastlane.yml
vendored
2
.github/workflows/changelog-to-fastlane.yml
vendored
@@ -2,7 +2,7 @@ name: Convert CHANGELOG to Fastlane
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
- main
|
||||
|
||||
jobs:
|
||||
convert_changelog_to_fastlane:
|
||||
|
||||
73
.github/workflows/codeql-analysis.yml
vendored
73
.github/workflows/codeql-analysis.yml
vendored
@@ -1,73 +0,0 @@
|
||||
# For most projects, this workflow file will not need changing; you simply need
|
||||
# to commit it to your repository.
|
||||
#
|
||||
# You may wish to alter this file to override the set of languages analyzed,
|
||||
# or to provide custom queries or build logic.
|
||||
#
|
||||
# ******** NOTE ********
|
||||
# We have attempted to detect the languages in your repository. Please check
|
||||
# the `language` matrix defined below to confirm you have the correct set of
|
||||
# supported CodeQL languages.
|
||||
#
|
||||
name: "CodeQL"
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
pull_request:
|
||||
# The branches below must be a subset of the branches above
|
||||
branches:
|
||||
- master
|
||||
schedule:
|
||||
- cron: '33 1 * * 4'
|
||||
|
||||
jobs:
|
||||
analyze:
|
||||
name: Analyze
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
actions: read
|
||||
contents: read
|
||||
security-events: write
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
language: [ 'java' ]
|
||||
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ]
|
||||
# Learn more:
|
||||
# https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v2
|
||||
|
||||
# Initializes the CodeQL tools for scanning.
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@v1
|
||||
with:
|
||||
languages: ${{ matrix.language }}
|
||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
||||
# By default, queries listed here will override any specified in a config file.
|
||||
# Prefix the list here with "+" to use these queries and those in the config file.
|
||||
# queries: ./path/to/local/query, your-org/your-repo/queries@main
|
||||
|
||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
||||
# If this step fails, then you should remove it and run the build manually (see below)
|
||||
- name: Autobuild
|
||||
uses: github/codeql-action/autobuild@v1
|
||||
|
||||
# ℹ️ Command-line programs to run using the OS shell.
|
||||
# 📚 https://git.io/JvXDl
|
||||
|
||||
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
|
||||
# and modify them (or add more) to build your code if your project
|
||||
# uses a compiled language
|
||||
|
||||
#- run: |
|
||||
# make bootstrap
|
||||
# make release
|
||||
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@v1
|
||||
2
.github/workflows/contributors-to-file.yml
vendored
2
.github/workflows/contributors-to-file.yml
vendored
@@ -6,7 +6,7 @@ on:
|
||||
jobs:
|
||||
contributors_to_file:
|
||||
runs-on: ubuntu-latest
|
||||
if: github.ref == 'refs/heads/master'
|
||||
if: github.ref == 'refs/heads/main'
|
||||
name: Write contributors to file
|
||||
steps:
|
||||
- name: Checkout repo
|
||||
|
||||
10
.github/workflows/gradle-wrapper-validation.yml
vendored
Normal file
10
.github/workflows/gradle-wrapper-validation.yml
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
name: "Validate Gradle Wrapper"
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
validation:
|
||||
name: "Validation"
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: gradle/wrapper-validation-action@v1
|
||||
15
CHANGELOG.md
15
CHANGELOG.md
@@ -1,8 +1,21 @@
|
||||
# Changelog
|
||||
|
||||
## Unreleased - 115
|
||||
## v2.21.2 - 117
|
||||
|
||||
- Remove unnecessary permissions
|
||||
- Target Android 13
|
||||
|
||||
## v2.21.1 - 116
|
||||
|
||||
- Fix quick spend dialog not allowing , separator
|
||||
- Support loading image from file manager
|
||||
|
||||
## v2.21.0 - 115
|
||||
|
||||
- Open image in gallery on long-press
|
||||
- Apply Material style to dialogs
|
||||
- Support creating card by sharing an image to Catima
|
||||
- Add quick spend button to card screen
|
||||
|
||||
## v2.20.0 - 114
|
||||
|
||||
|
||||
@@ -100,5 +100,5 @@ your real name, saying:
|
||||
Finally, you will need to submit your patches so that they can be reviewed
|
||||
and potentially merged into the main Catima repository. The preferred
|
||||
way to do this is to submit a Pull Request to the Catima project.
|
||||
Changes need to apply cleanly onto the master branch and pass all
|
||||
Changes need to apply cleanly onto the main branch and pass all
|
||||
unit tests and produce no errors during static analysis.
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
import com.github.spotbugs.snom.SpotBugsTask
|
||||
|
||||
apply plugin: 'com.android.application'
|
||||
apply plugin: 'com.github.spotbugs'
|
||||
plugins {
|
||||
id 'com.android.application'
|
||||
id 'com.github.spotbugs'
|
||||
}
|
||||
|
||||
spotbugs {
|
||||
ignoreFailures = false
|
||||
@@ -11,15 +13,14 @@ spotbugs {
|
||||
}
|
||||
|
||||
android {
|
||||
compileSdkVersion 31
|
||||
buildToolsVersion "31.0.0"
|
||||
compileSdk 33
|
||||
|
||||
defaultConfig {
|
||||
applicationId "me.hackerchick.catima"
|
||||
minSdkVersion 21
|
||||
targetSdkVersion 31
|
||||
versionCode 114
|
||||
versionName "2.20.0"
|
||||
minSdk 21
|
||||
targetSdk 33
|
||||
versionCode 117
|
||||
versionName "2.21.2"
|
||||
|
||||
vectorDrawables.useSupportLibrary true
|
||||
multiDexEnabled true
|
||||
@@ -37,6 +38,10 @@ android {
|
||||
}
|
||||
}
|
||||
|
||||
buildFeatures {
|
||||
viewBinding true
|
||||
}
|
||||
|
||||
bundle {
|
||||
language {
|
||||
enableSplit = false
|
||||
@@ -54,8 +59,7 @@ android {
|
||||
}
|
||||
|
||||
lintOptions {
|
||||
disable "GoogleAppIndexingWarning", "ButtonStyle", "AlwaysShowAction",
|
||||
"MissingTranslation", "MissingPrefix"
|
||||
lintConfig file("lint.xml")
|
||||
}
|
||||
|
||||
sourceSets {
|
||||
@@ -94,11 +98,11 @@ dependencies {
|
||||
|
||||
// Third-party
|
||||
implementation 'com.journeyapps:zxing-android-embedded:4.3.0@aar'
|
||||
implementation 'com.google.zxing:core:3.5.0'
|
||||
implementation 'com.google.zxing:core:3.5.1'
|
||||
implementation 'org.apache.commons:commons-csv:1.9.0'
|
||||
implementation 'com.jaredrummler:colorpicker:1.1.0'
|
||||
implementation 'com.github.invissvenska:NumberPickerPreference:1.0.4'
|
||||
implementation 'net.lingala.zip4j:zip4j:2.11.2'
|
||||
implementation 'net.lingala.zip4j:zip4j:2.11.3'
|
||||
|
||||
// SpotBugs
|
||||
implementation 'io.wcm.tooling.spotbugs:io.wcm.tooling.spotbugs.annotations:1.0.0'
|
||||
@@ -106,7 +110,7 @@ dependencies {
|
||||
// Testing
|
||||
testImplementation 'androidx.test:core:1.4.0'
|
||||
testImplementation 'junit:junit:4.13.2'
|
||||
testImplementation 'org.robolectric:robolectric:4.9'
|
||||
testImplementation 'org.robolectric:robolectric:4.9.2'
|
||||
}
|
||||
|
||||
tasks.withType(SpotBugsTask) {
|
||||
|
||||
@@ -6,5 +6,8 @@
|
||||
<Match>
|
||||
<Class name="~.*Manifest\$.*"/>
|
||||
</Match>
|
||||
<Match>
|
||||
<Class name="~.*Binding" />
|
||||
</Match>
|
||||
|
||||
</FindBugsFilter>
|
||||
|
||||
8
app/lint.xml
Normal file
8
app/lint.xml
Normal file
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<lint>
|
||||
<issue id="AlwaysShowAction" severity="ignore" />
|
||||
<issue id="ButtonStyle" severity="ignore" />
|
||||
<issue id="GoogleAppIndexingWarning" severity="ignore" />
|
||||
<issue id="MissingTranslation" severity="ignore" />
|
||||
<issue id="MissingPrefix" severity="ignore" />
|
||||
</lint>
|
||||
@@ -6,8 +6,7 @@
|
||||
<uses-sdk tools:overrideLibrary="com.google.zxing.client.android" />
|
||||
|
||||
<uses-permission android:name="android.permission.CAMERA" />
|
||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="23" />
|
||||
|
||||
<uses-feature
|
||||
android:name="android.hardware.camera"
|
||||
@@ -33,6 +32,12 @@
|
||||
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.SEND" />
|
||||
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:mimeType="image/*" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
<activity
|
||||
android:name=".AboutActivity"
|
||||
@@ -102,7 +107,39 @@
|
||||
<activity
|
||||
android:name=".ImportExportActivity"
|
||||
android:label="@string/importExport"
|
||||
android:theme="@style/AppTheme.NoActionBar" />
|
||||
android:exported="true"
|
||||
android:theme="@style/AppTheme.NoActionBar">
|
||||
|
||||
<!-- ZIP Intent Filter -->
|
||||
<intent-filter
|
||||
android:label="@string/importCards">
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:mimeType="application/zip" />
|
||||
<data android:scheme="content"/>
|
||||
<data android:host="*"/>
|
||||
</intent-filter>
|
||||
|
||||
<!-- JSON Intent Filter -->
|
||||
<intent-filter
|
||||
android:label="@string/importCards">
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:mimeType="application/json" />
|
||||
<data android:scheme="content"/>
|
||||
<data android:host="*"/>
|
||||
</intent-filter>
|
||||
|
||||
<!-- CSV Intent Filter -->
|
||||
<intent-filter
|
||||
android:label="@string/importCards">
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:scheme="content"/>
|
||||
<data android:host="*" />
|
||||
<data android:mimeType="text/comma-separated-values" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
<activity
|
||||
android:name=".CardShortcutConfigure"
|
||||
android:exported="true"
|
||||
|
||||
@@ -1,138 +1,46 @@
|
||||
package protect.card_locker;
|
||||
|
||||
import android.content.ActivityNotFoundException;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.PackageInfo;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.util.Log;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Calendar;
|
||||
import java.util.List;
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
|
||||
import androidx.appcompat.app.ActionBar;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
import androidx.constraintlayout.widget.ConstraintLayout;
|
||||
import androidx.core.text.HtmlCompat;
|
||||
|
||||
public class AboutActivity extends CatimaAppCompatActivity implements View.OnClickListener {
|
||||
import protect.card_locker.databinding.AboutActivityBinding;
|
||||
|
||||
public class AboutActivity extends CatimaAppCompatActivity {
|
||||
|
||||
private static final String TAG = "Catima";
|
||||
ConstraintLayout version_history, translate, license, repo, privacy, error, credits, rate;
|
||||
|
||||
private AboutActivityBinding binding;
|
||||
private AboutContent content;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setTitle(R.string.about);
|
||||
setContentView(R.layout.about_activity);
|
||||
Toolbar toolbar = findViewById(R.id.toolbar);
|
||||
setSupportActionBar(toolbar);
|
||||
ActionBar actionBar = getSupportActionBar();
|
||||
if (actionBar != null) {
|
||||
actionBar.setDisplayHomeAsUpEnabled(true);
|
||||
}
|
||||
binding = AboutActivityBinding.inflate(getLayoutInflater());
|
||||
content = new AboutContent(this);
|
||||
setTitle(content.getPageTitle());
|
||||
setContentView(binding.getRoot());
|
||||
setSupportActionBar(binding.toolbar);
|
||||
enableToolbarBackButton();
|
||||
|
||||
StringBuilder contributors = new StringBuilder().append("<br/>");
|
||||
TextView copyright = binding.creditsSub;
|
||||
copyright.setText(content.getCopyright());
|
||||
TextView versionHistory = binding.versionHistorySub;
|
||||
versionHistory.setText(content.getVersionHistory());
|
||||
|
||||
BufferedReader reader = new BufferedReader(new InputStreamReader(getResources().openRawResource(R.raw.contributors), StandardCharsets.UTF_8));
|
||||
binding.versionHistory.setTag("https://catima.app/changelog/");
|
||||
binding.translate.setTag("https://hosted.weblate.org/engage/catima/");
|
||||
binding.license.setTag("https://github.com/CatimaLoyalty/Android/blob/main/LICENSE");
|
||||
binding.repo.setTag("https://github.com/CatimaLoyalty/Android/");
|
||||
binding.privacy.setTag("https://catima.app/privacy-policy/");
|
||||
binding.reportError.setTag("https://github.com/CatimaLoyalty/Android/issues");
|
||||
binding.rate.setTag("https://play.google.com/store/apps/details?id=me.hackerchick.catima");
|
||||
|
||||
try {
|
||||
while (true) {
|
||||
String tmp = reader.readLine();
|
||||
|
||||
if (tmp == null || tmp.isEmpty()) {
|
||||
reader.close();
|
||||
break;
|
||||
}
|
||||
|
||||
contributors.append("<br/>");
|
||||
contributors.append(tmp);
|
||||
}
|
||||
} catch (IOException ignored) {
|
||||
}
|
||||
|
||||
final List<ThirdPartyInfo> USED_LIBRARIES = new ArrayList<>();
|
||||
USED_LIBRARIES.add(new ThirdPartyInfo("Color Picker", "https://github.com/jaredrummler/ColorPicker", "Apache 2.0"));
|
||||
USED_LIBRARIES.add(new ThirdPartyInfo("Commons CSV", "https://commons.apache.org/proper/commons-csv/", "Apache 2.0"));
|
||||
USED_LIBRARIES.add(new ThirdPartyInfo("NumberPickerPreference", "https://github.com/invissvenska/NumberPickerPreference", "GNU LGPL 3.0"));
|
||||
USED_LIBRARIES.add(new ThirdPartyInfo("uCrop", "https://github.com/Yalantis/uCrop", "Apache 2.0"));
|
||||
USED_LIBRARIES.add(new ThirdPartyInfo("Zip4j", "https://github.com/srikanth-lingala/zip4j", "Apache 2.0"));
|
||||
USED_LIBRARIES.add(new ThirdPartyInfo("ZXing", "https://github.com/zxing/zxing", "Apache 2.0"));
|
||||
USED_LIBRARIES.add(new ThirdPartyInfo("ZXing Android Embedded", "https://github.com/journeyapps/zxing-android-embedded", "Apache 2.0"));
|
||||
|
||||
final List<ThirdPartyInfo> USED_ASSETS = new ArrayList<>();
|
||||
USED_ASSETS.add(new ThirdPartyInfo("Android icons", "https://fonts.google.com/icons?selected=Material+Icons", "Apache 2.0"));
|
||||
|
||||
StringBuilder libs = new StringBuilder().append("<br/>");
|
||||
for (ThirdPartyInfo entry : USED_LIBRARIES) {
|
||||
libs.append("<br/><a href=\"").append(entry.url()).append("\">").append(entry.name()).append("</a> (").append(entry.license()).append(")");
|
||||
}
|
||||
|
||||
StringBuilder resources = new StringBuilder().append("<br/>");
|
||||
for (ThirdPartyInfo entry : USED_ASSETS) {
|
||||
resources.append("<br/><a href=\"").append(entry.url()).append("\">").append(entry.name()).append("</a> (").append(entry.license()).append(")");
|
||||
}
|
||||
|
||||
String appName = getString(R.string.app_name);
|
||||
int year = Calendar.getInstance().get(Calendar.YEAR);
|
||||
|
||||
String version = "?";
|
||||
try {
|
||||
PackageInfo pi = getPackageManager().getPackageInfo(getPackageName(), 0);
|
||||
version = pi.versionName;
|
||||
} catch (PackageManager.NameNotFoundException e) {
|
||||
Log.w(TAG, "Package name not found", e);
|
||||
}
|
||||
|
||||
TextView copyright = findViewById(R.id.credits_sub);
|
||||
copyright.setText(String.format(getString(R.string.app_copyright_fmt), year));
|
||||
TextView vHistory = findViewById(R.id.version_history_sub);
|
||||
vHistory.setText(String.format(getString(R.string.debug_version_fmt), version));
|
||||
|
||||
setTitle(String.format(getString(R.string.about_title_fmt), appName));
|
||||
|
||||
version_history = findViewById(R.id.version_history);
|
||||
translate = findViewById(R.id.translate);
|
||||
license = findViewById(R.id.license);
|
||||
repo = findViewById(R.id.repo);
|
||||
privacy = findViewById(R.id.privacy);
|
||||
error = findViewById(R.id.report_error);
|
||||
credits = findViewById(R.id.credits);
|
||||
rate = findViewById(R.id.rate);
|
||||
|
||||
version_history.setOnClickListener(this);
|
||||
translate.setOnClickListener(this);
|
||||
license.setOnClickListener(this);
|
||||
repo.setOnClickListener(this);
|
||||
privacy.setOnClickListener(this);
|
||||
error.setOnClickListener(this);
|
||||
rate.setOnClickListener(this);
|
||||
|
||||
StringBuilder contributorInfo = new StringBuilder();
|
||||
contributorInfo.append(HtmlCompat.fromHtml(String.format(getString(R.string.app_contributors), contributors.toString()), HtmlCompat.FROM_HTML_MODE_COMPACT));
|
||||
contributorInfo.append("\n\n");
|
||||
contributorInfo.append(getString(R.string.app_copyright_old));
|
||||
contributorInfo.append("\n\n");
|
||||
contributorInfo.append(HtmlCompat.fromHtml(String.format(getString(R.string.app_libraries), libs.toString()), HtmlCompat.FROM_HTML_MODE_COMPACT));
|
||||
contributorInfo.append("\n\n");
|
||||
contributorInfo.append(HtmlCompat.fromHtml(String.format(getString(R.string.app_resources), resources.toString()), HtmlCompat.FROM_HTML_MODE_COMPACT));
|
||||
|
||||
credits.setOnClickListener(view -> new AlertDialog.Builder(this)
|
||||
.setTitle(R.string.credits)
|
||||
.setMessage(contributorInfo.toString())
|
||||
.setPositiveButton(R.string.ok, (dialogInterface, i) -> {
|
||||
})
|
||||
.show());
|
||||
bindClickListeners();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -145,36 +53,47 @@ public class AboutActivity extends CatimaAppCompatActivity implements View.OnCli
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
int id = view.getId();
|
||||
|
||||
String url;
|
||||
if (id == R.id.version_history) {
|
||||
url = "https://catima.app/changelog/";
|
||||
} else if (id == R.id.translate) {
|
||||
url = "https://hosted.weblate.org/engage/catima/";
|
||||
} else if (id == R.id.license) {
|
||||
url = "https://github.com/CatimaLoyalty/Android/blob/master/LICENSE";
|
||||
} else if (id == R.id.repo) {
|
||||
url = "https://github.com/CatimaLoyalty/Android/";
|
||||
} else if (id == R.id.privacy) {
|
||||
url = "https://catima.app/privacy-policy/";
|
||||
} else if (id == R.id.report_error) {
|
||||
url = "https://github.com/CatimaLoyalty/Android/issues";
|
||||
} else if (id == R.id.rate) {
|
||||
url = "https://play.google.com/store/apps/details?id=me.hackerchick.catima";
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
|
||||
Intent intent = new Intent(Intent.ACTION_VIEW);
|
||||
intent.setData(Uri.parse(url));
|
||||
try {
|
||||
startActivity(intent);
|
||||
} catch (ActivityNotFoundException e) {
|
||||
Toast.makeText(this, R.string.failedToOpenUrl, Toast.LENGTH_LONG).show();
|
||||
Log.e(TAG, "No activity found to handle intent", e);
|
||||
}
|
||||
protected void onDestroy() {
|
||||
super.onDestroy();
|
||||
content.destroy();
|
||||
clearClickListeners();
|
||||
binding = null;
|
||||
}
|
||||
|
||||
private void bindClickListeners() {
|
||||
View.OnClickListener openExternalBrowser = view -> {
|
||||
Object tag = view.getTag();
|
||||
if (tag instanceof String && ((String) tag).startsWith("https://")) {
|
||||
(new OpenWebLinkHandler()).openBrowser(this, (String) tag);
|
||||
}
|
||||
};
|
||||
binding.versionHistory.setOnClickListener(openExternalBrowser);
|
||||
binding.translate.setOnClickListener(openExternalBrowser);
|
||||
binding.license.setOnClickListener(openExternalBrowser);
|
||||
binding.repo.setOnClickListener(openExternalBrowser);
|
||||
binding.privacy.setOnClickListener(openExternalBrowser);
|
||||
binding.reportError.setOnClickListener(openExternalBrowser);
|
||||
binding.rate.setOnClickListener(openExternalBrowser);
|
||||
|
||||
binding.credits.setOnClickListener(view -> showCredits());
|
||||
}
|
||||
|
||||
private void clearClickListeners() {
|
||||
binding.versionHistory.setOnClickListener(null);
|
||||
binding.translate.setOnClickListener(null);
|
||||
binding.license.setOnClickListener(null);
|
||||
binding.repo.setOnClickListener(null);
|
||||
binding.privacy.setOnClickListener(null);
|
||||
binding.reportError.setOnClickListener(null);
|
||||
binding.rate.setOnClickListener(null);
|
||||
binding.credits.setOnClickListener(null);
|
||||
}
|
||||
|
||||
private void showCredits() {
|
||||
new MaterialAlertDialogBuilder(this)
|
||||
.setTitle(R.string.credits)
|
||||
.setMessage(content.getContributorInfo())
|
||||
.setPositiveButton(R.string.ok, null)
|
||||
.show();
|
||||
}
|
||||
}
|
||||
|
||||
111
app/src/main/java/protect/card_locker/AboutContent.java
Normal file
111
app/src/main/java/protect/card_locker/AboutContent.java
Normal file
@@ -0,0 +1,111 @@
|
||||
package protect.card_locker;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.pm.PackageInfo;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.core.text.HtmlCompat;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Calendar;
|
||||
import java.util.List;
|
||||
|
||||
public class AboutContent {
|
||||
|
||||
public static final String TAG = "Catima";
|
||||
|
||||
public Context context;
|
||||
|
||||
public AboutContent(Context context) {
|
||||
this.context = context;
|
||||
}
|
||||
|
||||
public void destroy() {
|
||||
this.context = null;
|
||||
}
|
||||
|
||||
public String getPageTitle() {
|
||||
return String.format(context.getString(R.string.about_title_fmt), context.getString(R.string.app_name));
|
||||
}
|
||||
|
||||
public String getAppVersion() {
|
||||
String version = "?";
|
||||
try {
|
||||
PackageInfo pi = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
|
||||
version = pi.versionName;
|
||||
} catch (PackageManager.NameNotFoundException e) {
|
||||
Log.w(TAG, "Package name not found", e);
|
||||
}
|
||||
|
||||
return version;
|
||||
}
|
||||
|
||||
public int getCurrentYear() {
|
||||
return Calendar.getInstance().get(Calendar.YEAR);
|
||||
}
|
||||
|
||||
public String getCopyright() {
|
||||
return String.format(context.getString(R.string.app_copyright_fmt), getCurrentYear());
|
||||
}
|
||||
|
||||
public String getContributors() {
|
||||
String contributors;
|
||||
try {
|
||||
contributors = "<br/>" + Utils.readTextFile(context, R.raw.contributors);
|
||||
} catch (IOException ignored) {
|
||||
return "";
|
||||
}
|
||||
return contributors.replace("\n", "<br />");
|
||||
}
|
||||
|
||||
public String getThirdPartyLibraries() {
|
||||
final List<ThirdPartyInfo> usedLibraries = new ArrayList<>();
|
||||
usedLibraries.add(new ThirdPartyInfo("Color Picker", "https://github.com/jaredrummler/ColorPicker", "Apache 2.0"));
|
||||
usedLibraries.add(new ThirdPartyInfo("Commons CSV", "https://commons.apache.org/proper/commons-csv/", "Apache 2.0"));
|
||||
usedLibraries.add(new ThirdPartyInfo("NumberPickerPreference", "https://github.com/invissvenska/NumberPickerPreference", "GNU LGPL 3.0"));
|
||||
usedLibraries.add(new ThirdPartyInfo("uCrop", "https://github.com/Yalantis/uCrop", "Apache 2.0"));
|
||||
usedLibraries.add(new ThirdPartyInfo("Zip4j", "https://github.com/srikanth-lingala/zip4j", "Apache 2.0"));
|
||||
usedLibraries.add(new ThirdPartyInfo("ZXing", "https://github.com/zxing/zxing", "Apache 2.0"));
|
||||
usedLibraries.add(new ThirdPartyInfo("ZXing Android Embedded", "https://github.com/journeyapps/zxing-android-embedded", "Apache 2.0"));
|
||||
|
||||
StringBuilder result = new StringBuilder("<br/>");
|
||||
for (ThirdPartyInfo entry : usedLibraries) {
|
||||
result.append("<br/>")
|
||||
.append(entry.toHtml());
|
||||
}
|
||||
|
||||
return result.toString();
|
||||
}
|
||||
|
||||
public String getUsedThirdPartyAssets() {
|
||||
final List<ThirdPartyInfo> usedAssets = new ArrayList<>();
|
||||
usedAssets.add(new ThirdPartyInfo("Android icons", "https://fonts.google.com/icons?selected=Material+Icons", "Apache 2.0"));
|
||||
|
||||
StringBuilder result = new StringBuilder().append("<br/>");
|
||||
for (ThirdPartyInfo entry : usedAssets) {
|
||||
result.append("<br/>")
|
||||
.append(entry.toHtml());
|
||||
}
|
||||
|
||||
return result.toString();
|
||||
}
|
||||
|
||||
public String getContributorInfo() {
|
||||
StringBuilder contributorInfo = new StringBuilder();
|
||||
contributorInfo.append(HtmlCompat.fromHtml(String.format(context.getString(R.string.app_contributors), getContributors()), HtmlCompat.FROM_HTML_MODE_COMPACT));
|
||||
contributorInfo.append("\n\n");
|
||||
contributorInfo.append(context.getString(R.string.app_copyright_old));
|
||||
contributorInfo.append("\n\n");
|
||||
contributorInfo.append(HtmlCompat.fromHtml(String.format(context.getString(R.string.app_libraries), getThirdPartyLibraries()), HtmlCompat.FROM_HTML_MODE_COMPACT));
|
||||
contributorInfo.append("\n\n");
|
||||
contributorInfo.append(HtmlCompat.fromHtml(String.format(context.getString(R.string.app_resources), getUsedThirdPartyAssets()), HtmlCompat.FROM_HTML_MODE_COMPACT));
|
||||
|
||||
return contributorInfo.toString();
|
||||
}
|
||||
|
||||
public String getVersionHistory() {
|
||||
return String.format(context.getString(R.string.debug_version_fmt), getAppVersion());
|
||||
}
|
||||
}
|
||||
@@ -19,6 +19,8 @@ import java.util.ArrayList;
|
||||
import androidx.appcompat.app.ActionBar;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
|
||||
import protect.card_locker.databinding.BarcodeSelectorActivityBinding;
|
||||
|
||||
/**
|
||||
* This activity is callable and will allow a user to enter
|
||||
* barcode data and generate all barcodes possible for
|
||||
@@ -26,6 +28,7 @@ import androidx.appcompat.widget.Toolbar;
|
||||
* data and type will be returned to the caller.
|
||||
*/
|
||||
public class BarcodeSelectorActivity extends CatimaAppCompatActivity implements BarcodeSelectorAdapter.BarcodeSelectorListener {
|
||||
private BarcodeSelectorActivityBinding binding;
|
||||
private static final String TAG = "Catima";
|
||||
|
||||
// Result this activity will return
|
||||
@@ -40,17 +43,15 @@ public class BarcodeSelectorActivity extends CatimaAppCompatActivity implements
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
binding = BarcodeSelectorActivityBinding.inflate(getLayoutInflater());
|
||||
setTitle(R.string.selectBarcodeTitle);
|
||||
setContentView(R.layout.barcode_selector_activity);
|
||||
Toolbar toolbar = findViewById(R.id.toolbar);
|
||||
setContentView(binding.getRoot());
|
||||
Toolbar toolbar = binding.toolbar;
|
||||
setSupportActionBar(toolbar);
|
||||
ActionBar actionBar = getSupportActionBar();
|
||||
if (actionBar != null) {
|
||||
actionBar.setDisplayHomeAsUpEnabled(true);
|
||||
}
|
||||
enableToolbarBackButton();
|
||||
|
||||
EditText cardId = findViewById(R.id.cardId);
|
||||
ListView mBarcodeList = findViewById(R.id.barcodes);
|
||||
EditText cardId = binding.cardId;
|
||||
ListView mBarcodeList = binding.barcodes;
|
||||
mAdapter = new BarcodeSelectorAdapter(this, new ArrayList<>(), this);
|
||||
mBarcodeList.setAdapter(mAdapter);
|
||||
|
||||
@@ -66,7 +67,7 @@ public class BarcodeSelectorActivity extends CatimaAppCompatActivity implements
|
||||
runOnUiThread(() -> {
|
||||
generateBarcodes(s.toString());
|
||||
|
||||
View noBarcodeButtonView = findViewById(R.id.noBarcode);
|
||||
View noBarcodeButtonView = binding.noBarcode;
|
||||
setButtonListener(noBarcodeButtonView, s.toString());
|
||||
noBarcodeButtonView.setEnabled(s.length() > 0);
|
||||
});
|
||||
|
||||
@@ -13,6 +13,7 @@ import android.widget.TextView;
|
||||
import java.util.ArrayList;
|
||||
|
||||
import protect.card_locker.async.TaskHandler;
|
||||
import protect.card_locker.databinding.BarcodeLayoutBinding;
|
||||
|
||||
public class BarcodeSelectorAdapter extends ArrayAdapter<CatimaBarcodeWithValue> {
|
||||
private static final String TAG = "Catima";
|
||||
@@ -51,9 +52,10 @@ public class BarcodeSelectorAdapter extends ArrayAdapter<CatimaBarcodeWithValue>
|
||||
if (convertView == null) {
|
||||
viewHolder = new ViewHolder();
|
||||
LayoutInflater inflater = LayoutInflater.from(getContext());
|
||||
convertView = inflater.inflate(R.layout.barcode_layout, parent, false);
|
||||
viewHolder.image = convertView.findViewById(R.id.barcodeImage);
|
||||
viewHolder.text = convertView.findViewById(R.id.barcodeName);
|
||||
BarcodeLayoutBinding barcodeLayoutBinding = BarcodeLayoutBinding.inflate(inflater, parent, false);
|
||||
convertView = barcodeLayoutBinding.getRoot();
|
||||
viewHolder.image = barcodeLayoutBinding.barcodeImage;
|
||||
viewHolder.text = barcodeLayoutBinding.barcodeName;
|
||||
convertView.setTag(viewHolder);
|
||||
} else {
|
||||
viewHolder = (ViewHolder) convertView.getTag();
|
||||
|
||||
@@ -14,10 +14,13 @@ import androidx.core.content.pm.ShortcutManagerCompat;
|
||||
import androidx.recyclerview.widget.GridLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import protect.card_locker.databinding.SimpleToolbarListActivityBinding;
|
||||
|
||||
/**
|
||||
* The configuration screen for creating a shortcut.
|
||||
*/
|
||||
public class CardShortcutConfigure extends CatimaAppCompatActivity implements LoyaltyCardCursorAdapter.CardAdapterListener {
|
||||
private SimpleToolbarListActivityBinding binding;
|
||||
static final String TAG = "Catima";
|
||||
private SQLiteDatabase mDatabase;
|
||||
private LoyaltyCardCursorAdapter mAdapter;
|
||||
@@ -25,15 +28,15 @@ public class CardShortcutConfigure extends CatimaAppCompatActivity implements Lo
|
||||
@Override
|
||||
public void onCreate(Bundle bundle) {
|
||||
super.onCreate(bundle);
|
||||
|
||||
binding = SimpleToolbarListActivityBinding.inflate(getLayoutInflater());
|
||||
mDatabase = new DBHelper(this).getReadableDatabase();
|
||||
|
||||
// Set the result to CANCELED. This will cause nothing to happen if the
|
||||
// aback button is pressed.
|
||||
setResult(RESULT_CANCELED);
|
||||
|
||||
setContentView(R.layout.simple_toolbar_list_activity);
|
||||
Toolbar toolbar = findViewById(R.id.toolbar);
|
||||
setContentView(binding.getRoot());
|
||||
Toolbar toolbar = binding.toolbar;
|
||||
toolbar.setTitle(R.string.shortcutSelectCard);
|
||||
setSupportActionBar(toolbar);
|
||||
|
||||
@@ -50,7 +53,7 @@ public class CardShortcutConfigure extends CatimaAppCompatActivity implements Lo
|
||||
finish();
|
||||
}
|
||||
|
||||
final RecyclerView cardList = findViewById(R.id.list);
|
||||
final RecyclerView cardList = binding.list;
|
||||
GridLayoutManager layoutManager = (GridLayoutManager) cardList.getLayoutManager();
|
||||
if (layoutManager != null) {
|
||||
layoutManager.setSpanCount(getResources().getInteger(R.integer.main_view_card_columns));
|
||||
|
||||
@@ -137,7 +137,7 @@ public class CardsOnPowerScreenService extends ControlsProviderService {
|
||||
closePowerScreenOnAndroid11();
|
||||
}
|
||||
|
||||
@SuppressLint({"MissingPermission", "deprecation"})
|
||||
@SuppressWarnings({"MissingPermission", "deprecation"})
|
||||
private void closePowerScreenOnAndroid11() {
|
||||
// Android 12 will auto-close the power screen, but earlier versions won't
|
||||
// Lint complains about this but on Android 11 the permission is not needed
|
||||
|
||||
@@ -6,8 +6,11 @@ import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.view.View;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.app.ActionBar;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.core.view.WindowInsetsControllerCompat;
|
||||
|
||||
public class CatimaAppCompatActivity extends AppCompatActivity {
|
||||
@Override
|
||||
@@ -29,8 +32,10 @@ public class CatimaAppCompatActivity extends AppCompatActivity {
|
||||
// XXX changing this in onCreate causes issues with the splash screen activity, so doing this here
|
||||
boolean darkMode = Utils.isDarkModeEnabled(this);
|
||||
if (Build.VERSION.SDK_INT >= 23) {
|
||||
View decorView = getWindow().getDecorView();
|
||||
WindowInsetsControllerCompat wic = new WindowInsetsControllerCompat(getWindow(), decorView);
|
||||
wic.setAppearanceLightStatusBars(!darkMode);
|
||||
getWindow().setStatusBarColor(Color.TRANSPARENT);
|
||||
getWindow().getDecorView().setSystemUiVisibility(darkMode ? 0 : View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
|
||||
} else {
|
||||
// icons are always white back then
|
||||
getWindow().setStatusBarColor(darkMode ? Color.TRANSPARENT : Color.argb(127, 0, 0, 0));
|
||||
@@ -38,4 +43,14 @@ public class CatimaAppCompatActivity extends AppCompatActivity {
|
||||
// XXX android 9 and below has a nasty rendering bug if the theme was patched earlier
|
||||
Utils.postPatchColors(this);
|
||||
}
|
||||
|
||||
protected void enableToolbarBackButton() {
|
||||
ActionBar actionBar = getSupportActionBar();
|
||||
if (actionBar != null) {
|
||||
actionBar.setDisplayHomeAsUpEnabled(true);
|
||||
}
|
||||
}
|
||||
|
||||
public void onMockedRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
|
||||
}
|
||||
}
|
||||
|
||||
@@ -494,6 +494,15 @@ public class DBHelper extends SQLiteOpenHelper {
|
||||
return (rowsUpdated == 1);
|
||||
}
|
||||
|
||||
public static boolean updateLoyaltyCardBalance(SQLiteDatabase database, final int id, final BigDecimal newBalance) {
|
||||
ContentValues contentValues = new ContentValues();
|
||||
contentValues.put(LoyaltyCardDbIds.BALANCE, newBalance.toString());
|
||||
int rowsUpdated = database.update(LoyaltyCardDbIds.TABLE, contentValues,
|
||||
whereAttrs(LoyaltyCardDbIds.ID),
|
||||
withArgs(id));
|
||||
return (rowsUpdated == 1);
|
||||
}
|
||||
|
||||
public static LoyaltyCard getLoyaltyCard(SQLiteDatabase database, final int id) {
|
||||
Cursor data = database.query(LoyaltyCardDbIds.TABLE, null, whereAttrs(LoyaltyCardDbIds.ID), withArgs(id), null, null, null);
|
||||
|
||||
|
||||
@@ -7,11 +7,13 @@ import android.database.sqlite.SQLiteDatabase;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ImageButton;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.widget.AppCompatImageButton;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import protect.card_locker.databinding.GroupLayoutBinding;
|
||||
import protect.card_locker.preferences.Settings;
|
||||
|
||||
public class GroupCursorAdapter extends BaseCursorAdapter<GroupCursorAdapter.GroupListItemViewHolder> {
|
||||
@@ -33,9 +35,14 @@ public class GroupCursorAdapter extends BaseCursorAdapter<GroupCursorAdapter.Gro
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public GroupCursorAdapter.GroupListItemViewHolder onCreateViewHolder(ViewGroup inputParent, int inputViewType) {
|
||||
View itemView = LayoutInflater.from(inputParent.getContext()).inflate(R.layout.group_layout, inputParent, false);
|
||||
return new GroupListItemViewHolder(itemView);
|
||||
public GroupCursorAdapter.GroupListItemViewHolder onCreateViewHolder(@NonNull ViewGroup inputParent, int inputViewType) {
|
||||
return new GroupListItemViewHolder(
|
||||
GroupLayoutBinding.inflate(
|
||||
LayoutInflater.from(inputParent.getContext()),
|
||||
inputParent,
|
||||
false
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
public void onBindViewHolder(GroupListItemViewHolder inputHolder, Cursor inputCursor) {
|
||||
@@ -81,16 +88,16 @@ public class GroupCursorAdapter extends BaseCursorAdapter<GroupCursorAdapter.Gro
|
||||
|
||||
public static class GroupListItemViewHolder extends RecyclerView.ViewHolder {
|
||||
public TextView mName, mCardCount;
|
||||
public AppCompatImageButton mMoveUp, mMoveDown, mEdit, mDelete;
|
||||
public ImageButton mMoveUp, mMoveDown, mEdit, mDelete;
|
||||
|
||||
public GroupListItemViewHolder(View inputView) {
|
||||
super(inputView);
|
||||
mName = inputView.findViewById(R.id.name);
|
||||
mCardCount = inputView.findViewById(R.id.cardCount);
|
||||
mMoveUp = inputView.findViewById(R.id.moveUp);
|
||||
mMoveDown = inputView.findViewById(R.id.moveDown);
|
||||
mEdit = inputView.findViewById(R.id.edit);
|
||||
mDelete = inputView.findViewById(R.id.delete);
|
||||
public GroupListItemViewHolder(GroupLayoutBinding groupLayoutBinding) {
|
||||
super(groupLayoutBinding.getRoot());
|
||||
mName = groupLayoutBinding.name;
|
||||
mCardCount = groupLayoutBinding.cardCount;
|
||||
mMoveUp = groupLayoutBinding.moveUp;
|
||||
mMoveDown = groupLayoutBinding.moveDown;
|
||||
mEdit = groupLayoutBinding.edit;
|
||||
mDelete = groupLayoutBinding.delete;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,21 +24,25 @@ import java.util.List;
|
||||
|
||||
import androidx.activity.result.ActivityResultLauncher;
|
||||
import androidx.activity.result.contract.ActivityResultContracts;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.app.ActionBar;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
import androidx.core.app.ActivityCompat;
|
||||
import androidx.core.content.ContextCompat;
|
||||
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
|
||||
import protect.card_locker.async.TaskHandler;
|
||||
import protect.card_locker.databinding.ImportExportActivityBinding;
|
||||
import protect.card_locker.importexport.DataFormat;
|
||||
import protect.card_locker.importexport.ImportExportResult;
|
||||
import protect.card_locker.importexport.ImportExportResultType;
|
||||
|
||||
public class ImportExportActivity extends CatimaAppCompatActivity {
|
||||
private ImportExportActivityBinding binding;
|
||||
private static final String TAG = "Catima";
|
||||
|
||||
private static final int PERMISSIONS_EXTERNAL_STORAGE = 1;
|
||||
|
||||
private ImportExportTask importExporter;
|
||||
|
||||
private String importAlertTitle;
|
||||
@@ -55,26 +59,16 @@ public class ImportExportActivity extends CatimaAppCompatActivity {
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
binding = ImportExportActivityBinding.inflate(getLayoutInflater());
|
||||
setTitle(R.string.importExport);
|
||||
setContentView(R.layout.import_export_activity);
|
||||
Toolbar toolbar = findViewById(R.id.toolbar);
|
||||
setContentView(binding.getRoot());
|
||||
Toolbar toolbar = binding.toolbar;
|
||||
setSupportActionBar(toolbar);
|
||||
ActionBar actionBar = getSupportActionBar();
|
||||
if (actionBar != null) {
|
||||
actionBar.setDisplayHomeAsUpEnabled(true);
|
||||
}
|
||||
enableToolbarBackButton();
|
||||
|
||||
// If the application does not have permissions to external
|
||||
// storage, ask for it now
|
||||
|
||||
if (ContextCompat.checkSelfPermission(ImportExportActivity.this,
|
||||
Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED ||
|
||||
ContextCompat.checkSelfPermission(ImportExportActivity.this,
|
||||
Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
|
||||
ActivityCompat.requestPermissions(ImportExportActivity.this,
|
||||
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE,
|
||||
Manifest.permission.WRITE_EXTERNAL_STORAGE},
|
||||
PERMISSIONS_EXTERNAL_STORAGE);
|
||||
Intent fileIntent = getIntent();
|
||||
if (fileIntent != null && fileIntent.getType() != null) {
|
||||
chooseImportType(false, fileIntent.getData());
|
||||
}
|
||||
|
||||
// would use ActivityResultContracts.CreateDocument() but mime type cannot be set
|
||||
@@ -126,9 +120,9 @@ public class ImportExportActivity extends CatimaAppCompatActivity {
|
||||
intentCreateDocumentAction.setType("application/zip");
|
||||
intentCreateDocumentAction.putExtra(Intent.EXTRA_TITLE, "catima.zip");
|
||||
|
||||
Button exportButton = findViewById(R.id.exportButton);
|
||||
Button exportButton = binding.exportButton;
|
||||
exportButton.setOnClickListener(v -> {
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(ImportExportActivity.this);
|
||||
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(ImportExportActivity.this);
|
||||
builder.setTitle(R.string.exportPassword);
|
||||
|
||||
FrameLayout container = new FrameLayout(ImportExportActivity.this);
|
||||
@@ -158,12 +152,12 @@ public class ImportExportActivity extends CatimaAppCompatActivity {
|
||||
});
|
||||
|
||||
// Check that there is a file manager available
|
||||
Button importFilesystem = findViewById(R.id.importOptionFilesystemButton);
|
||||
importFilesystem.setOnClickListener(v -> chooseImportType(false));
|
||||
Button importFilesystem = binding.importOptionFilesystemButton;
|
||||
importFilesystem.setOnClickListener(v -> chooseImportType(false, null));
|
||||
|
||||
// Check that there is an app that data can be imported from
|
||||
Button importApplication = findViewById(R.id.importOptionApplicationButton);
|
||||
importApplication.setOnClickListener(v -> chooseImportType(true));
|
||||
Button importApplication = binding.importOptionApplicationButton;
|
||||
importApplication.setOnClickListener(v -> chooseImportType(true, null));
|
||||
}
|
||||
|
||||
private void openFileForImport(Uri uri, char[] password) {
|
||||
@@ -177,7 +171,9 @@ public class ImportExportActivity extends CatimaAppCompatActivity {
|
||||
}
|
||||
}
|
||||
|
||||
private void chooseImportType(boolean choosePicker) {
|
||||
private void chooseImportType(boolean choosePicker,
|
||||
@Nullable Uri fileData) {
|
||||
|
||||
List<CharSequence> betaImportOptions = new ArrayList<>();
|
||||
betaImportOptions.add("Fidme");
|
||||
betaImportOptions.add("Stocard");
|
||||
@@ -191,7 +187,7 @@ public class ImportExportActivity extends CatimaAppCompatActivity {
|
||||
importOptions.add(importOption);
|
||||
}
|
||||
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
||||
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(this);
|
||||
builder.setTitle(R.string.chooseImportType)
|
||||
.setItems(importOptions.toArray(new CharSequence[importOptions.size()]), (dialog, which) -> {
|
||||
switch (which) {
|
||||
@@ -229,7 +225,12 @@ public class ImportExportActivity extends CatimaAppCompatActivity {
|
||||
throw new IllegalArgumentException("Unknown DataFormat");
|
||||
}
|
||||
|
||||
new AlertDialog.Builder(this)
|
||||
if (fileData != null) {
|
||||
openFileForImport(fileData, null);
|
||||
return;
|
||||
}
|
||||
|
||||
new MaterialAlertDialogBuilder(this)
|
||||
.setTitle(importAlertTitle)
|
||||
.setMessage(importAlertMessage)
|
||||
.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
|
||||
@@ -296,30 +297,6 @@ public class ImportExportActivity extends CatimaAppCompatActivity {
|
||||
mTasks.executeTask(TaskHandler.TYPE.EXPORT, importExporter);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
|
||||
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
|
||||
|
||||
if (requestCode == PERMISSIONS_EXTERNAL_STORAGE) {
|
||||
// If request is cancelled, the result arrays are empty.
|
||||
boolean success = grantResults.length > 0;
|
||||
|
||||
for (int grant : grantResults) {
|
||||
if (grant != PackageManager.PERMISSION_GRANTED) {
|
||||
success = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (!success) {
|
||||
// External storage permission rejected, inform user that
|
||||
// import/export is prevented
|
||||
Toast.makeText(getApplicationContext(), R.string.noExternalStoragePermissionError,
|
||||
Toast.LENGTH_LONG).show();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDestroy() {
|
||||
mTasks.flushTaskList(TaskHandler.TYPE.IMPORT, true, false, false);
|
||||
@@ -340,7 +317,7 @@ public class ImportExportActivity extends CatimaAppCompatActivity {
|
||||
}
|
||||
|
||||
private void retryWithPassword(DataFormat dataFormat, Uri uri) {
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
||||
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(this);
|
||||
builder.setTitle(R.string.passwordRequired);
|
||||
|
||||
final EditText input = new EditText(this);
|
||||
@@ -383,7 +360,7 @@ public class ImportExportActivity extends CatimaAppCompatActivity {
|
||||
return;
|
||||
}
|
||||
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
||||
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(this);
|
||||
builder.setTitle(resultType == ImportExportResultType.Success ? R.string.importSuccessfulTitle : R.string.importFailedTitle);
|
||||
builder.setMessage(buildResultDialogMessage(result, true));
|
||||
builder.setNeutralButton(R.string.ok, (dialog, which) -> dialog.dismiss());
|
||||
@@ -394,7 +371,7 @@ public class ImportExportActivity extends CatimaAppCompatActivity {
|
||||
private void onExportComplete(ImportExportResult result, final Uri path) {
|
||||
ImportExportResultType resultType = result.resultType();
|
||||
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
||||
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(this);
|
||||
builder.setTitle(resultType == ImportExportResultType.Success ? R.string.exportSuccessfulTitle : R.string.exportFailedTitle);
|
||||
builder.setMessage(buildResultDialogMessage(result, false));
|
||||
builder.setNeutralButton(R.string.ok, (dialog, which) -> dialog.dismiss());
|
||||
|
||||
@@ -117,7 +117,7 @@ public class ImportURIHelper {
|
||||
}
|
||||
|
||||
return new LoyaltyCard(-1, store, note, expiry, balance, balanceType, cardId, barcodeId, barcodeType, headerColor, 0, Utils.getUnixTime(), 100,0);
|
||||
} catch (NullPointerException | NumberFormatException | UnsupportedEncodingException ex) {
|
||||
} catch (NullPointerException | NumberFormatException | UnsupportedEncodingException | ArrayIndexOutOfBoundsException ex) {
|
||||
throw new InvalidObjectException("Not a valid import URI");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,17 +17,20 @@ import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.google.android.material.card.MaterialCardView;
|
||||
import com.google.android.material.color.MaterialColors;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.text.DateFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Currency;
|
||||
import java.util.Date;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.constraintlayout.widget.ConstraintLayout;
|
||||
import androidx.core.content.ContextCompat;
|
||||
import androidx.core.graphics.BlendModeColorFilterCompat;
|
||||
import androidx.core.graphics.BlendModeCompat;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import protect.card_locker.databinding.LoyaltyCardLayoutBinding;
|
||||
import protect.card_locker.preferences.Settings;
|
||||
|
||||
public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCursorAdapter.LoyaltyCardListItemViewHolder> {
|
||||
@@ -82,10 +85,15 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
|
||||
return mShowDetails;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public LoyaltyCardListItemViewHolder onCreateViewHolder(ViewGroup inputParent, int inputViewType) {
|
||||
View itemView = LayoutInflater.from(inputParent.getContext()).inflate(R.layout.loyalty_card_layout, inputParent, false);
|
||||
return new LoyaltyCardListItemViewHolder(itemView, mListener);
|
||||
public LoyaltyCardListItemViewHolder onCreateViewHolder(@NonNull ViewGroup inputParent, int inputViewType) {
|
||||
LoyaltyCardLayoutBinding loyaltyCardLayoutBinding = LoyaltyCardLayoutBinding.inflate(
|
||||
LayoutInflater.from(inputParent.getContext()),
|
||||
inputParent,
|
||||
false
|
||||
);
|
||||
return new LoyaltyCardListItemViewHolder(loyaltyCardLayoutBinding, mListener);
|
||||
}
|
||||
|
||||
public LoyaltyCard getCard(int position) {
|
||||
@@ -107,15 +115,15 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
|
||||
}
|
||||
|
||||
if (mShowDetails && !loyaltyCard.balance.equals(new BigDecimal("0"))) {
|
||||
inputHolder.setBalanceField(loyaltyCard.balance, loyaltyCard.balanceType);
|
||||
inputHolder.setExtraField(inputHolder.mBalanceField, Utils.formatBalance(mContext, loyaltyCard.balance, loyaltyCard.balanceType), null);
|
||||
} else {
|
||||
inputHolder.setBalanceField(null, null);
|
||||
inputHolder.setExtraField(inputHolder.mBalanceField, null, null);
|
||||
}
|
||||
|
||||
if (mShowDetails && loyaltyCard.expiry != null) {
|
||||
inputHolder.setExpiryField(loyaltyCard.expiry);
|
||||
inputHolder.setExtraField(inputHolder.mExpiryField, DateFormat.getDateInstance(DateFormat.LONG).format(loyaltyCard.expiry), Utils.hasExpired(loyaltyCard.expiry) ? Color.RED : null);
|
||||
} else {
|
||||
inputHolder.setExpiryField(null);
|
||||
inputHolder.setExtraField(inputHolder.mExpiryField, null, null);
|
||||
}
|
||||
|
||||
setHeaderHeight(inputHolder, mShowDetails);
|
||||
@@ -237,22 +245,23 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
|
||||
|
||||
|
||||
|
||||
protected LoyaltyCardListItemViewHolder(View inputView, CardAdapterListener inputListener) {
|
||||
super(inputView);
|
||||
mRow = inputView.findViewById(R.id.row);
|
||||
mDivider = inputView.findViewById(R.id.info_divider);
|
||||
mStoreField = inputView.findViewById(R.id.store);
|
||||
mNoteField = inputView.findViewById(R.id.note);
|
||||
mBalanceField = inputView.findViewById(R.id.balance);
|
||||
mExpiryField = inputView.findViewById(R.id.expiry);
|
||||
mIconLayout = inputView.findViewById(R.id.icon_layout);
|
||||
mCardIcon = inputView.findViewById(R.id.thumbnail);
|
||||
mStar = inputView.findViewById(R.id.star);
|
||||
mStarBackground = inputView.findViewById(R.id.star_background);
|
||||
mStarBorder = inputView.findViewById(R.id.star_border);
|
||||
mArchived = inputView.findViewById(R.id.archivedIcon);
|
||||
mArchivedBackground = inputView.findViewById(R.id.archive_background);
|
||||
mTickIcon = inputView.findViewById(R.id.selected_thumbnail);
|
||||
protected LoyaltyCardListItemViewHolder(LoyaltyCardLayoutBinding loyaltyCardLayoutBinding, CardAdapterListener inputListener) {
|
||||
super(loyaltyCardLayoutBinding.getRoot());
|
||||
View inputView = loyaltyCardLayoutBinding.getRoot();
|
||||
mRow = loyaltyCardLayoutBinding.row;
|
||||
mDivider = loyaltyCardLayoutBinding.infoDivider;
|
||||
mStoreField = loyaltyCardLayoutBinding.store;
|
||||
mNoteField = loyaltyCardLayoutBinding.note;
|
||||
mBalanceField = loyaltyCardLayoutBinding.balance;
|
||||
mExpiryField = loyaltyCardLayoutBinding.expiry;
|
||||
mIconLayout = loyaltyCardLayoutBinding.iconLayout;
|
||||
mCardIcon = loyaltyCardLayoutBinding.thumbnail;
|
||||
mStar = loyaltyCardLayoutBinding.star;
|
||||
mStarBackground = loyaltyCardLayoutBinding.starBackground;
|
||||
mStarBorder = loyaltyCardLayoutBinding.starBorder;
|
||||
mArchived = loyaltyCardLayoutBinding.archivedIcon;
|
||||
mArchivedBackground = loyaltyCardLayoutBinding.archiveBackground;
|
||||
mTickIcon = loyaltyCardLayoutBinding.selectedThumbnail;
|
||||
inputView.setOnLongClickListener(view -> {
|
||||
inputListener.onRowClicked(getAdapterPosition());
|
||||
inputView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);
|
||||
@@ -260,6 +269,41 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
|
||||
});
|
||||
}
|
||||
|
||||
private void setExtraField(TextView field, String text, Integer color) {
|
||||
// If text is null, hide the field
|
||||
// If iconColor is null, use the default text and icon color based on theme
|
||||
if (text == null) {
|
||||
field.setVisibility(View.GONE);
|
||||
field.requestLayout();
|
||||
return;
|
||||
}
|
||||
|
||||
int size = mSettings.getFontSizeMax(mSettings.getSmallFont());
|
||||
|
||||
field.setVisibility(View.VISIBLE);
|
||||
field.setText(text);
|
||||
field.setTextSize(size);
|
||||
field.setTextColor(color != null ? color : MaterialColors.getColor(mContext, R.attr.colorSecondary, ContextCompat.getColor(mContext, mDarkModeEnabled ? R.color.md_theme_dark_secondary : R.color.md_theme_light_secondary)));
|
||||
|
||||
int drawableSize = dpToPx((size * 24) / 14, mContext);
|
||||
mDivider.setVisibility(View.VISIBLE);
|
||||
field.setVisibility(View.VISIBLE);
|
||||
Drawable icon = field.getCompoundDrawables()[0];
|
||||
if (icon != null) {
|
||||
icon.mutate();
|
||||
icon.setBounds(0, 0, drawableSize, drawableSize);
|
||||
field.setCompoundDrawablesRelative(icon, null, null, null);
|
||||
|
||||
if (color != null) {
|
||||
icon.setColorFilter(BlendModeColorFilterCompat.createBlendModeColorFilterCompat(color, BlendModeCompat.SRC_ATOP));
|
||||
} else {
|
||||
icon.setColorFilter(BlendModeColorFilterCompat.createBlendModeColorFilterCompat(mDarkModeEnabled ? Color.WHITE : Color.BLACK, BlendModeCompat.SRC_ATOP));
|
||||
}
|
||||
}
|
||||
|
||||
field.requestLayout();
|
||||
}
|
||||
|
||||
public void setStoreField(String text) {
|
||||
mStoreField.setText(text);
|
||||
mStoreField.setTextSize(mSettings.getFontSizeMax(mSettings.getMediumFont()));
|
||||
@@ -277,55 +321,6 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
|
||||
mNoteField.requestLayout();
|
||||
}
|
||||
|
||||
public void setBalanceField(BigDecimal balance, Currency balanceType) {
|
||||
if (balance == null) {
|
||||
mBalanceField.setVisibility(View.GONE);
|
||||
} else {
|
||||
int size = mSettings.getFontSizeMax(mSettings.getSmallFont());
|
||||
int drawableSize = dpToPx((size * 24) / 14, mContext);
|
||||
mDivider.setVisibility(View.VISIBLE);
|
||||
mBalanceField.setVisibility(View.VISIBLE);
|
||||
Drawable balanceIcon = mBalanceField.getCompoundDrawables()[0];
|
||||
if (balanceIcon != null) {
|
||||
balanceIcon.setBounds(0, 0, drawableSize, drawableSize);
|
||||
mBalanceField.setCompoundDrawablesRelative(balanceIcon, null, null, null);
|
||||
if (mDarkModeEnabled) {
|
||||
balanceIcon.setColorFilter(BlendModeColorFilterCompat.createBlendModeColorFilterCompat(Color.WHITE, BlendModeCompat.SRC_ATOP));
|
||||
}
|
||||
}
|
||||
mBalanceField.setText(Utils.formatBalance(mContext, balance, balanceType));
|
||||
mBalanceField.setTextSize(size);
|
||||
}
|
||||
mBalanceField.requestLayout();
|
||||
}
|
||||
|
||||
public void setExpiryField(Date expiry) {
|
||||
if (expiry == null) {
|
||||
mExpiryField.setVisibility(View.GONE);
|
||||
} else {
|
||||
int size = mSettings.getFontSizeMax(mSettings.getSmallFont());
|
||||
int drawableSize = dpToPx((size * 24) / 14, mContext);
|
||||
mDivider.setVisibility(View.VISIBLE);
|
||||
mExpiryField.setVisibility(View.VISIBLE);
|
||||
Drawable expiryIcon = mExpiryField.getCompoundDrawables()[0];
|
||||
if (expiryIcon != null) {
|
||||
expiryIcon.setBounds(0, 0, drawableSize, drawableSize);
|
||||
mExpiryField.setCompoundDrawablesRelative(expiryIcon, null, null, null);
|
||||
if (Utils.hasExpired(expiry)) {
|
||||
expiryIcon.setColorFilter(BlendModeColorFilterCompat.createBlendModeColorFilterCompat(Color.RED, BlendModeCompat.SRC_ATOP));
|
||||
} else if (mDarkModeEnabled) {
|
||||
expiryIcon.setColorFilter(BlendModeColorFilterCompat.createBlendModeColorFilterCompat(Color.WHITE, BlendModeCompat.SRC_ATOP));
|
||||
}
|
||||
}
|
||||
mExpiryField.setText(DateFormat.getDateInstance(DateFormat.LONG).format(expiry));
|
||||
if (Utils.hasExpired(expiry)) {
|
||||
mExpiryField.setTextColor(Color.RED);
|
||||
}
|
||||
mExpiryField.setTextSize(size);
|
||||
}
|
||||
mExpiryField.requestLayout();
|
||||
}
|
||||
|
||||
public void toggleCardStateIcon(boolean enableStar, boolean enableArchive, boolean colorByTheme) {
|
||||
/* the below code does not work in android 5! hence the change of drawable instead
|
||||
boolean needDarkForeground = Utils.needsDarkForeground(mIconBackgroundColor);
|
||||
|
||||
@@ -20,6 +20,7 @@ import android.os.LocaleList;
|
||||
import android.text.Editable;
|
||||
import android.text.InputType;
|
||||
import android.util.Log;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
@@ -37,6 +38,7 @@ import android.widget.Toast;
|
||||
import com.google.android.material.chip.Chip;
|
||||
import com.google.android.material.chip.ChipGroup;
|
||||
import com.google.android.material.color.MaterialColors;
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||
import com.google.android.material.snackbar.Snackbar;
|
||||
import com.google.android.material.tabs.TabLayout;
|
||||
@@ -57,6 +59,7 @@ import java.util.Calendar;
|
||||
import java.util.Collections;
|
||||
import java.util.Currency;
|
||||
import java.util.Date;
|
||||
import java.util.GregorianCalendar;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.LinkedHashMap;
|
||||
@@ -77,8 +80,11 @@ import androidx.core.content.FileProvider;
|
||||
import androidx.exifinterface.media.ExifInterface;
|
||||
import androidx.fragment.app.DialogFragment;
|
||||
import protect.card_locker.async.TaskHandler;
|
||||
import protect.card_locker.databinding.LayoutChipChoiceBinding;
|
||||
import protect.card_locker.databinding.LoyaltyCardEditActivityBinding;
|
||||
|
||||
public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
|
||||
private LoyaltyCardEditActivityBinding binding;
|
||||
private static final String TAG = "Catima";
|
||||
|
||||
private final String STATE_TAB_INDEX = "savedTab";
|
||||
@@ -105,6 +111,9 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
|
||||
private static final int PERMISSION_REQUEST_CAMERA_IMAGE_FRONT = 100;
|
||||
private static final int PERMISSION_REQUEST_CAMERA_IMAGE_BACK = 101;
|
||||
private static final int PERMISSION_REQUEST_CAMERA_IMAGE_ICON = 102;
|
||||
private static final int PERMISSION_REQUEST_STORAGE_IMAGE_FRONT = 103;
|
||||
private static final int PERMISSION_REQUEST_STORAGE_IMAGE_BACK = 104;
|
||||
private static final int PERMISSION_REQUEST_STORAGE_IMAGE_ICON = 105;
|
||||
|
||||
public static final String BUNDLE_ID = "id";
|
||||
public static final String BUNDLE_DUPLICATE_ID = "duplicateId";
|
||||
@@ -244,7 +253,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
|
||||
@Override
|
||||
public void onSaveInstanceState(@NonNull Bundle savedInstanceState) {
|
||||
super.onSaveInstanceState(savedInstanceState);
|
||||
tabs = findViewById(R.id.tabs);
|
||||
tabs = binding.tabs;
|
||||
savedInstanceState.putInt(STATE_TAB_INDEX, tabs.getSelectedTabPosition());
|
||||
savedInstanceState.putParcelable(STATE_TEMP_CARD, tempLoyaltyCard);
|
||||
savedInstanceState.putInt(STATE_REQUESTED_IMAGE, mRequestedImage);
|
||||
@@ -281,7 +290,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
|
||||
public void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
|
||||
tempLoyaltyCard = savedInstanceState.getParcelable(STATE_TEMP_CARD);
|
||||
super.onRestoreInstanceState(savedInstanceState);
|
||||
tabs = findViewById(R.id.tabs);
|
||||
tabs = binding.tabs;
|
||||
tabs.selectTab(tabs.getTabAt(savedInstanceState.getInt(STATE_TAB_INDEX)));
|
||||
mRequestedImage = savedInstanceState.getInt(STATE_REQUESTED_IMAGE);
|
||||
mFrontImageUnsaved = savedInstanceState.getInt(STATE_FRONT_IMAGE_UNSAVED) == 1;
|
||||
@@ -297,14 +306,11 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
setContentView(R.layout.loyalty_card_edit_activity);
|
||||
toolbar = findViewById(R.id.toolbar);
|
||||
binding = LoyaltyCardEditActivityBinding.inflate(getLayoutInflater());
|
||||
setContentView(binding.getRoot());
|
||||
toolbar = binding.toolbar;
|
||||
setSupportActionBar(toolbar);
|
||||
ActionBar actionBar = getSupportActionBar();
|
||||
if (actionBar != null) {
|
||||
actionBar.setDisplayHomeAsUpEnabled(true);
|
||||
}
|
||||
enableToolbarBackButton();
|
||||
|
||||
mDatabase = new DBHelper(this).getWritableDatabase();
|
||||
|
||||
@@ -316,28 +322,28 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
|
||||
currencies.put(currency.getSymbol(), currency);
|
||||
}
|
||||
|
||||
tabs = findViewById(R.id.tabs);
|
||||
thumbnail = findViewById(R.id.thumbnail);
|
||||
thumbnailEditIcon = findViewById(R.id.thumbnailEditIcon);
|
||||
storeFieldEdit = findViewById(R.id.storeNameEdit);
|
||||
noteFieldEdit = findViewById(R.id.noteEdit);
|
||||
groupsChips = findViewById(R.id.groupChips);
|
||||
expiryField = findViewById(R.id.expiryField);
|
||||
balanceField = findViewById(R.id.balanceField);
|
||||
balanceCurrencyField = findViewById(R.id.balanceCurrencyField);
|
||||
cardIdFieldView = findViewById(R.id.cardIdView);
|
||||
barcodeIdField = findViewById(R.id.barcodeIdField);
|
||||
barcodeTypeField = findViewById(R.id.barcodeTypeField);
|
||||
barcodeImage = findViewById(R.id.barcode);
|
||||
tabs = binding.tabs;
|
||||
thumbnail = binding.thumbnail;
|
||||
thumbnailEditIcon = binding.thumbnailEditIcon;
|
||||
storeFieldEdit = binding.storeNameEdit;
|
||||
noteFieldEdit = binding.noteEdit;
|
||||
groupsChips = binding.groupChips;
|
||||
expiryField = binding.expiryField;
|
||||
balanceField = binding.balanceField;
|
||||
balanceCurrencyField = binding.balanceCurrencyField;
|
||||
cardIdFieldView = binding.cardIdView;
|
||||
barcodeIdField = binding.barcodeIdField;
|
||||
barcodeTypeField = binding.barcodeTypeField;
|
||||
barcodeImage = binding.barcode;
|
||||
barcodeImage.setClipToOutline(true);
|
||||
barcodeImageLayout = findViewById(R.id.barcodeLayout);
|
||||
barcodeCaptureLayout = findViewById(R.id.barcodeCaptureLayout);
|
||||
cardImageFrontHolder = findViewById(R.id.frontImageHolder);
|
||||
cardImageBackHolder = findViewById(R.id.backImageHolder);
|
||||
cardImageFront = findViewById(R.id.frontImage);
|
||||
cardImageBack = findViewById(R.id.backImage);
|
||||
barcodeImageLayout = binding.barcodeLayout;
|
||||
barcodeCaptureLayout = binding.barcodeCaptureLayout;
|
||||
cardImageFrontHolder = binding.frontImageHolder;
|
||||
cardImageBackHolder = binding.backImageHolder;
|
||||
cardImageFront = binding.frontImage;
|
||||
cardImageBack = binding.backImage;
|
||||
|
||||
enterButton = findViewById(R.id.enterButton);
|
||||
enterButton = binding.enterButton;
|
||||
|
||||
barcodeImageGenerationFinishedCallback = () -> {
|
||||
if (!(boolean) barcodeImage.getTag()) {
|
||||
@@ -509,7 +515,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
|
||||
barcodeIdField.setText(lastValue);
|
||||
}
|
||||
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(LoyaltyCardEditActivity.this);
|
||||
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(LoyaltyCardEditActivity.this);
|
||||
builder.setTitle(R.string.setBarcodeId);
|
||||
final EditText input = new EditText(LoyaltyCardEditActivity.this);
|
||||
input.setInputType(InputType.TYPE_CLASS_TEXT);
|
||||
@@ -834,7 +840,9 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
|
||||
}
|
||||
|
||||
for (Group group : DBHelper.getGroups(mDatabase)) {
|
||||
Chip chip = (Chip) getLayoutInflater().inflate(R.layout.layout_chip_choice, groupsChips, false);
|
||||
LayoutChipChoiceBinding chipChoiceBinding = LayoutChipChoiceBinding
|
||||
.inflate(LayoutInflater.from(groupsChips.getContext()), groupsChips, false);
|
||||
Chip chip = chipChoiceBinding.getRoot();
|
||||
chip.setText(group._id);
|
||||
chip.setTag(group);
|
||||
|
||||
@@ -906,7 +914,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
|
||||
cardImageFrontHolder.setOnClickListener(new ChooseCardImage());
|
||||
cardImageBackHolder.setOnClickListener(new ChooseCardImage());
|
||||
|
||||
FloatingActionButton saveButton = findViewById(R.id.fabSave);
|
||||
FloatingActionButton saveButton = binding.fabSave;
|
||||
saveButton.setOnClickListener(v -> doSave());
|
||||
saveButton.bringToFront();
|
||||
|
||||
@@ -976,14 +984,59 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
|
||||
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
|
||||
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
|
||||
|
||||
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
|
||||
if (requestCode == PERMISSION_REQUEST_CAMERA_IMAGE_FRONT) {
|
||||
onMockedRequestPermissionsResult(requestCode, permissions, grantResults);
|
||||
}
|
||||
|
||||
public void onMockedRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
|
||||
boolean granted = grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED;
|
||||
Integer failureReason = null;
|
||||
|
||||
if (requestCode == PERMISSION_REQUEST_CAMERA_IMAGE_FRONT) {
|
||||
if (granted) {
|
||||
takePhotoForCard(Utils.CARD_IMAGE_FROM_CAMERA_FRONT);
|
||||
} else if (requestCode == PERMISSION_REQUEST_CAMERA_IMAGE_BACK) {
|
||||
takePhotoForCard(Utils.CARD_IMAGE_FROM_CAMERA_BACK);
|
||||
} else if (requestCode == PERMISSION_REQUEST_CAMERA_IMAGE_ICON) {
|
||||
takePhotoForCard(Utils.CARD_IMAGE_FROM_CAMERA_ICON);
|
||||
return;
|
||||
}
|
||||
|
||||
failureReason = R.string.cameraPermissionRequired;
|
||||
} else if (requestCode == PERMISSION_REQUEST_CAMERA_IMAGE_BACK) {
|
||||
if (granted) {
|
||||
takePhotoForCard(Utils.CARD_IMAGE_FROM_CAMERA_BACK);
|
||||
return;
|
||||
}
|
||||
|
||||
failureReason = R.string.cameraPermissionRequired;
|
||||
} else if (requestCode == PERMISSION_REQUEST_CAMERA_IMAGE_ICON) {
|
||||
if (granted) {
|
||||
takePhotoForCard(Utils.CARD_IMAGE_FROM_CAMERA_ICON);
|
||||
return;
|
||||
}
|
||||
|
||||
failureReason = R.string.cameraPermissionRequired;
|
||||
} else if (requestCode == PERMISSION_REQUEST_STORAGE_IMAGE_FRONT) {
|
||||
if (granted) {
|
||||
selectImageFromGallery(Utils.CARD_IMAGE_FROM_FILE_FRONT);
|
||||
return;
|
||||
}
|
||||
|
||||
failureReason = R.string.storageReadPermissionRequired;
|
||||
} else if (requestCode == PERMISSION_REQUEST_STORAGE_IMAGE_BACK) {
|
||||
if (granted) {
|
||||
selectImageFromGallery(Utils.CARD_IMAGE_FROM_FILE_BACK);
|
||||
return;
|
||||
}
|
||||
|
||||
failureReason = R.string.storageReadPermissionRequired;
|
||||
} else if (requestCode == PERMISSION_REQUEST_STORAGE_IMAGE_ICON) {
|
||||
if (granted) {
|
||||
selectImageFromGallery(Utils.CARD_IMAGE_FROM_FILE_ICON);
|
||||
return;
|
||||
}
|
||||
|
||||
failureReason = R.string.storageReadPermissionRequired;
|
||||
}
|
||||
|
||||
if (failureReason != null) {
|
||||
Toast.makeText(this, failureReason, Toast.LENGTH_LONG).show();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1000,7 +1053,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
|
||||
return;
|
||||
}
|
||||
|
||||
new AlertDialog.Builder(this)
|
||||
new MaterialAlertDialogBuilder(this)
|
||||
.setTitle(R.string.updateBarcodeQuestionTitle)
|
||||
.setMessage(R.string.updateBarcodeQuestionText)
|
||||
.setPositiveButton(R.string.yes, (dialog, which) -> {
|
||||
@@ -1034,7 +1087,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
|
||||
}
|
||||
|
||||
if (confirmExitDialog == null) {
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
||||
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(this);
|
||||
builder.setTitle(R.string.leaveWithoutSaveTitle);
|
||||
builder.setMessage(R.string.leaveWithoutSaveConfirmation);
|
||||
builder.setPositiveButton(R.string.confirm, (dialog, which) -> {
|
||||
@@ -1055,6 +1108,24 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
|
||||
mPhotoTakerLauncher.launch(photoURI);
|
||||
}
|
||||
|
||||
private void selectImageFromGallery(int type) {
|
||||
mRequestedImage = type;
|
||||
|
||||
Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
|
||||
photoPickerIntent.setType("image/*");
|
||||
Intent contentIntent = new Intent(Intent.ACTION_GET_CONTENT);
|
||||
contentIntent.setType("image/*");
|
||||
Intent chooserIntent = Intent.createChooser(photoPickerIntent, getString(R.string.addFromImage));
|
||||
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { contentIntent });
|
||||
|
||||
try {
|
||||
mPhotoPickerLauncher.launch(chooserIntent);
|
||||
} catch (ActivityNotFoundException e) {
|
||||
Toast.makeText(getApplicationContext(), R.string.failedLaunchingPhotoPicker, Toast.LENGTH_LONG).show();
|
||||
Log.e(TAG, "No activity found to handle intent", e);
|
||||
}
|
||||
}
|
||||
|
||||
class EditCardIdAndBarcode implements View.OnClickListener {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
@@ -1136,59 +1207,38 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
|
||||
}
|
||||
|
||||
cardOptions.put(getString(R.string.takePhoto), () -> {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||
int permissionRequestType;
|
||||
int permissionRequestType;
|
||||
|
||||
if (v.getId() == R.id.frontImageHolder) {
|
||||
permissionRequestType = PERMISSION_REQUEST_CAMERA_IMAGE_FRONT;
|
||||
} else if (v.getId() == R.id.backImageHolder) {
|
||||
permissionRequestType = PERMISSION_REQUEST_CAMERA_IMAGE_BACK;
|
||||
} else if (v.getId() == R.id.thumbnail) {
|
||||
permissionRequestType = PERMISSION_REQUEST_CAMERA_IMAGE_ICON;
|
||||
} else {
|
||||
throw new IllegalArgumentException("Unknown ID type " + v.getId());
|
||||
}
|
||||
|
||||
requestPermissions(new String[]{Manifest.permission.CAMERA}, permissionRequestType);
|
||||
} else {
|
||||
int cardImageType;
|
||||
|
||||
if (v.getId() == R.id.frontImageHolder) {
|
||||
cardImageType = Utils.CARD_IMAGE_FROM_CAMERA_FRONT;
|
||||
} else if (v.getId() == R.id.backImageHolder) {
|
||||
cardImageType = Utils.CARD_IMAGE_FROM_CAMERA_BACK;
|
||||
} else if (v.getId() == R.id.thumbnail) {
|
||||
cardImageType = Utils.CARD_IMAGE_FROM_CAMERA_ICON;
|
||||
} else {
|
||||
throw new IllegalArgumentException("Unknown ID type " + v.getId());
|
||||
}
|
||||
|
||||
takePhotoForCard(cardImageType);
|
||||
}
|
||||
return null;
|
||||
});
|
||||
|
||||
cardOptions.put(getString(R.string.addFromImage), () -> {
|
||||
if (v.getId() == R.id.frontImageHolder) {
|
||||
mRequestedImage = Utils.CARD_IMAGE_FROM_FILE_FRONT;
|
||||
permissionRequestType = PERMISSION_REQUEST_CAMERA_IMAGE_FRONT;
|
||||
} else if (v.getId() == R.id.backImageHolder) {
|
||||
mRequestedImage = Utils.CARD_IMAGE_FROM_FILE_BACK;
|
||||
permissionRequestType = PERMISSION_REQUEST_CAMERA_IMAGE_BACK;
|
||||
} else if (v.getId() == R.id.thumbnail) {
|
||||
mRequestedImage = Utils.CARD_IMAGE_FROM_FILE_ICON;
|
||||
permissionRequestType = PERMISSION_REQUEST_CAMERA_IMAGE_ICON;
|
||||
} else {
|
||||
throw new IllegalArgumentException("Unknown ID type " + v.getId());
|
||||
}
|
||||
|
||||
Intent i = new Intent(Intent.ACTION_PICK);
|
||||
i.setType("image/*");
|
||||
PermissionUtils.requestCameraPermission(LoyaltyCardEditActivity.this, permissionRequestType);
|
||||
|
||||
try {
|
||||
mPhotoPickerLauncher.launch(i);
|
||||
} catch (ActivityNotFoundException e) {
|
||||
Toast.makeText(getApplicationContext(), R.string.failedLaunchingPhotoPicker, Toast.LENGTH_LONG).show();
|
||||
Log.e(TAG, "No activity found to handle intent", e);
|
||||
return null;
|
||||
});
|
||||
|
||||
cardOptions.put(getString(R.string.addFromImage), () -> {
|
||||
int permissionRequestType;
|
||||
|
||||
if (v.getId() == R.id.frontImageHolder) {
|
||||
permissionRequestType = PERMISSION_REQUEST_STORAGE_IMAGE_FRONT;
|
||||
} else if (v.getId() == R.id.backImageHolder) {
|
||||
permissionRequestType = PERMISSION_REQUEST_STORAGE_IMAGE_BACK;
|
||||
} else if (v.getId() == R.id.thumbnail) {
|
||||
permissionRequestType = PERMISSION_REQUEST_STORAGE_IMAGE_ICON;
|
||||
} else {
|
||||
throw new IllegalArgumentException("Unknown ID type " + v.getId());
|
||||
}
|
||||
|
||||
PermissionUtils.requestStorageReadPermission(LoyaltyCardEditActivity.this, permissionRequestType);
|
||||
|
||||
return null;
|
||||
});
|
||||
|
||||
@@ -1204,7 +1254,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
|
||||
throw new IllegalArgumentException("Unknown ID type " + v.getId());
|
||||
}
|
||||
|
||||
new AlertDialog.Builder(LoyaltyCardEditActivity.this)
|
||||
new MaterialAlertDialogBuilder(LoyaltyCardEditActivity.this)
|
||||
.setTitle(getString(titleResource))
|
||||
.setItems(cardOptions.keySet().toArray(new CharSequence[cardOptions.size()]), (dialog, which) -> {
|
||||
Iterator<Callable<Void>> callables = cardOptions.values().iterator();
|
||||
@@ -1268,11 +1318,11 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
|
||||
}
|
||||
|
||||
public void onDateSet(DatePicker view, int year, int month, int day) {
|
||||
Calendar c = Calendar.getInstance();
|
||||
Calendar c = new GregorianCalendar();
|
||||
c.set(Calendar.YEAR, year);
|
||||
c.set(Calendar.MONTH, month);
|
||||
c.set(Calendar.DAY_OF_MONTH, day);
|
||||
c.set(Calendar.HOUR, 0);
|
||||
c.set(Calendar.HOUR_OF_DAY, 0);
|
||||
c.set(Calendar.MINUTE, 0);
|
||||
c.set(Calendar.SECOND, 0);
|
||||
c.set(Calendar.MILLISECOND, 0);
|
||||
@@ -1498,9 +1548,9 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
|
||||
return;
|
||||
}
|
||||
|
||||
View cardPart = findViewById(R.id.cardPart);
|
||||
View optionsPart = findViewById(R.id.optionsPart);
|
||||
View picturesPart = findViewById(R.id.picturesPart);
|
||||
View cardPart = binding.cardPart;
|
||||
View optionsPart = binding.optionsPart;
|
||||
View picturesPart = binding.picturesPart;
|
||||
|
||||
if (getString(R.string.card).equals(part)) {
|
||||
cardPart.setVisibility(View.VISIBLE);
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package protect.card_locker;
|
||||
|
||||
import android.content.ActivityNotFoundException;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.ActivityInfo;
|
||||
import android.content.res.ColorStateList;
|
||||
@@ -13,9 +14,11 @@ import android.graphics.Rect;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.text.InputType;
|
||||
import android.text.SpannableStringBuilder;
|
||||
import android.text.Spanned;
|
||||
import android.text.TextUtils;
|
||||
import android.text.method.DigitsKeyListener;
|
||||
import android.text.style.ForegroundColorSpan;
|
||||
import android.text.util.Linkify;
|
||||
import android.util.Log;
|
||||
@@ -25,10 +28,14 @@ import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.ViewOutlineProvider;
|
||||
import android.view.ViewTreeObserver;
|
||||
import android.view.Window;
|
||||
import android.view.WindowInsets;
|
||||
import android.view.WindowInsetsController;
|
||||
import android.view.WindowManager;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.ImageButton;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
@@ -49,24 +56,31 @@ import androidx.core.graphics.BlendModeColorFilterCompat;
|
||||
import androidx.core.graphics.BlendModeCompat;
|
||||
import androidx.core.graphics.ColorUtils;
|
||||
import androidx.core.graphics.drawable.DrawableCompat;
|
||||
import androidx.core.view.WindowInsetsControllerCompat;
|
||||
import androidx.core.widget.TextViewCompat;
|
||||
|
||||
import com.google.android.material.appbar.AppBarLayout;
|
||||
import com.google.android.material.bottomappbar.BottomAppBar;
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||
import com.google.android.material.textfield.TextInputEditText;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.math.BigDecimal;
|
||||
import java.text.DateFormat;
|
||||
import java.text.ParseException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Currency;
|
||||
import java.util.List;
|
||||
|
||||
import protect.card_locker.async.TaskHandler;
|
||||
import protect.card_locker.databinding.LoyaltyCardViewLayoutBinding;
|
||||
import protect.card_locker.preferences.Settings;
|
||||
|
||||
public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements GestureDetector.OnGestureListener {
|
||||
private LoyaltyCardViewLayoutBinding binding;
|
||||
private static final String TAG = "Catima";
|
||||
|
||||
private GestureDetector mGestureDetector;
|
||||
@@ -78,6 +92,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
|
||||
ImageButton bottomAppBarInfoButton;
|
||||
ImageButton bottomAppBarPreviousButton;
|
||||
ImageButton bottomAppBarNextButton;
|
||||
ImageButton bottomAppBarUpdateBalanceButton;
|
||||
AppCompatTextView storeName;
|
||||
ImageButton maximizeButton;
|
||||
ImageView mainImage;
|
||||
@@ -186,8 +201,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
|
||||
.setDataAndType(FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID, file), "image/*")
|
||||
.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
|
||||
startActivity(intent);
|
||||
}
|
||||
catch (ActivityNotFoundException e) {
|
||||
} catch (ActivityNotFoundException e) {
|
||||
// Display a toast message if an image viewer is not installed on device
|
||||
Toast.makeText(this, R.string.failedLaunchingPhotoPicker, Toast.LENGTH_SHORT).show();
|
||||
e.printStackTrace();
|
||||
@@ -311,6 +325,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
|
||||
}
|
||||
|
||||
super.onCreate(savedInstanceState);
|
||||
binding = LoyaltyCardViewLayoutBinding.inflate(getLayoutInflater());
|
||||
|
||||
settings = new Settings(this);
|
||||
|
||||
@@ -332,30 +347,31 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
|
||||
|
||||
extractIntentFields(getIntent());
|
||||
|
||||
setContentView(R.layout.loyalty_card_view_layout);
|
||||
setContentView(binding.getRoot());
|
||||
|
||||
database = new DBHelper(this).getWritableDatabase();
|
||||
importURIHelper = new ImportURIHelper(this);
|
||||
|
||||
coordinatorLayout = findViewById(R.id.coordinator_layout);
|
||||
mainLayout = findViewById(R.id.mainLayout);
|
||||
cardIdFieldView = findViewById(R.id.cardIdView);
|
||||
storeName = findViewById(R.id.storeName);
|
||||
maximizeButton = findViewById(R.id.maximizeButton);
|
||||
mainImage = findViewById(R.id.mainImage);
|
||||
coordinatorLayout = binding.coordinatorLayout;
|
||||
mainLayout = binding.mainLayout;
|
||||
cardIdFieldView = binding.cardIdView;
|
||||
storeName = binding.storeName;
|
||||
maximizeButton = binding.maximizeButton;
|
||||
mainImage = binding.mainImage;
|
||||
mainImage.setClipToOutline(true);
|
||||
dotIndicator = findViewById(R.id.dotIndicator);
|
||||
minimizeButton = findViewById(R.id.minimizeButton);
|
||||
collapsingToolbarLayout = findViewById(R.id.collapsingToolbarLayout);
|
||||
appBarLayout = findViewById(R.id.app_bar_layout);
|
||||
bottomAppBar = findViewById(R.id.bottom_app_bar);
|
||||
iconImage = findViewById(R.id.icon_image);
|
||||
portraitToolbar = findViewById(R.id.toolbar);
|
||||
landscapeToolbar = findViewById(R.id.toolbar_landscape);
|
||||
dotIndicator = binding.dotIndicator;
|
||||
minimizeButton = binding.minimizeButton;
|
||||
collapsingToolbarLayout = binding.collapsingToolbarLayout;
|
||||
appBarLayout = binding.appBarLayout;
|
||||
bottomAppBar = binding.bottomAppBar;
|
||||
iconImage = binding.iconImage;
|
||||
portraitToolbar = binding.toolbar;
|
||||
landscapeToolbar = binding.toolbarLandscape;
|
||||
|
||||
bottomAppBarInfoButton = findViewById(R.id.button_show_info);
|
||||
bottomAppBarPreviousButton = findViewById(R.id.button_previous);
|
||||
bottomAppBarNextButton = findViewById(R.id.button_next);
|
||||
bottomAppBarInfoButton = binding.buttonShowInfo;
|
||||
bottomAppBarPreviousButton = binding.buttonPrevious;
|
||||
bottomAppBarNextButton = binding.buttonNext;
|
||||
bottomAppBarUpdateBalanceButton = binding.buttonUpdateBalance;
|
||||
|
||||
barcodeImageGenerationFinishedCallback = () -> {
|
||||
if (!(boolean) mainImage.getTag()) {
|
||||
@@ -370,8 +386,8 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
|
||||
}
|
||||
};
|
||||
|
||||
centerGuideline = findViewById(R.id.centerGuideline);
|
||||
barcodeScaler = findViewById(R.id.barcodeScaler);
|
||||
centerGuideline = binding.centerGuideline;
|
||||
barcodeScaler = binding.barcodeScaler;
|
||||
barcodeScaler.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
|
||||
@Override
|
||||
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
|
||||
@@ -409,7 +425,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
|
||||
maximizeButton.setOnClickListener(v -> setFullscreen(true));
|
||||
minimizeButton.setOnClickListener(v -> setFullscreen(false));
|
||||
|
||||
editButton = findViewById(R.id.fabEdit);
|
||||
editButton = binding.fabEdit;
|
||||
editButton.setOnClickListener(v -> {
|
||||
Intent intent = new Intent(getApplicationContext(), LoyaltyCardEditActivity.class);
|
||||
Bundle bundle = new Bundle();
|
||||
@@ -432,6 +448,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
|
||||
bottomAppBarInfoButton.setOnClickListener(view -> showInfoDialog());
|
||||
bottomAppBarPreviousButton.setOnClickListener(view -> prevNextCard(false));
|
||||
bottomAppBarNextButton.setOnClickListener(view -> prevNextCard(true));
|
||||
bottomAppBarUpdateBalanceButton.setOnClickListener(view -> showBalanceUpdateDialog());
|
||||
|
||||
mGestureDetector = new GestureDetector(this, this);
|
||||
View.OnTouchListener gestureTouchListener = (v, event) -> mGestureDetector.onTouchEvent(event);
|
||||
@@ -446,6 +463,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
|
||||
iconImage.setClipBounds(new Rect(left, top, right, bottom));
|
||||
}
|
||||
});
|
||||
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
|
||||
}
|
||||
|
||||
private SpannableStringBuilder padSpannableString(SpannableStringBuilder spannableStringBuilder) {
|
||||
@@ -461,17 +479,29 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
|
||||
}
|
||||
|
||||
private void showInfoDialog() {
|
||||
AlertDialog.Builder infoDialog = new AlertDialog.Builder(this);
|
||||
AlertDialog.Builder infoDialog = new MaterialAlertDialogBuilder(this);
|
||||
|
||||
int dialogContentPadding = getResources().getDimensionPixelSize(R.dimen.alert_dialog_content_padding);
|
||||
int dialogTitlePadding = getResources().getDimensionPixelSize(R.dimen.alert_dialog_title_padding);
|
||||
TextView infoTitleView = new TextView(this);
|
||||
infoTitleView.setPadding(20, 20, 20, 20);
|
||||
infoTitleView.setPadding(
|
||||
dialogContentPadding,
|
||||
dialogContentPadding,
|
||||
dialogContentPadding,
|
||||
dialogTitlePadding
|
||||
);
|
||||
infoTitleView.setTextSize(settings.getFontSizeMax(settings.getMediumFont()));
|
||||
infoTitleView.setText(loyaltyCard.store);
|
||||
infoDialog.setCustomTitle(infoTitleView);
|
||||
infoDialog.setTitle(loyaltyCard.store);
|
||||
|
||||
TextView infoTextview = new TextView(this);
|
||||
infoTextview.setPadding(20, 0, 20, 0);
|
||||
infoTextview.setPadding(
|
||||
dialogContentPadding,
|
||||
0,
|
||||
dialogContentPadding,
|
||||
0
|
||||
);
|
||||
infoTextview.setAutoLinkMask(Linkify.ALL);
|
||||
infoTextview.setTextIsSelectable(true);
|
||||
|
||||
@@ -516,6 +546,80 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
|
||||
infoDialog.create().show();
|
||||
}
|
||||
|
||||
private void showBalanceUpdateDialog() {
|
||||
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(this);
|
||||
builder.setTitle(R.string.updateBalanceTitle);
|
||||
FrameLayout container = new FrameLayout(this);
|
||||
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
|
||||
ViewGroup.LayoutParams.MATCH_PARENT,
|
||||
ViewGroup.LayoutParams.WRAP_CONTENT
|
||||
);
|
||||
int contentPadding = getResources().getDimensionPixelSize(R.dimen.alert_dialog_content_padding);
|
||||
params.leftMargin = contentPadding;
|
||||
params.rightMargin = contentPadding;
|
||||
|
||||
LinearLayout layout = new LinearLayout(this);
|
||||
layout.setOrientation(LinearLayout.VERTICAL);
|
||||
|
||||
TextView currentTextview = new TextView(this);
|
||||
currentTextview.setText(getString(R.string.currentBalanceSentence, Utils.formatBalance(this, loyaltyCard.balance, loyaltyCard.balanceType)));
|
||||
layout.addView(currentTextview);
|
||||
|
||||
TextView updateTextView = new TextView(this);
|
||||
updateTextView.setText(getString(R.string.newBalanceSentence, Utils.formatBalance(this, loyaltyCard.balance, loyaltyCard.balanceType)));
|
||||
layout.addView(updateTextView);
|
||||
|
||||
final TextInputEditText input = new TextInputEditText(this);
|
||||
Context dialogContext = this;
|
||||
input.setInputType(InputType.TYPE_CLASS_NUMBER);
|
||||
input.setKeyListener(DigitsKeyListener.getInstance("0123456789,."));
|
||||
input.setHint(R.string.updateBalanceHint);
|
||||
input.addTextChangedListener(new SimpleTextWatcher() {
|
||||
@Override
|
||||
public void onTextChanged(CharSequence s, int start, int before, int count) {
|
||||
BigDecimal newBalance;
|
||||
try {
|
||||
newBalance = calculateNewBalance(loyaltyCard.balance, loyaltyCard.balanceType, s.toString());
|
||||
} catch (ParseException e) {
|
||||
input.setTag(null);
|
||||
updateTextView.setText(getString(R.string.newBalanceSentence, Utils.formatBalance(dialogContext, loyaltyCard.balance, loyaltyCard.balanceType)));
|
||||
return;
|
||||
}
|
||||
|
||||
// Save new balance into this element
|
||||
input.setTag(newBalance);
|
||||
updateTextView.setText(getString(R.string.newBalanceSentence, Utils.formatBalance(dialogContext, newBalance, loyaltyCard.balanceType)));
|
||||
}
|
||||
});
|
||||
layout.addView(input);
|
||||
layout.setLayoutParams(params);
|
||||
container.addView(layout);
|
||||
|
||||
builder.setView(container);
|
||||
builder.setPositiveButton(R.string.ok, (dialogInterface, i) -> {
|
||||
// Grab calculated balance from input field
|
||||
BigDecimal newBalance = (BigDecimal) input.getTag();
|
||||
if (newBalance == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Actually update balance
|
||||
DBHelper.updateLoyaltyCardBalance(database, loyaltyCardId, newBalance);
|
||||
// Reload UI
|
||||
this.onResume();
|
||||
});
|
||||
builder.setNegativeButton(getString(R.string.cancel), (dialog, which) -> dialog.cancel());
|
||||
AlertDialog dialog = builder.create();
|
||||
dialog.show();
|
||||
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
|
||||
input.requestFocus();
|
||||
}
|
||||
|
||||
private BigDecimal calculateNewBalance(BigDecimal currentBalance, Currency currency, String unparsedSubtraction) throws ParseException {
|
||||
BigDecimal subtraction = Utils.parseBalance(unparsedSubtraction, currency);
|
||||
return currentBalance.subtract(subtraction).max(new BigDecimal(0));
|
||||
}
|
||||
|
||||
private void setBottomAppBarButtonState() {
|
||||
if (!loyaltyCard.note.isEmpty() || !loyaltyCardGroups.isEmpty() || hasBalance(loyaltyCard) || loyaltyCard.expiry != null) {
|
||||
bottomAppBarInfoButton.setVisibility(View.VISIBLE);
|
||||
@@ -530,6 +634,8 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
|
||||
bottomAppBarPreviousButton.setVisibility(View.VISIBLE);
|
||||
bottomAppBarNextButton.setVisibility(View.VISIBLE);
|
||||
}
|
||||
|
||||
bottomAppBarUpdateBalanceButton.setVisibility(hasBalance(loyaltyCard) ? View.VISIBLE : View.GONE);
|
||||
}
|
||||
|
||||
private void prevNextCard(boolean next) {
|
||||
@@ -606,8 +712,11 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
|
||||
}
|
||||
|
||||
if (settings.getDisableLockscreenWhileViewingCard()) {
|
||||
window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
|
||||
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
|
||||
setShowWhenLocked(true);
|
||||
} else {
|
||||
showWhenLockedSdkLessThan27(window);
|
||||
}
|
||||
}
|
||||
|
||||
window.setAttributes(attributes);
|
||||
@@ -699,11 +808,14 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
|
||||
fixImageButtonColor(bottomAppBarInfoButton);
|
||||
fixImageButtonColor(bottomAppBarPreviousButton);
|
||||
fixImageButtonColor(bottomAppBarNextButton);
|
||||
fixImageButtonColor(bottomAppBarUpdateBalanceButton);
|
||||
setBottomAppBarButtonState();
|
||||
|
||||
// Make notification area light if dark icons are needed
|
||||
if (Build.VERSION.SDK_INT >= 23) {
|
||||
window.getDecorView().setSystemUiVisibility(backgroundNeedsDarkIcons ? View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR : 0);
|
||||
View decorView = getWindow().getDecorView();
|
||||
WindowInsetsControllerCompat wic = new WindowInsetsControllerCompat(getWindow(), decorView);
|
||||
wic.setAppearanceLightStatusBars(backgroundNeedsDarkIcons);
|
||||
window.setStatusBarColor(Color.TRANSPARENT);
|
||||
} else {
|
||||
// Darken statusbar if icons won't be visible otherwise
|
||||
@@ -744,6 +856,12 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
|
||||
DBHelper.updateLoyaltyCardLastUsed(database, loyaltyCard.id);
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
private void showWhenLockedSdkLessThan27(Window window) {
|
||||
window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
|
||||
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
|
||||
}
|
||||
|
||||
private void fixImageButtonColor(ImageButton imageButton) {
|
||||
imageButton.setColorFilter(BlendModeColorFilterCompat.createBlendModeColorFilterCompat(backgroundNeedsDarkIcons ? Color.BLACK : Color.WHITE, BlendModeCompat.SRC_ATOP));
|
||||
}
|
||||
@@ -840,7 +958,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
|
||||
|
||||
return true;
|
||||
} else if (id == R.id.action_delete) {
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
||||
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(this);
|
||||
builder.setTitle(R.string.deleteTitle);
|
||||
builder.setMessage(R.string.deleteConfirmation);
|
||||
builder.setPositiveButton(R.string.confirm, (dialog, which) -> {
|
||||
@@ -886,10 +1004,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
|
||||
setSupportActionBar(portraitToolbar);
|
||||
}
|
||||
|
||||
ActionBar actionBar = getSupportActionBar();
|
||||
if (actionBar != null) {
|
||||
actionBar.setDisplayHomeAsUpEnabled(true);
|
||||
}
|
||||
enableToolbarBackButton();
|
||||
}
|
||||
|
||||
private void drawBarcode(boolean addPadding) {
|
||||
@@ -1043,11 +1158,15 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
|
||||
editButton.setVisibility(View.GONE);
|
||||
|
||||
// Set Android to fullscreen mode
|
||||
getWindow().getDecorView().setSystemUiVisibility(
|
||||
getWindow().getDecorView().getSystemUiVisibility()
|
||||
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
|
||||
| View.SYSTEM_UI_FLAG_FULLSCREEN
|
||||
);
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
|
||||
getWindow().setDecorFitsSystemWindows(false);
|
||||
if (getWindow().getInsetsController() != null) {
|
||||
getWindow().getInsetsController().hide(WindowInsets.Type.statusBars() | WindowInsets.Type.navigationBars());
|
||||
getWindow().getInsetsController().setSystemBarsBehavior(WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE);
|
||||
}
|
||||
} else {
|
||||
setFullscreenModeSdkLessThan30();
|
||||
}
|
||||
} else {
|
||||
Log.d(TAG, "Move out of fullscreen");
|
||||
|
||||
@@ -1078,13 +1197,34 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
|
||||
bottomAppBar.setVisibility(View.VISIBLE);
|
||||
|
||||
// Unset fullscreen mode
|
||||
getWindow().getDecorView().setSystemUiVisibility(
|
||||
getWindow().getDecorView().getSystemUiVisibility()
|
||||
& ~View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
|
||||
& ~View.SYSTEM_UI_FLAG_FULLSCREEN
|
||||
);
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
|
||||
getWindow().setDecorFitsSystemWindows(true);
|
||||
if (getWindow().getInsetsController() != null) {
|
||||
getWindow().getInsetsController().show(WindowInsets.Type.statusBars() | WindowInsets.Type.navigationBars());
|
||||
}
|
||||
} else {
|
||||
unsetFullscreenModeSdkLessThan30();
|
||||
}
|
||||
}
|
||||
|
||||
Log.d("setFullScreen", "Is full screen enabled? " + enabled + " Zoom Level = " + barcodeScaler.getProgress());
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
private void unsetFullscreenModeSdkLessThan30() {
|
||||
getWindow().getDecorView().setSystemUiVisibility(
|
||||
getWindow().getDecorView().getSystemUiVisibility()
|
||||
& ~View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
|
||||
& ~View.SYSTEM_UI_FLAG_FULLSCREEN
|
||||
);
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
private void setFullscreenModeSdkLessThan30() {
|
||||
getWindow().getDecorView().setSystemUiVisibility(
|
||||
getWindow().getDecorView().getSystemUiVisibility()
|
||||
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
|
||||
| View.SYSTEM_UI_FLAG_FULLSCREEN
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,50 +9,56 @@ import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.database.CursorIndexOutOfBoundsException;
|
||||
import android.database.sqlite.SQLiteDatabase;
|
||||
import android.graphics.Bitmap;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.util.DisplayMetrics;
|
||||
import android.util.Log;
|
||||
import android.util.TypedValue;
|
||||
import android.view.GestureDetector;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.widget.CheckBox;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||
import com.google.android.material.tabs.TabLayout;
|
||||
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
import androidx.activity.result.ActivityResultLauncher;
|
||||
import androidx.activity.result.contract.ActivityResultContracts;
|
||||
import androidx.appcompat.app.ActionBar;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.appcompat.view.ActionMode;
|
||||
import androidx.appcompat.widget.SearchView;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
import androidx.core.splashscreen.SplashScreen;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||
import com.google.android.material.tabs.TabLayout;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
import protect.card_locker.databinding.ArchiveActivityBinding;
|
||||
import protect.card_locker.databinding.ContentMainBinding;
|
||||
import protect.card_locker.databinding.MainActivityBinding;
|
||||
import protect.card_locker.databinding.SortingOptionBinding;
|
||||
import protect.card_locker.preferences.SettingsActivity;
|
||||
|
||||
public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCardCursorAdapter.CardAdapterListener, GestureDetector.OnGestureListener {
|
||||
private MainActivityBinding binding;
|
||||
private ArchiveActivityBinding archiveActivityBinding;
|
||||
private ContentMainBinding contentMainBinding;
|
||||
private static final String TAG = "Catima";
|
||||
public static final String RESTART_ACTIVITY_INTENT = "restart_activity_intent";
|
||||
|
||||
private static final int MEDIUM_SCALE_FACTOR_DIP = 460;
|
||||
|
||||
private SQLiteDatabase mDatabase;
|
||||
private LoyaltyCardCursorAdapter mAdapter;
|
||||
private ActionMode mCurrentActionMode;
|
||||
@@ -68,6 +74,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
|
||||
private View mHelpSection;
|
||||
private View mNoMatchingCardsText;
|
||||
private View mNoGroupCardsText;
|
||||
private TabLayout groupsTabLayout;
|
||||
|
||||
private boolean mArchiveMode;
|
||||
public static final String BUNDLE_ARCHIVE_MODE = "archiveMode";
|
||||
@@ -141,7 +148,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
|
||||
inputMode.finish();
|
||||
return true;
|
||||
} else if (inputItem.getItemId() == R.id.action_delete) {
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
|
||||
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(MainActivity.this);
|
||||
// The following may seem weird, but it is necessary to give translators enough flexibility.
|
||||
// For example, in Russian, Android's plural quantity "one" actually refers to "any number ending on 1 but not ending in 11".
|
||||
// So while in English the extra non-plural form seems unnecessary duplication, it is necessary to give translators enough flexibility.
|
||||
@@ -163,7 +170,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
|
||||
ShortcutHelper.removeShortcut(MainActivity.this, loyaltyCard.id);
|
||||
}
|
||||
|
||||
TabLayout.Tab tab = ((TabLayout) findViewById(R.id.groups)).getTabAt(selectedTab);
|
||||
TabLayout.Tab tab = groupsTabLayout.getTabAt(selectedTab);
|
||||
mGroup = tab != null ? tab.getTag() : null;
|
||||
|
||||
updateLoyaltyCardList(true);
|
||||
@@ -175,28 +182,25 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
|
||||
dialog.show();
|
||||
|
||||
return true;
|
||||
}
|
||||
else if(inputItem.getItemId() == R.id.action_archive){
|
||||
} else if (inputItem.getItemId() == R.id.action_archive) {
|
||||
for (LoyaltyCard loyaltyCard : mAdapter.getSelectedItems()) {
|
||||
Log.d(TAG, "Archiving card: " + loyaltyCard.id);
|
||||
DBHelper.updateLoyaltyCardArchiveStatus(mDatabase, loyaltyCard.id,1);
|
||||
DBHelper.updateLoyaltyCardArchiveStatus(mDatabase, loyaltyCard.id, 1);
|
||||
updateLoyaltyCardList(false);
|
||||
inputMode.finish();
|
||||
invalidateOptionsMenu();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else if(inputItem.getItemId() == R.id.action_unarchive){
|
||||
} else if (inputItem.getItemId() == R.id.action_unarchive) {
|
||||
for (LoyaltyCard loyaltyCard : mAdapter.getSelectedItems()) {
|
||||
Log.d(TAG, "Unarchiving card: " + loyaltyCard.id);
|
||||
DBHelper.updateLoyaltyCardArchiveStatus(mDatabase, loyaltyCard.id,0);
|
||||
DBHelper.updateLoyaltyCardArchiveStatus(mDatabase, loyaltyCard.id, 0);
|
||||
updateLoyaltyCardList(false);
|
||||
inputMode.finish();
|
||||
invalidateOptionsMenu();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else if(inputItem.getItemId() == R.id.action_star){
|
||||
} else if (inputItem.getItemId() == R.id.action_star) {
|
||||
for (LoyaltyCard loyaltyCard : mAdapter.getSelectedItems()) {
|
||||
Log.d(TAG, "Starring card: " + loyaltyCard.id);
|
||||
DBHelper.updateLoyaltyCardStarStatus(mDatabase, loyaltyCard.id, 1);
|
||||
@@ -204,8 +208,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
|
||||
inputMode.finish();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else if(inputItem.getItemId() == R.id.action_unstar){
|
||||
} else if (inputItem.getItemId() == R.id.action_unstar) {
|
||||
for (LoyaltyCard loyaltyCard : mAdapter.getSelectedItems()) {
|
||||
Log.d(TAG, "Unstarring card: " + loyaltyCard.id);
|
||||
DBHelper.updateLoyaltyCardStarStatus(mDatabase, loyaltyCard.id, 0);
|
||||
@@ -230,28 +233,28 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
|
||||
extractIntentFields(getIntent());
|
||||
SplashScreen.installSplashScreen(this);
|
||||
super.onCreate(inputSavedInstanceState);
|
||||
if(!mArchiveMode) {
|
||||
if (!mArchiveMode) {
|
||||
binding = MainActivityBinding.inflate(getLayoutInflater());
|
||||
setTitle(R.string.app_name);
|
||||
setContentView(R.layout.main_activity);
|
||||
}
|
||||
else{
|
||||
setContentView(binding.getRoot());
|
||||
setSupportActionBar(binding.toolbar);
|
||||
groupsTabLayout = binding.groups;
|
||||
contentMainBinding = ContentMainBinding.bind(binding.include.getRoot());
|
||||
} else {
|
||||
archiveActivityBinding = ArchiveActivityBinding.inflate(getLayoutInflater());
|
||||
setTitle(R.string.archiveList);
|
||||
setContentView(R.layout.archive_activity);
|
||||
setContentView(archiveActivityBinding.getRoot());
|
||||
setSupportActionBar(archiveActivityBinding.toolbar);
|
||||
groupsTabLayout = archiveActivityBinding.groups;
|
||||
contentMainBinding = ContentMainBinding.bind(archiveActivityBinding.include.getRoot());
|
||||
}
|
||||
|
||||
Toolbar toolbar = findViewById(R.id.toolbar);
|
||||
setSupportActionBar(toolbar);
|
||||
|
||||
if(mArchiveMode){
|
||||
ActionBar actionBar = getSupportActionBar();
|
||||
if (actionBar != null) {
|
||||
actionBar.setDisplayHomeAsUpEnabled(true);
|
||||
}
|
||||
if(mArchiveMode) {
|
||||
enableToolbarBackButton();
|
||||
}
|
||||
|
||||
mDatabase = new DBHelper(this).getWritableDatabase();
|
||||
|
||||
TabLayout groupsTabLayout = findViewById(R.id.groups);
|
||||
groupsTabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
|
||||
@Override
|
||||
public void onTabSelected(TabLayout.Tab tab) {
|
||||
@@ -283,10 +286,10 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
|
||||
|
||||
View.OnTouchListener gestureTouchListener = (v, event) -> mGestureDetector.onTouchEvent(event);
|
||||
|
||||
mHelpSection = findViewById(R.id.helpSection);
|
||||
mNoMatchingCardsText = findViewById(R.id.noMatchingCardsText);
|
||||
mNoGroupCardsText = findViewById(R.id.noGroupCardsText);
|
||||
mCardList = findViewById(R.id.list);
|
||||
mHelpSection = contentMainBinding.helpSection;
|
||||
mNoMatchingCardsText = contentMainBinding.noMatchingCardsText;
|
||||
mNoGroupCardsText = contentMainBinding.noGroupCardsText;
|
||||
mCardList = contentMainBinding.list;
|
||||
|
||||
mNoMatchingCardsText.setOnTouchListener(gestureTouchListener);
|
||||
mCardList.setOnTouchListener(gestureTouchListener);
|
||||
@@ -331,21 +334,17 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
|
||||
*/
|
||||
|
||||
mBarcodeScannerLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
|
||||
// Exit early if the user cancelled the scan (pressed back/home)
|
||||
if (result.getResultCode() != RESULT_OK) {
|
||||
return;
|
||||
}
|
||||
|
||||
Intent intent = result.getData();
|
||||
BarcodeValues barcodeValues = Utils.parseSetBarcodeActivityResult(Utils.BARCODE_SCAN, result.getResultCode(), intent, this);
|
||||
|
||||
if (!barcodeValues.isEmpty()) {
|
||||
Intent newIntent = new Intent(getApplicationContext(), LoyaltyCardEditActivity.class);
|
||||
Bundle newBundle = new Bundle();
|
||||
newBundle.putString(LoyaltyCardEditActivity.BUNDLE_BARCODETYPE, barcodeValues.format());
|
||||
newBundle.putString(LoyaltyCardEditActivity.BUNDLE_CARDID, barcodeValues.content());
|
||||
Bundle inputBundle = intent.getExtras();
|
||||
if (inputBundle != null && inputBundle.getString(LoyaltyCardEditActivity.BUNDLE_ADDGROUP) != null) {
|
||||
newBundle.putString(LoyaltyCardEditActivity.BUNDLE_ADDGROUP, inputBundle.getString(LoyaltyCardEditActivity.BUNDLE_ADDGROUP));
|
||||
}
|
||||
newIntent.putExtras(newBundle);
|
||||
startActivity(newIntent);
|
||||
}
|
||||
Bundle inputBundle = intent.getExtras();
|
||||
String group = inputBundle != null ? inputBundle.getString(LoyaltyCardEditActivity.BUNDLE_ADDGROUP) : null;
|
||||
processBarcodeValues(barcodeValues, group);
|
||||
});
|
||||
|
||||
mSettingsLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
|
||||
@@ -374,7 +373,6 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
|
||||
}
|
||||
|
||||
// Start of active tab logic
|
||||
TabLayout groupsTabLayout = findViewById(R.id.groups);
|
||||
updateTabGroups(groupsTabLayout);
|
||||
|
||||
// Restore settings from Shared Preference
|
||||
@@ -402,12 +400,15 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
|
||||
groupsTabLayout.selectTab(tab);
|
||||
assert tab != null;
|
||||
mGroup = tab.getTag();
|
||||
} else if (!mArchiveMode) {
|
||||
scaleScreen();
|
||||
}
|
||||
|
||||
updateLoyaltyCardList(true);
|
||||
// End of active tab logic
|
||||
|
||||
if (!mArchiveMode) {
|
||||
FloatingActionButton addButton = findViewById(R.id.fabAdd);
|
||||
FloatingActionButton addButton = binding.fabAdd;
|
||||
|
||||
addButton.setOnClickListener(v -> {
|
||||
Intent intent = new Intent(getApplicationContext(), ScanActivity.class);
|
||||
@@ -424,8 +425,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
|
||||
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
|
||||
if (!mSearchView.isIconified()) {
|
||||
if (mSearchView != null && !mSearchView.isIconified()) {
|
||||
mSearchView.setIconified(true);
|
||||
return;
|
||||
}
|
||||
@@ -498,9 +498,67 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
|
||||
}
|
||||
}
|
||||
|
||||
private void processBarcodeValues(BarcodeValues barcodeValues, String group) {
|
||||
if (barcodeValues.isEmpty()) {
|
||||
throw new IllegalArgumentException("barcodesValues may not be empty");
|
||||
}
|
||||
|
||||
Intent newIntent = new Intent(getApplicationContext(), LoyaltyCardEditActivity.class);
|
||||
Bundle newBundle = new Bundle();
|
||||
newBundle.putString(LoyaltyCardEditActivity.BUNDLE_BARCODETYPE, barcodeValues.format());
|
||||
newBundle.putString(LoyaltyCardEditActivity.BUNDLE_CARDID, barcodeValues.content());
|
||||
if (group != null) {
|
||||
newBundle.putString(LoyaltyCardEditActivity.BUNDLE_ADDGROUP, group);
|
||||
}
|
||||
newIntent.putExtras(newBundle);
|
||||
startActivity(newIntent);
|
||||
}
|
||||
|
||||
private void onSharedIntent(Intent intent) {
|
||||
String receivedAction = intent.getAction();
|
||||
String receivedType = intent.getType();
|
||||
|
||||
// Check if an image was shared to us
|
||||
if (Intent.ACTION_SEND.equals(receivedAction)) {
|
||||
if (receivedType.startsWith("image/")) {
|
||||
BarcodeValues barcodeValues;
|
||||
try {
|
||||
Bitmap bitmap;
|
||||
try {
|
||||
Uri data = intent.getParcelableExtra(Intent.EXTRA_STREAM);
|
||||
bitmap = Utils.retrieveImageFromUri(this, data);
|
||||
} catch (IOException e) {
|
||||
Log.e(TAG, "Error getting data from image file");
|
||||
e.printStackTrace();
|
||||
Toast.makeText(this, R.string.errorReadingImage, Toast.LENGTH_LONG).show();
|
||||
finish();
|
||||
return;
|
||||
}
|
||||
|
||||
barcodeValues = Utils.getBarcodeFromBitmap(bitmap);
|
||||
|
||||
if (barcodeValues.isEmpty()) {
|
||||
Log.i(TAG, "No barcode found in image file");
|
||||
Toast.makeText(this, R.string.noBarcodeFound, Toast.LENGTH_LONG).show();
|
||||
finish();
|
||||
return;
|
||||
}
|
||||
} catch (NullPointerException e) {
|
||||
Toast.makeText(this, R.string.errorReadingImage, Toast.LENGTH_LONG).show();
|
||||
finish();
|
||||
return;
|
||||
}
|
||||
processBarcodeValues(barcodeValues, null);
|
||||
} else {
|
||||
Log.e(TAG, "Wrong mime-type");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void extractIntentFields(Intent intent) {
|
||||
final Bundle b = intent.getExtras();
|
||||
mArchiveMode = b != null && b.getBoolean(BUNDLE_ARCHIVE_MODE, false);
|
||||
onSharedIntent(intent);
|
||||
}
|
||||
|
||||
public void updateTabGroups(TabLayout groupsTabLayout) {
|
||||
@@ -532,9 +590,9 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
|
||||
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(Menu inputMenu) {
|
||||
if(!mArchiveMode)
|
||||
if (!mArchiveMode) {
|
||||
getMenuInflater().inflate(R.menu.main_menu, inputMenu);
|
||||
else{
|
||||
} else {
|
||||
getMenuInflater().inflate(R.menu.archive_menu, inputMenu);
|
||||
}
|
||||
|
||||
@@ -562,7 +620,6 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
|
||||
public boolean onQueryTextChange(String newText) {
|
||||
mFilter = newText;
|
||||
|
||||
TabLayout groupsTabLayout = findViewById(R.id.groups);
|
||||
TabLayout.Tab currentTab = groupsTabLayout.getTabAt(groupsTabLayout.getSelectedTabPosition());
|
||||
mGroup = currentTab != null ? currentTab.getTag() : null;
|
||||
|
||||
@@ -573,7 +630,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
|
||||
});
|
||||
}
|
||||
|
||||
if(!mArchiveMode) {
|
||||
if (!mArchiveMode) {
|
||||
if (DBHelper.getArchivedCardsCount(mDatabase) == 0) {
|
||||
inputMenu.findItem(R.id.action_archived).setVisible(false);
|
||||
} else {
|
||||
@@ -609,13 +666,15 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
|
||||
}
|
||||
}
|
||||
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
|
||||
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(MainActivity.this);
|
||||
builder.setTitle(R.string.sort_by);
|
||||
|
||||
final View customLayout = getLayoutInflater().inflate(R.layout.sorting_option, null);
|
||||
SortingOptionBinding sortingOptionBinding = SortingOptionBinding
|
||||
.inflate(LayoutInflater.from(MainActivity.this), null, false);
|
||||
final View customLayout = sortingOptionBinding.getRoot();
|
||||
builder.setView(customLayout);
|
||||
|
||||
CheckBox showReversed = (CheckBox) customLayout.findViewById(R.id.checkBox_reverse);
|
||||
CheckBox showReversed = sortingOptionBinding.checkBoxReverse;
|
||||
|
||||
|
||||
showReversed.setChecked(mOrderDirection == DBHelper.LoyaltyCardOrderDirection.Descending);
|
||||
@@ -736,7 +795,6 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
|
||||
return false;
|
||||
}
|
||||
|
||||
TabLayout groupsTabLayout = findViewById(R.id.groups);
|
||||
if (groupsTabLayout.getTabCount() < 2) {
|
||||
return false;
|
||||
}
|
||||
@@ -786,6 +844,16 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
|
||||
toggleSelection(inputPosition);
|
||||
}
|
||||
|
||||
private void scaleScreen() {
|
||||
DisplayMetrics displayMetrics = new DisplayMetrics();
|
||||
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
|
||||
int screenHeight = displayMetrics.heightPixels;
|
||||
float mediumSizePx = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,MEDIUM_SCALE_FACTOR_DIP,getResources().getDisplayMetrics());
|
||||
boolean shouldScaleSmaller = screenHeight < mediumSizePx;
|
||||
|
||||
binding.include.welcomeIcon.setVisibility(shouldScaleSmaller ? View.GONE : View.VISIBLE);
|
||||
}
|
||||
|
||||
private void toggleSelection(int inputPosition) {
|
||||
mAdapter.toggleSelection(inputPosition);
|
||||
int count = mAdapter.getSelectedItemCount();
|
||||
@@ -804,11 +872,10 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
|
||||
boolean hasStarred = false;
|
||||
boolean hasUnstarred = false;
|
||||
|
||||
if(!mArchiveMode) {
|
||||
if (!mArchiveMode) {
|
||||
unarchiveItem.setVisible(false);
|
||||
archiveItem.setVisible(true);
|
||||
}
|
||||
else{
|
||||
} else {
|
||||
unarchiveItem.setVisible(true);
|
||||
archiveItem.setVisible(false);
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@ import android.widget.EditText;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -25,8 +26,11 @@ import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import protect.card_locker.databinding.ActivityManageGroupBinding;
|
||||
|
||||
public class ManageGroupActivity extends CatimaAppCompatActivity implements ManageGroupCursorAdapter.CardAdapterListener {
|
||||
|
||||
private ActivityManageGroupBinding binding;
|
||||
private SQLiteDatabase mDatabase;
|
||||
private ManageGroupCursorAdapter mAdapter;
|
||||
|
||||
@@ -43,17 +47,18 @@ public class ManageGroupActivity extends CatimaAppCompatActivity implements Mana
|
||||
@Override
|
||||
protected void onCreate(Bundle inputSavedInstanceState) {
|
||||
super.onCreate(inputSavedInstanceState);
|
||||
setContentView(R.layout.activity_manage_group);
|
||||
Toolbar toolbar = findViewById(R.id.toolbar);
|
||||
binding = ActivityManageGroupBinding.inflate(getLayoutInflater());
|
||||
setContentView(binding.getRoot());
|
||||
Toolbar toolbar = binding.toolbar;
|
||||
setSupportActionBar(toolbar);
|
||||
|
||||
mDatabase = new DBHelper(this).getWritableDatabase();
|
||||
|
||||
noGroupCardsText = findViewById(R.id.noGroupCardsText);
|
||||
mCardList = findViewById(R.id.list);
|
||||
FloatingActionButton saveButton = findViewById(R.id.fabSave);
|
||||
noGroupCardsText = binding.include.noGroupCardsText;
|
||||
mCardList = binding.include.list;
|
||||
FloatingActionButton saveButton = binding.fabSave;
|
||||
|
||||
mGroupNameText = findViewById(R.id.editTextGroupName);
|
||||
mGroupNameText = binding.editTextGroupName;
|
||||
|
||||
mGroupNameText.addTextChangedListener(new TextWatcher() {
|
||||
@Override
|
||||
@@ -105,12 +110,7 @@ public class ManageGroupActivity extends CatimaAppCompatActivity implements Mana
|
||||
mGroupNameText.setText(inputSavedInstanceState.getString(SAVE_INSTANCE_CURRENT_GROUP_NAME));
|
||||
}
|
||||
|
||||
ActionBar actionBar = getSupportActionBar();
|
||||
if (actionBar == null) {
|
||||
throw (new RuntimeException("mActionBar is not expected to be null here"));
|
||||
}
|
||||
actionBar.setDisplayHomeAsUpEnabled(true);
|
||||
actionBar.setDisplayShowHomeEnabled(true);
|
||||
enableToolbarBackButton();
|
||||
|
||||
saveButton.setOnClickListener(v -> {
|
||||
String currentGroupName = mGroupNameText.getText().toString().trim();
|
||||
@@ -200,7 +200,7 @@ public class ManageGroupActivity extends CatimaAppCompatActivity implements Mana
|
||||
|
||||
private void leaveWithoutSaving() {
|
||||
if (hasChanged()) {
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(ManageGroupActivity.this);
|
||||
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(ManageGroupActivity.this);
|
||||
builder.setTitle(R.string.leaveWithoutSaveTitle);
|
||||
builder.setMessage(R.string.leaveWithoutSaveConfirmation);
|
||||
builder.setPositiveButton(R.string.confirm, (dialog, which) -> finish());
|
||||
|
||||
@@ -8,11 +8,14 @@ import android.os.Bundle;
|
||||
import android.text.InputType;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.WindowManager;
|
||||
import android.widget.EditText;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||
|
||||
import java.util.List;
|
||||
@@ -24,7 +27,10 @@ import androidx.recyclerview.widget.DefaultItemAnimator;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import protect.card_locker.databinding.ManageGroupsActivityBinding;
|
||||
|
||||
public class ManageGroupsActivity extends CatimaAppCompatActivity implements GroupCursorAdapter.GroupAdapterListener {
|
||||
private ManageGroupsActivityBinding binding;
|
||||
private static final String TAG = "Catima";
|
||||
|
||||
private SQLiteDatabase mDatabase;
|
||||
@@ -35,14 +41,12 @@ public class ManageGroupsActivity extends CatimaAppCompatActivity implements Gro
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
binding = ManageGroupsActivityBinding.inflate(getLayoutInflater());
|
||||
setTitle(R.string.groups);
|
||||
setContentView(R.layout.manage_groups_activity);
|
||||
Toolbar toolbar = findViewById(R.id.toolbar);
|
||||
setContentView(binding.getRoot());
|
||||
Toolbar toolbar = binding.toolbar;
|
||||
setSupportActionBar(toolbar);
|
||||
ActionBar actionBar = getSupportActionBar();
|
||||
if (actionBar != null) {
|
||||
actionBar.setDisplayHomeAsUpEnabled(true);
|
||||
}
|
||||
enableToolbarBackButton();
|
||||
|
||||
mDatabase = new DBHelper(this).getWritableDatabase();
|
||||
}
|
||||
@@ -51,12 +55,12 @@ public class ManageGroupsActivity extends CatimaAppCompatActivity implements Gro
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
|
||||
FloatingActionButton addButton = findViewById(R.id.fabAdd);
|
||||
FloatingActionButton addButton = binding.fabAdd;
|
||||
addButton.setOnClickListener(v -> createGroup());
|
||||
addButton.bringToFront();
|
||||
|
||||
mGroupList = findViewById(R.id.list);
|
||||
mHelpText = findViewById(R.id.helpText);
|
||||
mGroupList = binding.include.list;
|
||||
mHelpText = binding.include.helpText;
|
||||
|
||||
// Init group list
|
||||
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
|
||||
@@ -108,24 +112,60 @@ public class ManageGroupsActivity extends CatimaAppCompatActivity implements Gro
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
|
||||
private void setGroupNameError(EditText input) {
|
||||
String string = sanitizeAddGroupNameField(input.getText());
|
||||
|
||||
if (string.length() == 0) {
|
||||
input.setError(getString(R.string.group_name_is_empty));
|
||||
return;
|
||||
}
|
||||
|
||||
if (DBHelper.getGroup(mDatabase, string) != null) {
|
||||
input.setError(getString(R.string.group_name_already_in_use));
|
||||
return;
|
||||
}
|
||||
|
||||
input.setError(null);
|
||||
}
|
||||
|
||||
private String sanitizeAddGroupNameField(CharSequence s) {
|
||||
return s.toString().trim();
|
||||
}
|
||||
|
||||
private void createGroup() {
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
||||
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(this);
|
||||
builder.setTitle(R.string.enter_group_name);
|
||||
final EditText input = new EditText(this);
|
||||
input.setInputType(InputType.TYPE_CLASS_TEXT);
|
||||
builder.setView(input);
|
||||
input.addTextChangedListener(new SimpleTextWatcher() {
|
||||
public void onTextChanged(CharSequence s, int start, int before, int count) {
|
||||
setGroupNameError(input);
|
||||
}
|
||||
});
|
||||
setGroupNameError(input);
|
||||
|
||||
// Add spacing to EditText
|
||||
FrameLayout container = new FrameLayout(this);
|
||||
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
|
||||
ViewGroup.LayoutParams.MATCH_PARENT,
|
||||
ViewGroup.LayoutParams.WRAP_CONTENT
|
||||
);
|
||||
params.leftMargin = 50;
|
||||
params.rightMargin = 50;
|
||||
input.setLayoutParams(params);
|
||||
container.addView(input);
|
||||
|
||||
builder.setView(container);
|
||||
|
||||
builder.setPositiveButton(getString(R.string.ok), (dialog, which) -> {
|
||||
String inputString = input.getText().toString().trim();
|
||||
if (inputString.length() == 0) {
|
||||
Toast.makeText(getApplicationContext(), R.string.group_name_is_empty, Toast.LENGTH_SHORT).show();
|
||||
CharSequence error = input.getError();
|
||||
|
||||
if (error != null) {
|
||||
Toast.makeText(getApplicationContext(), error.toString(), Toast.LENGTH_SHORT).show();
|
||||
return;
|
||||
}
|
||||
if (DBHelper.getGroup(mDatabase, inputString) != null) {
|
||||
Toast.makeText(getApplicationContext(), R.string.group_name_already_in_use, Toast.LENGTH_SHORT).show();
|
||||
return;
|
||||
}
|
||||
DBHelper.insertGroup(mDatabase, inputString);
|
||||
|
||||
DBHelper.insertGroup(mDatabase, sanitizeAddGroupNameField(input.getText()));
|
||||
updateGroupList();
|
||||
});
|
||||
builder.setNegativeButton(getString(R.string.cancel), (dialog, which) -> dialog.cancel());
|
||||
@@ -193,7 +233,7 @@ public class ManageGroupsActivity extends CatimaAppCompatActivity implements Gro
|
||||
public void onDeleteButtonClicked(View view) {
|
||||
final String groupName = getGroupName(view);
|
||||
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
||||
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(this);
|
||||
builder.setTitle(R.string.deleteConfirmationGroup);
|
||||
builder.setMessage(groupName);
|
||||
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
package protect.card_locker;
|
||||
|
||||
import android.content.ActivityNotFoundException;
|
||||
import android.content.Intent;
|
||||
import android.net.Uri;
|
||||
import android.util.Log;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
|
||||
public class OpenWebLinkHandler {
|
||||
|
||||
private static final String TAG = "Catima";
|
||||
|
||||
public void openBrowser(AppCompatActivity activity, String url) {
|
||||
if (url == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
Intent intent = new Intent(Intent.ACTION_VIEW);
|
||||
intent.setData(Uri.parse(url));
|
||||
try {
|
||||
activity.startActivity(intent);
|
||||
} catch (ActivityNotFoundException e) {
|
||||
Toast.makeText(activity, R.string.failedToOpenUrl, Toast.LENGTH_LONG).show();
|
||||
Log.e(TAG, "No activity found to handle intent", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
94
app/src/main/java/protect/card_locker/PermissionUtils.java
Normal file
94
app/src/main/java/protect/card_locker/PermissionUtils.java
Normal file
@@ -0,0 +1,94 @@
|
||||
package protect.card_locker;
|
||||
|
||||
import android.Manifest;
|
||||
import android.app.Activity;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.os.Build;
|
||||
|
||||
import androidx.core.app.ActivityCompat;
|
||||
import androidx.core.content.ContextCompat;
|
||||
|
||||
public class PermissionUtils {
|
||||
/**
|
||||
* Check if storage read permission is needed.
|
||||
*
|
||||
* This is only necessary on Android 6.0 (Marshmallow) and below. See
|
||||
* https://github.com/CatimaLoyalty/Android/issues/979 for more info.
|
||||
*
|
||||
* @param activity
|
||||
* @return
|
||||
*/
|
||||
private static boolean needsStorageReadPermission(Activity activity) {
|
||||
// Testing showed this permission wasn't needed for anything Catima did past Marshmallow
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return ContextCompat.checkSelfPermission(activity, android.Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if camera permission is needed.
|
||||
*
|
||||
* @param activity
|
||||
* @return
|
||||
*/
|
||||
public static boolean needsCameraPermission(Activity activity) {
|
||||
// Android only introduced the runtime permission system in Marshmallow (Android 6.0)
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return ContextCompat.checkSelfPermission(activity, android.Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED;
|
||||
}
|
||||
|
||||
/**
|
||||
* Call onRequestPermissionsResult after storage read permission was granted.
|
||||
* Mocks a successful grant if a grant is not necessary.
|
||||
*
|
||||
* @param activity
|
||||
* @param requestCode
|
||||
*/
|
||||
public static void requestStorageReadPermission(CatimaAppCompatActivity activity, int requestCode) {
|
||||
String[] permissions = new String[]{ android.Manifest.permission.READ_EXTERNAL_STORAGE };
|
||||
int[] mockedResults = new int[]{ PackageManager.PERMISSION_GRANTED };
|
||||
|
||||
if (needsStorageReadPermission(activity)) {
|
||||
ActivityCompat.requestPermissions(activity, permissions, requestCode);
|
||||
} else {
|
||||
// FIXME: This points to onMockedRequestPermissionResult instead of to
|
||||
// onRequestPermissionResult because onRequestPermissionResult was only introduced in
|
||||
// Android 6.0 (SDK 23) and we and to support Android 5.0 (SDK 21) too.
|
||||
//
|
||||
// When minSdk becomes 23, this should point to onRequestPermissionResult directly and
|
||||
// the activity input variable should be changed from CatimaAppCompatActivity to
|
||||
// Activity.
|
||||
activity.onMockedRequestPermissionsResult(requestCode, permissions, mockedResults);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Call onRequestPermissionsResult after camera permission was granted.
|
||||
* Mocks a successful grant if a grant is not necessary.
|
||||
*
|
||||
* @param activity
|
||||
* @param requestCode
|
||||
*/
|
||||
public static void requestCameraPermission(CatimaAppCompatActivity activity, int requestCode) {
|
||||
String[] permissions = new String[]{ Manifest.permission.CAMERA };
|
||||
int[] mockedResults = new int[]{ PackageManager.PERMISSION_GRANTED };
|
||||
|
||||
if (needsCameraPermission(activity)) {
|
||||
ActivityCompat.requestPermissions(activity, permissions, requestCode);
|
||||
} else {
|
||||
// FIXME: This points to onMockedRequestPermissionResult instead of to
|
||||
// onRequestPermissionResult because onRequestPermissionResult was only introduced in
|
||||
// Android 6.0 (SDK 23) and we and to support Android 5.0 (SDK 21) too.
|
||||
//
|
||||
// When minSdk becomes 23, this should point to onRequestPermissionResult directly and
|
||||
// the activity input variable should be changed from CatimaAppCompatActivity to
|
||||
// Activity.
|
||||
activity.onMockedRequestPermissionsResult(requestCode, permissions, mockedResults);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,17 +1,31 @@
|
||||
package protect.card_locker;
|
||||
|
||||
import android.Manifest;
|
||||
import android.app.Activity;
|
||||
import android.content.ActivityNotFoundException;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.graphics.Color;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.provider.Settings;
|
||||
import android.util.DisplayMetrics;
|
||||
import android.util.Log;
|
||||
import android.util.TypedValue;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.activity.result.ActivityResultLauncher;
|
||||
import androidx.activity.result.contract.ActivityResultContracts;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.app.ActionBar;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
|
||||
import androidx.core.content.ContextCompat;
|
||||
|
||||
import com.google.zxing.ResultPoint;
|
||||
import com.google.zxing.client.android.Intents;
|
||||
import com.journeyapps.barcodescanner.BarcodeCallback;
|
||||
@@ -21,10 +35,8 @@ import com.journeyapps.barcodescanner.DecoratedBarcodeView;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import androidx.activity.result.ActivityResultLauncher;
|
||||
import androidx.activity.result.contract.ActivityResultContracts;
|
||||
import androidx.appcompat.app.ActionBar;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
import protect.card_locker.databinding.CustomBarcodeScannerBinding;
|
||||
import protect.card_locker.databinding.ScanActivityBinding;
|
||||
|
||||
/**
|
||||
* Custom Scannner Activity extending from Activity to display a custom layout form scanner view.
|
||||
@@ -33,8 +45,16 @@ import androidx.appcompat.widget.Toolbar;
|
||||
* originally licensed under Apache 2.0
|
||||
*/
|
||||
public class ScanActivity extends CatimaAppCompatActivity {
|
||||
|
||||
private ScanActivityBinding binding;
|
||||
private CustomBarcodeScannerBinding customBarcodeScannerBinding;
|
||||
private static final String TAG = "Catima";
|
||||
|
||||
private static final int MEDIUM_SCALE_FACTOR_DIP = 460;
|
||||
private static final int COMPAT_SCALE_FACTOR_DIP = 320;
|
||||
|
||||
private static final int PERMISSION_SCAN_ADD_FROM_IMAGE = 100;
|
||||
|
||||
private CaptureManager capture;
|
||||
private DecoratedBarcodeView barcodeScannerView;
|
||||
|
||||
@@ -56,23 +76,22 @@ public class ScanActivity extends CatimaAppCompatActivity {
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
binding = ScanActivityBinding.inflate(getLayoutInflater());
|
||||
customBarcodeScannerBinding = CustomBarcodeScannerBinding.bind(binding.zxingBarcodeScanner);
|
||||
setTitle(R.string.scanCardBarcode);
|
||||
setContentView(R.layout.scan_activity);
|
||||
Toolbar toolbar = findViewById(R.id.toolbar);
|
||||
setContentView(binding.getRoot());
|
||||
Toolbar toolbar = binding.toolbar;
|
||||
setSupportActionBar(toolbar);
|
||||
ActionBar actionBar = getSupportActionBar();
|
||||
if (actionBar != null) {
|
||||
actionBar.setDisplayHomeAsUpEnabled(true);
|
||||
}
|
||||
enableToolbarBackButton();
|
||||
|
||||
extractIntentFields(getIntent());
|
||||
|
||||
manualAddLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> handleActivityResult(Utils.SELECT_BARCODE_REQUEST, result.getResultCode(), result.getData()));
|
||||
photoPickerLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> handleActivityResult(Utils.BARCODE_IMPORT_FROM_IMAGE_FILE, result.getResultCode(), result.getData()));
|
||||
findViewById(R.id.add_from_image).setOnClickListener(this::addFromImage);
|
||||
findViewById(R.id.add_manually).setOnClickListener(this::addManually);
|
||||
customBarcodeScannerBinding.addFromImage.setOnClickListener(this::addFromImage);
|
||||
customBarcodeScannerBinding.addManually.setOnClickListener(this::addManually);
|
||||
|
||||
barcodeScannerView = findViewById(R.id.zxing_barcode_scanner);
|
||||
barcodeScannerView = binding.zxingBarcodeScanner;
|
||||
|
||||
// Even though we do the actual decoding with the barcodeScannerView
|
||||
// CaptureManager needs to be running to show the camera and scanning bar
|
||||
@@ -109,6 +128,10 @@ public class ScanActivity extends CatimaAppCompatActivity {
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
capture.onResume();
|
||||
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
|
||||
showCameraPermissionMissingText(false);
|
||||
}
|
||||
scaleScreen();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -205,13 +228,74 @@ public class ScanActivity extends CatimaAppCompatActivity {
|
||||
}
|
||||
|
||||
public void addFromImage(View view) {
|
||||
PermissionUtils.requestStorageReadPermission(this, PERMISSION_SCAN_ADD_FROM_IMAGE);
|
||||
}
|
||||
|
||||
private void addFromImageAfterPermission() {
|
||||
Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
|
||||
photoPickerIntent.setType("image/*");
|
||||
Intent contentIntent = new Intent(Intent.ACTION_GET_CONTENT);
|
||||
contentIntent.setType("image/*");
|
||||
|
||||
Intent chooserIntent = Intent.createChooser(photoPickerIntent, getString(R.string.addFromImage));
|
||||
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { contentIntent });
|
||||
try {
|
||||
photoPickerLauncher.launch(photoPickerIntent);
|
||||
photoPickerLauncher.launch(chooserIntent);
|
||||
} catch (ActivityNotFoundException e) {
|
||||
Toast.makeText(getApplicationContext(), R.string.failedLaunchingPhotoPicker, Toast.LENGTH_LONG).show();
|
||||
Log.e(TAG, "No activity found to handle intent", e);
|
||||
}
|
||||
}
|
||||
|
||||
private void showCameraPermissionMissingText(boolean show) {
|
||||
customBarcodeScannerBinding.cameraPermissionDeniedLayout.cameraPermissionDeniedClickableArea.setOnClickListener(show ? v -> {
|
||||
navigateToSystemPermissionSetting();
|
||||
} : null);
|
||||
customBarcodeScannerBinding.cardInputContainer.setBackgroundColor(show ? obtainThemeAttribute(R.attr.colorSurface) : Color.TRANSPARENT);
|
||||
customBarcodeScannerBinding.cameraPermissionDeniedLayout.getRoot().setVisibility(show ? View.VISIBLE : View.GONE);
|
||||
}
|
||||
|
||||
private void scaleScreen() {
|
||||
DisplayMetrics displayMetrics = new DisplayMetrics();
|
||||
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
|
||||
int screenHeight = displayMetrics.heightPixels;
|
||||
float mediumSizePx = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,MEDIUM_SCALE_FACTOR_DIP,getResources().getDisplayMetrics());
|
||||
boolean shouldScaleSmaller = screenHeight < mediumSizePx;
|
||||
|
||||
customBarcodeScannerBinding.cameraPermissionDeniedLayout.cameraPermissionDeniedIcon.setVisibility(shouldScaleSmaller ? View.GONE : View.VISIBLE);
|
||||
customBarcodeScannerBinding.cameraPermissionDeniedLayout.cameraPermissionDeniedTitle.setVisibility(shouldScaleSmaller ? View.GONE : View.VISIBLE);
|
||||
}
|
||||
|
||||
private int obtainThemeAttribute(int attribute) {
|
||||
TypedValue typedValue = new TypedValue();
|
||||
getTheme().resolveAttribute(attribute, typedValue, true);
|
||||
return typedValue.data;
|
||||
}
|
||||
|
||||
private void navigateToSystemPermissionSetting() {
|
||||
Intent permissionIntent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.fromParts("package", getPackageName(), null));
|
||||
permissionIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
startActivity(permissionIntent);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
|
||||
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
|
||||
|
||||
onMockedRequestPermissionsResult(requestCode, permissions, grantResults);
|
||||
}
|
||||
|
||||
public void onMockedRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
|
||||
boolean granted = grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED;
|
||||
|
||||
if (requestCode == CaptureManager.getCameraPermissionReqCode()) {
|
||||
showCameraPermissionMissingText(!granted);
|
||||
} else if (requestCode == PERMISSION_SCAN_ADD_FROM_IMAGE) {
|
||||
if (granted) {
|
||||
addFromImageAfterPermission();
|
||||
} else {
|
||||
Toast.makeText(this, R.string.storageReadPermissionRequired, Toast.LENGTH_LONG).show();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,4 +22,8 @@ public class ThirdPartyInfo {
|
||||
public String license() {
|
||||
return mLicense;
|
||||
}
|
||||
|
||||
public String toHtml() {
|
||||
return String.format("<a href=\"%s\">%s</a> (%s)", url(), name(), license());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,6 +18,7 @@ import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.widget.AppCompatImageView;
|
||||
import androidx.core.content.ContextCompat;
|
||||
import androidx.core.graphics.ColorUtils;
|
||||
import androidx.core.view.WindowInsetsControllerCompat;
|
||||
|
||||
public class UCropWrapper extends UCropActivity {
|
||||
public static final String UCROP_TOOLBAR_TYPEFACE_STYLE = "ucop_toolbar_typeface_style";
|
||||
@@ -28,7 +29,9 @@ public class UCropWrapper extends UCropActivity {
|
||||
boolean darkMode = Utils.isDarkModeEnabled(this);
|
||||
// setup status bar to look like the rest of the app
|
||||
if (Build.VERSION.SDK_INT >= 23) {
|
||||
getWindow().getDecorView().setSystemUiVisibility(darkMode ? 0 : View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
|
||||
View decorView = getWindow().getDecorView();
|
||||
WindowInsetsControllerCompat wic = new WindowInsetsControllerCompat(getWindow(), decorView);
|
||||
wic.setAppearanceLightStatusBars(!darkMode);
|
||||
} else {
|
||||
// icons are always white back then
|
||||
if (!darkMode) {
|
||||
|
||||
@@ -11,6 +11,7 @@ import android.graphics.BitmapFactory;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.ImageDecoder;
|
||||
import android.graphics.Matrix;
|
||||
import android.net.Uri;
|
||||
import android.os.Build;
|
||||
import android.os.LocaleList;
|
||||
import android.provider.MediaStore;
|
||||
@@ -19,6 +20,13 @@ import android.util.TypedValue;
|
||||
import android.view.MenuItem;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.RawRes;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.appcompat.app.AppCompatDelegate;
|
||||
import androidx.core.graphics.ColorUtils;
|
||||
import androidx.exifinterface.media.ExifInterface;
|
||||
import androidx.palette.graphics.Palette;
|
||||
|
||||
import com.google.android.material.color.DynamicColors;
|
||||
import com.google.zxing.BinaryBitmap;
|
||||
import com.google.zxing.LuminanceSource;
|
||||
@@ -28,13 +36,18 @@ import com.google.zxing.RGBLuminanceSource;
|
||||
import com.google.zxing.Result;
|
||||
import com.google.zxing.common.HybridBinarizer;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.StringWriter;
|
||||
import java.math.BigDecimal;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.text.NumberFormat;
|
||||
import java.text.ParseException;
|
||||
import java.util.Calendar;
|
||||
@@ -44,11 +57,6 @@ import java.util.GregorianCalendar;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.appcompat.app.AppCompatDelegate;
|
||||
import androidx.core.graphics.ColorUtils;
|
||||
import androidx.exifinterface.media.ExifInterface;
|
||||
import androidx.palette.graphics.Palette;
|
||||
import protect.card_locker.preferences.Settings;
|
||||
|
||||
public class Utils {
|
||||
@@ -118,12 +126,8 @@ public class Utils {
|
||||
|
||||
Bitmap bitmap;
|
||||
try {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
|
||||
ImageDecoder.Source image_source = ImageDecoder.createSource(context.getContentResolver(), intent.getData());
|
||||
bitmap = ImageDecoder.decodeBitmap(image_source, (decoder, info, source) -> decoder.setMutableRequired(true));
|
||||
} else {
|
||||
bitmap = MediaStore.Images.Media.getBitmap(context.getContentResolver(), intent.getData());
|
||||
}
|
||||
Uri data = intent.getData();
|
||||
bitmap = retrieveImageFromUri(context, data);
|
||||
} catch (IOException e) {
|
||||
Log.e(TAG, "Error getting data from image file");
|
||||
e.printStackTrace();
|
||||
@@ -163,6 +167,20 @@ public class Utils {
|
||||
throw new UnsupportedOperationException("Unknown request code for parseSetBarcodeActivityResult");
|
||||
}
|
||||
|
||||
static public Bitmap retrieveImageFromUri(Context context, Uri data) throws IOException {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
|
||||
ImageDecoder.Source image_source = ImageDecoder.createSource(context.getContentResolver(), data);
|
||||
return ImageDecoder.decodeBitmap(image_source, (decoder, info, source) -> decoder.setMutableRequired(true));
|
||||
} else {
|
||||
return getBitmapSdkLessThan29(data, context);
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
private static Bitmap getBitmapSdkLessThan29(Uri data, Context context) throws IOException {
|
||||
return MediaStore.Images.Media.getBitmap(context.getContentResolver(), data);
|
||||
}
|
||||
|
||||
static public BarcodeValues getBarcodeFromBitmap(Bitmap bitmap) {
|
||||
// This function is vulnerable to OOM, so we try again with a smaller bitmap is we get OOM
|
||||
for (int i = 0; i < 10; i++) {
|
||||
@@ -205,6 +223,11 @@ public class Utils {
|
||||
date.set(Calendar.SECOND, 0);
|
||||
date.set(Calendar.MILLISECOND, 0);
|
||||
|
||||
// Note: In #1083 it was discovered that `DatePickerFragment` may sometimes store the expiryDate
|
||||
// at 12:00 PM instead of 12:00 AM in the DB. While this has been fixed and the 12-hour difference
|
||||
// is not a problem for the way the comparison currently works, it's good to keep in mind such
|
||||
// dates may exist in the DB in case the comparison changes in the future and the new one relies
|
||||
// on both dates being set at 12:00 AM.
|
||||
return expiryDate.before(date.getTime());
|
||||
}
|
||||
|
||||
@@ -396,8 +419,7 @@ public class Utils {
|
||||
Resources res = context.getResources();
|
||||
Configuration configuration = res.getConfiguration();
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
|
||||
configuration.locale = chosenLocale != null ? chosenLocale : Locale.getDefault();
|
||||
res.updateConfiguration(configuration, res.getDisplayMetrics());
|
||||
setLocalesSdkLessThan24(chosenLocale, configuration, res);
|
||||
return context;
|
||||
}
|
||||
|
||||
@@ -407,6 +429,12 @@ public class Utils {
|
||||
return context.createConfigurationContext(configuration);
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
private static void setLocalesSdkLessThan24(Locale chosenLocale, Configuration configuration, Resources res) {
|
||||
configuration.locale = chosenLocale != null ? chosenLocale : Locale.getDefault();
|
||||
res.updateConfiguration(configuration, res.getDisplayMetrics());
|
||||
}
|
||||
|
||||
static public long getUnixTime() {
|
||||
return System.currentTimeMillis() / 1000;
|
||||
}
|
||||
@@ -488,7 +516,7 @@ public class Utils {
|
||||
} else {
|
||||
// final catch all in case of invalid theme value from older versions
|
||||
// also handles R.string.settings_key_system_theme
|
||||
DynamicColors.applyIfAvailable(activity);
|
||||
DynamicColors.applyToActivityIfAvailable(activity);
|
||||
}
|
||||
|
||||
if (isDarkModeEnabled(activity) && settings.getOledDark()) {
|
||||
@@ -528,4 +556,23 @@ public class Utils {
|
||||
final int color = (int) (Math.random() * colors.length());
|
||||
return colors.getColor(color, Color.BLACK);
|
||||
}
|
||||
|
||||
public static String readTextFile(Context context, @RawRes int resourceId) throws IOException {
|
||||
InputStream input = context.getResources().openRawResource(resourceId);
|
||||
BufferedReader reader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8));
|
||||
StringBuilder result = new StringBuilder();
|
||||
while (true) {
|
||||
String nextLine = reader.readLine();
|
||||
|
||||
if (nextLine == null || nextLine.isEmpty()) {
|
||||
reader.close();
|
||||
break;
|
||||
}
|
||||
|
||||
result.append("\n");
|
||||
result.append(nextLine);
|
||||
}
|
||||
|
||||
return result.toString();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,7 +15,15 @@ import java.io.Reader;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
public class ZipUtils {
|
||||
static public String read(ZipInputStream zipInputStream) throws IOException {
|
||||
public static Bitmap readImage(ZipInputStream zipInputStream) {
|
||||
return BitmapFactory.decodeStream(zipInputStream);
|
||||
}
|
||||
|
||||
public static JSONObject readJSON(ZipInputStream zipInputStream) throws IOException, JSONException {
|
||||
return new JSONObject(read(zipInputStream));
|
||||
}
|
||||
|
||||
private static String read(ZipInputStream zipInputStream) throws IOException {
|
||||
StringBuilder stringBuilder = new StringBuilder();
|
||||
Reader reader = new BufferedReader(new InputStreamReader(zipInputStream, StandardCharsets.UTF_8));
|
||||
int c;
|
||||
@@ -24,12 +32,4 @@ public class ZipUtils {
|
||||
}
|
||||
return stringBuilder.toString();
|
||||
}
|
||||
|
||||
static public Bitmap readImage(ZipInputStream zipInputStream) {
|
||||
return BitmapFactory.decodeStream(zipInputStream);
|
||||
}
|
||||
|
||||
static public JSONObject readJSON(ZipInputStream zipInputStream) throws IOException, JSONException {
|
||||
return new JSONObject(read(zipInputStream));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,7 +13,6 @@ import org.apache.commons.csv.CSVRecord;
|
||||
|
||||
import java.io.BufferedInputStream;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
@@ -55,7 +54,7 @@ public class CatimaImporter implements Importer {
|
||||
|
||||
String fileName = Uri.parse(localFileHeader.getFileName()).getLastPathSegment();
|
||||
if (fileName.equals("catima.csv")) {
|
||||
importCSV(context, database, new ByteArrayInputStream(ZipUtils.read(zipInputStream).getBytes(StandardCharsets.UTF_8)));
|
||||
importCSV(context, database, zipInputStream);
|
||||
} else if (fileName.endsWith(".png")) {
|
||||
Utils.saveCardImage(context, ZipUtils.readImage(zipInputStream), fileName);
|
||||
} else {
|
||||
@@ -68,23 +67,14 @@ public class CatimaImporter implements Importer {
|
||||
bufferedInputStream.reset();
|
||||
importCSV(context, database, bufferedInputStream);
|
||||
}
|
||||
|
||||
input.close();
|
||||
}
|
||||
|
||||
public void importCSV(Context context, SQLiteDatabase database, InputStream input) throws IOException, FormatException, InterruptedException {
|
||||
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8));
|
||||
|
||||
bufferedReader.mark(100);
|
||||
|
||||
Integer version = 1;
|
||||
|
||||
try {
|
||||
version = Integer.parseInt(bufferedReader.readLine());
|
||||
} catch (NumberFormatException _e) {
|
||||
// Assume version 1
|
||||
}
|
||||
|
||||
bufferedReader.reset();
|
||||
|
||||
int version = parseVersion(bufferedReader);
|
||||
switch (version) {
|
||||
case 1:
|
||||
parseV1(context, database, bufferedReader);
|
||||
@@ -95,8 +85,6 @@ public class CatimaImporter implements Importer {
|
||||
default:
|
||||
throw new FormatException(String.format("No code to parse version %s", version));
|
||||
}
|
||||
|
||||
bufferedReader.close();
|
||||
}
|
||||
|
||||
public void parseV1(Context context, SQLiteDatabase database, BufferedReader input) throws IOException, FormatException, InterruptedException {
|
||||
@@ -118,8 +106,8 @@ public class CatimaImporter implements Importer {
|
||||
}
|
||||
|
||||
public void parseV2(Context context, SQLiteDatabase database, BufferedReader input) throws IOException, FormatException, InterruptedException {
|
||||
Integer part = 0;
|
||||
String stringPart = "";
|
||||
int part = 0;
|
||||
StringBuilder stringPart = new StringBuilder();
|
||||
|
||||
try {
|
||||
while (true) {
|
||||
@@ -135,7 +123,7 @@ public class CatimaImporter implements Importer {
|
||||
break;
|
||||
case 1:
|
||||
try {
|
||||
parseV2Groups(database, stringPart);
|
||||
parseV2Groups(database, stringPart.toString());
|
||||
sectionParsed = true;
|
||||
} catch (FormatException e) {
|
||||
// We may have a multiline field, try again
|
||||
@@ -143,7 +131,7 @@ public class CatimaImporter implements Importer {
|
||||
break;
|
||||
case 2:
|
||||
try {
|
||||
parseV2Cards(context, database, stringPart);
|
||||
parseV2Cards(context, database, stringPart.toString());
|
||||
sectionParsed = true;
|
||||
} catch (FormatException e) {
|
||||
// We may have a multiline field, try again
|
||||
@@ -151,7 +139,7 @@ public class CatimaImporter implements Importer {
|
||||
break;
|
||||
case 3:
|
||||
try {
|
||||
parseV2CardGroups(database, stringPart);
|
||||
parseV2CardGroups(database, stringPart.toString());
|
||||
sectionParsed = true;
|
||||
} catch (FormatException e) {
|
||||
// We may have a multiline field, try again
|
||||
@@ -167,12 +155,12 @@ public class CatimaImporter implements Importer {
|
||||
|
||||
if (sectionParsed) {
|
||||
part += 1;
|
||||
stringPart = "";
|
||||
stringPart = new StringBuilder();
|
||||
} else {
|
||||
stringPart += tmp + "\n";
|
||||
stringPart.append(tmp).append('\n');
|
||||
}
|
||||
} else {
|
||||
stringPart += tmp + "\n";
|
||||
stringPart.append(tmp).append('\n');
|
||||
}
|
||||
}
|
||||
} catch (FormatException e) {
|
||||
@@ -255,6 +243,35 @@ public class CatimaImporter implements Importer {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse the version number of the import file
|
||||
*
|
||||
* @param reader the reader containing the import file
|
||||
* @return the parsed version number, defaulting to 1 if none is found
|
||||
* @throws IOException there was a problem reading the file
|
||||
*/
|
||||
private int parseVersion(BufferedReader reader) throws IOException {
|
||||
reader.mark(10); // slightly over the search limit just to be sure
|
||||
StringBuilder sb = new StringBuilder();
|
||||
int searchLimit = 5; // gives you version numbers up to 99999
|
||||
int codePoint;
|
||||
// search until the next whitespace, indicating the end of the version
|
||||
while (!Character.isWhitespace(codePoint = reader.read())) {
|
||||
// we found something that isn't a digit, or we ran out of chars
|
||||
if (!Character.isDigit(codePoint) || searchLimit <= 0) {
|
||||
reader.reset();
|
||||
return 1; // default value
|
||||
}
|
||||
sb.append((char) codePoint);
|
||||
searchLimit--;
|
||||
}
|
||||
reader.reset();
|
||||
if (sb.length() == 0) {
|
||||
return 1;
|
||||
}
|
||||
return Integer.parseInt(sb.toString());
|
||||
}
|
||||
|
||||
/**
|
||||
* Import a single loyalty card into the database using the given
|
||||
* session.
|
||||
@@ -338,7 +355,7 @@ public class CatimaImporter implements Importer {
|
||||
// We catch this exception so we can still import old backups
|
||||
}
|
||||
|
||||
DBHelper.insertLoyaltyCard(database, id, store, note, expiry, balance, balanceType, cardId, barcodeId, barcodeType, headerColor, starStatus, lastUsed,archiveStatus);
|
||||
DBHelper.insertLoyaltyCard(database, id, store, note, expiry, balance, balanceType, cardId, barcodeId, barcodeType, headerColor, starStatus, lastUsed, archiveStatus);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -17,32 +17,35 @@ import androidx.appcompat.app.ActionBar;
|
||||
import androidx.appcompat.app.AppCompatDelegate;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
import androidx.fragment.app.DialogFragment;
|
||||
import androidx.fragment.app.FragmentResultListener;
|
||||
import androidx.preference.ListPreference;
|
||||
import androidx.preference.Preference;
|
||||
import androidx.preference.PreferenceFragmentCompat;
|
||||
|
||||
import kotlin.Suppress;
|
||||
import nl.invissvenska.numberpickerpreference.NumberDialogPreference;
|
||||
import nl.invissvenska.numberpickerpreference.NumberPickerPreferenceDialogFragment;
|
||||
import protect.card_locker.CatimaAppCompatActivity;
|
||||
import protect.card_locker.MainActivity;
|
||||
import protect.card_locker.R;
|
||||
import protect.card_locker.Utils;
|
||||
import protect.card_locker.databinding.SettingsActivityBinding;
|
||||
|
||||
public class SettingsActivity extends CatimaAppCompatActivity {
|
||||
|
||||
private SettingsActivityBinding binding;
|
||||
private final static String RELOAD_MAIN_STATE = "mReloadMain";
|
||||
private SettingsFragment fragment;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
binding = SettingsActivityBinding.inflate(getLayoutInflater());
|
||||
setTitle(R.string.settings);
|
||||
setContentView(R.layout.settings_activity);
|
||||
Toolbar toolbar = findViewById(R.id.toolbar);
|
||||
setContentView(binding.getRoot());
|
||||
Toolbar toolbar = binding.toolbar;
|
||||
setSupportActionBar(toolbar);
|
||||
ActionBar actionBar = getSupportActionBar();
|
||||
if (actionBar != null) {
|
||||
actionBar.setDisplayHomeAsUpEnabled(true);
|
||||
}
|
||||
enableToolbarBackButton();
|
||||
|
||||
// Display the fragment as the main content.
|
||||
fragment = new SettingsFragment();
|
||||
@@ -163,6 +166,11 @@ public class SettingsActivity extends CatimaAppCompatActivity {
|
||||
}
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("deprecation") // setTargetFragment
|
||||
// androidx.preference.PreferenceDialogFragmentCompat uses the deprecated method
|
||||
// `getTargetFragment()`, which throws if `setTargetFragment()` isn't used before.
|
||||
// While this isn't fixed on upstream, suppress the deprecation warning
|
||||
// https://issuetracker.google.com/issues/181793702
|
||||
public void onDisplayPreferenceDialog(Preference preference) {
|
||||
if (preference instanceof NumberDialogPreference) {
|
||||
NumberDialogPreference dialogPreference = (NumberDialogPreference) preference;
|
||||
|
||||
5
app/src/main/res/drawable/camera_permission_denied.xml
Normal file
5
app/src/main/res/drawable/camera_permission_denied.xml
Normal file
@@ -0,0 +1,5 @@
|
||||
<vector android:height="24dp" android:tint="#BD0000"
|
||||
android:viewportHeight="24" android:viewportWidth="24"
|
||||
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<path android:fillColor="@android:color/white" android:pathData="M10.94,8.12L7.48,4.66L9,3h6l1.83,2H20c1.1,0 2,0.9 2,2v12c0,0.05 -0.01,0.1 -0.02,0.16l-5.1,-5.1C16.96,13.71 17,13.36 17,13c0,-2.76 -2.24,-5 -5,-5C11.64,8 11.29,8.04 10.94,8.12zM20.49,23.31L18.17,21H4c-1.1,0 -2,-0.9 -2,-2V7c0,-0.59 0.27,-1.12 0.68,-1.49l-2,-2L2.1,2.1l19.8,19.8L20.49,23.31zM14.49,17.32l-1.5,-1.5C12.67,15.92 12.35,16 12,16c-1.66,0 -3,-1.34 -3,-3c0,-0.35 0.08,-0.67 0.19,-0.98l-1.5,-1.5C7.25,11.24 7,12.09 7,13c0,2.76 2.24,5 5,5C12.91,18 13.76,17.75 14.49,17.32z"/>
|
||||
</vector>
|
||||
@@ -0,0 +1,5 @@
|
||||
<vector android:height="24dp" android:tint="?attr/colorControlNormal"
|
||||
android:viewportHeight="24" android:viewportWidth="24"
|
||||
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<path android:fillColor="@android:color/white" android:pathData="M7,18c-1.1,0 -1.99,0.9 -1.99,2S5.9,22 7,22s2,-0.9 2,-2 -0.9,-2 -2,-2zM1,2v2h2l3.6,7.59 -1.35,2.45c-0.16,0.28 -0.25,0.61 -0.25,0.96 0,1.1 0.9,2 2,2h12v-2L7.42,15c-0.14,0 -0.25,-0.11 -0.25,-0.25l0.03,-0.12 0.9,-1.63h7.45c0.75,0 1.41,-0.41 1.75,-1.03l3.58,-6.49c0.08,-0.14 0.12,-0.31 0.12,-0.48 0,-0.55 -0.45,-1 -1,-1L5.21,4l-0.94,-2L1,2zM17,18c-1.1,0 -1.99,0.9 -1.99,2s0.89,2 1.99,2 2,-0.9 2,-2 -0.9,-2 -2,-2z"/>
|
||||
</vector>
|
||||
@@ -27,6 +27,8 @@
|
||||
|
||||
</com.google.android.material.appbar.AppBarLayout>
|
||||
|
||||
<include layout="@layout/content_main"/>
|
||||
<include
|
||||
android:id="@+id/include"
|
||||
layout="@layout/content_main" />
|
||||
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
|
||||
41
app/src/main/res/layout/camera_permission_failed_layout.xml
Normal file
41
app/src/main/res/layout/camera_permission_failed_layout.xml
Normal file
@@ -0,0 +1,41 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
app:layout_behavior="@string/appbar_scrolling_view_behavior"
|
||||
tools:context="protect.card_locker.MainActivity"
|
||||
tools:showIn="@layout/custom_barcode_scanner">
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/camera_permission_denied_clickable_area"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/camera_permission_denied_icon"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="84dp"
|
||||
android:scaleType="fitCenter"
|
||||
android:src="@drawable/camera_permission_denied" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/camera_permission_denied_title"
|
||||
style="@style/TextAppearance.Material3.HeadlineLarge"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center"
|
||||
android:text="@string/cameraPermissionDeniedTitle" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/camera_permission_denied_message"
|
||||
style="@style/AppTheme.TextView.NoData"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center"
|
||||
android:text="@string/noCameraPermissionDirectToSystemSetting" />
|
||||
</LinearLayout>
|
||||
|
||||
</RelativeLayout>
|
||||
@@ -1,6 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<RelativeLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
@@ -10,19 +9,21 @@
|
||||
tools:showIn="@layout/main_activity">
|
||||
|
||||
<LinearLayout
|
||||
android:visibility="gone"
|
||||
android:id="@+id/helpSection"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:visibility="gone">
|
||||
android:orientation="vertical">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/welcome_icon"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="184dp"
|
||||
android:scaleType="fitCenter"
|
||||
android:src="@drawable/ic_launcher_foreground" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/welcome_text"
|
||||
style="@style/TextAppearance.Material3.HeadlineLarge"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
@@ -30,40 +31,40 @@
|
||||
android:text="@string/welcome" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/add_card_instruction"
|
||||
style="@style/AppTheme.TextView.NoData"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center"
|
||||
android:text="@string/noGiftCards"/>
|
||||
android:text="@string/noGiftCards" />
|
||||
</LinearLayout>
|
||||
|
||||
<TextView
|
||||
style="@style/AppTheme.TextView.NoData"
|
||||
android:id="@+id/noMatchingCardsText"
|
||||
style="@style/AppTheme.TextView.NoData"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:gravity="center"
|
||||
android:text="@string/noMatchingGiftCards"
|
||||
android:visibility="gone"/>
|
||||
android:visibility="gone" />
|
||||
|
||||
<TextView
|
||||
style="@style/AppTheme.TextView.NoData"
|
||||
android:id="@+id/noGroupCardsText"
|
||||
style="@style/AppTheme.TextView.NoData"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:gravity="center"
|
||||
android:text="@string/noGroupCards"
|
||||
android:visibility="gone"/>
|
||||
android:visibility="gone" />
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/list"
|
||||
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
|
||||
app:spanCount="@integer/main_view_card_columns"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:paddingBottom="80dp"
|
||||
android:clipToPadding="false"
|
||||
android:paddingBottom="80dp"
|
||||
android:scrollbars="vertical"
|
||||
android:visibility="gone"/>
|
||||
|
||||
android:visibility="gone"
|
||||
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
|
||||
app:spanCount="@integer/main_view_card_columns" />
|
||||
</RelativeLayout>
|
||||
|
||||
@@ -1,41 +1,57 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Based on https://github.com/journeyapps/zxing-android-embedded/blob/0fdfbce9fb3285e985bad9971c5f7c0a7a334e7b/sample/src/main/res/layout/custom_barcode_scanner.xml originally released under Apache 2.0 -->
|
||||
<?xml version="1.0" encoding="utf-8"?><!-- Based on https://github.com/journeyapps/zxing-android-embedded/blob/0fdfbce9fb3285e985bad9971c5f7c0a7a334e7b/sample/src/main/res/layout/custom_barcode_scanner.xml originally released under Apache 2.0 -->
|
||||
<merge xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||
|
||||
<com.journeyapps.barcodescanner.BarcodeView
|
||||
android:id="@+id/zxing_barcode_surface"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:id="@+id/zxing_barcode_surface"
|
||||
app:zxing_framing_rect_width="250dp"
|
||||
app:zxing_framing_rect_height="250dp"/>
|
||||
app:zxing_framing_rect_height="250dp"
|
||||
app:zxing_framing_rect_width="250dp" />
|
||||
|
||||
<com.journeyapps.barcodescanner.ViewfinderView
|
||||
android:id="@+id/zxing_viewfinder_view"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:id="@+id/zxing_viewfinder_view"
|
||||
app:zxing_possible_result_points="@color/zxing_custom_possible_result_points"
|
||||
app:zxing_result_view="@color/zxing_custom_result_view"
|
||||
app:zxing_viewfinder_laser="@color/zxing_custom_viewfinder_laser"
|
||||
app:zxing_viewfinder_mask="@color/zxing_custom_viewfinder_mask"/>
|
||||
app:zxing_viewfinder_mask="@color/zxing_custom_viewfinder_mask" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom|center_horizontal"
|
||||
android:gravity="center_horizontal"
|
||||
android:orientation="vertical">
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:id="@+id/card_input_container"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:padding="@dimen/activity_scanner_padding">
|
||||
|
||||
<include
|
||||
android:id="@+id/camera_permission_denied_layout"
|
||||
layout="@layout/camera_permission_failed_layout"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:visibility="gone"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/add_from_image"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/addFromImage" />
|
||||
android:text="@string/addFromImage"
|
||||
app:layout_constraintBottom_toTopOf="@+id/add_manually"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/camera_permission_denied_layout"
|
||||
app:layout_constraintVertical_bias="1.0" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/add_manually"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/addManually" />
|
||||
</LinearLayout>
|
||||
android:text="@string/addManually"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent" />
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
</merge>
|
||||
@@ -288,7 +288,7 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:inputType="numberDecimal"
|
||||
android:digits="0123456789.,$" />
|
||||
android:digits="0123456789,." />
|
||||
|
||||
</com.google.android.material.textfield.TextInputLayout>
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
android:layout_height="fill_parent"
|
||||
android:fitsSystemWindows="true">
|
||||
|
||||
|
||||
<com.google.android.material.appbar.AppBarLayout
|
||||
android:id="@+id/app_bar_layout"
|
||||
android:layout_width="fill_parent"
|
||||
@@ -264,6 +265,18 @@
|
||||
android:tooltipText="@string/nextCard"
|
||||
android:visibility="gone" />
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/button_update_balance"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="end"
|
||||
android:background="@android:color/transparent"
|
||||
android:paddingStart="12dp"
|
||||
android:paddingEnd="12dp"
|
||||
android:src="@drawable/ic_baseline_shopping_cart_24"
|
||||
android:tooltipText="@string/updateBalance"
|
||||
android:visibility="gone" />
|
||||
|
||||
</com.google.android.material.bottomappbar.BottomAppBar>
|
||||
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
|
||||
@@ -36,6 +36,8 @@
|
||||
|
||||
</com.google.android.material.appbar.AppBarLayout>
|
||||
|
||||
<include layout="@layout/content_main"/>
|
||||
<include
|
||||
android:id="@+id/include"
|
||||
layout="@layout/content_main" />
|
||||
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
|
||||
@@ -29,6 +29,8 @@
|
||||
|
||||
</com.google.android.material.appbar.AppBarLayout>
|
||||
|
||||
<include layout="@layout/group_main"/>
|
||||
<include
|
||||
android:id="@+id/include"
|
||||
layout="@layout/group_main" />
|
||||
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
|
||||
@@ -8,39 +8,51 @@ Oğuz Ersen
|
||||
Katharine Chui
|
||||
mondstern
|
||||
IllusiveMan196
|
||||
Altonss
|
||||
StoyanDimitrov
|
||||
Petr Novák
|
||||
Joel A
|
||||
Michael Moroni
|
||||
Taco
|
||||
Altonss
|
||||
SlavekB
|
||||
Gediminas Murauskas
|
||||
Petr Novák
|
||||
Michael Moroni
|
||||
Joel A
|
||||
Taco
|
||||
pfaffenrodt
|
||||
Nyatsuki
|
||||
Samantaz Fox
|
||||
laralem
|
||||
Samantaz Fox
|
||||
arno-github
|
||||
Ankit Tiwari
|
||||
Sergio Paredes
|
||||
Aayush Gupta
|
||||
gallegonovato
|
||||
huuhaa
|
||||
arshbeerSingh
|
||||
Freddo espresso
|
||||
Quentin PAGÈS
|
||||
Miha Frangež
|
||||
Arnis Jaundzeikars
|
||||
sr093906
|
||||
Freddo espresso
|
||||
mdvhimself
|
||||
Katarzyna
|
||||
Maciej Błędkowski
|
||||
Magnitudee
|
||||
Olivia (Zoe)
|
||||
betsythefc
|
||||
Silvério Santos
|
||||
waffshappen
|
||||
Robin
|
||||
Eric
|
||||
Alexander Ivanov
|
||||
ati3
|
||||
Giovanni
|
||||
Jane Kong
|
||||
K. Herbert
|
||||
Magnitudee
|
||||
Lisa A.
|
||||
Mawuena M. KODZO A.
|
||||
Max
|
||||
Still Hsu
|
||||
String E. Fighter
|
||||
Tapu
|
||||
Yurical
|
||||
rr-vesp
|
||||
alajemba-vik
|
||||
@@ -50,87 +62,118 @@ Alessandro Mandelli
|
||||
KovalevArtem
|
||||
Artem M.
|
||||
Astrohops1
|
||||
BMN
|
||||
BootVirtual
|
||||
Clonewayx
|
||||
D. Domig
|
||||
Diego
|
||||
Evgeniy Khramov
|
||||
Fede Pujol
|
||||
Jean-Luc Tibaux
|
||||
Lukas Grassauer
|
||||
Marnick L'Eau
|
||||
Michalis
|
||||
Michał
|
||||
Mohamed A. Salah
|
||||
Neko Nekowazarashi
|
||||
Rishi Agarwal
|
||||
Rosdyana Kusuma
|
||||
umoenks
|
||||
Simon Rusinov
|
||||
Mritunjay
|
||||
Tarik Dzambic
|
||||
Thomas Bertels
|
||||
Thomas Cruveilher
|
||||
Tong Liu
|
||||
Wanath
|
||||
Runner
|
||||
ce i moa
|
||||
inesre
|
||||
lgasp
|
||||
phlostically
|
||||
Ágata Leuck
|
||||
BmBKun
|
||||
Aditya Das
|
||||
Asier
|
||||
Kevin Sicong Jiang
|
||||
Tomer Ben-Rachel
|
||||
tfuxu
|
||||
Ahmed Saleh
|
||||
Airat
|
||||
Alexander Ivanov
|
||||
sNiXx
|
||||
Angela Enogieru
|
||||
AnimeshChatterjee1
|
||||
Ashish Yadav
|
||||
BMN
|
||||
Aya Elsaadany
|
||||
Biren
|
||||
Booc Sylvan
|
||||
CherryMonster222
|
||||
Colgrave
|
||||
Csaba
|
||||
Mylou53
|
||||
danieluhrinyi
|
||||
Kasina Dheeraj
|
||||
Donno
|
||||
Eric
|
||||
Evgeniy Khramov
|
||||
Flav
|
||||
Franciszek Stefan
|
||||
Grzegorz
|
||||
HowITsDone
|
||||
Izzy
|
||||
Jacek
|
||||
Jacopo Gennaro Esposito
|
||||
Jean Mareilles
|
||||
Jean-Baptiste
|
||||
Jean-Luc Tibaux
|
||||
人工知能
|
||||
krkk
|
||||
Lisa
|
||||
Laura Ferraz
|
||||
Lucas da Costa
|
||||
bittin
|
||||
Manan Jhaveri
|
||||
Marco
|
||||
Mario M. Viscovich
|
||||
Mattia
|
||||
Md. Al-Amin
|
||||
Michael Gangolf
|
||||
3DN1M
|
||||
Moi Toi
|
||||
DivideEtImpera
|
||||
Nicolas
|
||||
pbeckmann
|
||||
Peer Beckmann
|
||||
Piotr Zet
|
||||
Quang Nguyen
|
||||
Ratnesh
|
||||
Reza
|
||||
Rohan Babbar
|
||||
Ronak Upadhyay
|
||||
Rose Liverman
|
||||
SKULD
|
||||
Samarth Asthan
|
||||
Simone Dotto
|
||||
Subhashish Anand
|
||||
TenTraicion
|
||||
Titas Pažereckas
|
||||
Tom Sawyer
|
||||
Tomer Ben-Rachel
|
||||
Tony C
|
||||
Tymofii Lytvynenko
|
||||
Vancha March
|
||||
Yevgeny M
|
||||
Yusril A
|
||||
Avik Kundu
|
||||
diksha-2911
|
||||
gbonaspetti
|
||||
huang ivan
|
||||
mtrmirez
|
||||
opsik
|
||||
polarhun
|
||||
pooyanazari
|
||||
psa-jforestier
|
||||
Robin
|
||||
sergio
|
||||
Marcus
|
||||
techwebpd
|
||||
Truestorybaby
|
||||
tygyh
|
||||
unstartdev
|
||||
luoyang3
|
||||
JaeBeom An
|
||||
JungHee Lee
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
|
||||
<string name="action_search">بحث</string>
|
||||
<string name="action_add">اضف</string>
|
||||
<string name="noGiftCards">اضغط علي زر + لاضافة بطاقة, او استورد بعض منهم من قائمة ال ⋮.</string>
|
||||
<string name="noMatchingGiftCards">لا نتائج. حاول تغيير بحثك.</string>
|
||||
<string name="noGiftCards">اضغط على + الزر الإضافي لاضافة بطاقة, او استورد من ⋮ القائمة.</string>
|
||||
<string name="noMatchingGiftCards">لا نتائج. حاول تغيير كلمات البحث.</string>
|
||||
<string name="storeName">اسم</string>
|
||||
<string name="note">مذكرة</string>
|
||||
<string name="cardId">بطاقة شخصية</string>
|
||||
@@ -12,17 +12,17 @@
|
||||
<string name="noBarcode">لا يوجد باركود</string>
|
||||
<string name="star">اضف الي المفضلة</string>
|
||||
<string name="unstar">حذف من المفضلة</string>
|
||||
<string name="cancel">الغاء</string>
|
||||
<string name="cancel">إلغاء</string>
|
||||
<string name="save">حفظ</string>
|
||||
<string name="edit">تعديل</string>
|
||||
<string name="delete">مسح</string>
|
||||
<string name="confirm">تأكيد</string>
|
||||
<string name="deleteConfirmation">مسح هذة البطاقة نهائيا؟</string>
|
||||
<string name="ok">حسنا</string>
|
||||
<string name="copy_to_clipboard">نسخ البطاقة الشخصية الي الحافظة</string>
|
||||
<string name="copy_to_clipboard">نسخ البطاقة الشخصية الى الحافظة</string>
|
||||
<string name="share">شارك</string>
|
||||
<string name="sendLabel">ارسل…</string>
|
||||
<string name="editCardTitle">عدل بطاقة</string>
|
||||
<string name="editCardTitle">عدل البطاقة</string>
|
||||
<string name="addCardTitle">اضف بطاقة</string>
|
||||
<string name="scanCardBarcode">مسح باركود</string>
|
||||
<string name="cardShortcut">اختصار البطاقة</string>
|
||||
@@ -31,15 +31,14 @@
|
||||
<string name="barcodeImageDescriptionWithType">صورة <xliff:g>%s</xliff:g> باركود</string>
|
||||
<string name="noStoreError">لا يوجد اسم مدخل</string>
|
||||
<string name="noCardIdError">لا يوجد بطاقة شخصية مدخلة</string>
|
||||
<string name="noCardExistsError">لا يمكن العثور علي هذه البطاقة</string>
|
||||
<string name="noCardExistsError">لا يمكن العثور على هذه البطاقة</string>
|
||||
<string name="failedParsingImportUriError">لا يمكن تحليل الرابط المستورد</string>
|
||||
<string name="importExport">استيراد/تصدير</string>
|
||||
<string name="importExportHelp">عمل نسخ احتطياتي لبياناتك يسمح نقلها لجهاز اخر.</string>
|
||||
<string name="importFailed">لا يمكن عمل الاستيراد</string>
|
||||
<string name="importExportHelp">دعم بياناتك يسمح بنقلها إلى جهاز آخر.</string>
|
||||
<string name="importFailed">تعذر إجراء الاستيراد</string>
|
||||
<string name="exportSuccessfulTitle">متصدر</string>
|
||||
<string name="exportFailedTitle">فشل التصدير</string>
|
||||
<string name="exportFailed">لا يمكن عمل التصدير</string>
|
||||
<string name="noExternalStoragePermissionError">امنح التخزين الخارجي اذن لاستيراد وتصدير البيانات</string>
|
||||
<string name="exportOptionExplanation">ستتم كتابة البيانات في الموقع الذي تختاره.</string>
|
||||
<string name="importOptionFilesystemButton">من نظام الملفات</string>
|
||||
<string name="importOptionApplicationTitle">استخدم تطبيقًا آخر</string>
|
||||
@@ -85,7 +84,7 @@
|
||||
<string name="points">نقاط</string>
|
||||
<string name="parsingBalanceFailed"><xliff:g>%s</xliff:g> لا يبدو أنه رصيد صالح.</string>
|
||||
<string name="chooseImportType">استيراد البيانات من</string>
|
||||
<string name="app_loyalty_card_keychain">Loyalty Card Keychain</string>
|
||||
<string name="app_loyalty_card_keychain">سلسلة مفاتيح بطاقة الولاء</string>
|
||||
<string name="privacy_policy">سياسة الخصوصية</string>
|
||||
<string name="accept">قبول</string>
|
||||
<string name="importCatima">الاستيراد من Catima</string>
|
||||
@@ -138,7 +137,7 @@
|
||||
<string name="sort">فرز</string>
|
||||
<string name="showMoreInfo">اظهر المعلومات</string>
|
||||
<string name="hideMoreInfo">إخفاء المعلومات</string>
|
||||
<string name="swipeToSwitchImages">اسحب أو اضغط لفترة طويلة لتبديل الصور</string>
|
||||
<string name="swipeToSwitchImages">امسح لتبديل الصور, اضغط لفترة طويلة لفتح الصورة في تطبيق المعرض</string>
|
||||
<string name="sort_by_balance">الرصيد</string>
|
||||
<string name="reverse">... بترتيب معكوس</string>
|
||||
<string name="sort_by">صنف حسب</string>
|
||||
@@ -160,7 +159,7 @@
|
||||
<string name="unarchived">البطاقة غير مؤرشفة</string>
|
||||
<string name="archiveList">أرشيف</string>
|
||||
<string name="failedLaunchingPhotoPicker">تعذر العثور على تطبيق معرض مدعوم</string>
|
||||
<string name="noGiftCardsGroup">انشئ بعض من البطاقات, و عيينهم لهذة المجموعة.</string>
|
||||
<string name="noGiftCardsGroup">انشئ بعض من البطاقات, و عيينهم لهذه المجموعة.</string>
|
||||
<string name="deleteTitle">مسح بطاقة</string>
|
||||
<plurals name="selectedCardCount">
|
||||
<item quantity="zero"><xliff:g>%d</xliff:g> محدد</item>
|
||||
@@ -174,7 +173,7 @@
|
||||
<string name="exportName">تصدير</string>
|
||||
<string name="exporting">جار التصدير…</string>
|
||||
<string name="importSuccessfulTitle">مستورد</string>
|
||||
<string name="importFailedTitle">فشل الاستيراد</string>
|
||||
<string name="importFailedTitle">فشل بالاستيراد</string>
|
||||
<string name="sort_by_most_recently_used">الأكثر أستعمالا مؤخرا</string>
|
||||
<string name="license">رخصة</string>
|
||||
<string name="sort_by_name">اسم</string>
|
||||
@@ -191,18 +190,18 @@
|
||||
<plurals name="deleteCardsTitle">
|
||||
<item quantity="zero">مسح <xliff:g>%d</xliff:g> بطاقة</item>
|
||||
<item quantity="one">مسح <xliff:g>%d</xliff:g> بطاقة</item>
|
||||
<item quantity="two">مسح <xliff:g>%d</xliff:g> بطاقة</item>
|
||||
<item quantity="two">مسح <xliff:g>%d</xliff:g> بطاقتين</item>
|
||||
<item quantity="few">مسح <xliff:g>%d</xliff:g> بطاقات</item>
|
||||
<item quantity="many">مسح <xliff:g>%d</xliff:g> بطاقات</item>
|
||||
<item quantity="other">مسح <xliff:g>%d</xliff:g> بطاقات</item>
|
||||
</plurals>
|
||||
<plurals name="deleteCardsConfirmation">
|
||||
<item quantity="zero">مسح هذه <xliff:g>%d</xliff:g> بطاقة نهائيا؟</item>
|
||||
<item quantity="one">مسح هذه <xliff:g>%d</xliff:g> بطاقة نهائيا؟</item>
|
||||
<item quantity="two">مسح هذه <xliff:g>%d</xliff:g> بطاقة نهائيا؟</item>
|
||||
<item quantity="few">مسح هذه <xliff:g>%d</xliff:g> بطاقات نهائيا؟</item>
|
||||
<item quantity="many">مسح هذه <xliff:g>%d</xliff:g> بطاقات نهائيا؟</item>
|
||||
<item quantity="other">مسح هذه <xliff:g>%d</xliff:g> بطاقات نهائيا؟</item>
|
||||
<item quantity="zero">مسح هذه <xliff:g>%d</xliff:g> البطاقة نهائيا؟</item>
|
||||
<item quantity="one">مسح هذه <xliff:g>%d</xliff:g> البطاقة نهائيا؟</item>
|
||||
<item quantity="two">مسح هذه <xliff:g>%d</xliff:g> البطاقتين نهائيا؟</item>
|
||||
<item quantity="few">مسح هذه <xliff:g>%d</xliff:g> البطاقات نهائيا؟</item>
|
||||
<item quantity="many">مسح هذه <xliff:g>%d</xliff:g> البطاقات نهائيا؟</item>
|
||||
<item quantity="other">مسح هذه <xliff:g>%d</xliff:g> البطاقات نهائيا؟</item>
|
||||
</plurals>
|
||||
<string name="importOptionFilesystemTitle">الاستيراد من نظام الملفات</string>
|
||||
<string name="importOptionFilesystemExplanation">اختر ملفًا محددًا من نظام الملفات.</string>
|
||||
@@ -271,4 +270,24 @@
|
||||
<string name="settings_theme_color">لون المظهر</string>
|
||||
<string name="previousCard">السابق</string>
|
||||
<string name="nextCard">التالي</string>
|
||||
<string name="failedToRetrieveImageFile">فشل في استخراج ملف الصورة</string>
|
||||
<string name="barcodeLongPressMessage">يمكن فتح صور فقط في تطبيق معرض الصور</string>
|
||||
<string name="failedToOpenUrl">ثبت متصفح ويب أولاً</string>
|
||||
<string name="welcome">مرحبا بك في كاتيما</string>
|
||||
<string name="updateBalanceTitle">كم أنفقت؟</string>
|
||||
<string name="currentBalanceSentence">الرصيد الحالي: <xliff:g> %s </xliff:g></string>
|
||||
<plurals name="viewArchivedCardsWithCount">
|
||||
<item quantity="zero">عرض الأرشيف (<xliff:g>%1$d</xliff:g> بطاقة)</item>
|
||||
<item quantity="one">عرض الأرشيف (<xliff:g>%1$d</xliff:g> بطاقة)</item>
|
||||
<item quantity="two">عرض الأرشيف (<xliff:g>%1$d</xliff:g> بطاقتين)</item>
|
||||
<item quantity="few">عرض الأرشيف (<xliff:g>%1$d</xliff:g> بطاقات)</item>
|
||||
<item quantity="many">عرض الأرشيف (<xliff:g>%1$d</xliff:g> بطاقات)</item>
|
||||
<item quantity="other">عرض الأرشيف (<xliff:g>%1$d</xliff:g> بطاقات)</item>
|
||||
</plurals>
|
||||
<string name="importCards">استيراد البطاقات</string>
|
||||
<string name="newBalanceSentence">الرصيد الجديد: <xliff:g>%s</xliff:g></string>
|
||||
<string name="cameraPermissionDeniedTitle">تعذر الوصول إلى الكاميرا</string>
|
||||
<string name="noCameraPermissionDirectToSystemSetting">لمسح الباركود، ستحتاج Catima إلى الوصول إلى الكاميرا. اضغط هنا لتغيير إعدادات الأذونات.</string>
|
||||
<string name="updateBalance">تحديث الرصيد</string>
|
||||
<string name="updateBalanceHint">أدخل المبلغ</string>
|
||||
</resources>
|
||||
2
app/src/main/res/values-ars/strings.xml
Normal file
2
app/src/main/res/values-ars/strings.xml
Normal file
@@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources></resources>
|
||||
@@ -34,7 +34,6 @@
|
||||
<string name="setFrontImage">Снимка на предната страна</string>
|
||||
<string name="photos">Снимки</string>
|
||||
<string name="importOptionApplicationExplanation">Изберете файл на друго приложение.</string>
|
||||
<string name="noExternalStoragePermissionError">Разрешете достъп до хранилището, за да работи внасянето и изнасянето</string>
|
||||
<string name="noCardExistsError">Картата не е намерена</string>
|
||||
<string name="updateBarcodeQuestionText">Идентификаторът е променен. Желаете ли с неговата стойност да бъде променен и щрихкодът\?</string>
|
||||
<string name="updateBarcodeQuestionTitle">Обновяване на щрихкода\?</string>
|
||||
@@ -184,7 +183,7 @@
|
||||
<string name="settings_locale">Език</string>
|
||||
<string name="noGroupCards">Групата е празна</string>
|
||||
<string name="barcodeImageDescriptionWithType">Изображение на щрихкод от вид <xliff:g>%s</xliff:g></string>
|
||||
<string name="swipeToSwitchImages">Плъзване или задържане за смяна на изображения</string>
|
||||
<string name="swipeToSwitchImages">За да размените изображенията - плъзнете, а за да ги отворите в галерията - задръжте</string>
|
||||
<string name="sort_by">Сортиране по</string>
|
||||
<string name="reverse">…в обратен ред</string>
|
||||
<string name="sort_by_balance">Наличност</string>
|
||||
@@ -240,7 +239,7 @@
|
||||
<string name="unarchived">Карта е извадена от архива</string>
|
||||
<string name="archiveList">Архив</string>
|
||||
<string name="noUnarchivedCardsMessage">Няма карти извън архива</string>
|
||||
<string name="failedLaunchingPhotoPicker">Не е намерено поддържано приложение за галерия.</string>
|
||||
<string name="failedLaunchingPhotoPicker">Не е намерено поддържано приложение за галерия</string>
|
||||
<plurals name="groupCardCountWithArchived">
|
||||
<item quantity="one"><xliff:g>%1$d</xliff:g> карта (<xliff:g id="archivedCount">%2$d</xliff:g> архивирана)</item>
|
||||
<item quantity="other"><xliff:g>%1$d</xliff:g> карти (<xliff:g id="archivedCount">%2$d</xliff:g> архивирани)</item>
|
||||
@@ -253,4 +252,16 @@
|
||||
<item quantity="one">Преглед на архива (<xliff:g>%1$d</xliff:g> карта)</item>
|
||||
<item quantity="other">Преглед на архива (<xliff:g>%1$d</xliff:g> карти)</item>
|
||||
</plurals>
|
||||
<string name="barcodeLongPressMessage">В приложението галерия могат да бъдат отваряни само изображения</string>
|
||||
<string name="failedToRetrieveImageFile">Не е възможно извличане на изображение</string>
|
||||
<string name="noCameraPermissionDirectToSystemSetting">За да сканирате щрихкодове с Catima е необходим достъп до камерата. За да промените разрешението докоснете тук.</string>
|
||||
<string name="updateBalanceTitle">Каква е промяната\?</string>
|
||||
<string name="updateBalanceHint">Въведете стойност</string>
|
||||
<string name="newBalanceSentence">Нов баланс: <xliff:g>%s</xliff:g></string>
|
||||
<string name="cameraPermissionDeniedTitle">Камерата е недостъпна</string>
|
||||
<string name="currentBalanceSentence">Текущ баланс: <xliff:g>%s</xliff:g></string>
|
||||
<string name="updateBalance">Обновяване на баланса</string>
|
||||
<string name="importCards">Внасяне на карти</string>
|
||||
<string name="storageReadPermissionRequired">За това действие е необходимо разрешение за четене на хранилището…</string>
|
||||
<string name="cameraPermissionRequired">За това действие е необходимо разрешение за достъп до камерата…</string>
|
||||
</resources>
|
||||
@@ -1,10 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="save">সংরক্ষণ</string>
|
||||
<string name="cancel">বাতিল</string>
|
||||
<string name="unstar">তারা মুক্ত</string>
|
||||
<string name="star">তারা</string>
|
||||
<string name="barcodeNoBarcode">বারকোড না বারকোড</string>
|
||||
<string name="barcodeNoBarcode">কোনো বারকোড নেই</string>
|
||||
<string name="barcodeType">বারকোড ধরন</string>
|
||||
<string name="note">বিঃদ্রঃ</string>
|
||||
<string name="storeName">দোকানের নাম</string>
|
||||
@@ -38,8 +38,8 @@
|
||||
<string name="wrongValueForBarcodeType">বারকোড টাইপের জন্য ভুল মান</string>
|
||||
<string name="copy_to_clipboard_multiple_toast">ক্লিপবোর্ড একাধিক টোস্টে অনুলিপি করুন</string>
|
||||
<string name="intent_import_card_from_url_share_multiple_text">url থেকে ইন্টেন্ট ইম্পোর্ট কার্ড একাধিক টেক্সট শেয়ার করে</string>
|
||||
<string name="frontImageDescription">সামনের চিত্রের বর্ণনা</string>
|
||||
<string name="backImageDescription">পিছনের চিত্রের বর্ণনা</string>
|
||||
<string name="frontImageDescription">সামনের চিত্র</string>
|
||||
<string name="backImageDescription">পিছনের চিত্র</string>
|
||||
<string name="photos">ছবি</string>
|
||||
<string name="setFrontImage">সদর ছবি স্থাপন</string>
|
||||
<string name="setBackImage">পিছনের ছবি স্থাপন</string>
|
||||
@@ -71,17 +71,34 @@
|
||||
<string name="sort_by_expiry">মেয়াদ শেষ করে সাজান</string>
|
||||
<string name="reverse">বিপরীত</string>
|
||||
<string name="sort_by">ক্রমানুসার</string>
|
||||
<string name="noCardExistsError">কোন কার্ড নেই ত্রুটি</string>
|
||||
<string name="noCardExistsError">কার্ডটি পাওয়া যায়নি</string>
|
||||
<string name="noStoreError">স্টোরেজ ত্রুটি নেই</string>
|
||||
<string name="card_ids_copied">কার্ড আইডি কপি করা হয়েছে</string>
|
||||
<string name="card_ids_copied">আইডি কপি করা হয়েছে</string>
|
||||
<string name="noCardsMessage">কোন কার্ড বার্তা নেই</string>
|
||||
<string name="addCardTitle">কার্ডের শিরোনাম যোগ করুন</string>
|
||||
<string name="editCardTitle">কার্ডের শিরোনাম সম্পাদনা করুন</string>
|
||||
<string name="sendLabel">লেবেল পাঠান</string>
|
||||
<string name="sendLabel">পাঠান…</string>
|
||||
<string name="share">ভাগ</string>
|
||||
<string name="copy_to_clipboard">নকল করুন ক্লিপবোর্ড এ</string>
|
||||
<string name="deleteConfirmation">নিশ্চিতকরণ মুছে দিন</string>
|
||||
<string name="confirm">নিশ্চিত করুন</string>
|
||||
<string name="delete">মুছে ফেলুন</string>
|
||||
<string name="edit">সম্পাদনা</string>
|
||||
<string name="action_search">খুঁজুন</string>
|
||||
<string name="card">কার্ড</string>
|
||||
<string name="currency">মুদ্রা</string>
|
||||
<string name="cardId">কার্ড আইডি</string>
|
||||
<string name="noBarcode">বারকোড নেই</string>
|
||||
<string name="deleteTitle">কার্ড ডিলিট করুন</string>
|
||||
<string name="ok">ঠিক আছে</string>
|
||||
<string name="about">সম্পর্কিত</string>
|
||||
<string name="debug_version_fmt">সংস্করণ:
|
||||
\n<xliff:g id="version">
|
||||
\n%s</xliff:g></string>
|
||||
<string name="importOptionApplicationButton">অন্য অ্যাপ ব্যাবহার করুন</string>
|
||||
<string name="moveUp">উপরে উঠান</string>
|
||||
<string name="moveDown">নিচে নামান</string>
|
||||
<string name="barcode">বারকোড</string>
|
||||
<string name="expiryDate">মেয়াদোত্তীর্ণ তারিখ</string>
|
||||
<string name="noBarcodeFound">কোনো বারকোড পাওয়া যায়নি</string>
|
||||
</resources>
|
||||
55
app/src/main/res/values-bn/strings.xml
Normal file
55
app/src/main/res/values-bn/strings.xml
Normal file
@@ -0,0 +1,55 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="settings_locale">ভাষা</string>
|
||||
<string name="action_search">খুঁজুন</string>
|
||||
<string name="settings_pink_theme">গুলাপি</string>
|
||||
<string name="settings_blue_theme">নীল</string>
|
||||
<string name="settings_green_theme">সবুজ</string>
|
||||
<string name="settings_brown_theme">বাদামি</string>
|
||||
<string name="save">সংরক্ষণ</string>
|
||||
<string name="cardId">কার্ড আইডি</string>
|
||||
<string name="barcodeType">বারকোডের ধরন</string>
|
||||
<string name="about">সম্পর্কিত</string>
|
||||
<string name="card">কার্ড</string>
|
||||
<string name="yes">হ্যাঁ</string>
|
||||
<string name="settings_grey_theme">ধূসর</string>
|
||||
<string name="ok">ঠিক আছে</string>
|
||||
<string name="sendLabel">পাঠান…</string>
|
||||
<string name="sort_by_name">নাম</string>
|
||||
<string name="previousCard">পূর্ববর্তী</string>
|
||||
<string name="all">সকল</string>
|
||||
<string name="barcode">বারকোড</string>
|
||||
<string name="never">কখনো না</string>
|
||||
<string name="currency">মুদ্রা</string>
|
||||
<string name="settings_violet_theme">বেগুনি</string>
|
||||
<string name="no">না</string>
|
||||
<string name="nextCard">পরবর্তী</string>
|
||||
<string name="action_add">যুক্ত করুন</string>
|
||||
<string name="noGiftCardsGroup">কিছু কার্ড তৈরি করুন এবং তারপর সেগুলিকে এখানে গ্রুপে বরাদ্দ করুন।</string>
|
||||
<string name="noMatchingGiftCards">কোন ফলাফল নেই. আপনার অনুসন্ধান পরিবর্তন করার চেষ্টা করুন.</string>
|
||||
<string name="storeName">নাম</string>
|
||||
<string name="note">বিঃদ্রঃ</string>
|
||||
<string name="star">ফেভারিটে যোগ করুন</string>
|
||||
<string name="barcodeNoBarcode">কোন বারকোড নেই</string>
|
||||
<string name="noBarcode">বারকোড নেই</string>
|
||||
<string name="unstar">পছন্দের তালিকা থেকে অপসারণ</string>
|
||||
<string name="cancel">বাতিল করুন</string>
|
||||
<string name="edit">সম্পাদনা করুন</string>
|
||||
<string name="delete">মুছে ফেলা</string>
|
||||
<string name="confirm">নিশ্চিত করুন</string>
|
||||
<string name="deleteConfirmation">এই কার্ডটি স্থায়ীভাবে মুছবেন\?</string>
|
||||
<plurals name="deleteCardsConfirmation">
|
||||
<item quantity="one">এই <xliff:g>%d</xliff:g> কার্ডটি স্থায়ীভাবে মুছবেন\?</item>
|
||||
<item quantity="other">এই <xliff:g>%d</xliff:g> কার্ডগুলিকে স্থায়ীভাবে মুছবেন\?</item>
|
||||
</plurals>
|
||||
<string name="copy_to_clipboard">ক্লিপবোর্ডে আইডি কপি করুন</string>
|
||||
<string name="share">শেয়ার করুন</string>
|
||||
<string name="editCardTitle">কার্ড সম্পাদনা করুন</string>
|
||||
<string name="addCardTitle">কার্ড যোগ করুন</string>
|
||||
<string name="scanCardBarcode">বারকোড স্ক্যান করুন</string>
|
||||
<plurals name="deleteCardsTitle">
|
||||
<item quantity="one"><xliff:g>%d</xliff:g> কার্ড মুছুন</item>
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> কার্ডগুলো মুছুন</item>
|
||||
</plurals>
|
||||
<string name="deleteTitle">কার্ড মুছুন</string>
|
||||
</resources>
|
||||
@@ -4,11 +4,11 @@
|
||||
<string name="cancel">Odustani</string>
|
||||
<string name="unstar">Ukloni sve omiljene</string>
|
||||
<string name="star">Omiljene</string>
|
||||
<string name="barcodeNoBarcode">Ova kartica nema barkode</string>
|
||||
<string name="barcodeNoBarcode">Ne postoji barkod</string>
|
||||
<string name="barcodeType">Barcode tip</string>
|
||||
<string name="note">Bilježnica</string>
|
||||
<string name="storeName">Ime</string>
|
||||
<string name="noMatchingGiftCards">Nisam našao ništa. Pokušaj promijeniti pretragu.</string>
|
||||
<string name="noMatchingGiftCards">Nema rezultata. Pokušaj promijeniti pretragu.</string>
|
||||
<string name="noGiftCards">Kliknite + Plus dugme da dodate kartu ili uvozite nešto iz menija prvo.</string>
|
||||
<string name="action_add">Dodaj</string>
|
||||
<string name="all">Sve</string>
|
||||
@@ -71,9 +71,9 @@
|
||||
<string name="sort_by_expiry">Sajam</string>
|
||||
<string name="reverse">Rikverc</string>
|
||||
<string name="sort_by">Sortiraj</string>
|
||||
<string name="noCardExistsError">Nisam mogao pronaći karticu</string>
|
||||
<string name="noCardExistsError">Nisam mogao pronaći tu karticu</string>
|
||||
<string name="noStoreError">Nije uneseno ime</string>
|
||||
<string name="card_ids_copied">Kopiran ID kartice(s)</string>
|
||||
<string name="card_ids_copied">Kopiran ID/ovi</string>
|
||||
<string name="noCardsMessage">Dodaj prvo kartu</string>
|
||||
<string name="addCardTitle">Dodaj Kartu</string>
|
||||
<string name="editCardTitle">Izmijeni Karticu</string>
|
||||
@@ -84,4 +84,33 @@
|
||||
<string name="confirm">Potvrdi</string>
|
||||
<string name="delete">Obriši</string>
|
||||
<string name="edit">Izmijeni</string>
|
||||
<string name="action_search">Traži</string>
|
||||
<string name="ok">OK</string>
|
||||
<string name="cardId">ID kartice</string>
|
||||
<string name="exportFailed">Nisam uspio izvršiti izvoz</string>
|
||||
<string name="app_copyright_old">Bazirano na Loyalty Card privjesku
|
||||
\ncopyright © 2016-2020 Branden Archer</string>
|
||||
<string name="noGiftCardsGroup">Kreirajte kartice, i dodajte ih ovdje u grupu.</string>
|
||||
<string name="importExportHelp">Backupovanje vaših podataka omogućava njihov prenos na drugi uređaj.</string>
|
||||
<string name="importSuccessfulTitle">Uvezeno</string>
|
||||
<string name="exportFailedTitle">Izvoz neuspješan</string>
|
||||
<string name="scanCardBarcode">Skeniraj barkod</string>
|
||||
<string name="cardShortcut">Prečica kartice</string>
|
||||
<string name="noCardIdError">ID nije unesen</string>
|
||||
<string name="failedParsingImportUriError">Nisam uspio parsirati URI za uvoz</string>
|
||||
<string name="importExport">Uvoz/Izvoz</string>
|
||||
<string name="exportName">Izvoz</string>
|
||||
<string name="importFailedTitle">Uvoz neuspješan</string>
|
||||
<string name="importFailed">Nisam uspio odraditi uvoz</string>
|
||||
<string name="exportSuccessfulTitle">Izvezeno</string>
|
||||
<string name="importing">Uvozim…</string>
|
||||
<string name="exporting">Izvozim…</string>
|
||||
<string name="exportOptionExplanation">Ovi podaci će biti zapisani na lokaciju po Vašoj želji.</string>
|
||||
<string name="importOptionFilesystemTitle">Uvoz iz file sistema</string>
|
||||
<string name="importOptionFilesystemExplanation">Izaberite specifični file iz file sistema.</string>
|
||||
<string name="importOptionFilesystemButton">Iz file sistema</string>
|
||||
<string name="importOptionApplicationTitle">Koristi drugu aplikaciju</string>
|
||||
<string name="importOptionApplicationExplanation">Koristi bilo koju aplikaciju ili Vašu omiljenu aplikaciju da bi otvorili file.</string>
|
||||
<string name="importOptionApplicationButton">Koristi drugu aplikaciju</string>
|
||||
<string name="about">O</string>
|
||||
</resources>
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
|
||||
<string name="action_add">Přidat</string>
|
||||
<string name="noGiftCards">Klepnutím na tlačítko + plus přidáte kartu nebo ji nejprve importujete z nabídky ⋮.</string>
|
||||
<string name="noGiftCards">Klepněte na tlačítko + plus pro přidání karty nebo naimportujete karty z nabídky ⋮.</string>
|
||||
<string name="storeName">Název</string>
|
||||
<string name="note">Poznámka</string>
|
||||
<string name="cardId">ID karty</string>
|
||||
@@ -29,15 +29,14 @@
|
||||
<string name="exportFailed">Export nelze provést</string>
|
||||
<string name="importing">Importuji…</string>
|
||||
<string name="exporting">Exportuji…</string>
|
||||
<string name="noExternalStoragePermissionError">Udělit oprávnění přístupu k externímu úložišti pro import nebo export dat</string>
|
||||
<string name="importOptionFilesystemTitle">Import ze souborového systému</string>
|
||||
<string name="importOptionFilesystemExplanation">Vyberte konkrétní soubor v úložišti.</string>
|
||||
<string name="importOptionFilesystemButton">Ze souborového systému</string>
|
||||
<string name="importOptionApplicationTitle">Použitím jiné aplikace</string>
|
||||
<string name="importOptionApplicationExplanation">K otevření souboru použijte libovolnou aplikaci nebo svého oblíbeného správce souborů.</string>
|
||||
<string name="importOptionApplicationExplanation">K otevření souboru použijte libovolnou aplikaci nebo svého oblíbeného správce souborů.</string>
|
||||
<string name="importOptionApplicationButton">Použít jinou aplikaci</string>
|
||||
<string name="about">O aplikaci</string>
|
||||
<string name="app_license">Copyleftovaný svobodný software s licencí GPLv3+</string>
|
||||
<string name="app_license">Copyleftovaný svobodný software s licencí GPLv3+</string>
|
||||
<string name="about_title_fmt">O aplikaci <xliff:g id="app_name">%s</xliff:g></string>
|
||||
<string name="debug_version_fmt">Verze: <xliff:g id="version">%s</xliff:g></string>
|
||||
<string name="app_revision_fmt">Informace o revizi: <xliff:g id="app_revision_url">%s</xliff:g></string>
|
||||
@@ -49,20 +48,20 @@
|
||||
<string name="moveBarcodeToTopOfScreen">Přesunout čárový kód do horní části obrazovky</string>
|
||||
<string name="chooseExpiryDate">Zvolte datum vypršení platnosti</string>
|
||||
<string name="never">Nikdy</string>
|
||||
<string name="expiryDate">Platnost</string>
|
||||
<string name="expiryDate">Vypršení platnosti</string>
|
||||
<string name="editBarcode">Upravit čárový kód</string>
|
||||
<string name="barcode">Kód</string>
|
||||
<string name="app_resources">Svobodné zdroje třetích stran: <xliff:g id="app_resources_list">%s</xliff:g></string>
|
||||
<string name="app_libraries">Svobodné knihovny třetích stran: <xliff:g id="app_libraries_list">%s</xliff:g></string>
|
||||
<string name="app_copyright_old">Na základě Loyalty Card Keychain
|
||||
<string name="app_copyright_old">Založeno na Loyalty Card Keychain
|
||||
\ncopyright © 2016–2020 Branden Archer</string>
|
||||
<string name="exportOptionExplanation">Data budou zapsána na místo podle vašeho výběru.</string>
|
||||
<string name="failedParsingImportUriError">Nelze analyzovat import URI</string>
|
||||
<string name="failedParsingImportUriError">Nelze analyzovat importovanou URI</string>
|
||||
<string name="noCardExistsError">Takovou kartu nelze najít</string>
|
||||
<string name="noCardsMessage">Nejprve přidejte kartu</string>
|
||||
<string name="cardShortcut">Zástupce karty</string>
|
||||
<string name="share">Podíl</string>
|
||||
<string name="unstar">Odebrat z oblíbených</string>
|
||||
<string name="share">Sdílet</string>
|
||||
<string name="unstar">Odebrat z oblíbených</string>
|
||||
<string name="star">Přidat do oblíbených</string>
|
||||
<string name="noBarcode">Žádný čárový kód</string>
|
||||
<string name="barcodeNoBarcode">Tato karta nemá čárový kód</string>
|
||||
@@ -72,9 +71,9 @@
|
||||
<string name="thumbnailDescription">Miniatura</string>
|
||||
<string name="card_ids_copied">ID zkopírováno</string>
|
||||
<plurals name="deleteCardsConfirmation">
|
||||
<item quantity="one">Opravdu chcete <xliff:g>%d</xliff:g> kartu trvale odstranit\?</item>
|
||||
<item quantity="few">Opravdu chcete <xliff:g>%d</xliff:g> karty trvale odstranit\?</item>
|
||||
<item quantity="other">Opravdu chcete <xliff:g>%d</xliff:g> karet trvale odstranit\?</item>
|
||||
<item quantity="one">Opravdu chcete trvale odstranit <xliff:g>%d</xliff:g> kartu\?</item>
|
||||
<item quantity="few">Opravdu chcete trvale odstranit <xliff:g>%d</xliff:g> karty\?</item>
|
||||
<item quantity="other">Opravdu chcete trvale odstranit <xliff:g>%d</xliff:g> karet\?</item>
|
||||
</plurals>
|
||||
<plurals name="deleteCardsTitle">
|
||||
<item quantity="one">Odstranit <xliff:g>%d</xliff:g> kartu</item>
|
||||
@@ -82,7 +81,7 @@
|
||||
<item quantity="other">Odstranit <xliff:g>%d</xliff:g> karet</item>
|
||||
</plurals>
|
||||
<string name="importSuccessful">Data importována</string>
|
||||
<string name="intent_import_card_from_url_share_text">Chci s Vámi sdílet kartu</string>
|
||||
<string name="intent_import_card_from_url_share_text">Chci s Vámi sdílet kartu</string>
|
||||
<string name="settings_disable_lockscreen_while_viewing_card">Bránit uzamykání obrazovky</string>
|
||||
<string name="settings_keep_screen_on">Udržovat obrazovku zapnutou</string>
|
||||
<string name="settings_max_font_size_scale">Maximální velikost písma</string>
|
||||
@@ -113,7 +112,7 @@
|
||||
<string name="settings_locale">Jazyk</string>
|
||||
<string name="turn_flashlight_off">Vypnout světlo</string>
|
||||
<string name="turn_flashlight_on">Zapnout světlo</string>
|
||||
<string name="failedGeneratingShareURL">Nepodařilo se vygenerovat sdílenou adresu URL. Nahlaste to prosím.</string>
|
||||
<string name="failedGeneratingShareURL">Nepodařilo se vygenerovat adresu URL pro sdílení. Nahlaste to prosím.</string>
|
||||
<string name="passwordRequired">Zadejte prosím heslo</string>
|
||||
<string name="no">Ne</string>
|
||||
<string name="yes">Ano</string>
|
||||
@@ -133,23 +132,23 @@
|
||||
<string name="barcodeId">Hodnota čárového kódu</string>
|
||||
<string name="setBarcodeId">Nastavení hodnoty čárového kódu</string>
|
||||
<string name="sameAsCardId">Stejné jako ID</string>
|
||||
<string name="importVoucherVaultMessage">Vyberte svůj <i>vouchervault.json</i> exportovaný z Voucher Vault, který chcete importovat.
|
||||
<string name="importVoucherVaultMessage">Vyberte k importu svůj <i>vouchervault.json</i> exportovaný z Voucher Vault.
|
||||
\nVytvoříte jej tak, že nejprve stisknete tlačítko Exportovat v aplikaci Voucher Vault.</string>
|
||||
<string name="importVoucherVault">Import z Voucher Vault</string>
|
||||
<string name="importStocardMessage">Vyberte svůj <i>***-sync.zip</i> exportovaný z aplikace Stocard, který chcete importovat.
|
||||
<string name="importVoucherVault">Import z Voucher Vault</string>
|
||||
<string name="importStocardMessage">Vyberte k importu svůj <i>***-sync.zip</i> exportovaný z aplikace Stocard.
|
||||
\nZískejte ji zasláním e-mailu na adresu support@stocardapp.com s žádostí o export vašich dat.</string>
|
||||
<string name="importStocard">Import ze Stocard</string>
|
||||
<string name="importLoyaltyCardKeychainMessage">Vyberte <i>LoyaltyCardKeychain.csv</i> exportovaný z Loyalty Card Keychain, který chcete importovat.
|
||||
<string name="importLoyaltyCardKeychainMessage">Vyberte k importu <i>LoyaltyCardKeychain.csv</i> exportovaný z Loyalty Card Keychain.
|
||||
\nVytvoříte jej z nabídky Import/Export v Loyalty Card Keychain tak, že tam nejprve stisknete tlačítko Exportovat.</string>
|
||||
<string name="importLoyaltyCardKeychain">Import z Loyalty Card Keychain</string>
|
||||
<string name="importFidmeMessage">Vyberte svůj <i>fidme-export-request-xxxxxx.zip</i> exportovaný z FidMe k importu a poté vyberte typy čárových kódů ručně.
|
||||
<string name="importLoyaltyCardKeychain">Import z Loyalty Card Keychain</string>
|
||||
<string name="importFidmeMessage">Vyberte k importu svůj <i>fidme-export-request-xxxxxx.zip</i> exportovaný z FidMe a poté vyberte typy čárových kódů ručně.
|
||||
\nVytvoříte jej ze svého profilu FidMe tak, že nejprve zvolíte možnost Ochrana dat a poté stisknete tlačítko Extrahovat moje data.</string>
|
||||
<string name="importFidme">Import z FidMe</string>
|
||||
<string name="importFidme">Import z FidMe</string>
|
||||
<string name="importCatimaMessage">Vyberte <i>catima.zip</i> exportovaný z aplikace Catima, který chcete importovat.
|
||||
\nVytvoříte jej z nabídky Import/Export jiné aplikace Catima tak, že v ní nejprve stisknete tlačítko Exportovat.</string>
|
||||
<string name="importCatima">Import z Catima</string>
|
||||
<string name="importCatima">Import z Catima</string>
|
||||
<string name="accept">Přijmout</string>
|
||||
<string name="privacy_policy_popup_text">Oznámení o zásadách ochrany osobních údajů (vyžadováno některými obchody s aplikacemi):
|
||||
<string name="privacy_policy_popup_text">Oznámení o zásadách ochrany osobních údajů (vyžadováno některými obchody s aplikacemi):
|
||||
\n
|
||||
\nNejsou shromažďovány žádné údaje, což může potvrdit každý, protože naše aplikace je svobodný software.</string>
|
||||
<string name="privacy_policy">Zásady soukromí</string>
|
||||
@@ -162,7 +161,7 @@
|
||||
<string name="errorReadingImage">Obrázek se nepodařilo přečíst</string>
|
||||
<string name="noBarcodeFound">Čárový kód nenalezen</string>
|
||||
<string name="groupsList">Skupiny: <xliff:g>%s</xliff:g></string>
|
||||
<string name="addFromImage">Výběr obrázku z galerie</string>
|
||||
<string name="addFromImage">Výběr obrázku z galerie</string>
|
||||
<string name="addManually">Ruční zadání ID</string>
|
||||
<string name="leaveWithoutSaveConfirmation">Ukončit bez uložení\?</string>
|
||||
<string name="leaveWithoutSaveTitle">Ukončit</string>
|
||||
@@ -194,7 +193,7 @@
|
||||
<string name="sort_by_expiry">Vypršení</string>
|
||||
<string name="sort_by_most_recently_used">Naposledy použité</string>
|
||||
<string name="sort_by_name">Název</string>
|
||||
<string name="swipeToSwitchImages">Přejetím nebo dlouhým stisknutím přepínáte obrázky</string>
|
||||
<string name="swipeToSwitchImages">Přejetím přepínáte obrázky, dlouhým stisknutím otevřete obrázek v aplikaci pro galerii</string>
|
||||
<string name="sort">Seřadit</string>
|
||||
<string name="barcodeImageDescriptionWithType">Obrázek čárového kódu <xliff:g>%s</xliff:g></string>
|
||||
<string name="version_history">Historie verzí</string>
|
||||
@@ -204,7 +203,7 @@
|
||||
<string name="on_github">na GitHubu</string>
|
||||
<string name="source_repository">Úložiště zdrojů</string>
|
||||
<string name="license">Licence</string>
|
||||
<string name="help_translate_this_app">Pomozte s překladem této aplikace</string>
|
||||
<string name="help_translate_this_app">Pomozte s překladem této aplikace</string>
|
||||
<string name="report_error">Nahlásit chybu</string>
|
||||
<string name="on_google_play">na Google Play</string>
|
||||
<string name="exportPassword">Nastavení hesla pro ochranu exportu (volitelné)</string>
|
||||
@@ -216,14 +215,14 @@
|
||||
<string name="group_name_is_empty">Název skupiny nemůže být prázdný</string>
|
||||
<string name="group_updated">Skupina aktualizována</string>
|
||||
<string name="editGroup">Úprava skupiny: <xliff:g>%s</xliff:g></string>
|
||||
<string name="noGiftCardsGroup">Zatím nemáte žádné věrnostní karty. Jakmile nějaké přidáte, můžete je přiřadit do skupiny zde.</string>
|
||||
<string name="noGiftCardsGroup">Zatím nemáte žádné věrnostní karty. Jakmile nějaké přidáte, můžete je zde přiřadit do skupiny.</string>
|
||||
<string name="shortcutSelectCard">Vybrat kartu</string>
|
||||
<string name="action_show_details">Zobrazit detaily</string>
|
||||
<string name="action_hide_details">Skrýt detaily</string>
|
||||
<string name="translate_platform">na Weblate</string>
|
||||
<string name="showMoreInfo">Zobrazit podrobnosti</string>
|
||||
<string name="hideMoreInfo">Skrýt podrobnosti</string>
|
||||
<string name="starred">S hvězdičkou</string>
|
||||
<string name="starred">S hvězdičkou</string>
|
||||
<string name="set_scale">Nastavení měřítka</string>
|
||||
<string name="options">Volby</string>
|
||||
<plurals name="balancePoints">
|
||||
@@ -238,7 +237,7 @@
|
||||
<string name="settings_lock_on_opening_orientation">Zamknout podle orientace použité při otevření karty</string>
|
||||
<string name="archive">Archivovat</string>
|
||||
<string name="unarchive">Vrátit z archivu</string>
|
||||
<string name="archiveList">Archivovat</string>
|
||||
<string name="archiveList">Archiv</string>
|
||||
<string name="noUnarchivedCardsMessage">Nejsou žádné karty vrácené z archivu</string>
|
||||
<string name="unarchived">Karta vrácena z archivu</string>
|
||||
<string name="settings_card_orientation">Orientace čárového kódu</string>
|
||||
@@ -260,4 +259,16 @@
|
||||
<item quantity="few">Zobrazit archiv (<xliff:g>%1$d</xliff:g> karty)</item>
|
||||
<item quantity="other">Zobrazit archiv (<xliff:g>%1$d</xliff:g> karet)</item>
|
||||
</plurals>
|
||||
<string name="barcodeLongPressMessage">V aplikaci pro galerii mohou být otevírány pouze obrázky</string>
|
||||
<string name="failedToRetrieveImageFile">Nepodařilo se získat soubor obrázku</string>
|
||||
<string name="cameraPermissionDeniedTitle">Nelze získat přístup k fotoaparátu</string>
|
||||
<string name="importCards">Importovat karty</string>
|
||||
<string name="updateBalance">Aktualizovat zůstatek</string>
|
||||
<string name="currentBalanceSentence">Současný zůstatek: <xliff:g>%s</xliff:g></string>
|
||||
<string name="noCameraPermissionDirectToSystemSetting">Pro skenování čárových kódů bude Catima potřebovat přístup k fotoaparátu. Klepněte zde pro změnu nastavení oprávnění.</string>
|
||||
<string name="updateBalanceTitle">Kolik jste utratil\?</string>
|
||||
<string name="updateBalanceHint">Zadejte výši</string>
|
||||
<string name="newBalanceSentence">Nový zůstatek: <xliff:g>%s</xliff:g></string>
|
||||
<string name="storageReadPermissionRequired">Pro tuto akci je potřeba oprávnění ke čtení úložiště…</string>
|
||||
<string name="cameraPermissionRequired">Pro tuto akci je potřeba oprávnění k přístupu k fotoaparátu…</string>
|
||||
</resources>
|
||||
@@ -67,7 +67,6 @@
|
||||
<string name="importOptionFilesystemExplanation">Vælg en bestemt fil fra filsystemet.</string>
|
||||
<string name="importOptionFilesystemTitle">Import fra filsystem</string>
|
||||
<string name="exportOptionExplanation">Dataene skrives til en placering efter eget valg.</string>
|
||||
<string name="noExternalStoragePermissionError">Giv først tilladelse til ekstern lagring til at importere eller eksportere kort</string>
|
||||
<string name="failedParsingImportUriError">Kunne ikke analysere import-URI\'en</string>
|
||||
<string name="noCardExistsError">Kunne ikke finde kort</string>
|
||||
<string name="noCardIdError">Der er ikke angivet noget kort-ID</string>
|
||||
|
||||
@@ -36,7 +36,6 @@
|
||||
<string name="exportFailed">Export konnte nicht durchgeführt werden</string>
|
||||
<string name="importing">Importiere…</string>
|
||||
<string name="exporting">Exportiere…</string>
|
||||
<string name="noExternalStoragePermissionError">Berechtigung für den externen Speicher zum Importieren oder Exportieren von Daten erteilen</string>
|
||||
<string name="importOptionFilesystemTitle">Importiere aus dem Dateisystem</string>
|
||||
<string name="importOptionFilesystemExplanation">Wähle eine Datei vom Dateisystem aus.</string>
|
||||
<string name="importOptionFilesystemButton">Wähle vom Dateisystem</string>
|
||||
@@ -185,7 +184,7 @@
|
||||
<string name="settings_theme_color">Designfarbe</string>
|
||||
<string name="app_contributors">Ermöglicht durch: <xliff:g id="app_contributors">%s</xliff:g></string>
|
||||
<string name="barcodeImageDescriptionWithType">Bild <xliff:g>%s</xliff:g> Barcode</string>
|
||||
<string name="swipeToSwitchImages">Wischen oder langes Drücken zum Wechseln der Bilder</string>
|
||||
<string name="swipeToSwitchImages">Wischen zum Wechseln der Bilder, Halten zum Öffnen des Bildes in der Galerie</string>
|
||||
<string name="sort_by">Sortieren nach</string>
|
||||
<string name="sort_by_balance">Kontostand</string>
|
||||
<string name="sort_by_expiry">Ablaufdatum</string>
|
||||
@@ -253,4 +252,14 @@
|
||||
<item quantity="other">Archiv ansehen (<xliff:g>%1$d</xliff:g> Karten)</item>
|
||||
</plurals>
|
||||
<string name="welcome">Willkommen bei Catima</string>
|
||||
<string name="barcodeLongPressMessage">In der Galerie können nur Bilder geöffnet werden</string>
|
||||
<string name="failedToRetrieveImageFile">Bilddatei konnte nicht abgerufen werden</string>
|
||||
<string name="updateBalanceTitle">Wie viel haben Sie ausgegeben\?</string>
|
||||
<string name="cameraPermissionDeniedTitle">Kein Zugriff auf die Kamera möglich</string>
|
||||
<string name="noCameraPermissionDirectToSystemSetting">Um Strichcodes zu scannen, benötigt Catima Zugriff auf Ihre Kamera. Tippen Sie hier, um Ihre Berechtigungseinstellungen zu ändern.</string>
|
||||
<string name="updateBalanceHint">Betrag eingeben</string>
|
||||
<string name="importCards">Karten importieren</string>
|
||||
<string name="currentBalanceSentence">Aktuelles Guthaben: <xliff:g>%s</xliff:g></string>
|
||||
<string name="newBalanceSentence">Neues Guthaben: <xliff:g>%s</xliff:g></string>
|
||||
<string name="updateBalance">Guthaben aktualisieren</string>
|
||||
</resources>
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
|
||||
<string name="action_add">Προσθήκη</string>
|
||||
<string name="noGiftCards">Κάντε κλικ στο + κουμπί για να προσθέσετε μία κάρτα ή εισάγετε κάρτες από το ⋮ μενού.</string>
|
||||
<string name="noGiftCards">Κάντε κλικ στο + κουμπί για να προσθέσετε μία κάρτα ή προσθέστε από το ⋮ μενού.</string>
|
||||
<string name="storeName">Όνομα</string>
|
||||
<string name="note">Σημείωση</string>
|
||||
<string name="cardId">Κωδικός Κάρτας</string>
|
||||
@@ -32,7 +32,6 @@
|
||||
<string name="exportFailed">Δεν ήταν δυνατή η εξαγωγή</string>
|
||||
<string name="importing">Γίνεται εισαγωγή του…</string>
|
||||
<string name="exporting">Γίνεται εξαγωγή του…</string>
|
||||
<string name="noExternalStoragePermissionError">Εγκρίνετε την άδεια εξωτερικής αποθήκευσης για να εισάγετε ή εξάγετε δεδομένα</string>
|
||||
<string name="importOptionFilesystemTitle">Εισαγωγή από το σύστημα αρχείων</string>
|
||||
<string name="importOptionFilesystemExplanation">Επιλέξτε ένα συγκεκριμένο αρχείο από το σύστημα αρχείων.</string>
|
||||
<string name="importOptionFilesystemButton">Από το σύστημα αρχείων</string>
|
||||
@@ -85,7 +84,7 @@
|
||||
<string name="expiryDate">Ημερομηνία λήξης</string>
|
||||
<string name="settings_keep_screen_on">Κράτα την οθόνη ανοιχτή</string>
|
||||
<string name="leaveWithoutSaveTitle">Έξοδος</string>
|
||||
<string name="swipeToSwitchImages">Σύρετε ή πατήστε παρατεταμένα για να αλλάξετε εικόνες</string>
|
||||
<string name="swipeToSwitchImages">Σύρετε για να αλλάξετε εικόνες, κρατήστε για να ανοίξετε μια εικόνα στην συλλογή</string>
|
||||
<string name="sort_by_balance">Υπόλοιπο</string>
|
||||
<string name="reverse">... σε αντίθετη σειρά</string>
|
||||
<string name="version_history">Ιστορικό έκδοσης</string>
|
||||
@@ -245,4 +244,22 @@
|
||||
<string name="unarchive">Αφαίρεση από το αρχείο</string>
|
||||
<string name="archiveList">Αρχείο</string>
|
||||
<string name="noUnarchivedCardsMessage">Δεν υπάρχουν αρχειοθετημένες κάρτες</string>
|
||||
<string name="updateBalanceTitle">Πόσα ξοδέψατε;</string>
|
||||
<string name="cameraPermissionDeniedTitle">Αδύνατη η πρόσβαση στην κάμερα</string>
|
||||
<string name="failedToRetrieveImageFile">Αποτυχία ανάκτησης αρχείου εικόνας</string>
|
||||
<string name="previousCard">Προηγούμενη</string>
|
||||
<string name="nextCard">Επόμενη</string>
|
||||
<string name="updateBalance">Ενημέρωση υπολοίπου</string>
|
||||
<string name="barcodeLongPressMessage">Μόνο εικόνες μπορούν να ανοιχτούν στην εφαρμογή φωτογραφιών</string>
|
||||
<string name="noCameraPermissionDirectToSystemSetting">Για να σκανάρετε γραμμοκώδικες, θα χρειαστεί πρόσβαση στην κάμερα από το Catima. Πατήστε εδώ για να δώσετε πρόσβαση.</string>
|
||||
<plurals name="viewArchivedCardsWithCount">
|
||||
<item quantity="one">Προβολή αρχείου (<xliff:g>%1$d</xliff:g> κάρτας)</item>
|
||||
<item quantity="other">Προβολή αρχείου (<xliff:g>%1$d</xliff:g> καρτών)</item>
|
||||
</plurals>
|
||||
<string name="importCards">Εισαγωγή καρτών</string>
|
||||
<string name="updateBalanceHint">Εισάγετε ποσό</string>
|
||||
<string name="currentBalanceSentence">Τωρινό υπόλοιπο <xliff:g>%s</xliff:g></string>
|
||||
<string name="newBalanceSentence">Νέο υπόλοιπο: <xliff:g>%s</xliff:g></string>
|
||||
<string name="failedToOpenUrl">Εγκαταστήστε έναν περιηγητή πρώτα</string>
|
||||
<string name="welcome">Καλώς ήρθατε στο Catima</string>
|
||||
</resources>
|
||||
@@ -63,7 +63,6 @@
|
||||
<string name="importOptionApplicationTitle">Uzi alian app</string>
|
||||
<string name="importOptionFilesystemExplanation">Elektu specifa dosiero de la dosiersistemo.</string>
|
||||
<string name="exportOptionExplanation">La datumoj estos skribita al loko de via elekto.</string>
|
||||
<string name="noExternalStoragePermissionError">Grant ekstera stokado permeso de importado aŭ eksportado kartoj unua</string>
|
||||
<string name="exportFailed">Ne povis eksporti kartoj</string>
|
||||
<string name="importFailed">Ne povis importi kartoj</string>
|
||||
<string name="importExportHelp">Subtenanta supre vian kartoj permesas vin movi ilin al alia aparato.</string>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
|
||||
<string name="action_add">Añadir</string>
|
||||
<string name="noGiftCards">Pulse el botón «+» para añadir una tarjeta, o importe algunas del menú ⋮.</string>
|
||||
<string name="noGiftCards">Haz clic en el botón + para añadir una tarjeta, o importa desde el menú ⋮.</string>
|
||||
<string name="storeName">Nombre</string>
|
||||
<string name="note">Nota</string>
|
||||
<string name="cardId">ID. de tarjeta</string>
|
||||
@@ -32,7 +32,6 @@
|
||||
<string name="exportFailed">No se han podido exportar</string>
|
||||
<string name="importing">Importando…</string>
|
||||
<string name="exporting">Exportando…</string>
|
||||
<string name="noExternalStoragePermissionError">Otorgar permiso de almacenamiento para importar o exportar datos</string>
|
||||
<string name="importOptionFilesystemTitle">Importar desde el sistema de archivos</string>
|
||||
<string name="importOptionFilesystemExplanation">Elegir un archivo concreto del sistema de archivos.</string>
|
||||
<string name="importOptionFilesystemButton">Desde el sistema de archivos</string>
|
||||
@@ -146,7 +145,7 @@
|
||||
\n
|
||||
\nNINGÚN DATO SE RECOPILA, cualquiera puede confirmar ya que nuestra aplicación es software libre.</string>
|
||||
<string name="privacy_policy">Política de privacidad</string>
|
||||
<string name="app_loyalty_card_keychain">Loyalty Card Keychain</string>
|
||||
<string name="app_loyalty_card_keychain">Llavero con tarjeta de fidelización</string>
|
||||
<string name="chooseImportType">Importar datos de</string>
|
||||
<string name="parsingBalanceFailed"><xliff:g>%s</xliff:g> no tendría un saldo válido.</string>
|
||||
<string name="currency">Moneda</string>
|
||||
@@ -158,8 +157,9 @@
|
||||
<string name="settings_disable_lockscreen_while_viewing_card">Evitar el bloqueo de pantalla</string>
|
||||
<string name="settings_keep_screen_on">Mantener pantalla encendida</string>
|
||||
<plurals name="selectedCardCount">
|
||||
<item quantity="one"><xliff:g>%d</xliff:g> tarjeta seleccionada</item>
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> tarjetas seleccionadas</item>
|
||||
<item quantity="one"><xliff:g>%d</xliff:g> seleccionada</item>
|
||||
<item quantity="many"><xliff:g>%d</xliff:g> seleccionadas</item>
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> seleccionadas</item>
|
||||
</plurals>
|
||||
<string name="deleteTitle">Eliminar la tarjeta</string>
|
||||
<string name="deleteConfirmation">¿Quiere eliminar permanentemente esta tarjeta\?</string>
|
||||
@@ -225,7 +225,7 @@
|
||||
<string name="selectColor">Seleccione el color</string>
|
||||
<string name="setIcon">Establecer icono</string>
|
||||
<string name="sort">Ordenar</string>
|
||||
<string name="swipeToSwitchImages">Desliza el dedo o haz una pulsación larga para cambiar de imagen</string>
|
||||
<string name="swipeToSwitchImages">Desliza para cambiar de imagen, mantén presionado para abrir la imagen en la aplicación de la galería</string>
|
||||
<string name="sort_by">Ordenar por</string>
|
||||
<string name="rate_this_app">Califica esta aplicación</string>
|
||||
<string name="options">Opciones</string>
|
||||
@@ -258,4 +258,17 @@
|
||||
<item quantity="many"><xliff:g>%1$d</xliff:g> tarjetas (archivadas)<xliff:g id="archivedCount">%2$d</xliff:g></item>
|
||||
<item quantity="other"><xliff:g>%1$d</xliff:g> tarjetas (archivadas)<xliff:g id="archivedCount">%2$d</xliff:g></item>
|
||||
</plurals>
|
||||
<string name="starred">Estrellado</string>
|
||||
<string name="failedToRetrieveImageFile">No se pudo recuperar el archivo de imagen</string>
|
||||
<string name="barcodeLongPressMessage">Solo se pueden abrir imágenes en la aplicación de galería</string>
|
||||
<string name="updateBalanceTitle">¿Cuánto has gastado\?</string>
|
||||
<string name="currentBalanceSentence">Saldo actual: <xliff:g>%s</xliff:g></string>
|
||||
<string name="noCameraPermissionDirectToSystemSetting">Para escanear códigos de barras, Catima necesitará acceso a su cámara. Toque aquí para cambiar la configuración de sus permisos.</string>
|
||||
<string name="updateBalanceHint">Introduzca el importe</string>
|
||||
<string name="newBalanceSentence">Nuevo balance: <xliff:g>%s</xliff:g></string>
|
||||
<string name="cameraPermissionDeniedTitle">No se pudo acceder a la cámara</string>
|
||||
<string name="updateBalance">Actualizar el balance</string>
|
||||
<string name="importCards">Importar tarjetas</string>
|
||||
<string name="storageReadPermissionRequired">Se necesita permiso para leer el almacenamiento para esta acción…</string>
|
||||
<string name="cameraPermissionRequired">Se necesita permiso para acceder a la cámara para esta acción…</string>
|
||||
</resources>
|
||||
@@ -1,10 +1,9 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
|
||||
<string name="noExternalStoragePermissionError">Salli käyttöoikeus ulkoisen tallennustilan käyttöön voidaksesi tuoda tai viedä tietoja</string>
|
||||
<string name="no">Ei</string>
|
||||
<string name="yes">Kyllä</string>
|
||||
<string name="updateBarcodeQuestionText">Vaihdoit ID-tunnuksen. Haluatko päivittää myös viivakoodin käyttämään samaa arvoa\?</string>
|
||||
<string name="updateBarcodeQuestionTitle">Päivitä viivakoodin arvo\?</string>
|
||||
<string name="updateBarcodeQuestionTitle">Päivitetäänkö viivakoodin arvo\?</string>
|
||||
<string name="intent_import_card_from_url_share_multiple_text">Haluan jakaa joitain kortteja kanssasi</string>
|
||||
<string name="copy_to_clipboard_multiple_toast">ID-tunnukset kopioitu leikepöydälle</string>
|
||||
<string name="wrongValueForBarcodeType">Arvo ei ole kelvollinen valitulle viivakoodityypille</string>
|
||||
@@ -14,15 +13,15 @@
|
||||
<string name="barcodeId">Viivakoodin arvo</string>
|
||||
<string name="importVoucherVaultMessage">Valitse tuotava <i>vouchervault.json</i>-vienti Voucher Vaultista.
|
||||
\nLuo se painamalla ensin Vie Voucher Vaultissa.</string>
|
||||
<string name="importVoucherVault">Tuo Voucher Vault varmuuskopiotiedostosta</string>
|
||||
<string name="importVoucherVault">Tuo Voucher Vault -varmuuskopiotiedostosta</string>
|
||||
<string name="importLoyaltyCardKeychainMessage">Valitse tuotava <i>LoyaltyCardKeychain.csv</i>-vientitiedostosi Loyalty Card Keychainista.
|
||||
\nTai luo se Loyalty Card Keychainin Import/Export-valikosta painamalla ensin Export (Vie).</string>
|
||||
<string name="importLoyaltyCardKeychain">Tuo Loyalty Card Keychain varmuuskopiotiedostosta</string>
|
||||
<string name="importFidmeMessage">Valitse tuotava <i>fidme-export-request-xxxxxxxx.zip</i>-vientitiedostosi FidMe:stä ja valitse viivakoodityypit manuaalisesti sen jälkeen.
|
||||
\nLuo se FidMe-profiilistasi valitsemalla Tietosuoja ja painamalla ensin Extract my data.</string>
|
||||
<string name="importFidme">Tuo FidMe varmuuskopiotiedostosta</string>
|
||||
<string name="importFidme">Tuo FidMe-varmuuskopiotiedostosta</string>
|
||||
<string name="importCatimaMessage">Valitse tuotava <i>catima.zip</i>-vientitiedostosi Catimasta.
|
||||
\nLuo se Catima-sovelluksen Tuo/Vie-valikosta painamalla siellä ensin Vie.</string>
|
||||
\nLuo se Catima-sovelluksen Tuo/vie-valikosta painamalla siellä ensin Vie.</string>
|
||||
<string name="importCatima">Tuo Catima varmuuskopiotiedostosta</string>
|
||||
<string name="accept">Hyväksy</string>
|
||||
<string name="privacy_policy_popup_text">Tietosuojaseloste (joidenkin sovelluskauppojen vaatimus):
|
||||
@@ -51,18 +50,18 @@
|
||||
<string name="groupsList">Ryhmät: <xliff:g>%s</xliff:g></string>
|
||||
<string name="addFromImage">Valitse kuva galleriasta</string>
|
||||
<string name="addManually">Anna ID-tunnus manuaalisesti</string>
|
||||
<string name="leaveWithoutSaveConfirmation">Poistu tallentamatta\?</string>
|
||||
<string name="leaveWithoutSaveConfirmation">Poistutaanko tallentamatta\?</string>
|
||||
<string name="leaveWithoutSaveTitle">Poistu</string>
|
||||
<string name="moveDown">Siirrä alaspäin</string>
|
||||
<string name="moveUp">Siirrä ylöspäin</string>
|
||||
<string name="failedOpeningFileManager">Asenna ensin tiedostonhallintaohjelma.</string>
|
||||
<string name="deleteConfirmationGroup">Poista ryhmä\?</string>
|
||||
<string name="deleteConfirmationGroup">Poistetaanko ryhmä\?</string>
|
||||
<string name="all">Kaikki</string>
|
||||
<plurals name="groupCardCount">
|
||||
<item quantity="one"><xliff:g>%d</xliff:g> kortti</item>
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> kortit</item>
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> korttia</item>
|
||||
</plurals>
|
||||
<string name="noGroups">Napsauta + plus-painiketta lisätäksesi ryhmät luokittelua varten.</string>
|
||||
<string name="noGroups">Napsauta plus-painiketta (+) lisätäksesi ryhmät luokittelua varten.</string>
|
||||
<string name="groups">Ryhmät</string>
|
||||
<string name="enter_group_name">Anna ryhmän nimi</string>
|
||||
<string name="exportSuccessful">Tiedot viety</string>
|
||||
@@ -78,18 +77,18 @@
|
||||
<string name="settings_theme">Teema</string>
|
||||
<string name="settings_category_title_ui">Käyttöliittymä</string>
|
||||
<string name="settings">Asetukset</string>
|
||||
<string name="starImage">Suosikki tähti</string>
|
||||
<string name="starImage">Suosikkitähti</string>
|
||||
<string name="thumbnailDescription">Pienoiskuva</string>
|
||||
<string name="copy_to_clipboard_toast">ID-tunnus kopioitu leikepöydälle</string>
|
||||
<string name="enterBarcodeInstructions">Syötä ID-tunnus ja valitse sen viivakoodityyppi, tai valitse \"Ei viivakoodia\".</string>
|
||||
<string name="selectBarcodeTitle">Valitse viivakoodi</string>
|
||||
<string name="app_resources">Vapaat kolmannen osapuolen resurssit: <xliff:g id="app_resources_list">%s</xliff:g></string>
|
||||
<string name="app_libraries">Kolmannen osapuolen Libre-kirjastot: <xliff:g id="app_libraries_list">%s</xliff:g></string>
|
||||
<string name="app_libraries">Vapaat kolmannen osapuolen kirjastot: <xliff:g id="app_libraries_list">%s</xliff:g></string>
|
||||
<string name="app_revision_fmt">Muutostiedot: <xliff:g id="app_revision_url">%s</xliff:g></string>
|
||||
<string name="debug_version_fmt">Versio: <xliff:g id="version">%s</xliff:g></string>
|
||||
<string name="about_title_fmt">Tietoja <xliff:g id="app_name">%s</xliff:g></string>
|
||||
<string name="app_license">Copyleft (käyttäjänoikeus) - vapaa ohjelmisto, lisenssi GPLv3+</string>
|
||||
<string name="app_copyright_old">Perustuu Loyalty Card Keychain sovellukseen
|
||||
<string name="app_copyright_old">Perustuu Loyalty Card Keychain -sovellukseen
|
||||
\ntekijänoikeus © 2016–2020 Branden Archer</string>
|
||||
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Tekijänoikeus © 2019–<xliff:g>%d</xliff:g> Sylvia van Os</string>
|
||||
<string name="about">Tietoja</string>
|
||||
@@ -110,7 +109,7 @@
|
||||
<string name="importSuccessfulTitle">Tuonti valmis</string>
|
||||
<string name="importExportHelp">Tietojesi varmuuskopiointi mahdollistaa niiden siirtämisen toiseen laitteeseen.</string>
|
||||
<string name="exportName">Vie</string>
|
||||
<string name="importExport">Tuo/Vie</string>
|
||||
<string name="importExport">Tuo/vie</string>
|
||||
<string name="failedParsingImportUriError">Tuonnin URI: n jäsentäminen epäonnistui</string>
|
||||
<string name="noCardExistsError">Tätä korttia ei löytynyt</string>
|
||||
<string name="noCardIdError">ID-tunnusta ei annettu</string>
|
||||
@@ -139,7 +138,7 @@
|
||||
<string name="note">Lisätieto</string>
|
||||
<string name="storeName">Nimi</string>
|
||||
<string name="noMatchingGiftCards">Ei hakutuloksia, kokeile toisella hakutermillä.</string>
|
||||
<string name="noGiftCards">Lisää kortti napsauttamalla + plus-painiketta, tai mene ⋮ valikkoon tuodaksesi varmuuskopiosta.</string>
|
||||
<string name="noGiftCards">Lisää kortti napsauttamalla plus-painiketta (+), tai mene ⋮-valikkoon tuodaksesi.</string>
|
||||
<string name="action_add">Lisää</string>
|
||||
<string name="action_search">Hae</string>
|
||||
<string name="takePhoto">Ota valokuva</string>
|
||||
@@ -149,32 +148,32 @@
|
||||
<string name="photos">Valokuvat</string>
|
||||
<string name="backImageDescription">Takakuva</string>
|
||||
<string name="frontImageDescription">Etukuva</string>
|
||||
<string name="deleteConfirmation">Poista tämä kortti\?</string>
|
||||
<string name="deleteConfirmation">Poistetaanko tämä kortti\?</string>
|
||||
<string name="deleteTitle">Poista kortti</string>
|
||||
<plurals name="deleteCardsConfirmation">
|
||||
<item quantity="one">Poista tämä <xliff:g>%d</xliff:g> kortti pysyvästi\?</item>
|
||||
<item quantity="other">Poista tämä <xliff:g>%d</xliff:g> kortit pysyvästi\?</item>
|
||||
<item quantity="one">Poistetaanko tämä <xliff:g>%d</xliff:g> kortti pysyvästi\?</item>
|
||||
<item quantity="other">Poistetaanko nämä <xliff:g>%d</xliff:g> korttia pysyvästi\?</item>
|
||||
</plurals>
|
||||
<plurals name="deleteCardsTitle">
|
||||
<item quantity="one">Poista <xliff:g>%d</xliff:g>kortti</item>
|
||||
<item quantity="other">Poista <xliff:g>%d</xliff:g>kortit</item>
|
||||
<item quantity="other">Poista <xliff:g>%d</xliff:g>korttia</item>
|
||||
</plurals>
|
||||
<plurals name="selectedCardCount">
|
||||
<item quantity="one"><xliff:g>%d</xliff:g> valittu</item>
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> valitut</item>
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> valittu</item>
|
||||
</plurals>
|
||||
<string name="importStocard">Tuo Stocardista</string>
|
||||
<string name="importStocardMessage">Valitse tuotava <i>***-sync.zip</i>-vienti Stocardista.
|
||||
\nHanki se lähettämällä sähköpostia osoitteeseen support@stocardapp.com ja pyytämällä tietojesi vientiä.</string>
|
||||
<string name="passwordRequired">Ole hyvä ja syötä salasana</string>
|
||||
<string name="failedGeneratingShareURL">Ei pystynyt luomaan jaettavaa URL-osoitetta. Ilmoita tästä.</string>
|
||||
<string name="turn_flashlight_on">Sytytä taskulamppu</string>
|
||||
<string name="failedGeneratingShareURL">Jaettavaa URL-osoitetta ei voitu luoda. Ilmoita tästä.</string>
|
||||
<string name="turn_flashlight_on">Käytä taskulamppua</string>
|
||||
<string name="turn_flashlight_off">Sammuta salamavalo</string>
|
||||
<string name="app_contributors">Mahdollistanut: <xliff:g id="app_contributors">%s</xliff:g></string>
|
||||
<string name="settings_brown_theme">Ruskea</string>
|
||||
<string name="settings_grey_theme">Harmaa</string>
|
||||
<string name="settings_green_theme">Vihreä</string>
|
||||
<string name="settings_sky_blue_theme">Taivaan sininen</string>
|
||||
<string name="settings_sky_blue_theme">Taivaansininen</string>
|
||||
<string name="settings_blue_theme">Siniset</string>
|
||||
<string name="settings_violet_theme">Violetti</string>
|
||||
<string name="settings_magenta_theme">Magenta</string>
|
||||
@@ -195,7 +194,7 @@
|
||||
</plurals>
|
||||
<string name="settings_oled_dark">Musta tausta tummalle teemalle</string>
|
||||
<string name="setIcon">Aseta kuvake</string>
|
||||
<string name="swipeToSwitchImages">Vaihda kuvia pyyhkäisemällä tai painamalla pitkään</string>
|
||||
<string name="swipeToSwitchImages">Vaihda kuvia pyyhkäisemällä, paina kuvaa pitkään avataksesi galleriasovelluksessa</string>
|
||||
<string name="sort_by_name">Nimi</string>
|
||||
<string name="sort_by_most_recently_used">Viimeksi käytetyt</string>
|
||||
<string name="sort_by_expiry">Viimeinen voimassaoloaika</string>
|
||||
@@ -227,10 +226,10 @@
|
||||
<string name="selectColor">Valitse väri</string>
|
||||
<string name="rate_this_app">Arvostele tämä sovellus</string>
|
||||
<string name="noGiftCardsGroup">Lisää kortteja ja lisää ne ryhmään täällä.</string>
|
||||
<string name="barcodeImageDescriptionWithType">Image <xliff:g>%s</xliff:g> viivakoodi</string>
|
||||
<string name="barcodeImageDescriptionWithType">Kuva <xliff:g>%s</xliff:g> viivakoodi</string>
|
||||
<string name="settings_follow_system_orientation">Seuraa järjestelmää</string>
|
||||
<string name="settings_portrait_orientation">Muotokuva</string>
|
||||
<string name="settings_landscape_orientation">Maisema</string>
|
||||
<string name="settings_portrait_orientation">Pysty</string>
|
||||
<string name="settings_landscape_orientation">Vaaka</string>
|
||||
<string name="unarchived">Kortti on poistettu arkistosta</string>
|
||||
<string name="noUnarchivedCardsMessage">Arkistoimattomia kortteja ei ole olemassa</string>
|
||||
<string name="unarchive">Poista arkistosta</string>
|
||||
@@ -242,7 +241,7 @@
|
||||
<item quantity="one"><xliff:g>%1$d</xliff:g> kortti (<xliff:g id="archivedCount">%2$d</xliff:g> arkistoitu)</item>
|
||||
<item quantity="other"><xliff:g>%1$d</xliff:g> korttia (<xliff:g id="archivedCount">%2$d</xliff:g> arkistoitu)</item>
|
||||
</plurals>
|
||||
<string name="duplicateCard">Duplikaatti</string>
|
||||
<string name="duplicateCard">Kaksoiskappale</string>
|
||||
<string name="previousCard">Edellinen</string>
|
||||
<string name="nextCard">Seuraava</string>
|
||||
<string name="failedToOpenUrl">Asenna ensin verkkoselain</string>
|
||||
@@ -251,4 +250,16 @@
|
||||
<item quantity="one">Näytä arkisto (<xliff:g>%1$d</xliff:g> kortti)</item>
|
||||
<item quantity="other">Näytä arkisto (<xliff:g>%1$d</xliff:g> korttia)</item>
|
||||
</plurals>
|
||||
<string name="updateBalanceTitle">Kuinka paljon kulutit\?</string>
|
||||
<string name="updateBalanceHint">Syötä summa</string>
|
||||
<string name="barcodeLongPressMessage">Vain kuvia on mahdollista avata galleriasovelluksessa</string>
|
||||
<string name="archive">Arkistoi</string>
|
||||
<string name="importCards">Tuo kortteja</string>
|
||||
<string name="failedToRetrieveImageFile">Kuvatiedoston noutaminen epäonnistui</string>
|
||||
<string name="currentBalanceSentence">Nykyinen saldo: <xliff:g>%s</xliff:g></string>
|
||||
<string name="newBalanceSentence">Uusi saldo: <xliff:g>%s</xliff:g></string>
|
||||
<string name="cameraPermissionDeniedTitle">Ei pääsyä kameraan</string>
|
||||
<string name="settings_lock_on_opening_orientation">Lukitse suunta, kun korttia avataan</string>
|
||||
<string name="noCameraPermissionDirectToSystemSetting">Viivakoodien lukeminen vaatii, että Catimalla on käyttöoikeus kameraan. Napauta tästä muuttaaksesi oikeuksia.</string>
|
||||
<string name="updateBalance">Päivitä saldo</string>
|
||||
</resources>
|
||||
@@ -32,7 +32,6 @@
|
||||
<string name="exportFailed">Impossible d’effectuer l’exportation</string>
|
||||
<string name="importing">Import …</string>
|
||||
<string name="exporting">Export …</string>
|
||||
<string name="noExternalStoragePermissionError">Accorder au stockage externe l’autorisation d’importer ou d’exporter des données</string>
|
||||
<string name="importOptionFilesystemTitle">Importer depuis le système de fichiers</string>
|
||||
<string name="importOptionFilesystemExplanation">Choisissez le fichier à importer.</string>
|
||||
<string name="importOptionFilesystemButton">Système de fichiers</string>
|
||||
@@ -189,7 +188,7 @@
|
||||
<string name="app_contributors">Rendu possible par : <xliff:g id="app_contributors">%s</xliff:g></string>
|
||||
<string name="noGroupCards">Ce groupe est vide</string>
|
||||
<string name="barcodeImageDescriptionWithType">Image <xliff:g>%s</xliff:g> code-barres</string>
|
||||
<string name="swipeToSwitchImages">Balayez ou appuyez longuement pour changer d’image</string>
|
||||
<string name="swipeToSwitchImages">Balayez pour changer d’image, maintenez appuyé pour ouvrir l’image dans la galerie</string>
|
||||
<string name="sort">Trier</string>
|
||||
<string name="sort_by">Trier par</string>
|
||||
<string name="reverse">… dans l’ordre inverse</string>
|
||||
@@ -260,4 +259,14 @@
|
||||
<item quantity="other">Voir les archives (<xliff:g>%1$d</xliff:g> cartes)</item>
|
||||
</plurals>
|
||||
<string name="welcome">Bienvenue dans Catima</string>
|
||||
<string name="barcodeLongPressMessage">Seules les images peuvent être ouvertes dans l’application galerie</string>
|
||||
<string name="failedToRetrieveImageFile">Impossible de récupérer le fichier image</string>
|
||||
<string name="currentBalanceSentence">Solde actuel : <xliff:g>%s</xliff:g></string>
|
||||
<string name="updateBalanceHint">Entrez le montant</string>
|
||||
<string name="cameraPermissionDeniedTitle">Impossible d\'accéder à la caméra</string>
|
||||
<string name="noCameraPermissionDirectToSystemSetting">Pour scanner les codes-barres, Catima doit avoir accès à votre caméra. Tapez ici pour modifier vos paramètres d\'autorisation.</string>
|
||||
<string name="updateBalance">Mettre à jour le solde</string>
|
||||
<string name="updateBalanceTitle">Combien avez-vous dépensé \?</string>
|
||||
<string name="newBalanceSentence">Nouveau solde : <xliff:g>%s</xliff:g></string>
|
||||
<string name="importCards">Importer des cartes</string>
|
||||
</resources>
|
||||
153
app/src/main/res/values-hi/strings.xml
Normal file
153
app/src/main/res/values-hi/strings.xml
Normal file
@@ -0,0 +1,153 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
|
||||
<string name="storeName">नाम</string>
|
||||
<string name="note">नोट</string>
|
||||
<string name="cardId">कार्ड आईडी</string>
|
||||
<string name="star">पसंदीदा में जोड़ें</string>
|
||||
<string name="unstar">पसंदीदा से निकाले</string>
|
||||
<string name="cancel">रद्द करना</string>
|
||||
<string name="save">बचाना</string>
|
||||
<string name="delete">मिटाना</string>
|
||||
<string name="deleteConfirmation">इस कार्ड को स्थायी रूप से हटाएं\?</string>
|
||||
<plurals name="deleteCardsConfirmation">
|
||||
<item quantity="one">इस <xliff:g>%d</xliff:g> कार्ड को स्थायी रूप से हटाएं\?</item>
|
||||
<item quantity="other">ये <xliff:g>%d</xliff:g> कार्ड स्थायी रूप से हटाएं\?</item>
|
||||
</plurals>
|
||||
<string name="ok">ठीक</string>
|
||||
<string name="share">बाँटें</string>
|
||||
<string name="sendLabel">भेजें…</string>
|
||||
<string name="editCardTitle">कार्ड संपादित करें</string>
|
||||
<string name="addCardTitle">कार्ड जोड़ें</string>
|
||||
<string name="noCardsMessage">पहले एक कार्ड जोड़ें</string>
|
||||
<string name="card_ids_copied">कॉपी की गई आईडी</string>
|
||||
<string name="noStoreError">कोई नाम दर्ज नहीं</string>
|
||||
<string name="noCardIdError">कोई पहचान पत्र (आईडी दर्ज नहीं) की गई</string>
|
||||
<string name="noCardExistsError">वह कार्ड नहीं मिला</string>
|
||||
<string name="importExport">आयात / निर्यात</string>
|
||||
<string name="exportName">निर्यात</string>
|
||||
<string name="importSuccessfulTitle">आयातित</string>
|
||||
<string name="importFailed">आयात नहीं कर सका</string>
|
||||
<string name="action_search">खोज</string>
|
||||
<string name="noGiftCardsGroup">कुछ कार्ड बनाएँ, और फिर उन्हें यहाँ समूह करें।</string>
|
||||
<string name="noMatchingGiftCards">कोई परिणाम नहीं। अपनी खोज बदलने का प्रयास करें।</string>
|
||||
<string name="deleteTitle">कार्ड हटाएं</string>
|
||||
<plurals name="deleteCardsTitle">
|
||||
<item quantity="one">कार्ड <xliff:g>%d</xliff:g> हटाएं</item>
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> इन कार्डों को हटाएं</item>
|
||||
</plurals>
|
||||
<string name="importFailedTitle">आयात विफल</string>
|
||||
<string name="exportOptionExplanation">डाटा आपके मनचाहे स्थान पर लिखा जाएगा.</string>
|
||||
<string name="importOptionFilesystemExplanation">फाईल सिस्टम से एक फाईल चुनें.</string>
|
||||
<string name="app_copyright_old">लोयलटी कार्ड कीचैंन पर आधारित
|
||||
\nकौपीराईट © 2016–2020 ब्रांडन आर्चर</string>
|
||||
<string name="action_add">जोड़</string>
|
||||
<string name="edit">बदलें</string>
|
||||
<string name="confirm">पक्का करें</string>
|
||||
<string name="failedParsingImportUriError">दी गई URL का विक्ष्लेषण नही हो सका</string>
|
||||
<string name="exportSuccessfulTitle">निर्यात सफल</string>
|
||||
<string name="exportFailedTitle">निर्यात असफल</string>
|
||||
<string name="exportFailed">निर्यात नही हो सका</string>
|
||||
<string name="importing">आयात चल रहा है…</string>
|
||||
<string name="exporting">निर्यात चल रहा है…</string>
|
||||
<string name="importOptionFilesystemTitle">फाईल सिस्टम से आयात करें</string>
|
||||
<string name="importOptionFilesystemButton">फाईल सिस्टम से</string>
|
||||
<string name="importOptionApplicationTitle">दूसरा एप्प इस्तमाल करें</string>
|
||||
<string name="importOptionApplicationButton">दूसरा एप्प इस्तमाल करें</string>
|
||||
<string name="about">बारे में</string>
|
||||
<string name="starImage">पसंदीदा स्टार</string>
|
||||
<string name="settings_light_theme">उजालित</string>
|
||||
<string name="settings_dark_theme">अँधेरा</string>
|
||||
<string name="settings">व्यवस्थाएं (सेटिंगें)</string>
|
||||
<string name="settings_system_theme">तंत्र</string>
|
||||
<string name="settings_card_orientation">बारकोड का अनुकूलन(ओरिएंटेशन)</string>
|
||||
<string name="settings_landscape_orientation">आयत रूप(लैंडस्केप)</string>
|
||||
<string name="settings_follow_system_orientation">सिस्टम का पालन करें</string>
|
||||
<string name="settings_portrait_orientation">पोट्रैट</string>
|
||||
<string name="settings_max_font_size_scale">अक्षर का अधिकतम नाप</string>
|
||||
<string name="settings_display_barcode_max_brightness">बारकोड का दृश्य उजालित(ब्राइट) करें</string>
|
||||
<string name="settings_keep_screen_on">स्क्रीन को चालू रखें</string>
|
||||
<string name="cameraPermissionDeniedTitle">हम कैमरा तक पहुँच नहीं सकते</string>
|
||||
<string name="noCameraPermissionDirectToSystemSetting">बारकोड स्कैन करने के लिए,को आपके कैमरा का इस्तेमाल करना होगा। इजाज़त कि व्यवस्था (सेटिंग) बदलने के लिए यहाँ दबायें।</string>
|
||||
<string name="importOptionApplicationExplanation">फाइल खोलने के लिए कोई भी ऐप या अपना पसंदिता फाइल मैनेजर का इस्तेमाल करे।</string>
|
||||
<string name="settings_category_title_ui">उपयोक्ता अंतरापृष्ठ (यूजर इंटरफ़ेस)</string>
|
||||
<string name="settings_theme">विषय</string>
|
||||
<string name="barcodeType">बारकोड का प्रकार</string>
|
||||
<string name="barcodeNoBarcode">कोई बारकोड नहीं है</string>
|
||||
<string name="noBarcode">बारकोड नहीं है</string>
|
||||
<string name="copy_to_clipboard">पहचान पत्र(आई डी) को क्लिपबोर्ड में कॉपी करें</string>
|
||||
<string name="scanCardBarcode">बारकोड स्कैन करें</string>
|
||||
<string name="cardShortcut">कार्ड का सरल उपाय (शॉर्टकट)</string>
|
||||
<string name="noGiftCards">\"+\" बटन दबाके कार्ड जोड़ें वा मेन्यू से कार्ड आयात करें</string>
|
||||
<string name="importExportHelp">तथ्य (डाटा) को बैकअप करना हमें उसे दूसरे डिवाइस में भेजने देता है|</string>
|
||||
<string name="barcodeImageDescriptionWithType"><xliff:g>%s</xliff:g> का बारकोड</string>
|
||||
<string name="settings_disable_lockscreen_while_viewing_card">स्क्रीन को लॉक होने से रोकें</string>
|
||||
<string name="enterBarcodeInstructions">अपनी आई डी लिखें तथा या तो बारकोड प्रकार चुनें, या फिर कोई बारकोड नहीं है चुनें|</string>
|
||||
<string name="settings_lock_on_opening_orientation">कार्ड खोलते समय प्रयोग करि गयी अवस्था को प्रतिबन्ध करें</string>
|
||||
<string name="intent_import_card_from_url_share_text">मैं तुम्हें एक कार्ड भेजना चाहता हूँ</string>
|
||||
<string name="selectBarcodeTitle">बारकोड चुनें</string>
|
||||
<string name="thumbnailDescription">छोटा चित्र</string>
|
||||
<string name="noGroups">+ दबा कर समूहों को भागीकरण के लिए चुनें|</string>
|
||||
<string name="sameAsCardId">आई डी से निरंतर</string>
|
||||
<string name="intent_import_card_from_url_share_multiple_text">में तुम्हें कुछ कार्ड्स भेजना चाहता हूँ</string>
|
||||
<string name="importSuccessful">जानकारी प्राप्त हुई</string>
|
||||
<string name="enter_group_name">समूह का नाम लिखें</string>
|
||||
<string name="group_edit">समूह बदलें</string>
|
||||
<string name="noGroupCards">यह समूह खाली है</string>
|
||||
<string name="group_name_already_in_use">समूह का नाम पहले ही प्रयोग में है</string>
|
||||
<string name="group_name_is_empty">समूह का नाम खाली नहीं हो सकता</string>
|
||||
<string name="all">सब</string>
|
||||
<string name="deleteConfirmationGroup">समूह को मिटा दिया जाए\?</string>
|
||||
<string name="moveUp">ऊपर की और बढ़ें</string>
|
||||
<string name="moveDown">नीचे की और बढ़ें</string>
|
||||
<string name="leaveWithoutSaveTitle">निकास करें</string>
|
||||
<string name="addFromImage">गैलरी से चित्र चुनें</string>
|
||||
<string name="card">कार्ड</string>
|
||||
<string name="barcode">बारकोड</string>
|
||||
<string name="editBarcode">बारकोड में बदलाव करें</string>
|
||||
<string name="expiryDate">समाप्ति दिन</string>
|
||||
<string name="never">कभी नहीं</string>
|
||||
<string name="chooseExpiryDate">समाप्ति दिन चुनें</string>
|
||||
<string name="moveBarcodeToTopOfScreen">बार कोड को स्क्रीन के ऊपरी भाग पर लाएं</string>
|
||||
<string name="moveBarcodeToCenterOfScreen">बार कोड को स्क्रीन के बीच में लाएं</string>
|
||||
<string name="noBarcodeFound">कोई बारकोड नहीं पाया गया</string>
|
||||
<string name="errorReadingImage">चित्र को पढ़ना संभव नहीं हुआ</string>
|
||||
<string name="balance">संतुलन</string>
|
||||
<string name="currency">मुद्रा</string>
|
||||
<string name="accept">स्वीकार</string>
|
||||
<string name="exportSuccessful">डेटा निर्यात किया गया</string>
|
||||
<string name="groupsList">समूह: <xliff:g>%s</xliff:g></string>
|
||||
<plurals name="balancePoints">
|
||||
<item quantity="one"><xliff:g>%s</xliff:g> अंक</item>
|
||||
<item quantity="other"><xliff:g>%s</xliff:g> अंक</item>
|
||||
</plurals>
|
||||
<string name="privacy_policy_popup_text">निजता नीति नोटिस (कुछ ऐप स्टोर के लिए आवश्यक):
|
||||
\n
|
||||
\nकोई भी डेटा एकत्र नहीं किया जाता है, जिसकी पुष्टि कोई भी कर सकता है क्योंकि हमारा ऐप मुफ्त सॉफ्टवेयर है।</string>
|
||||
<string name="importCatimaMessage">आयात करने के लिए, <i>catima.zip</i> फाइल को चुने जो की Catima से निर्यात किया गया था.
|
||||
\nदूसरे Catima ऍप के आयात/निर्यात मेनू से निर्यात बटन दबाकर, पहले catima.zip फाइल को बनाये.</string>
|
||||
<plurals name="selectedCardCount">
|
||||
<item quantity="one"><xliff:g>%d</xliff:g> चयनित</item>
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> चयनित.</item>
|
||||
</plurals>
|
||||
<string name="groups">समूहों</string>
|
||||
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">कॉपीराइट © 2019–<xliff:g>%d</xliff:g> Sylvia van Os</string>
|
||||
<plurals name="groupCardCount">
|
||||
<item quantity="one"><xliff:g>%d</xliff:g> कार्ड</item>
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> कार्डों</item>
|
||||
</plurals>
|
||||
<string name="group_updated">समूह अपडेट किया गया</string>
|
||||
<string name="failedOpeningFileManager">पहले एक फाइल मैनेजर इनस्टॉल करें.</string>
|
||||
<string name="leaveWithoutSaveConfirmation">बिना सुरक्षित किये छोड़े\?</string>
|
||||
<string name="addManually">मैन्युअली आई डी दर्ज करें</string>
|
||||
<string name="editGroup">समूह संपादन: <xliff:g>%s</xliff:g></string>
|
||||
<string name="points">अंक</string>
|
||||
<string name="parsingBalanceFailed"><xliff:g>%s</xliff:g> एक वैध शेष राशि नहीं है.</string>
|
||||
<string name="chooseImportType">यहाँ से डेटा का आयात करें</string>
|
||||
<string name="privacy_policy">निजता नीति</string>
|
||||
<string name="importCatima">कैटिमा से आयात करें</string>
|
||||
<string name="app_license">कॉपीलेफ्ट लिबर सॉफ्टवेयर, GPLv3+ लाइसेंस प्राप्त</string>
|
||||
<string name="about_title_fmt"><xliff:g id="app_name">%s</xliff:g> के बारे में</string>
|
||||
<string name="debug_version_fmt">संस्करण: <xliff:g id="version">%s</xliff:g></string>
|
||||
<string name="app_revision_fmt"><xliff:g id="app_revision_url">%s</xliff:g> संशोधन के बारे में</string>
|
||||
<string name="copy_to_clipboard_toast">आई डी क्लिपबोर्ड पर कॉपी किया गया</string>
|
||||
</resources>
|
||||
@@ -22,7 +22,7 @@
|
||||
<string name="action_add">Dodaj</string>
|
||||
<string name="storeName">Ime</string>
|
||||
<string name="note">Napomena</string>
|
||||
<string name="noMatchingGiftCards">Ništa nisam našao. Pokušajte promijeniti pretraživanje.</string>
|
||||
<string name="noMatchingGiftCards">Nema rezultata. Pokušajte promijeniti pretraživanje.</string>
|
||||
<string name="cardId">ID kartice</string>
|
||||
<string name="barcodeType">Vrsta crtičnog koda</string>
|
||||
<string name="barcodeNoBarcode">Na ovoj kartici nema crtičnog koda</string>
|
||||
@@ -44,7 +44,6 @@
|
||||
<string name="exportOptionExplanation">Podaci će biti zabilježeni na odabranom mjestu.</string>
|
||||
<string name="exportFailedTitle">Izvoz nije uspio</string>
|
||||
<string name="exporting">Opskrba…</string>
|
||||
<string name="noExternalStoragePermissionError">Najprije odobrite dopuštenje za vanjsku pohranu za uvoz ili izvoz kartica</string>
|
||||
<string name="importOptionFilesystemExplanation">Odaberite određenu datoteku iz datotečnog sustava.</string>
|
||||
<string name="importOptionApplicationTitle">Koristite drugu aplikaciju</string>
|
||||
<string name="settings">Postavke</string>
|
||||
@@ -80,4 +79,5 @@
|
||||
<string name="leaveWithoutSaveTitle">Izlaz</string>
|
||||
<string name="card">Karta</string>
|
||||
<string name="leaveWithoutSaveConfirmation">Otići bez očuvanja\?</string>
|
||||
<string name="noGiftCardsGroup">Izradite neke kartice, a zatim ih dodijelite grupi ovdje.</string>
|
||||
</resources>
|
||||
@@ -1,11 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
|
||||
<string name="noGiftCards">Nyomja meg a + jelet a kártya hozzáadásához, vagy importáljon a ⋮ menüvel.</string>
|
||||
<string name="noGiftCards">Kattintson a + plusz gombra egy kártya hozzáadásához, vagy importáljon a ⋮ menüből.</string>
|
||||
<string name="action_add">Hozzáadás</string>
|
||||
<string name="action_search">Keresés</string>
|
||||
<plurals name="selectedCardCount">
|
||||
<item quantity="one"><xliff:g>%d</xliff:g> kiválasztva</item>
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> kiválasztva</item>
|
||||
<item quantity="one"><xliff:g>%d</xliff:g> kiválasztott</item>
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> kiválasztottak</item>
|
||||
</plurals>
|
||||
<string name="noCardsMessage">Először adjon hozzá egy kártyát</string>
|
||||
<string name="noGiftCardsGroup">Hozzon létre kártyákat, és rendelje hozzá a megfelelő csoporthoz.</string>
|
||||
@@ -24,8 +24,8 @@
|
||||
<string name="delete">Törlés</string>
|
||||
<string name="confirm">Alkalmaz</string>
|
||||
<plurals name="deleteCardsTitle">
|
||||
<item quantity="one"><xliff:g>%d</xliff:g> törlése</item>
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> törlése</item>
|
||||
<item quantity="one">Törölje az <xliff:g>%d</xliff:g> kártyát</item>
|
||||
<item quantity="other">Törölje az <xliff:g>%d</xliff:g> kártyákat</item>
|
||||
</plurals>
|
||||
<string name="deleteConfirmation">Véglegesen törli a kártyát\?</string>
|
||||
<string name="ok">Rendben</string>
|
||||
@@ -81,7 +81,6 @@
|
||||
<string name="exportFailed">Exportálás sikertelen</string>
|
||||
<string name="importing">Importálás…</string>
|
||||
<string name="exporting">Exportálás…</string>
|
||||
<string name="noExternalStoragePermissionError">Külső háttértárhoz való hozzáférés engedélyezése adat import vagy export miatt</string>
|
||||
<string name="exportOptionExplanation">Az adatokat a kiválasztott helyre fogjuk menteni.</string>
|
||||
<string name="importOptionFilesystemTitle">Importálás fájlrendszerből</string>
|
||||
<string name="importOptionFilesystemButton">A fájlrendszerből</string>
|
||||
@@ -137,7 +136,7 @@
|
||||
<string name="currency">Valuta</string>
|
||||
<string name="points">Pontok</string>
|
||||
<string name="parsingBalanceFailed">A <xliff:g>%s</xliff:g> nem tűnik valós egyenlegnek.</string>
|
||||
<string name="app_loyalty_card_keychain">Loyalty Card Keychain</string>
|
||||
<string name="app_loyalty_card_keychain">Hűségkártya kulcstartó</string>
|
||||
<string name="privacy_policy">Adatvédelmi Szabályzat</string>
|
||||
<string name="accept">Elfogad</string>
|
||||
<string name="importCatima">Importálás Catimából</string>
|
||||
@@ -179,7 +178,7 @@
|
||||
<string name="app_contributors">Lehetővé tette: <xliff:g id="app_contributors">%s</xliff:g></string>
|
||||
<string name="showMoreInfo">Infó mutatása</string>
|
||||
<string name="hideMoreInfo">Infó elrejtése</string>
|
||||
<string name="swipeToSwitchImages">Húzza oldalra vagy tartsa nyomva a kép megváltoztatásáért</string>
|
||||
<string name="swipeToSwitchImages">Csúsztassa ujját a képek váltásához, tartsa lenyomva a kép megnyitásához a Galéria alkalmazásban</string>
|
||||
<string name="sort_by_balance">Egyenleg</string>
|
||||
<string name="reverse">...fordított sorrendben</string>
|
||||
<string name="sort_by">Rendezés mint</string>
|
||||
@@ -200,7 +199,7 @@
|
||||
</plurals>
|
||||
<plurals name="balancePoints">
|
||||
<item quantity="one"><xliff:g>%s</xliff:g> pont</item>
|
||||
<item quantity="other"><xliff:g>%s</xliff:g> pont</item>
|
||||
<item quantity="other"><xliff:g>%s</xliff:g> pontok</item>
|
||||
</plurals>
|
||||
<string name="chooseImportType">Adat importálása innen</string>
|
||||
<string name="thumbnailDescription">Előkép</string>
|
||||
@@ -247,4 +246,20 @@
|
||||
<string name="archived">Kártya archiválása</string>
|
||||
<string name="archiveList">Archivál</string>
|
||||
<string name="duplicateCard">Másolat</string>
|
||||
<string name="currentBalanceSentence">Jelenlegi egyenleg: <xliff:g>%s</xliff:g></string>
|
||||
<string name="updateBalanceHint">Adja meg az összeget</string>
|
||||
<string name="importCards">Kártyák importálása</string>
|
||||
<string name="updateBalanceTitle">Mennyit költöttél\?</string>
|
||||
<string name="newBalanceSentence">Új egyenleg: <xliff:g>%s</xliff:g></string>
|
||||
<string name="cameraPermissionDeniedTitle">Nem sikerült hozzáférni a kamerához</string>
|
||||
<string name="failedToRetrieveImageFile">Nem sikerült lekérni a képfájlt</string>
|
||||
<string name="barcodeLongPressMessage">Csak képek nyithatók meg a galéria alkalmazásban</string>
|
||||
<string name="unarchived">Archiválatlan kártya</string>
|
||||
<string name="welcome">Üdvözöljük Catimában</string>
|
||||
<plurals name="viewArchivedCardsWithCount">
|
||||
<item quantity="one">Archívum megtekintése (<xliff:g>%1$d</xliff:g> kártya)</item>
|
||||
<item quantity="other">Archívum megtekintése (<xliff:g>%1$d</xliff:g> kártyák)</item>
|
||||
</plurals>
|
||||
<string name="updateBalance">Egyenleg frissítése</string>
|
||||
<string name="noCameraPermissionDirectToSystemSetting">A vonalkódok beolvasásához a Catimának hozzá kell férnie a kamerához. Koppintson ide az engedélybeállítások módosításához.</string>
|
||||
</resources>
|
||||
@@ -7,8 +7,8 @@
|
||||
<string name="edit">Ubah</string>
|
||||
<string name="save">Simpan</string>
|
||||
<string name="deleteTitle">Hapus kartu</string>
|
||||
<string name="cardId">Kartu ID</string>
|
||||
<string name="barcodeType">Tipe barcode</string>
|
||||
<string name="cardId">ID Kartu</string>
|
||||
<string name="barcodeType">Jenis barcode</string>
|
||||
<string name="star">Tambahkan ke favorit</string>
|
||||
<string name="unstar">Hapus dari favorit</string>
|
||||
<string name="action_add">Tambah</string>
|
||||
@@ -30,7 +30,7 @@
|
||||
<string name="scanCardBarcode">Pindai Barcode</string>
|
||||
<string name="barcodeNoBarcode">Tidak ada barcode</string>
|
||||
<string name="cancel">Batalkan</string>
|
||||
<string name="importExport">Import/Ekspor</string>
|
||||
<string name="importExport">Impor/Ekspor</string>
|
||||
<string name="settings_category_title_ui">Tampilan Pengguna</string>
|
||||
<string name="settings_theme">Tema</string>
|
||||
<string name="all">Semua</string>
|
||||
@@ -76,17 +76,17 @@
|
||||
<string name="removeImage">Hapus gambar</string>
|
||||
<string name="setBackImage">Atur gambar bagian belakang</string>
|
||||
<string name="intent_import_card_from_url_share_multiple_text">Saya ingin berbagi kartu dengan Anda</string>
|
||||
<string name="noGiftCards">Klik tanda + tombol tambah untuk menambahkan kartu, atau mengimpor beberapa kartu melalui ⋮ menu.</string>
|
||||
<string name="noMatchingGiftCards">Tidak menemukan apapun. Coba untuk mengubah pencarian anda.</string>
|
||||
<string name="noGiftCards">Tap tanda tombol plus ( + ) untuk menambahkan kartu, atau mengimpor nya melalui menu ( ⋮ ).</string>
|
||||
<string name="noMatchingGiftCards">Tidak menemukan apapun. Cobalah untuk mengubah pencarian anda.</string>
|
||||
<string name="noBarcode">Bukan barcode</string>
|
||||
<string name="confirm">Konfirmasi</string>
|
||||
<string name="copy_to_clipboard">Salin ID ke papan klip</string>
|
||||
<string name="sendLabel">Kirim…</string>
|
||||
<string name="noCardsMessage">Tambah kartu terlebih dahulu</string>
|
||||
<string name="noStoreError">Nama masih kosong</string>
|
||||
<string name="noCardIdError">Kartu ID masih kosong</string>
|
||||
<string name="noCardIdError">Tidak ada ID yang dimasukkan</string>
|
||||
<string name="noCardExistsError">Tidak dapat menemukan kartu</string>
|
||||
<string name="failedParsingImportUriError">Tidak dapat menguraikan alamat impor situs web</string>
|
||||
<string name="failedParsingImportUriError">Tidak dapat memparsing impor URI</string>
|
||||
<string name="exportName">Ekspor</string>
|
||||
<string name="importSuccessfulTitle">Sudah diimpor</string>
|
||||
<string name="importFailedTitle">Impor gagal</string>
|
||||
@@ -94,13 +94,12 @@
|
||||
<string name="exportSuccessfulTitle">Sudah diekspor</string>
|
||||
<string name="exportFailedTitle">Ekspor gagal</string>
|
||||
<string name="exportFailed">Tidak dapat mengekspor</string>
|
||||
<string name="importing">Mengimpor…</string>
|
||||
<string name="exporting">Mengekspor…</string>
|
||||
<string name="noExternalStoragePermissionError">Berikan izin penyimpanan eksternal untuk mengimpor atau mengekspor data</string>
|
||||
<string name="importing">Sedang mengimpor…</string>
|
||||
<string name="exporting">Sedang mengekspor…</string>
|
||||
<string name="exportOptionExplanation">Data akan ditulis ke lokasi pilihan Anda.</string>
|
||||
<string name="importOptionFilesystemTitle">Impor dari sistem</string>
|
||||
<string name="importOptionFilesystemExplanation">Pilih file dari sistem.</string>
|
||||
<string name="importOptionFilesystemButton">Dari sistem</string>
|
||||
<string name="importOptionFilesystemTitle">Impor dari pengelola file bawaan</string>
|
||||
<string name="importOptionFilesystemExplanation">Pilih file dari pengelola file bawaan.</string>
|
||||
<string name="importOptionFilesystemButton">Dari pengelola file bawaan</string>
|
||||
<string name="importOptionApplicationTitle">Gunakan aplikasi lain</string>
|
||||
<string name="importOptionApplicationExplanation">Gunakan aplikasi lain atau pengelola file favorit anda untuk membuka file.</string>
|
||||
<string name="importOptionApplicationButton">Gunakan aplikasi lain</string>
|
||||
@@ -123,7 +122,7 @@
|
||||
<string name="settings_max_font_size_scale">Ukuran maksimal huruf</string>
|
||||
<string name="settings_display_barcode_max_brightness">Terangkan tampilan barcode</string>
|
||||
<string name="settings_keep_screen_on">Biarkan layar menyala</string>
|
||||
<string name="settings_disable_lockscreen_while_viewing_card">Mencegah layar menyala</string>
|
||||
<string name="settings_disable_lockscreen_while_viewing_card">Cegah kunci layar</string>
|
||||
<string name="intent_import_card_from_url_share_text">Saya ingin berbagi kartu dengan anda</string>
|
||||
<string name="importSuccessful">Data terimpor</string>
|
||||
<string name="exportSuccessful">Data terekspor</string>
|
||||
@@ -178,18 +177,18 @@
|
||||
<string name="exportPassword">Tetapkan kata sandi untuk melindungi ekspor anda (opsional)</string>
|
||||
<string name="failedGeneratingShareURL">Tidak dapat membuat alamat berbagi. Mohon laporkan ini.</string>
|
||||
<string name="app_contributors">Pengembangan dibantu oleh: <xliff:g id="app_contributors">%s</xliff:g></string>
|
||||
<string name="swipeToSwitchImages">Geser atau tekan yang lama untuk mengganti gambar</string>
|
||||
<string name="reverse">Ubah urutan</string>
|
||||
<string name="swipeToSwitchImages">Geser untuk beralih gambar, tahan untuk membuka gambar di aplikasi galeri</string>
|
||||
<string name="reverse">…dalam urutan terbalik</string>
|
||||
<string name="version_history">Riwayat Versi</string>
|
||||
<string name="help_translate_this_app">Bantu terjemahkan aplikasi ini</string>
|
||||
<string name="source_repository">Sumber Repositori</string>
|
||||
<string name="on_github">di GitHub</string>
|
||||
<string name="and_data_usage">dan penggunaan data</string>
|
||||
<string name="on_google_play">di Google Play</string>
|
||||
<string name="cardShortcut">Pintasan kartu</string>
|
||||
<string name="card_ids_copied">ID kartu yang tersalin</string>
|
||||
<string name="cardShortcut">Pintasan Kartu</string>
|
||||
<string name="card_ids_copied">ID(s) yang disalin</string>
|
||||
<string name="barcodeImageDescriptionWithType">Gambar <xliff:g>%s</xliff:g> barcode</string>
|
||||
<string name="importExportHelp">Mencadangkan data anda memungkinkan memindahkannya ke perangkat lain.</string>
|
||||
<string name="importExportHelp">Mencadangkan data anda akan memungkinkan memindahkannya ke perangkat lain.</string>
|
||||
<plurals name="selectedCardCount">
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> kartu dipilih</item>
|
||||
</plurals>
|
||||
@@ -242,4 +241,19 @@
|
||||
<string name="archive">Arsip</string>
|
||||
<string name="archived">Kartu diarsipkan</string>
|
||||
<string name="archiveList">Arsip</string>
|
||||
</resources>
|
||||
<string name="failedToRetrieveImageFile">Gagal mengambil file gambar</string>
|
||||
<string name="barcodeLongPressMessage">Hanya gambar yang dapat dibuka di aplikasi galeri</string>
|
||||
<string name="unarchive">Ekstrak</string>
|
||||
<string name="unarchived">Kartu tidak diarsipkan</string>
|
||||
<string name="noUnarchivedCardsMessage">Tidak ada kartu yang diekstrak</string>
|
||||
<string name="options">Opsi</string>
|
||||
<string name="starred">Berbintang</string>
|
||||
<string name="importCards">Import kartu</string>
|
||||
<string name="newBalanceSentence">Saldo baru: <xliff:g>%s</xliff:g></string>
|
||||
<string name="cameraPermissionDeniedTitle">Tidak dapat mengakses kamera</string>
|
||||
<string name="updateBalance">Perbarui saldo</string>
|
||||
<string name="updateBalanceHint">Masukkan jumlah</string>
|
||||
<string name="currentBalanceSentence">Saldo saat ini: <xliff:g>%s</xliff:g></string>
|
||||
<string name="updateBalanceTitle">Berapa banyak yang telah kamu habiskan \?</string>
|
||||
<string name="noCameraPermissionDirectToSystemSetting">Untuk memindai barcode, Catima membutuhkan akses ke kamera mu. Tap disini untuk mengganti pengaturan perizinan mu.</string>
|
||||
</resources>
|
||||
@@ -33,7 +33,6 @@
|
||||
<string name="importExportHelp">Stuðningur upp spil gerir þér kleift að færa þá til annar tæki.</string>
|
||||
<string name="importSuccessfulTitle">Flutt</string>
|
||||
<string name="importFailedTitle">Innflutningur mistókst</string>
|
||||
<string name="noExternalStoragePermissionError">Grant ytri geymslu leyfi til að flytja eða flytja spil fyrstu</string>
|
||||
<string name="exportOptionExplanation">Gögnum verður skrifað á stað af eigin vali.</string>
|
||||
<string name="importOptionFilesystemTitle">Innflutningur frá möppuna</string>
|
||||
<string name="importOptionFilesystemExplanation">Velja ákveðna skrá frá möppuna.</string>
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
|
||||
<string name="action_search">Cerca</string>
|
||||
<string name="action_add">Aggiungi</string>
|
||||
<string name="noGiftCards">Premi il pulsante + per aggiungere una carta oppure importane alcune dal menù ⋮.</string>
|
||||
<string name="noGiftCards">Premi il pulsante + per aggiungere una carta oppure importala dal menù ⋮.</string>
|
||||
<string name="noMatchingGiftCards">Nessun risultato. Prova a cambiare la tua ricerca.</string>
|
||||
<string name="storeName">Nome</string>
|
||||
<string name="note">Note</string>
|
||||
@@ -37,7 +37,6 @@
|
||||
<string name="exportFailed">Impossibile eseguire l\'esportazione</string>
|
||||
<string name="importing">Importazione in corso…</string>
|
||||
<string name="exporting">Esportazione in corso…</string>
|
||||
<string name="noExternalStoragePermissionError">Concedi il permesso di archiviazione esterna per importare o esportare dati</string>
|
||||
<string name="importOptionFilesystemTitle">Importa dall\'archivio</string>
|
||||
<string name="importOptionFilesystemExplanation">Scegli un file dall\'archivio.</string>
|
||||
<string name="importOptionFilesystemButton">Dall\'archivio</string>
|
||||
@@ -189,7 +188,7 @@
|
||||
<string name="app_contributors">Reso possibile da: <xliff:g id="app_contributors">%s</xliff:g></string>
|
||||
<string name="noGroupCards">Questo gruppo è vuoto</string>
|
||||
<string name="barcodeImageDescriptionWithType">Immagine del codice a barre in formato <xliff:g>%s</xliff:g></string>
|
||||
<string name="swipeToSwitchImages">Scorri o premi a lungo per cambiare immagine</string>
|
||||
<string name="swipeToSwitchImages">Scorri per cambiare immagine, tieni premuto per aprire l\'immagine nella galleria</string>
|
||||
<string name="sort_by">Ordina per</string>
|
||||
<string name="reverse">…in ordine inverso</string>
|
||||
<string name="sort_by_balance">Saldo</string>
|
||||
@@ -260,4 +259,16 @@
|
||||
<item quantity="many">Visualizza archivio (<xliff:g>%1$d</xliff:g> carta)</item>
|
||||
<item quantity="other">Visualizza archivio (<xliff:g>%1$d</xliff:g> carte)</item>
|
||||
</plurals>
|
||||
<string name="failedToRetrieveImageFile">Impossibile ottenere il file dell\'immagine</string>
|
||||
<string name="barcodeLongPressMessage">Si possono aprire solo immagini dell\'app della galleria</string>
|
||||
<string name="cameraPermissionDeniedTitle">È impossibile accedere alla fotocamera</string>
|
||||
<string name="noCameraPermissionDirectToSystemSetting">Per poter scansionare i codici a barre, Catima ha bisogno di accedere alla tua fotocamera. Premi qui per poter cambiare le impostazioni dei permessi.</string>
|
||||
<string name="updateBalance">Aggiorna bilancio</string>
|
||||
<string name="updateBalanceTitle">Quanto hai speso\?</string>
|
||||
<string name="updateBalanceHint">Inserisci l\'importo</string>
|
||||
<string name="currentBalanceSentence">Bilancio attuale: <xliff:g>%s</xliff:g></string>
|
||||
<string name="newBalanceSentence">Nuovo bilancio: <xliff:g>%s</xliff:g></string>
|
||||
<string name="importCards">Importa carte</string>
|
||||
<string name="storageReadPermissionRequired">Per questa azione è necessario il permesso per accedere alla memoria del dispositivo…</string>
|
||||
<string name="cameraPermissionRequired">Per questa azione è necessario il permesso ad accedere alla fotocamera…</string>
|
||||
</resources>
|
||||
@@ -87,7 +87,6 @@
|
||||
<string name="importOptionFilesystemExplanation">ストレージからファイルを選択してください。</string>
|
||||
<string name="importOptionFilesystemTitle">ストレージからインポート</string>
|
||||
<string name="exportOptionExplanation">選択した場所にデータを出力します。</string>
|
||||
<string name="noExternalStoragePermissionError">データをインポート/エクスポートするために外部ストレージへのアクセスを許可してください</string>
|
||||
<string name="exporting">エクスポート中…</string>
|
||||
<string name="importing">インポート中…</string>
|
||||
<string name="exportFailed">カードをエクスポートできませんでした</string>
|
||||
|
||||
@@ -1,29 +1,29 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="addManually">직접 카드 ID 입력</string>
|
||||
<string name="groupsList">그룹: <xliff:g xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">%s</xliff:g></string>
|
||||
<string name="groupsList">그룹: <xliff:g>%s</xliff:g></string>
|
||||
<string name="all">모두</string>
|
||||
<string name="groups">그룹</string>
|
||||
<string name="enter_group_name">그룹 이름 입력</string>
|
||||
<string name="settings_dark_theme">어두움</string>
|
||||
<string name="settings_light_theme">밝음</string>
|
||||
<string name="debug_version_fmt">버전: <xliff:g xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" id="version">%s</xliff:g></string>
|
||||
<string name="about_title_fmt"><xliff:g xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" id="app_name">%s</xliff:g> 정보</string>
|
||||
<string name="debug_version_fmt">버전: <xliff:g id="version">%s</xliff:g></string>
|
||||
<string name="about_title_fmt"><xliff:g id="app_name">%s</xliff:g> 정보</string>
|
||||
<string name="settings_system_theme">시스템</string>
|
||||
<string name="settings_theme">테마</string>
|
||||
<string name="settings_category_title_ui">사용자 인터페이스</string>
|
||||
<string name="settings">설정</string>
|
||||
<string name="enterBarcodeInstructions">카드 ID를 입력하고 카드에서 사용하는 바코드 이미지를 선택하세요. 바코드를 사용하지 않는 경우 “이 카드는 바코드가 없음”을 선택하세요.</string>
|
||||
<string name="app_revision_fmt">리비전 정보: <xliff:g xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" id="app_revision_url">%s</xliff:g></string>
|
||||
<string name="app_revision_fmt">리비전 정보: <xliff:g id="app_revision_url">%s</xliff:g></string>
|
||||
<string name="selectBarcodeTitle">바코드 선택</string>
|
||||
<string name="about">정보</string>
|
||||
<string name="exporting">내보내는 중…</string>
|
||||
<string name="importing">가져오는 중…</string>
|
||||
<string name="importExportHelp">카드를 백업하면 다른 장치로 옮길 수 있습니다.</string>
|
||||
<string name="importExportHelp">데이터를 백업하면 다른 장치로 이동할 수 있습니다.</string>
|
||||
<string name="exportName">내보내기</string>
|
||||
<string name="importExport">가져오기/내보내기</string>
|
||||
<string name="cardShortcut">카드 바로 가기</string>
|
||||
<string name="scanCardBarcode">카드 바코드 스캔</string>
|
||||
<string name="scanCardBarcode">바코드 스캔</string>
|
||||
<string name="addCardTitle">카드 추가</string>
|
||||
<string name="editCardTitle">카드 편집</string>
|
||||
<string name="sendLabel">보내기…</string>
|
||||
@@ -38,7 +38,7 @@
|
||||
<string name="unstar">즐겨찾기에서 제거</string>
|
||||
<string name="star">즐겨찾기에 추가</string>
|
||||
<string name="noBarcode">바코드 없음</string>
|
||||
<string name="barcodeNoBarcode">이 카드는 바코드가 없음</string>
|
||||
<string name="barcodeNoBarcode">바코드가 없습니다</string>
|
||||
<string name="barcodeType">바코드 형식</string>
|
||||
<string name="cardId">카드 ID</string>
|
||||
<string name="note">노트</string>
|
||||
@@ -49,22 +49,22 @@
|
||||
<string name="action_add">추가</string>
|
||||
<string name="action_search">검색</string>
|
||||
<string name="copy_to_clipboard_toast">카드 ID를 클립보드에 복사함</string>
|
||||
<string name="importOptionApplicationTitle">외부 앱 사용</string>
|
||||
<string name="importOptionApplicationTitle">다른 앱 사용</string>
|
||||
<string name="importOptionFilesystemExplanation">파일 시스템에서 파일을 선택합니다.</string>
|
||||
<string name="importOptionFilesystemTitle">파일 시스템에서 가져오기</string>
|
||||
<string name="exportFailed">카드를 내보낼 수 없음</string>
|
||||
<string name="exportFailed">내보내기를 수행할 수 없습니다</string>
|
||||
<string name="importOptionApplicationExplanation">다른 파일 관리자 또는 앱을 사용하여 파일을 엽니다.</string>
|
||||
<string name="exportFailedTitle">내보내기 실패</string>
|
||||
<string name="exportSuccessfulTitle">내보내기 완료</string>
|
||||
<string name="importFailed">카드를 가져올 수 없음</string>
|
||||
<string name="importFailed">가져오기를 수행할 수 없습니다</string>
|
||||
<string name="importFailedTitle">가져오기 실패</string>
|
||||
<string name="importSuccessfulTitle">가져오기 완료</string>
|
||||
<string name="noCardIdError">카드 ID를 입력하지 않음</string>
|
||||
<string name="noCardIdError">ID를 입력하지 않았습니다</string>
|
||||
<string name="storeName">이름</string>
|
||||
<string name="thumbnailDescription">카드 섬네일</string>
|
||||
<string name="importOptionApplicationButton">외부 앱 사용</string>
|
||||
<string name="importOptionApplicationButton">다른 앱 사용</string>
|
||||
<string name="failedParsingImportUriError">가져온 URI를 분석할 수 없음</string>
|
||||
<string name="noCardExistsError">카드를 찾을 수 없음</string>
|
||||
<string name="noCardExistsError">해당 카드를 찾을 수 없습니다</string>
|
||||
<string name="moveUp">목록에서 위로 옮기기</string>
|
||||
<string name="leaveWithoutSaveTitle">저장하지 않고 종료</string>
|
||||
<string name="moveDown">목록에서 아래로 옮기기</string>
|
||||
@@ -73,5 +73,8 @@
|
||||
<string name="settings_display_barcode_max_brightness">바코드를 표시할 때 화면 밝기 높이기</string>
|
||||
<string name="barcode">바코드</string>
|
||||
<string name="deleteConfirmation">정말 이 카드를 삭제하시겠습니까\?</string>
|
||||
<string name="deleteTitle">카드 제거</string>
|
||||
<string name="deleteTitle">카드 삭제</string>
|
||||
<plurals name="deleteCardsTitle">
|
||||
<item quantity="other">카드 <xliff:g>%d</xliff:g> 제거</item>
|
||||
</plurals>
|
||||
</resources>
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
|
||||
<string name="action_add">Pridėti</string>
|
||||
<string name="noGiftCards">Norėdami pridėti kortelę, spustelėkite mygtuką + plius arba pirmiausia importuokite kortelę iš ⋮ meniu.</string>
|
||||
<string name="noGiftCards">Norėdami pridėti kortelę, spustelėkite mygtuką + arba importuokite kortelę iš ⋮ meniu.</string>
|
||||
<string name="storeName">Pavadinimas</string>
|
||||
<string name="note">Užrašas</string>
|
||||
<string name="cardId">Kortelės ID</string>
|
||||
@@ -14,32 +14,31 @@
|
||||
<string name="copy_to_clipboard">Nukopijuoti ID į iškarpinę</string>
|
||||
<string name="editCardTitle">Redaguoti lojalumo kortelę</string>
|
||||
<string name="addCardTitle">Pridėti lojalumo kortelę</string>
|
||||
<string name="scanCardBarcode">Skenuoti kortelės brūkšninį kodą</string>
|
||||
<string name="scanCardBarcode">Nuskaityti brūkšninį kodą</string>
|
||||
<string name="noStoreError">Neįvestas pavadinimas</string>
|
||||
<string name="noCardIdError">Neįvestas kortelės ID</string>
|
||||
<string name="noCardIdError">Neįvestas ID</string>
|
||||
<string name="importExport">Importuoti/Exportuoti</string>
|
||||
<string name="exportName">Exportuoti</string>
|
||||
<string name="importFailed">Nepavyko importuoti kortelių</string>
|
||||
<string name="exportFailed">Nepavyko eksportuoti kortelių</string>
|
||||
<string name="importFailed">Nepavyko importuoti</string>
|
||||
<string name="exportFailed">Nepavyko eksportuoti</string>
|
||||
<string name="importing">Importuoja…</string>
|
||||
<string name="exporting">Eksportuoja…</string>
|
||||
<string name="noExternalStoragePermissionError">Pirmiausia suteikite išorinės saugyklos leidimą, kad galėtumėte importuoti arba eksportuoti korteles</string>
|
||||
<string name="about">Apie</string>
|
||||
<string name="app_license">Copylefted laisvoji programinė įranga, licencijuota GPLv3+</string>
|
||||
<string name="about_title_fmt">Apie <xliff:g id="app_name">%s</xliff:g></string>
|
||||
<string name="debug_version_fmt">Versija: <xliff:g id="version">%s</xliff:g></string>
|
||||
<string name="app_revision_fmt">Revizijos info: <xliff:g id="app_revision_url">%s</xliff:g></string>
|
||||
<string name="selectBarcodeTitle">Pasirinkite brūkšninį kodą</string>
|
||||
<string name="copy_to_clipboard_toast">Kortelės ID nukopijuota į iškarpinę</string>
|
||||
<string name="card_ids_copied">Nukopijuotos kortelės ID</string>
|
||||
<string name="copy_to_clipboard_toast">ID nukopijuota į iškarpinę</string>
|
||||
<string name="card_ids_copied">Nukopijuoti ID</string>
|
||||
<string name="noCardsMessage">Pirmiausia pridėkite kortelę</string>
|
||||
<string name="sendLabel">Siųsti…</string>
|
||||
<string name="unstar">Pašalinti iš mėgstamiausių</string>
|
||||
<string name="star">Pridėti prie mėgstamiausių</string>
|
||||
<string name="noBarcode">Nėra brūkšninio kodo</string>
|
||||
<string name="barcodeNoBarcode">Ši kortelė neturi brūkšninio kodo</string>
|
||||
<string name="barcodeNoBarcode">Brūkšninio kodo nėra</string>
|
||||
<string name="barcodeType">Brūkšninio kodo tipas</string>
|
||||
<string name="noMatchingGiftCards">Nieko nerasta. Pabandykite pakeisti paiešką.</string>
|
||||
<string name="noMatchingGiftCards">Rezultatų nėra. Pabandykite pakeisti paiešką.</string>
|
||||
<string name="action_search">Ieškoti</string>
|
||||
<string name="cardShortcut">Kortelės sparčioji nuoroda</string>
|
||||
<string name="importVoucherVaultMessage">Pasirinkite savo <i>vouchervault.json</i> eksportą iš Voucher Vault, kurį norite importuoti.
|
||||
@@ -60,21 +59,21 @@
|
||||
<string name="passwordRequired">Įveskite slaptažodį</string>
|
||||
<string name="no">Ne</string>
|
||||
<string name="yes">Taip</string>
|
||||
<string name="updateBarcodeQuestionText">Pakeitėte kortelės ID. Ar norite atnaujinti ir brūkšninį kodą, kad būtų naudojama ta pati reikšmė\?</string>
|
||||
<string name="updateBarcodeQuestionText">Pakeitėte ID. Ar norite atnaujinti ir brūkšninį kodą, kad būtų naudojama ta pati reikšmė\?</string>
|
||||
<string name="updateBarcodeQuestionTitle">Atnaujinti brūkšninio kodo reikšmę\?</string>
|
||||
<string name="takePhoto">Nufotografuoti</string>
|
||||
<string name="removeImage">Pašalinti vaizdą</string>
|
||||
<string name="setBackImage">Nustatyti galinį vaizdą</string>
|
||||
<string name="setFrontImage">Nustatyti priekinį vaizdą</string>
|
||||
<string name="photos">Nuotraukos</string>
|
||||
<string name="backImageDescription">Kortelės galinis vaizdas</string>
|
||||
<string name="frontImageDescription">Kortelės priekinis vaizdas</string>
|
||||
<string name="backImageDescription">Galinis vaizdas</string>
|
||||
<string name="frontImageDescription">Priekinis vaizdas</string>
|
||||
<string name="intent_import_card_from_url_share_multiple_text">Noriu su jumis pasidalyti keliomis kortelėmis</string>
|
||||
<string name="copy_to_clipboard_multiple_toast">Kortelės ID nukopijuotas į iškarpinę</string>
|
||||
<string name="copy_to_clipboard_multiple_toast">ID nukopijuotas į iškarpinę</string>
|
||||
<string name="wrongValueForBarcodeType">Vertė netinkama pasirinktam brūkšninio kodo tipui</string>
|
||||
<string name="unsupportedBarcodeType">Šio brūkšninio kodo tipo dar negalima rodyti. Galbūt jis bus palaikomas vėlesnėje programėlės versijoje.</string>
|
||||
<string name="setBarcodeId">Nustatyti brūkšninio kodo reikšmę</string>
|
||||
<string name="sameAsCardId">Tokia pat kaip kortelės ID</string>
|
||||
<string name="sameAsCardId">Tokia pat kaip ID</string>
|
||||
<string name="barcodeId">Brūkšninio kodo reikšmė</string>
|
||||
<string name="importStocardMessage">Pasirinkite <i>***-sync.zip</i> eksportą iš Stocard, kad galėtumėte importuoti.
|
||||
\nGaukite susisiekę el. paštu support@stocardapp.com, prašydami eksportuoti jūsų duomenis.</string>
|
||||
@@ -90,7 +89,7 @@
|
||||
\n
|
||||
\nJOKIE DUOMENYS NĖRA RENKAMI, o tai gali patvirtinti bet kas, nes mūsų programėlė yra laisvoji programinė įranga.</string>
|
||||
<string name="privacy_policy">Privatumo politika</string>
|
||||
<string name="chooseImportType">Importuoti duomenis iš\?</string>
|
||||
<string name="chooseImportType">Importuoti duomenis iš</string>
|
||||
<string name="points">Taškai</string>
|
||||
<string name="currency">Valiuta</string>
|
||||
<string name="balance">Balansas</string>
|
||||
@@ -107,7 +106,7 @@
|
||||
<string name="expiryStateSentence">Nustoja galioti: <xliff:g>%s</xliff:g></string>
|
||||
<string name="groupsList">Grupės: <xliff:g> %s </xliff:g></string>
|
||||
<string name="addFromImage">Pasirinkti vaizdą iš galerijos</string>
|
||||
<string name="addManually">Rankiniu būdu įvesti kortelės ID</string>
|
||||
<string name="addManually">Rankiniu būdu įvesti ID</string>
|
||||
<string name="leaveWithoutSaveConfirmation">Išeiti neišsaugojus\?</string>
|
||||
<string name="leaveWithoutSaveTitle">Išeiti</string>
|
||||
<string name="moveDown">Judėti žemyn</string>
|
||||
@@ -120,24 +119,24 @@
|
||||
<item quantity="few"><xliff:g>%d</xliff:g> kortelės</item>
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> kortelių</item>
|
||||
</plurals>
|
||||
<string name="noGroups">Spustelėkite + pliuso mygtuką, kad pirmiausia pridėtumėte grupes kategorizavimui.</string>
|
||||
<string name="noGroups">Spustelėkite mygtuką +, kad pridėtumėte grupes kategorizavimui.</string>
|
||||
<string name="groups">Grupės</string>
|
||||
<string name="enter_group_name">Įvesti grupės pavadinimą</string>
|
||||
<string name="exportSuccessful">Kortelės duomenys eksportuoti</string>
|
||||
<string name="importSuccessful">Kortelės duomenys importuoti</string>
|
||||
<string name="exportSuccessful">Duomenys eksportuoti</string>
|
||||
<string name="importSuccessful">Duomenys importuoti</string>
|
||||
<string name="intent_import_card_from_url_share_text">Noriu pasidalyti su jumis kortele</string>
|
||||
<string name="settings_disable_lockscreen_while_viewing_card">Neleisti užrakinti ekrano</string>
|
||||
<string name="settings_keep_screen_on">Laikyti ekraną įjungtą</string>
|
||||
<string name="settings_max_font_size_scale">Didžiausias šrifto dydis</string>
|
||||
<string name="settings_dark_theme">Tamsi</string>
|
||||
<string name="settings_light_theme">Šviesi</string>
|
||||
<string name="settings_system_theme">Sistema</string>
|
||||
<string name="settings_system_theme">Sistemos</string>
|
||||
<string name="settings_theme">Tema</string>
|
||||
<string name="settings_category_title_ui">Vartotojo sąsaja</string>
|
||||
<string name="settings">Nustatymai</string>
|
||||
<string name="starImage">Mėgstamiausia žvaigždė</string>
|
||||
<string name="thumbnailDescription">Kortelės miniatiūra</string>
|
||||
<string name="enterBarcodeInstructions">Įveskite kortelės ID ir toliau pasirinkite jos brūkšninio kodo tipą arba \"Ši kortelė neturi brūkšninio kodo\".</string>
|
||||
<string name="thumbnailDescription">Miniatiūra</string>
|
||||
<string name="enterBarcodeInstructions">Įveskite ID ir toliau pasirinkite brūkšninio kodo tipą arba \"Nėra brūkšninio kodo\".</string>
|
||||
<string name="app_resources">Laisvosios trečiųjų šalių ištekliai: <xliff:g id="app_resources_list">%s</xliff:g></string>
|
||||
<string name="app_libraries">Laisvosios trečiųjų šalių bibliotekos: <xliff:g id="app_libraries_list">%s</xliff:g></string>
|
||||
<string name="app_copyright_old">Paremta Loyalty Card Keychain
|
||||
@@ -154,8 +153,8 @@
|
||||
<string name="exportSuccessfulTitle">Eksportuota</string>
|
||||
<string name="importFailedTitle">Importuoti nepavyko</string>
|
||||
<string name="importSuccessfulTitle">Importuota</string>
|
||||
<string name="importExportHelp">Atsarginių kopijų darymas leidžia perkelti korteles į kitą įrenginį.</string>
|
||||
<string name="noCardExistsError">Nepavyko rasti kortelės</string>
|
||||
<string name="importExportHelp">Duomenų atsarginių kopijų darymas leidžia perkelti juos į kitą įrenginį.</string>
|
||||
<string name="noCardExistsError">Nepavyko rasti šios kortelės</string>
|
||||
<string name="share">Dalintis</string>
|
||||
<plurals name="selectedCardCount">
|
||||
<item quantity="one">Pasirinkta: <xliff:g>%d</xliff:g> kortelė</item>
|
||||
@@ -187,11 +186,11 @@
|
||||
<string name="settings_catima_theme">Catima</string>
|
||||
<string name="settings_theme_color">Temos spalva</string>
|
||||
<string name="app_contributors">Tapo įmanoma su pagalba: <xliff:g id="app_contributors">%s</xliff:g></string>
|
||||
<string name="noGroupCards">Šioje grupėje nėra jokių kortelių</string>
|
||||
<string name="barcodeImageDescriptionWithType"><xliff:g>%s</xliff:g> tipo kortelės brūkšninio kodo vaizdas</string>
|
||||
<string name="swipeToSwitchImages">Perbraukite arba ilgai palaikykite paspaudę, kad perjungtumėte vaizdus</string>
|
||||
<string name="noGroupCards">Grupėje yra tuščia</string>
|
||||
<string name="barcodeImageDescriptionWithType"><xliff:g>%s</xliff:g> brūkšninio kodo vaizdas</string>
|
||||
<string name="swipeToSwitchImages">Braukite, kad perjungtumėte vaizdus, palaikykite, kad atvertumėte vaizdą galerijos programėlėje</string>
|
||||
<string name="sort_by">Rikiuoti pagal</string>
|
||||
<string name="reverse">Atvirkštinis</string>
|
||||
<string name="reverse">…atvirkštine tvarka</string>
|
||||
<string name="sort_by_balance">Balansas</string>
|
||||
<string name="sort_by_expiry">Galiojimo pabaiga</string>
|
||||
<string name="sort_by_most_recently_used">Vėliausiai naudota</string>
|
||||
@@ -214,10 +213,60 @@
|
||||
<string name="editGroup">Redaguojama grupė: <xliff:g>%s</xliff:g></string>
|
||||
<string name="group_updated">Grupė atnaujinta</string>
|
||||
<string name="group_edit">Redaguoti grupę</string>
|
||||
<string name="noGiftCardsGroup">Dar neturite jokių lojalumo kortelių. Kai kelias pridėsite, galėsite jas priskirti grupei čia.</string>
|
||||
<string name="noGiftCardsGroup">Sukurkite keletą kortelių ir priskirkite jas grupei čia.</string>
|
||||
<string name="setIcon">Nustatyti piktogramą</string>
|
||||
<string name="selectColor">Pasirinkti spalvą</string>
|
||||
<string name="action_hide_details">Paslėpti informaciją</string>
|
||||
<string name="action_show_details">Rodyti išsamią informaciją</string>
|
||||
<string name="settings_card_orientation">Brūkšninio kodo orientacija</string>
|
||||
<string name="archiveList">Archyvas</string>
|
||||
<string name="noUnarchivedCardsMessage">Nėra išarchyvuotų kortelių</string>
|
||||
<string name="failedLaunchingPhotoPicker">Nepavyko rasti palaikomos galerijos programėlės</string>
|
||||
<string name="previousCard">Ankstesnė</string>
|
||||
<string name="nextCard">Kita</string>
|
||||
<plurals name="viewArchivedCardsWithCount">
|
||||
<item quantity="one">Peržiūrėti archyvą (<xliff:g>%1$d</xliff:g> kortelė)</item>
|
||||
<item quantity="few">Peržiūrėti archyvą (<xliff:g>%1$d</xliff:g> kortelės)</item>
|
||||
<item quantity="other">Peržiūrėti archyvą (<xliff:g>%1$d</xliff:g> kortelių)</item>
|
||||
</plurals>
|
||||
<plurals name="groupCardCountWithArchived">
|
||||
<item quantity="one"><xliff:g>%1$d</xliff:g> kortelė ( archyvuota)<xliff:g id="archivedCount">%2$d</xliff:g></item>
|
||||
<item quantity="few"><xliff:g>%1$d</xliff:g> kortelės ( archyvuotos)<xliff:g id="archivedCount">%2$d</xliff:g></item>
|
||||
<item quantity="other"><xliff:g>%1$d</xliff:g> kortelių ( archyvuotų)<xliff:g id="archivedCount">%2$d</xliff:g></item>
|
||||
</plurals>
|
||||
<string name="set_scale">Nustatyti mastelį</string>
|
||||
<string name="hideMoreInfo">Slėpti informaciją</string>
|
||||
<string name="updateBalance">Atnaujinti balansą</string>
|
||||
<string name="failedToRetrieveImageFile">Nepavyko gauti vaizdo failo</string>
|
||||
<string name="barcodeLongPressMessage">Galerijos programėlėje galima atidaryti tik vaizdus</string>
|
||||
<string name="translate_platform">Weblate svetainėje</string>
|
||||
<string name="shortcutSelectCard">Pasirinkti kortelę</string>
|
||||
<string name="options">Parinktys</string>
|
||||
<string name="starred">Pažymėta žvaigždute</string>
|
||||
<string name="include_if_asking_support">Jei norite prašyti pagalbos, įtraukite šią informaciją:</string>
|
||||
<string name="archive">Archyvuoti</string>
|
||||
<string name="duplicateCard">Dubliuoti</string>
|
||||
<string name="unarchive">Išarchyvuoti</string>
|
||||
<string name="archived">Kortelė archyvuota</string>
|
||||
<string name="unarchived">Kortelė išarchyvuota</string>
|
||||
<string name="updateBalanceTitle">Kiek išleidote\?</string>
|
||||
<string name="updateBalanceHint">Įveskite sumą</string>
|
||||
<string name="currentBalanceSentence">Dabartinis likutis: <xliff:g>%s</xliff:g></string>
|
||||
<string name="newBalanceSentence">Naujas balansas: <xliff:g>%s</xliff:g></string>
|
||||
<string name="failedToOpenUrl">Pirmiausia įdiekite žiniatinklio naršyklę</string>
|
||||
<string name="welcome">Sveiki užėję į Catima</string>
|
||||
<string name="showMoreInfo">Rodyti informaciją</string>
|
||||
<string name="settings_oled_dark">Visiškai juodas fonas tamsiajai temai</string>
|
||||
<string name="settings_follow_system_orientation">Sekti sistemą</string>
|
||||
<string name="settings_portrait_orientation">Portretas</string>
|
||||
<string name="settings_landscape_orientation">Gulsčias</string>
|
||||
<string name="settings_lock_on_opening_orientation">Užfiksuoti padėtį, kuri naudojama atidarant kortelę</string>
|
||||
<string name="cameraPermissionDeniedTitle">Nepavyko pasiekti kameros</string>
|
||||
<string name="noCameraPermissionDirectToSystemSetting">Skanuoti brūkšniniams kodams Catima reikės gauti leidimo naudotis jūsų kamera. Spustelkite čia norėdami pakeisti leidimų nustatymus.</string>
|
||||
<plurals name="balancePoints">
|
||||
<item quantity="one"><xliff:g>%s</xliff:g> taškas</item>
|
||||
<item quantity="few"><xliff:g>%s</xliff:g> taškai</item>
|
||||
<item quantity="other"><xliff:g>%s</xliff:g> taškų</item>
|
||||
</plurals>
|
||||
<string name="importCards">Importuoti korteles</string>
|
||||
</resources>
|
||||
@@ -1,13 +1,13 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="action_search">Meklēšana</string>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
|
||||
<string name="action_search">Meklēt</string>
|
||||
<string name="action_add">Pievienot</string>
|
||||
<string name="noGiftCards">Noklikšķiniet uz pogas + plus, lai pievienotu karti, vai vispirms importējiet dažus no ⋮ izvēlnes.</string>
|
||||
<string name="noMatchingGiftCards">Neko neatradu. Mēģiniet mainīt meklēšanu.</string>
|
||||
<string name="noMatchingGiftCards">Nav rezultātu. Mēģiniet mainīt meklējamo tekstu.</string>
|
||||
<string name="storeName">Nosaukums</string>
|
||||
<string name="note">Piezīme</string>
|
||||
<string name="barcodeType">Svītrkoda Tips</string>
|
||||
<string name="barcodeNoBarcode">Šai kartei nav svītrkoda</string>
|
||||
<string name="barcodeType">Svītrkoda tips</string>
|
||||
<string name="barcodeNoBarcode">Bez svītrkoda</string>
|
||||
<string name="noBarcode">Nav svītrkoda</string>
|
||||
<string name="star">Pievienot izlasei</string>
|
||||
<string name="unstar">Noņemt no izlases</string>
|
||||
@@ -21,73 +21,239 @@
|
||||
<string name="balance">Bilance</string>
|
||||
<string name="noBarcodeFound">Svītrkods netika atrasts</string>
|
||||
<string name="currency">Valūta</string>
|
||||
<string name="points">Punkts</string>
|
||||
<string name="chooseImportType">Importēt datus no\?</string>
|
||||
<string name="points">Punkti</string>
|
||||
<string name="chooseImportType">Importēt datus no</string>
|
||||
<string name="sendLabel">Nosūtīt…</string>
|
||||
<string name="editCardTitle">Rediģēt Karti</string>
|
||||
<string name="share">Daļa</string>
|
||||
<string name="editCardTitle">Rediģēt karti</string>
|
||||
<string name="share">Kopīgot</string>
|
||||
<string name="confirm">Apstiprināt</string>
|
||||
<string name="deleteTitle">Dzēst karti</string>
|
||||
<string name="deleteConfirmation">Dzēst šo karti pastāvīgi\?</string>
|
||||
<string name="ok">LABI</string>
|
||||
<string name="addCardTitle">Pievienot Karti</string>
|
||||
<string name="scanCardBarcode">Skenēšanas Kartes Svītrkods</string>
|
||||
<string name="cardShortcut">Kartes Saīsne</string>
|
||||
<string name="deleteConfirmation">Neatgriezeniski dzēst šo karti\?</string>
|
||||
<string name="ok">Labi</string>
|
||||
<string name="addCardTitle">Pievienot karti</string>
|
||||
<string name="scanCardBarcode">Skenēt svītrkodu</string>
|
||||
<string name="cardShortcut">Kartes saīsne</string>
|
||||
<string name="noCardsMessage">Vispirms pievienojiet karti</string>
|
||||
<string name="noStoreError">Vārds nav ievadīts</string>
|
||||
<string name="noCardExistsError">Nevarēja atrast karti</string>
|
||||
<string name="failedParsingImportUriError">Nevarēja parsēt importa URI</string>
|
||||
<string name="importExport">Imports/Eksports</string>
|
||||
<string name="exportName">Eksports</string>
|
||||
<string name="importExportHelp">Jūsu Karšu dublēšana ļauj pārvietot tās uz citu ierīci.</string>
|
||||
<string name="importExportHelp">Dublējot Jūsu datus, tos var pārnest uz citu ierīci.</string>
|
||||
<string name="importSuccessfulTitle">Importēts</string>
|
||||
<string name="importFailedTitle">Neizdevās importēt</string>
|
||||
<string name="importFailed">Nevarēja importēt kartes</string>
|
||||
<string name="exportSuccessfulTitle">Eksports</string>
|
||||
<string name="importFailedTitle">Imports neizdevās</string>
|
||||
<string name="importFailed">Karšu importu nevarēja veikt</string>
|
||||
<string name="exportSuccessfulTitle">Eksportēts</string>
|
||||
<string name="exportFailedTitle">Eksports neizdevās</string>
|
||||
<string name="exportFailed">Nevarēja eksportēt kartes</string>
|
||||
<string name="importing">Imports…</string>
|
||||
<string name="exporting">Eksports…</string>
|
||||
<string name="noExternalStoragePermissionError">Piešķiriet ārējai atmiņai atļauju vispirms importēt vai eksportēt kartes</string>
|
||||
<string name="exportOptionExplanation">Dati tiks rakstīts uz vietu, pēc jūsu izvēles.</string>
|
||||
<string name="importOptionFilesystemTitle">Importēt no failu sistēmas</string>
|
||||
<string name="exportFailed">Kartes neizdevās eksportēt</string>
|
||||
<string name="importing">Importē…</string>
|
||||
<string name="exporting">Eksportē…</string>
|
||||
<string name="exportOptionExplanation">Dati tiks saglabāti Jūsu izvēlētajā vietā.</string>
|
||||
<string name="importOptionFilesystemTitle">Imports no failu sistēmas</string>
|
||||
<string name="importOptionFilesystemExplanation">Izvēlieties konkrētu failu no failu sistēmas.</string>
|
||||
<string name="importOptionFilesystemButton">No failu sistēmas</string>
|
||||
<string name="importOptionApplicationTitle">Izmantojiet citu lietotni</string>
|
||||
<string name="importOptionApplicationTitle">Izmantojot citu lietotni</string>
|
||||
<string name="importOptionApplicationExplanation">Izmantojiet jebkuru lietotni vai savu iecienītāko failu pārvaldnieku, lai atvērtu failu.</string>
|
||||
<string name="importOptionApplicationButton">Izmantojiet citu lietotni</string>
|
||||
<string name="importOptionApplicationButton">Ar citu lietotni</string>
|
||||
<string name="about">Par</string>
|
||||
<string name="app_license">Copylefted libre programmatūra, licencēta GPLv3+</string>
|
||||
<string name="selectBarcodeTitle">Izvēlieties Svītrkodu</string>
|
||||
<string name="copy_to_clipboard_toast">Kartes ID kopēts starpliktuvē</string>
|
||||
<string name="thumbnailDescription">Sīktēls kartei</string>
|
||||
<string name="starImage">Mīļākā zvaigzne</string>
|
||||
<string name="settings">Iestatījums</string>
|
||||
<string name="app_license">Copyleft brīva un atvērta programmatūra, licencēta GPLv3+</string>
|
||||
<string name="selectBarcodeTitle">Izvēlieties svītrkodu</string>
|
||||
<string name="copy_to_clipboard_toast">Numurs kopēts starpliktuvē</string>
|
||||
<string name="thumbnailDescription">Sīktēls</string>
|
||||
<string name="starImage">Izlases zvaigzne</string>
|
||||
<string name="settings">Iestatījumi</string>
|
||||
<string name="settings_category_title_ui">Interfeiss</string>
|
||||
<string name="settings_theme">Tēma</string>
|
||||
<string name="settings_system_theme">Sistēma</string>
|
||||
<string name="settings_light_theme">Gaisma</string>
|
||||
<string name="settings_dark_theme">Tumšs</string>
|
||||
<string name="settings_max_font_size_scale">Max. fonts</string>
|
||||
<string name="settings_display_barcode_max_brightness">Izgaismojiet svītrkoda skatu</string>
|
||||
<string name="settings_keep_screen_on">Saglabāt ekrānu</string>
|
||||
<string name="settings_disable_lockscreen_while_viewing_card">Novērst bloķēšanas ekrānu</string>
|
||||
<string name="intent_import_card_from_url_share_text">Es vēlos dalīties ar jums karti</string>
|
||||
<string name="importSuccessful">Importētie kartes dati</string>
|
||||
<string name="exportSuccessful">Kartes dati eksportēti</string>
|
||||
<string name="noGroups">Noklikšķiniet uz pogas + plus, lai vispirms pievienotu grupas kategorizēšanai.</string>
|
||||
<string name="noGroupCards">Šajā grupā nav nevienas kartes</string>
|
||||
<string name="all">Visi</string>
|
||||
<string name="settings_system_theme">Sistēmas</string>
|
||||
<string name="settings_light_theme">Gaiša</string>
|
||||
<string name="settings_dark_theme">Tumša</string>
|
||||
<string name="settings_max_font_size_scale">Maksimālais burtu lielums</string>
|
||||
<string name="settings_display_barcode_max_brightness">Izgaismot svītrkoda skatu</string>
|
||||
<string name="settings_keep_screen_on">Turēt ekrānu ieslēgtu</string>
|
||||
<string name="settings_disable_lockscreen_while_viewing_card">Neļaut ekrānam aizslēgties</string>
|
||||
<string name="intent_import_card_from_url_share_text">Es vēlos ar Jums kopīgot karti</string>
|
||||
<string name="importSuccessful">Dati importēti</string>
|
||||
<string name="exportSuccessful">Dati eksportēti</string>
|
||||
<string name="noGroups">Spiediet uz \"+\" plus pogas, lai pievienotu grupas karšu kategorizēšanai.</string>
|
||||
<string name="noGroupCards">Šī grupa ir tukša</string>
|
||||
<string name="all">Visas</string>
|
||||
<string name="deleteConfirmationGroup">Dzēst grupu\?</string>
|
||||
<string name="failedOpeningFileManager">Vispirms instalējiet failu pārvaldnieku.</string>
|
||||
<string name="moveUp">Pārvietot uz augšu</string>
|
||||
<string name="moveDown">Pārvietot uz leju</string>
|
||||
<string name="leaveWithoutSaveTitle">Izeja</string>
|
||||
<string name="leaveWithoutSaveConfirmation">Atstāt bez taupīšanas\?</string>
|
||||
<string name="addFromImage">Izvēlieties attēlu no galerijas</string>
|
||||
<string name="leaveWithoutSaveTitle">Iziet</string>
|
||||
<string name="leaveWithoutSaveConfirmation">Iziet nesaglabājot\?</string>
|
||||
<string name="addFromImage">Izvēlēties attēlu no galerijas</string>
|
||||
<string name="card">Karte</string>
|
||||
<string name="barcode">Svītrkods</string>
|
||||
<string name="expiryDate">Derīguma termiņš</string>
|
||||
<string name="never">Nekad</string>
|
||||
<string name="chooseExpiryDate">Izvēlieties derīguma termiņu</string>
|
||||
<string name="failedToRetrieveImageFile">Neizdevās ielādēt attēla failu</string>
|
||||
<string name="barcodeLongPressMessage">Galerijas lietotnē var atvērt tikai attēlus</string>
|
||||
<string name="sort_by_expiry">Derīguma termiņš</string>
|
||||
<string name="reverse">...apgrieztā secībā</string>
|
||||
<string name="credits">Pateicības</string>
|
||||
<string name="shortcutSelectCard">Izvēlieties karti</string>
|
||||
<string name="set_scale">Iestatiet mērogu</string>
|
||||
<string name="duplicateCard">Dublēt</string>
|
||||
<string name="archive">Arhivēt</string>
|
||||
<string name="translate_platform">vietnē Weblate</string>
|
||||
<string name="starred">Izlase</string>
|
||||
<string name="cardId">Kartes numurs</string>
|
||||
<string name="enterBarcodeInstructions">Ievadiet kartes numuru un izvēlieties svītrkoda tipu (vai izvēlieties \"bez svītrkoda\").</string>
|
||||
<plurals name="deleteCardsConfirmation">
|
||||
<item quantity="zero">Neatgriezeniski dzēst šīs <xliff:g>%d</xliff:g> kartes\?</item>
|
||||
<item quantity="one">Neatgriezeniski dzēst šo <xliff:g>%d</xliff:g> karti\?</item>
|
||||
<item quantity="other">Neatgriezeniski dzēst šīs <xliff:g>%d</xliff:g> kartes\?</item>
|
||||
</plurals>
|
||||
<string name="noCardIdError">Numurs nav ievadīts</string>
|
||||
<string name="about_title_fmt">Par <xliff:g id="app_name">%s</xliff:g></string>
|
||||
<string name="app_revision_fmt">Versijas pārskats: <xliff:g id="app_revision_url">%s</xliff:g></string>
|
||||
<string name="expiryStateSentenceExpired">Derīguma termiņš beidzās: <xliff:g>%s</xliff:g></string>
|
||||
<string name="action_hide_details">Slēpt detaļas</string>
|
||||
<string name="action_show_details">Rādīt detalizēti</string>
|
||||
<string name="selectColor">Izvēlieties krāsu</string>
|
||||
<string name="settings_catima_theme">Catima</string>
|
||||
<string name="settings_pink_theme">Rozā</string>
|
||||
<string name="settings_magenta_theme">Purpura</string>
|
||||
<string name="settings_sky_blue_theme">Gaiši zila</string>
|
||||
<string name="settings_green_theme">Zaļa</string>
|
||||
<string name="sort_by_name">Nosaukums</string>
|
||||
<string name="on_google_play">pakalpojumā Google Play</string>
|
||||
<string name="report_error">Ziņojiet par kļūdu</string>
|
||||
<plurals name="balancePoints">
|
||||
<item quantity="zero"><xliff:g>%s</xliff:g> punkti</item>
|
||||
<item quantity="one"><xliff:g>%s</xliff:g> punkts</item>
|
||||
<item quantity="other"><xliff:g>%s</xliff:g> punkti</item>
|
||||
</plurals>
|
||||
<string name="parsingBalanceFailed"><xliff:g>%s</xliff:g> nešķiet derīga bilance.</string>
|
||||
<string name="app_loyalty_card_keychain">Loyalty Card Keychain</string>
|
||||
<string name="privacy_policy_popup_text">Paziņojums par privātuma politiku (nepieciešams dažiem lietotņu veikaliem):
|
||||
\n
|
||||
\nNEKĀDI DATI NETIEK VĀKTI, par ko var pārliecināties ikkatrs, jo mūsu lietotne ir brīva, atvērta koda programmatūra.</string>
|
||||
<string name="importCatimaMessage">Izvēlieties jūstu <i>catima.zip</i> failu importam.
|
||||
\nFailu var izveidot eksportējot datus no Catima lietotnes citā ierīce, sadaļā \"Imports/Eksports\".</string>
|
||||
<string name="importLoyaltyCardKeychainMessage">Importam izvēlieties Jūsu <i>LoyaltyCardKeychain.csv</i> eksporta failu no Loyalty Card Keychain.
|
||||
\nFailu var izveidot \"Imports/Eksports\" izvēlnē Loyalty Card Keychain lietotnē, spiežot \"Eksportēt\".</string>
|
||||
<string name="removeImage">Noņemt attēlu</string>
|
||||
<string name="exportPasswordHint">Ievadiet paroli</string>
|
||||
<string name="on_github">vietnē GitHub</string>
|
||||
<string name="settings_locale">Valoda</string>
|
||||
<string name="failedGeneratingShareURL">Nevarēja izveidot koplietojamu URL. Lūdzu, ziņojiet par šo kļūdu.</string>
|
||||
<string name="turn_flashlight_off">Izslēgt zibspuldzi</string>
|
||||
<string name="app_contributors">To padarīja iespējamu: <xliff:g id="app_contributors">%s</xliff:g></string>
|
||||
<string name="sort_by_balance">Bilance</string>
|
||||
<string name="version_history">Versiju vēsture</string>
|
||||
<string name="sort_by">Kārtot pēc</string>
|
||||
<string name="help_translate_this_app">Palīdziet tulkot šo lietotni</string>
|
||||
<string name="and_data_usage">un datu lietojums</string>
|
||||
<string name="license">Licence</string>
|
||||
<string name="source_repository">Pirmkods</string>
|
||||
<string name="rate_this_app">Novērtējiet šo lietotni</string>
|
||||
<string name="noGiftCardsGroup">Izveidojiet kartes, un pēc tam šeit pievienojiet tās grupai.</string>
|
||||
<string name="options">Parametri</string>
|
||||
<plurals name="groupCardCount">
|
||||
<item quantity="zero"><xliff:g>%d</xliff:g> kartes</item>
|
||||
<item quantity="one"><xliff:g>%d</xliff:g> karte</item>
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> kartes</item>
|
||||
</plurals>
|
||||
<plurals name="deleteCardsTitle">
|
||||
<item quantity="zero">Dzēst <xliff:g>%d</xliff:g> kartes</item>
|
||||
<item quantity="one">Dzēst <xliff:g>%d</xliff:g> karti</item>
|
||||
<item quantity="other">Dzēst <xliff:g>%d</xliff:g> kartes</item>
|
||||
</plurals>
|
||||
<string name="updateBarcodeQuestionText">Jūs izmainījāt numuru. Vai vēlaties arī atjaunināt svītrkodu ar tādu pašu vērtību\?</string>
|
||||
<string name="updateBarcodeQuestionTitle">Atjaunināt svītrkoda vērtību\?</string>
|
||||
<string name="yes">Jā</string>
|
||||
<string name="no">Nē</string>
|
||||
<string name="settings_system_locale">Sistēmas</string>
|
||||
<string name="include_if_asking_support">Ja vēlaties lūgt atbalstu, lūdzu iekļaujiet sekojošo informāciju:</string>
|
||||
<string name="card_ids_copied">Kopētie numuri</string>
|
||||
<string name="barcodeImageDescriptionWithType"><xliff:g>%s</xliff:g> svītrkoda attēls</string>
|
||||
<string name="privacy_policy">Privātuma politika</string>
|
||||
<string name="accept">Apstiprināt</string>
|
||||
<string name="editGroup">Grupas rediģēšana: <xliff:g>%s</xliff:g></string>
|
||||
<string name="settings_brown_theme">Brūna</string>
|
||||
<string name="copy_to_clipboard">Kopēt kartes numuru starpliktuvē</string>
|
||||
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Autortiesības © 2019–<xliff:g>%d</xliff:g> Sylvia van Os</string>
|
||||
<string name="app_copyright_old">Balstīta uz Loyalty Card Keychain
|
||||
\nautortiesības © 2016–2020 Branden Archer</string>
|
||||
<string name="debug_version_fmt">Versija: <xliff:g id="version">%s</xliff:g></string>
|
||||
<string name="app_libraries">Brīvas trešo pušu programmatūras bibliotēkas: <xliff:g id="app_libraries_list">%s</xliff:g></string>
|
||||
<string name="app_resources">Brīvi trešo pušu resursi: <xliff:g id="app_resources_list">%s</xliff:g></string>
|
||||
<string name="settings_card_orientation">Svītrkoda orientācija</string>
|
||||
<string name="settings_follow_system_orientation">Pēc sistēmas</string>
|
||||
<string name="settings_portrait_orientation">Portreta</string>
|
||||
<string name="settings_landscape_orientation">Ainavas</string>
|
||||
<string name="settings_lock_on_opening_orientation">Ievērot to orientāciju, kādā karte atvērta</string>
|
||||
<string name="enter_group_name">Ievadiet grupas nosaukumu</string>
|
||||
<string name="groups">Grupas</string>
|
||||
<string name="group_edit">Rediģēt grupu</string>
|
||||
<string name="group_name_already_in_use">Jau ir grupa ar šādu nosaukumu</string>
|
||||
<string name="group_name_is_empty">Grupas nosaukums nevar būt tukšs</string>
|
||||
<string name="group_updated">Grupa atjaunināta</string>
|
||||
<string name="addManually">Ievadīt numuru manuāli</string>
|
||||
<string name="groupsList">Grupas: <xliff:g>%s</xliff:g></string>
|
||||
<string name="expiryStateSentence">Derīguma termiņš: <xliff:g>%s</xliff:g></string>
|
||||
<string name="balanceSentence">Bilance: <xliff:g>%s</xliff:g></string>
|
||||
<string name="editBarcode">Rediģēt svītrkodu</string>
|
||||
<string name="importCatima">Importēt no Catima</string>
|
||||
<string name="importFidme">Importēt no FidMe</string>
|
||||
<string name="importFidmeMessage">Importam izvēlieties Jūsu <i>fidme-export-request-xxxxxx.zip</i> FidMe eksportēto failu, un pēc tam manuāli precizējiet svītrkodu tipus.
|
||||
\nFailu var izveidot Jūsu FidMe profilā, ejot uz \"Data Protection\" un spiežot \"Extract my data\".</string>
|
||||
<string name="importLoyaltyCardKeychain">Importēt no Loyalty Card Keychain</string>
|
||||
<string name="importStocard">Importēt no Stocard</string>
|
||||
<string name="importStocardMessage">Importam izvēlieties Jūsu <i>***-sync.zip</i> eksporta failu no Stocard.
|
||||
\nFailu var iegūt sūtot e-pastu uz support@stocardapp.com ar pieprasījumu eksportēt Jūsu datus.</string>
|
||||
<string name="importVoucherVault">Importēt no Voucher Vault</string>
|
||||
<string name="importVoucherVaultMessage">Importam izvēlieties Jūsu <i>vouchervault.json</i> failu no Voucher Vault.
|
||||
\nFailu var izveidot spiežot \"Eksportēt\" Voucher Vault lietotnē.</string>
|
||||
<string name="barcodeId">Svītrkoda vērtība</string>
|
||||
<string name="sameAsCardId">Tāpat kā numurs</string>
|
||||
<string name="setBarcodeId">Norādiet svītrkoda vērtību</string>
|
||||
<string name="unsupportedBarcodeType">Šo svītrkoda tipu pagaidām nav iespējams attēlot. Iespējams, nākotnē tas tiks atbalstīts vēlākā lietotnes versijā.</string>
|
||||
<string name="wrongValueForBarcodeType">Šī vērtība nav derīga izvēlētajam svītrkoda tipam</string>
|
||||
<string name="copy_to_clipboard_multiple_toast">Numuri kopēti starpliktuvē</string>
|
||||
<string name="intent_import_card_from_url_share_multiple_text">Vēlos koplietot kartes</string>
|
||||
<string name="frontImageDescription">Priekšas attēls</string>
|
||||
<string name="backImageDescription">Aizmugures attēls</string>
|
||||
<string name="photos">Foto</string>
|
||||
<string name="setFrontImage">Iestatīt priekšas attēlu</string>
|
||||
<string name="setBackImage">Iestatīt aizmugures attēlu</string>
|
||||
<string name="takePhoto">Fotografēt</string>
|
||||
<string name="passwordRequired">Ievadiet paroli</string>
|
||||
<string name="exportPassword">Iestatiet paroli, lai aizsargātu eksporta failu (nav obligāti)</string>
|
||||
<string name="turn_flashlight_on">Ieslēgt zibspuldzi</string>
|
||||
<string name="settings_oled_dark">Tīri melns fons tumšajai tēmai</string>
|
||||
<string name="setIcon">Iestatīt ikonu</string>
|
||||
<string name="settings_theme_color">Tēmas krāsa</string>
|
||||
<string name="settings_violet_theme">Violeta</string>
|
||||
<string name="settings_blue_theme">Zila</string>
|
||||
<string name="settings_grey_theme">Pelēka</string>
|
||||
<string name="sort">Kārtot</string>
|
||||
<string name="showMoreInfo">Rādīt informāciju</string>
|
||||
<string name="hideMoreInfo">Slēpt informāciju</string>
|
||||
<string name="swipeToSwitchImages">Velciet, lai pārslēgtu attēlus; spiediet un turiet lai atvērtu attēlu galerijas lietotnē</string>
|
||||
<string name="sort_by_most_recently_used">Nesen lietotās</string>
|
||||
<string name="unarchive">Atarhivēt</string>
|
||||
<string name="archived">Karte arhivēta</string>
|
||||
<string name="unarchived">Karte atarhivēta</string>
|
||||
<string name="archiveList">Arhīvs</string>
|
||||
<string name="noUnarchivedCardsMessage">Nav atarhivētu karšu</string>
|
||||
<string name="failedLaunchingPhotoPicker">Nevarēja atrast atbalstītu galerijas lietotni</string>
|
||||
<string name="previousCard">Iepriekšējā</string>
|
||||
<string name="nextCard">Nākamā</string>
|
||||
<plurals name="viewArchivedCardsWithCount">
|
||||
<item quantity="zero">Skatīt arhivētu (<xliff:g>%1$d</xliff:g> karti)</item>
|
||||
<item quantity="one">Skatīt arhivētu (<xliff:g>%1$d</xliff:g> karti)</item>
|
||||
<item quantity="other">Skatīt arhivētas (<xliff:g>%1$d</xliff:g> kartes)</item>
|
||||
</plurals>
|
||||
<plurals name="groupCardCountWithArchived">
|
||||
<item quantity="zero"><xliff:g>%1$d</xliff:g> card (<xliff:g id="archivedCount">%2$d</xliff:g> arhivēta)</item>
|
||||
<item quantity="one"><xliff:g>%1$d</xliff:g> card (<xliff:g id="archivedCount">%2$d</xliff:g> arhivēta)</item>
|
||||
<item quantity="other"><xliff:g>%1$d</xliff:g> cards (<xliff:g id="archivedCount">%2$d</xliff:g> arhivētas)</item>
|
||||
</plurals>
|
||||
<string name="failedToOpenUrl">Vispirms nepieciešams uzstādīt interneta pārlūku</string>
|
||||
<string name="welcome">Laipni lūgti Catima</string>
|
||||
</resources>
|
||||
@@ -33,7 +33,6 @@
|
||||
<string name="exportFailed">Kunne ikke utføre eksport</string>
|
||||
<string name="importing">Importerer…</string>
|
||||
<string name="exporting">Exporterer…</string>
|
||||
<string name="noExternalStoragePermissionError">Innvilg lagringstilgang til eksternlager for å importere eller eksportere data</string>
|
||||
<string name="exportOptionExplanation">Data skrives dit du ønsker det.</string>
|
||||
<string name="importOptionFilesystemTitle">Importer fra filsystem</string>
|
||||
<string name="importOptionFilesystemExplanation">Velg spesifikk fil fra filsystemet.</string>
|
||||
@@ -183,7 +182,7 @@
|
||||
<string name="settings_theme_color">Draktfarge</string>
|
||||
<string name="noGroupCards">Denne gruppen er tom</string>
|
||||
<string name="barcodeImageDescriptionWithType">Bilde av <xliff:g>%s</xliff:g>-strekkode</string>
|
||||
<string name="swipeToSwitchImages">Dra eller hold lenge for å bygge bilder</string>
|
||||
<string name="swipeToSwitchImages">Dra for å bytte bilder, hold for å åpne et bilde i galleriet.</string>
|
||||
<string name="sort_by">Sortering</string>
|
||||
<string name="reverse">…i omvendt rekkefølge</string>
|
||||
<string name="sort_by_balance">Saldo</string>
|
||||
@@ -253,4 +252,14 @@
|
||||
<item quantity="one">Vis arkiv (<xliff:g>%1$d</xliff:g> kort)</item>
|
||||
<item quantity="other">Vis arkiv (<xliff:g>%1$d</xliff:g> kort)</item>
|
||||
</plurals>
|
||||
<string name="failedToRetrieveImageFile">Kunne ikke hente bildefil</string>
|
||||
<string name="barcodeLongPressMessage">Kun bilder kan åpnes i galleriet</string>
|
||||
<string name="cameraPermissionDeniedTitle">Fikk ikke tilgang til kameraet</string>
|
||||
<string name="noCameraPermissionDirectToSystemSetting">Catima trenger kameratilgang for å skanne strekkoder. Trykk her for å endre tilgangsinnstillingene.</string>
|
||||
<string name="importCards">Importer kort</string>
|
||||
<string name="currentBalanceSentence">Nåværende saldo: <xliff:g>%s</xliff:g></string>
|
||||
<string name="updateBalanceTitle">Hvor mye brukte du\?</string>
|
||||
<string name="updateBalanceHint">Skriv inn beløp</string>
|
||||
<string name="newBalanceSentence">Ny saldo: <xliff:g>%s</xliff:g></string>
|
||||
<string name="updateBalance">Oppdater saldo</string>
|
||||
</resources>
|
||||
@@ -38,7 +38,6 @@
|
||||
<string name="exportFailed">Het exporteren is mislukt</string>
|
||||
<string name="importing">Bezig met importeren…</string>
|
||||
<string name="exporting">Bezig met exporteren…</string>
|
||||
<string name="noExternalStoragePermissionError">Verleen het recht ‘externe opslag’ om gegevens te kunnen im- of exporteren</string>
|
||||
<string name="exportOptionExplanation">De gegevens worden weggeschreven op een locatie naar keuze.</string>
|
||||
<string name="importOptionFilesystemTitle">Importeren uit bestandssysteem</string>
|
||||
<string name="importOptionFilesystemExplanation">Kies een specifiek bestand van het bestandssysteem.</string>
|
||||
@@ -185,7 +184,7 @@
|
||||
<string name="app_contributors">Mede mogelijk gemaakt door: <xliff:g id="app_contributors">%s</xliff:g></string>
|
||||
<string name="noGroupCards">Deze groep bevat geen kaarten</string>
|
||||
<string name="barcodeImageDescriptionWithType">Afbeelding van barcode <xliff:g>%s</xliff:g></string>
|
||||
<string name="swipeToSwitchImages">Veeg of houd lang ingedrukt om te bladeren</string>
|
||||
<string name="swipeToSwitchImages">Veeg om te bladeren; houd lang ingedrukt om te openen in de galerij-app</string>
|
||||
<string name="sort_by">Sorteren op</string>
|
||||
<string name="reverse">…in omgekeerde volgorde</string>
|
||||
<string name="sort_by_balance">Op saldo</string>
|
||||
@@ -253,4 +252,16 @@
|
||||
<item quantity="one">Archief bekijken (<xliff:g>%1$d</xliff:g> kaart)</item>
|
||||
<item quantity="other">Archief bekijken (<xliff:g>%1$d</xliff:g> kaarten)</item>
|
||||
</plurals>
|
||||
<string name="failedToRetrieveImageFile">De afbeelding kan niet worden opgehaald</string>
|
||||
<string name="barcodeLongPressMessage">Alleen afbeeldingen kunnen worden geopend in de galerij-app</string>
|
||||
<string name="cameraPermissionDeniedTitle">Geen cameratoegang</string>
|
||||
<string name="updateBalanceTitle">Hoeveel heb je uitgegeven\?</string>
|
||||
<string name="noCameraPermissionDirectToSystemSetting">Catima heeft toegang tot je camera nodig om barcodes te kunnen scannen. Druk hier om toegang te verlenen.</string>
|
||||
<string name="currentBalanceSentence">Huidig saldo: <xliff:g>%s</xliff:g></string>
|
||||
<string name="updateBalance">Saldo bijwerken</string>
|
||||
<string name="updateBalanceHint">Voer een bedrag in</string>
|
||||
<string name="newBalanceSentence">Nieuw saldo: <xliff:g>%s</xliff:g></string>
|
||||
<string name="importCards">Kaarten importeren</string>
|
||||
<string name="storageReadPermissionRequired">Toestemming om de opslag uit te lezen benodigd voor deze actie…</string>
|
||||
<string name="cameraPermissionRequired">Toestemming om de camera te openen benodigd voor deze actie…</string>
|
||||
</resources>
|
||||
@@ -24,20 +24,19 @@
|
||||
<string name="noCardsMessage">Najpierw dodaj kartę</string>
|
||||
<string name="noStoreError">Nie wprowadzono nazwy</string>
|
||||
<string name="noCardIdError">Nie wprowadzono identyfikatora</string>
|
||||
<string name="noCardExistsError">Nie można wyszukać karty lojalnościowej</string>
|
||||
<string name="noCardExistsError">Nie można znaleźć tej karty lojalnościowej</string>
|
||||
<string name="failedParsingImportUriError">Nie można przeanalizować identyfikatora importu URI</string>
|
||||
<string name="importExport">Importuj/Eksportuj</string>
|
||||
<string name="exportName">Eksportuj</string>
|
||||
<string name="importExportHelp">Kopie zapasowe umożliwiają przeniesienie kart na inne urządzenie.</string>
|
||||
<string name="importSuccessfulTitle">Zaimportowano</string>
|
||||
<string name="importFailedTitle">Import nie powiódł się</string>
|
||||
<string name="importFailedTitle">Importowanie nie powiodło się</string>
|
||||
<string name="importFailed">Nie udało się zaimportować</string>
|
||||
<string name="exportSuccessfulTitle">Wyeksportowano</string>
|
||||
<string name="exportFailedTitle">Eksport nie powiódł się</string>
|
||||
<string name="exportFailed">Nie udało się wyeksportować</string>
|
||||
<string name="importing">Importowanie…</string>
|
||||
<string name="exporting">Eksportowanie…</string>
|
||||
<string name="noExternalStoragePermissionError">Przyznaj uprawnienia pamięci zewnętrznej, aby importować lub eksportować dane</string>
|
||||
<string name="importOptionFilesystemTitle">Importuj z systemu plików</string>
|
||||
<string name="importOptionFilesystemExplanation">Wybierz określony plik z systemu plików.</string>
|
||||
<string name="importOptionFilesystemButton">Z systemu plików</string>
|
||||
@@ -48,7 +47,7 @@
|
||||
<string name="app_license">Wolne oprogramowanie typu copyleft, na licencji GPLv3+</string>
|
||||
<string name="about_title_fmt">O <xliff:g id="app_name">%s</xliff:g></string>
|
||||
<string name="debug_version_fmt">Wersja: <xliff:g id="version">%s</xliff:g></string>
|
||||
<string name="app_revision_fmt">Info o wydaniu: <xliff:g id="app_revision_url">%s</xliff:g></string>
|
||||
<string name="app_revision_fmt">Informacje o wydaniu: <xliff:g id="app_revision_url">%s</xliff:g></string>
|
||||
<string name="selectBarcodeTitle">Wybierz kod kreskowy</string>
|
||||
<string name="enterBarcodeInstructions">Wprowadź ID, a następnie wybierz typ kodu kreskowego, którego chcesz użyć lub wybierz „Bez kodu kreskowego”.</string>
|
||||
<string name="copy_to_clipboard_toast">Skopiowano ID do schowka</string>
|
||||
@@ -63,12 +62,12 @@
|
||||
<string name="intent_import_card_from_url_share_text">Chcę udostępnić Ci kartę lojalnościową</string>
|
||||
<string name="deleteConfirmationGroup">Usunąć grupę\?</string>
|
||||
<string name="all">Wszystko</string>
|
||||
<string name="noGroups">Kliknij przycisk + plus, aby dodać grupy w celu kategoryzacji.</string>
|
||||
<string name="noGroups">Kliknij przycisk + plus, aby dodać grupy do kategoryzacji.</string>
|
||||
<string name="groups">Grupy</string>
|
||||
<string name="enter_group_name">Wpisz nazwę grupy</string>
|
||||
<string name="exportSuccessful">Dane zostały wyeksportowane</string>
|
||||
<string name="importSuccessful">Zaimportowano dane</string>
|
||||
<string name="starImage">Ulubiona gwiazda</string>
|
||||
<string name="starImage">Gwiazdka ulubionych</string>
|
||||
<string name="app_copyright_old">Na podstawie Loyalty Card Keychain
|
||||
\nWszelkie prawa zastrzeżone © 2016–2020 Branden Archer</string>
|
||||
<string name="exportOptionExplanation">Dane zostaną zapisane w wybranym przez Ciebie miejscu.</string>
|
||||
@@ -206,20 +205,20 @@
|
||||
<string name="report_error">Zgłoś Błąd</string>
|
||||
<string name="setIcon">Ustaw ikonę</string>
|
||||
<string name="on_github">na GitHub\'ie</string>
|
||||
<string name="swipeToSwitchImages">Przeciągnij lub przytrzymaj aby zmienić obraz</string>
|
||||
<string name="swipeToSwitchImages">Przeciągnij aby zmienić obraz, przytrzymaj aby otworzyć obraz w galerii</string>
|
||||
<string name="selectColor">Wybierz kolor</string>
|
||||
<string name="version_history">Historia Wersji</string>
|
||||
<string name="and_data_usage">i wykorzystanie danych</string>
|
||||
<string name="rate_this_app">Oceń tą aplikację</string>
|
||||
<string name="license">Licencja</string>
|
||||
<string name="on_google_play">w Google Play</string>
|
||||
<string name="noGiftCardsGroup">Stwórz karty i przypisz je do grupy w tym miejscu.</string>
|
||||
<string name="noGiftCardsGroup">Stwórz karty i przypisz je do grup w tym miejscu.</string>
|
||||
<string name="reverse">...w odwrotnej kolejności</string>
|
||||
<string name="translate_platform">na Weblate</string>
|
||||
<string name="sort">Sortuj</string>
|
||||
<string name="barcodeImageDescriptionWithType">Obraz kodu kreskowego typu <xliff:g>%s</xliff:g></string>
|
||||
<string name="group_edit">Edytuj Grupę</string>
|
||||
<string name="group_name_already_in_use">Ta nazwa jest już użyta</string>
|
||||
<string name="group_name_already_in_use">Ta nazwa jest już w użytku</string>
|
||||
<string name="group_name_is_empty">Nazwa grupy nie może być pusta</string>
|
||||
<string name="group_updated">Zaktualizowano grupę</string>
|
||||
<string name="editGroup">Edytowanie grupy: <xliff:g>%s</xliff:g></string>
|
||||
@@ -237,7 +236,7 @@
|
||||
<string name="settings_oled_dark">Całkowicie czarne tło dla ciemnego motywu</string>
|
||||
<string name="hideMoreInfo">Ukryj informacje</string>
|
||||
<string name="settings_card_orientation">Orientacja kodu kreskowego</string>
|
||||
<string name="settings_follow_system_orientation">Śledź system</string>
|
||||
<string name="settings_follow_system_orientation">Śledź orientację systemową</string>
|
||||
<string name="set_scale">Ustaw skalę</string>
|
||||
<string name="duplicateCard">Duplikuj</string>
|
||||
<string name="starred">Oznaczone gwiazdką</string>
|
||||
@@ -259,4 +258,22 @@
|
||||
<item quantity="many"><xliff:g>%1$d</xliff:g> kart (<xliff:g id="archivedCount">%2$d</xliff:g> zarchwizowanych)</item>
|
||||
<item quantity="other"><xliff:g>%1$d</xliff:g> kart (<xliff:g id="archivedCount">%2$d</xliff:g> zarchwizowanych)</item>
|
||||
</plurals>
|
||||
<string name="failedToRetrieveImageFile">Nie udało się pobrać pliku obrazu</string>
|
||||
<string name="barcodeLongPressMessage">W galerii możesz otworzyć tylko obrazy</string>
|
||||
<string name="failedToOpenUrl">Najpierw zainstaluj przeglądarkę</string>
|
||||
<string name="welcome">Witaj w Catima</string>
|
||||
<plurals name="viewArchivedCardsWithCount">
|
||||
<item quantity="one">Wyświetl zarchiwizowaną (<xliff:g>%1$d</xliff:g> kartę)</item>
|
||||
<item quantity="few">Wyświetl zarchiwizowane (<xliff:g>%1$d</xliff:g> karty)</item>
|
||||
<item quantity="many">Wyświetl zarchiwizowane (<xliff:g>%1$d</xliff:g> karty)</item>
|
||||
<item quantity="other">Wyświetl zarchiwizowane (<xliff:g>%1$d</xliff:g> karty)</item>
|
||||
</plurals>
|
||||
<string name="currentBalanceSentence">Saldo: <xliff:g>%s</xliff:g></string>
|
||||
<string name="noCameraPermissionDirectToSystemSetting">By zeskanować kody kreskowe, Catima musi mieć dostęp do twojej kamery. Dotknij tutaj by zmienić swoje ustawienia dostępu.</string>
|
||||
<string name="updateBalanceTitle">Ile wydałeś\?</string>
|
||||
<string name="updateBalanceHint">Wpisz sumę</string>
|
||||
<string name="updateBalance">Zaktualizuj balans</string>
|
||||
<string name="cameraPermissionDeniedTitle">Odmówiono dostępu do kamery</string>
|
||||
<string name="newBalanceSentence">Nowe saldo: <xliff:g>%s</xliff:g></string>
|
||||
<string name="importCards">Importuj karty</string>
|
||||
</resources>
|
||||
@@ -12,7 +12,7 @@
|
||||
<string name="cancel">Cancelar</string>
|
||||
<string name="save">Guardar</string>
|
||||
<string name="edit">Editar</string>
|
||||
<string name="noGiftCards">Clique no botão + para adicionar um cartão ou importe um no botão do menu ⋮.</string>
|
||||
<string name="noGiftCards">Clique no botão + para adicionar um cartão ou importe-o no menu ⋮.</string>
|
||||
<string name="noBarcode">Sem código de barras</string>
|
||||
<string name="unstar">Retirar dos favoritos</string>
|
||||
<string name="importOptionFilesystemButton">Do sistema de ficheiros</string>
|
||||
@@ -72,7 +72,6 @@
|
||||
<string name="moveUp">Subir</string>
|
||||
<string name="moveDown">Descer</string>
|
||||
<string name="leaveWithoutSaveTitle">Sair</string>
|
||||
<string name="noExternalStoragePermissionError">Conceda primeiro a autorização de acesso ao armazenamento externo para importar ou exportar dados</string>
|
||||
<string name="importExportHelp">A cópia de segurança dos seus dados permite-lhe movê-los para outro dispositivo.</string>
|
||||
<string name="importSuccessfulTitle">Importado</string>
|
||||
<string name="importFailedTitle">A importação falhou</string>
|
||||
@@ -178,7 +177,7 @@
|
||||
<string name="settings_blue_theme">Azul</string>
|
||||
<string name="app_contributors">Tornado possível por: <xliff:g id="app_contributors">%s</xliff:g></string>
|
||||
<string name="sort">Ordenar</string>
|
||||
<string name="swipeToSwitchImages">Deslize ou pressione prolongadamente para mudar as imagens</string>
|
||||
<string name="swipeToSwitchImages">Deslize para mudar as imagens, toque prolongadamente para abrir na aplicação da galeria</string>
|
||||
<string name="sort_by_name">Nome</string>
|
||||
<string name="sort_by_most_recently_used">Mais usados recentemente</string>
|
||||
<string name="sort_by_expiry">Validade</string>
|
||||
@@ -260,4 +259,16 @@
|
||||
<item quantity="other">Ver arquivo (<xliff:g>%1$d</xliff:g> cartões)</item>
|
||||
</plurals>
|
||||
<string name="welcome">Bem-vindo ao Catima</string>
|
||||
<string name="failedToRetrieveImageFile">Falha ao recuperar o ficheiro de imagem</string>
|
||||
<string name="barcodeLongPressMessage">Apenas imagens podem ser abertas na aplicação de galeria</string>
|
||||
<string name="noCameraPermissionDirectToSystemSetting">Para digitalizar código de barras, o Catima tem de aceder à câmara. Clique aqui para mudar as configurações de permissão.</string>
|
||||
<string name="cameraPermissionDeniedTitle">Não foi possível aceder à câmara</string>
|
||||
<string name="importCards">Importar cartões</string>
|
||||
<string name="currentBalanceSentence">Saldo atual: <xliff:g>%s</xliff:g></string>
|
||||
<string name="newBalanceSentence">Novo saldo: <xliff:g>%s</xliff:g></string>
|
||||
<string name="updateBalance">Atualizar saldo</string>
|
||||
<string name="updateBalanceTitle">Quanto gastou\?</string>
|
||||
<string name="updateBalanceHint">Introduza o valor</string>
|
||||
<string name="storageReadPermissionRequired">É necessária a permissão para ler o armazenamento para esta ação…</string>
|
||||
<string name="cameraPermissionRequired">É necessária a permissão para aceder à câmara para esta ação…</string>
|
||||
</resources>
|
||||
@@ -4,7 +4,7 @@
|
||||
<string name="cardId">Cardului ID</string>
|
||||
<string name="note">Notă</string>
|
||||
<string name="storeName">Numele</string>
|
||||
<string name="noMatchingGiftCards">Nu am găsit nimic. Încearcă să schimbi căutarea.</string>
|
||||
<string name="noMatchingGiftCards">Nu au fost găsite rezultate. Încercați să schimbați termenii de căutare.</string>
|
||||
<string name="noGiftCards">Faceți clic pe butonul + plus pentru a adăuga o carte sau importați mai întâi câteva din meniul ⋮.</string>
|
||||
<string name="action_add">Adăugați</string>
|
||||
<string name="action_search">Căutare</string>
|
||||
@@ -21,13 +21,13 @@
|
||||
<string name="unstar">Eliminați din favorite</string>
|
||||
<string name="star">Adaugă la favorite</string>
|
||||
<string name="noBarcode">Fără cod de bare</string>
|
||||
<string name="barcodeNoBarcode">Acest card nu are cod de bare</string>
|
||||
<string name="barcodeNoBarcode">Nu există cod de bare</string>
|
||||
<string name="moveDown">Mutarea în jos</string>
|
||||
<string name="card">Cardul</string>
|
||||
<string name="settings_theme">Tema</string>
|
||||
<string name="all">Toate</string>
|
||||
<string name="noCardsMessage">Adăugați mai întâi o carte</string>
|
||||
<string name="noCardExistsError">Nu a putut găsi cardul</string>
|
||||
<string name="noCardExistsError">Acel card nu a putut fi găsit</string>
|
||||
<string name="failedParsingImportUriError">Nu s-a putut analiza URI-ul de import</string>
|
||||
<string name="importExport">Importație/Export</string>
|
||||
<string name="exportName">Exportați</string>
|
||||
@@ -38,7 +38,6 @@
|
||||
<string name="exportFailed">Nu s-a putut exporta carduri</string>
|
||||
<string name="importing">Importul…</string>
|
||||
<string name="exporting">Exportul…</string>
|
||||
<string name="noExternalStoragePermissionError">Acordați mai întâi permisiunea de stocare externă pentru a importa sau exporta carduri</string>
|
||||
<string name="exportOptionExplanation">Datele vor fi scrise într-o locație aleasă de dumneavoastră.</string>
|
||||
<string name="importOptionFilesystemTitle">Import din sistemul de fișiere</string>
|
||||
<string name="importOptionApplicationTitle">Utilizați o altă aplicație</string>
|
||||
@@ -88,12 +87,23 @@
|
||||
<string name="errorReadingImage">Nu s-a putut citi imaginea</string>
|
||||
<string name="points">Puncte</string>
|
||||
<string name="cardShortcut">Scurtătură de card</string>
|
||||
<string name="scanCardBarcode">Scanarea codului de bare al cardului</string>
|
||||
<string name="importExportHelp">Copierea de rezervă a cardurilor vă permite să le mutați pe un alt dispozitiv.</string>
|
||||
<string name="scanCardBarcode">Scanați codul de bare</string>
|
||||
<string name="importExportHelp">Copierea de rezervă a datelor vă permite să le mutați pe un alt dispozitiv</string>
|
||||
<string name="exportSuccessfulTitle">Exportată</string>
|
||||
<string name="exportFailedTitle">Export eșuat</string>
|
||||
<string name="importOptionFilesystemExplanation">Alegeți un anumit fișier din sistemul de fișiere.</string>
|
||||
<string name="importOptionApplicationButton">Utilizați o altă aplicație</string>
|
||||
<string name="thumbnailDescription">Miniatură pentru card</string>
|
||||
<string name="enter_group_name">Introduceți numele grupului</string>
|
||||
<string name="yes">Da</string>
|
||||
<string name="no">Nu</string>
|
||||
<string name="archive">Arhivați</string>
|
||||
<string name="archiveList">Arhivă</string>
|
||||
<string name="passwordRequired">Vă rugăm, introduceți parola</string>
|
||||
<string name="unsupportedBarcodeType">Acest tip de cod de bare nu poate fi afișat. Este posibil ca acesta să se poată afișa într-o versiune mai nouă a aplicației.</string>
|
||||
<string name="photos">Imagini</string>
|
||||
<string name="noGiftCardsGroup">Adăugați câteva carduri, iar apoi atribuiți-le grupului aici.</string>
|
||||
<string name="importCatima">Importați din Catima</string>
|
||||
<string name="importStocard">Importați din Stocard</string>
|
||||
<string name="intent_import_card_from_url_share_multiple_text">Aș dori să partajez niște carduri cu tine</string>
|
||||
</resources>
|
||||
@@ -38,7 +38,6 @@
|
||||
<string name="exportFailed">Невозможно выполнить экспорт</string>
|
||||
<string name="importing">Импорт…</string>
|
||||
<string name="exporting">Экспорт…</string>
|
||||
<string name="noExternalStoragePermissionError">Импорт или экспорт данных невозможен без разрешения на доступ к хранилищу</string>
|
||||
<string name="exportOptionExplanation">Данные будут записаны в выбранное место.</string>
|
||||
<string name="importOptionFilesystemTitle">Импорт из файловой системы</string>
|
||||
<string name="importOptionFilesystemExplanation">Выберете файл на файловой системе.</string>
|
||||
@@ -193,7 +192,7 @@
|
||||
<string name="app_contributors">Создано при поддержке: <xliff:g id="app_contributors">%s</xliff:g></string>
|
||||
<string name="noGroupCards">Группа пуста</string>
|
||||
<string name="barcodeImageDescriptionWithType">Изображение штрих-кода <xliff:g>%s</xliff:g></string>
|
||||
<string name="swipeToSwitchImages">Смахивание или долгое нажатие для переключения изображений</string>
|
||||
<string name="swipeToSwitchImages">Смахивание переключает изображения, долгое нажатие открывает в приложении галереи</string>
|
||||
<string name="sort_by_expiry">Срок действия</string>
|
||||
<string name="sort_by">Сортировать по</string>
|
||||
<string name="reverse">…в обратном порядке</string>
|
||||
@@ -267,4 +266,16 @@
|
||||
<item quantity="many">Просмотр архива (<xliff:g>%1$d</xliff:g> карт)</item>
|
||||
<item quantity="other">Просмотр архива (<xliff:g>%1$d</xliff:g> карт)</item>
|
||||
</plurals>
|
||||
<string name="failedToRetrieveImageFile">Невозможно получить файл изображения</string>
|
||||
<string name="barcodeLongPressMessage">В приложении галереи можно открывать только изображения</string>
|
||||
<string name="noCameraPermissionDirectToSystemSetting">Для сканирования штрих-кодов Catima требуется доступ к камере устройства. Нажмите здесь, чтобы изменить настройки разрешений.</string>
|
||||
<string name="updateBalance">Обновить баланс</string>
|
||||
<string name="newBalanceSentence">Новый баланс: <xliff:g>%s</xliff:g></string>
|
||||
<string name="currentBalanceSentence">Текущий баланс: <xliff:g>%s</xliff:g></string>
|
||||
<string name="cameraPermissionDeniedTitle">Камера недоступна</string>
|
||||
<string name="updateBalanceHint">Введите сумму</string>
|
||||
<string name="updateBalanceTitle">Какое изменение\?</string>
|
||||
<string name="importCards">Импорт карт</string>
|
||||
<string name="storageReadPermissionRequired">Для этого действия необходимо разрешение на чтение хранилища…</string>
|
||||
<string name="cameraPermissionRequired">Для этого действия необходимо разрешение на доступ к камере…</string>
|
||||
</resources>
|
||||
@@ -32,7 +32,6 @@
|
||||
<string name="exportFailed">Zlyhal export</string>
|
||||
<string name="importing">Importujem…</string>
|
||||
<string name="exporting">Exportujem…</string>
|
||||
<string name="noExternalStoragePermissionError">Nie je možné importovať a exportovať karty bez prístupu k externému úložisku</string>
|
||||
<string name="importOptionFilesystemTitle">Import zo súborového systému</string>
|
||||
<string name="importOptionFilesystemExplanation">Vyberte súbor zo súborového systému.</string>
|
||||
<string name="importOptionFilesystemButton">Zo súborového systému</string>
|
||||
@@ -205,4 +204,5 @@
|
||||
<string name="passwordRequired">Zadajte prosím heslo</string>
|
||||
<string name="parsingBalanceFailed"><xliff:g>%s</xliff:g> sa nezdá byť platným zostatkom.</string>
|
||||
<string name="noGiftCardsGroup">Zatiaľ nemáte žiadne vernostné karty. Keď nejaké pridáte, môžete ich priradiť ku skupine tu.</string>
|
||||
<string name="noCameraPermissionDirectToSystemSetting"></string>
|
||||
</resources>
|
||||
@@ -1,8 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
|
||||
<string name="action_add">Dodaj</string>
|
||||
<string name="noGiftCards">Trenutno nimate shranjene nobene kartice zvestobe. Kliknite \"+\" (plus) na vrhu, da jih dodate.\n\n Aplikacija Kartice zvestobe Vam omogoča, da imate kartice zvestobe shranjene na Vašem telefonu in vedno v dosegu roke.</string>
|
||||
<string name="storeName">Shrani</string>
|
||||
<string name="noGiftCards">Pritisnite gumb + za dodajanje nove kartice ali gumb⋮v meniju za uvoz baze kartic iz datoteke.</string>
|
||||
<string name="storeName">Ime</string>
|
||||
<string name="note">Zabeležka</string>
|
||||
<string name="cardId">Št. kartice</string>
|
||||
<string name="cancel">Prekliči</string>
|
||||
@@ -18,35 +18,34 @@
|
||||
<string name="scanCardBarcode">Skeniraj črtno kodo</string>
|
||||
<string name="cardShortcut">Bližnjica do kartice</string>
|
||||
<string name="noCardsMessage">Najprej dodajte kartico</string>
|
||||
<string name="noStoreError">Ime trgovine ni bilo vnešeno</string>
|
||||
<string name="noCardIdError">Številka kartice ni bila vnešena</string>
|
||||
<string name="noCardExistsError">Te kartice zvestobe ni bilo moč najti</string>
|
||||
<string name="noStoreError">Ime ni bilo vnešeno</string>
|
||||
<string name="noCardIdError">ID številka kartice ni bila vnešena</string>
|
||||
<string name="noCardExistsError">Te kartice zvestobe ni bilo mogoče najti</string>
|
||||
<string name="importExport">Uvozi/izvozi</string>
|
||||
<string name="exportName">Izvozi</string>
|
||||
<string name="importExportHelp">Varnostna kopija omogoča varen prenos kartic na druge naprave.</string>
|
||||
<string name="importExportHelp">Varnostna kopija podatkovne baze kartic zvestobe omogoča prenos baze kartic tudi na drugo napravo.</string>
|
||||
<string name="importSuccessfulTitle">Uvoz je bil uspešen</string>
|
||||
<string name="importFailedTitle">Uvoz ni uspel</string>
|
||||
<string name="importFailed">Napaka pri uvozu</string>
|
||||
<string name="importFailed">Napaka pri uvozu baze</string>
|
||||
<string name="exportSuccessfulTitle">Izvoz je uspel</string>
|
||||
<string name="exportFailedTitle">Izvoz ni uspel</string>
|
||||
<string name="exportFailed">Napaka pri izvozu</string>
|
||||
<string name="exportFailed">Napaka pri izvozu baze</string>
|
||||
<string name="importing">Uvažanje…</string>
|
||||
<string name="exporting">Izvažanje…</string>
|
||||
<string name="noExternalStoragePermissionError">Izvažanje in uvažanje je nemogoče brez omogočenega dostopa do zunanje shrambe</string>
|
||||
<string name="importOptionFilesystemTitle">Uvozi iz datotečnega sistema</string>
|
||||
<string name="importOptionFilesystemExplanation">Izberite specifično datoteko iz datotečnega sistema.</string>
|
||||
<string name="importOptionFilesystemButton">Iz datotečnega sistema</string>
|
||||
<string name="importOptionApplicationTitle">Uporabi zunanjo aplikacijo</string>
|
||||
<string name="importOptionApplicationTitle">Uporabi drugo aplikacijo</string>
|
||||
<string name="importOptionApplicationExplanation">Uporabi zunanjo aplikacijo, kot npr. Dropbox, Google Drive ali ostale upravljalnike datotek, za odpiranje datoteke.</string>
|
||||
<string name="importOptionApplicationButton">Uporabi zunanjo aplikacijo</string>
|
||||
<string name="importOptionApplicationButton">Uporabi drugo aplikacijo</string>
|
||||
<string name="about">Več o aplikaciji</string>
|
||||
<string name="app_license">Licencirano s skladu z GPLv3.</string>
|
||||
<string name="app_license">Odprtokodna programska oprema, licencirana skladno s GPL3+</string>
|
||||
<string name="about_title_fmt">Več o <xliff:g id="app_name">%s</xliff:g></string>
|
||||
<string name="debug_version_fmt">Verzija: <xliff:g id="version">%s</xliff:g></string>
|
||||
<string name="app_revision_fmt">Informacije o popravkih: <xliff:g id="app_revision_url">%s</xliff:g></string>
|
||||
<string name="selectBarcodeTitle">Izberite črtno kodo</string>
|
||||
<string name="copy_to_clipboard_toast">Številka kartice je bila kopirana v odložišče</string>
|
||||
<string name="thumbnailDescription">Ikona kartice</string>
|
||||
<string name="copy_to_clipboard_toast">ID številka je kopirana v odložišče</string>
|
||||
<string name="thumbnailDescription">Sličica</string>
|
||||
<string name="settings">Nastavitve</string>
|
||||
<string name="settings_category_title_ui">Uporabniški vmesnik</string>
|
||||
<string name="settings_display_barcode_max_brightness">Povečaj osvetljenost prikaza črtne kode</string>
|
||||
@@ -54,7 +53,7 @@
|
||||
<string name="deleteConfirmation">Prosim potrdite, če želite izbrisati to kartico\?</string>
|
||||
<string name="card">Kartica</string>
|
||||
<string name="addFromImage">Izberite sliko iz galerije</string>
|
||||
<string name="addManually">Ročno vnesite št. kartice</string>
|
||||
<string name="addManually">Ročno vnesite ID kartice</string>
|
||||
<string name="leaveWithoutSaveConfirmation">Zapustite brez shranjevanja\?</string>
|
||||
<string name="leaveWithoutSaveTitle">Izhod</string>
|
||||
<string name="moveDown">Premikanje navzdol</string>
|
||||
@@ -62,33 +61,34 @@
|
||||
<string name="failedOpeningFileManager">Najprej namestite upravitelja datotek.</string>
|
||||
<string name="deleteConfirmationGroup">Brisanje skupine\?</string>
|
||||
<string name="all">Vse</string>
|
||||
<string name="noGroupCards">Ta skupina ne vsebuje kartic</string>
|
||||
<string name="noGroups">Kliknite gumb + plus, če želite najprej dodati skupine za kategorizacijo.</string>
|
||||
<string name="noGroupCards">Ta skupina je prazna</string>
|
||||
<string name="noGroups">Pritisnite gumb \"+\", če želite dodati skupine za kategorizacijo.</string>
|
||||
<string name="groups">Skupine</string>
|
||||
<string name="enter_group_name">Vnesite ime skupine</string>
|
||||
<string name="exportSuccessful">Izvoženi podatki o karticah</string>
|
||||
<string name="importSuccessful">Uvoženi podatki o karticah</string>
|
||||
<string name="exportSuccessful">Podatkovna baza izvožena</string>
|
||||
<string name="importSuccessful">Podatkovna baza uvožena</string>
|
||||
<string name="intent_import_card_from_url_share_text">Z vami želim deliti kartico</string>
|
||||
<string name="settings_disable_lockscreen_while_viewing_card">Preprečitev zaklepanja zaslona</string>
|
||||
<string name="settings_disable_lockscreen_while_viewing_card">Prepreči zaklepanje zaslona</string>
|
||||
<string name="settings_keep_screen_on">Ohranite zaslon vklopljen</string>
|
||||
<string name="enterBarcodeInstructions">Vnesite ID kartice in spodaj izberite vrsto črtne kode ali \"Ta kartica nima črtne kode\".</string>
|
||||
<string name="enterBarcodeInstructions">Vnesite ID kartice in spodaj izberite vrsto črtne kode ali izbiro \"Ta kartica nima črtne kode\".</string>
|
||||
<string name="settings_max_font_size_scale">Največja velikost pisave</string>
|
||||
<string name="settings_dark_theme">Temno</string>
|
||||
<string name="settings_light_theme">Svetlo</string>
|
||||
<string name="settings_system_theme">Sistem</string>
|
||||
<string name="settings_theme">Tema</string>
|
||||
<string name="starImage">Zvezdica za priljubljene</string>
|
||||
<string name="app_copyright_old">Na podlagi aplikacije Loyalty Card Keychain copyright © 2016-2020 Branden Archer.</string>
|
||||
<string name="app_copyright_old">Bazira na podlagi aplikacije Loyalty Card Keychain
|
||||
\ncopyright © 2016-2020 Branden Archer</string>
|
||||
<string name="exportOptionExplanation">Podatki bodo zapisani na izbrano mesto.</string>
|
||||
<string name="failedParsingImportUriError">Ni bilo mogoče razčleniti URI uvoza</string>
|
||||
<string name="card_ids_copied">Kopirana kartica ID(s)</string>
|
||||
<string name="card_ids_copied">Kopirana ID številka kartice</string>
|
||||
<string name="share">Delite</string>
|
||||
<string name="unstar">Odstrani iz priljubljenih</string>
|
||||
<string name="star">Dodaj med priljubljene</string>
|
||||
<string name="noBarcode">Brez črtne kode</string>
|
||||
<string name="barcodeNoBarcode">Ta kartica nima črtne kode</string>
|
||||
<string name="barcodeNoBarcode">Ni črtne kode</string>
|
||||
<string name="barcodeType">Vrsta črtne kode</string>
|
||||
<string name="noMatchingGiftCards">Ničesar nisem našel. Poskusite spremeniti iskanje.</string>
|
||||
<string name="noMatchingGiftCards">Brez rezultata iskanja. Poskusite spremeniti iskalni niz.</string>
|
||||
<string name="action_search">Iskanje</string>
|
||||
<string name="exportPasswordHint">Vnesite geslo</string>
|
||||
<string name="exportPassword">Izberite geslo za zaščito izvoza (neobvezno)</string>
|
||||
@@ -105,10 +105,10 @@
|
||||
<string name="settings_theme_color">Barva teme</string>
|
||||
<string name="settings_system_locale">Sistem</string>
|
||||
<string name="settings_locale">Jezik</string>
|
||||
<string name="barcodeImageDescriptionWithType">Slika črtne kode tipa <xliff:g>%s</xliff:g></string>
|
||||
<string name="swipeToSwitchImages">Povlecite ali dolgo pritisnite da zamenjate slike</string>
|
||||
<string name="barcodeImageDescriptionWithType">Slika <xliff:g>%s</xliff:g> črtna koda</string>
|
||||
<string name="swipeToSwitchImages">Povlecite za zamenjavo slike ali dolgo pritisnite, da odprete sliko v aplikaciji za gledanje slik</string>
|
||||
<string name="sort_by">Razvrsti po</string>
|
||||
<string name="reverse">Obratno</string>
|
||||
<string name="reverse">...v obratnem vrstnem redu</string>
|
||||
<string name="sort_by_balance">Stanje</string>
|
||||
<string name="sort_by_expiry">Potek</string>
|
||||
<string name="sort_by_most_recently_used">Nazadnje uporabljene</string>
|
||||
@@ -127,7 +127,7 @@
|
||||
<string name="errorReadingImage">Slike ni bilo mogoče prebrati</string>
|
||||
<string name="noBarcodeFound">Črtna koda ni bila najdena</string>
|
||||
<string name="balanceSentence">Stanje: <xliff:g>%s</xliff:g></string>
|
||||
<string name="chooseImportType">Uvoz iz?</string>
|
||||
<string name="chooseImportType">Uvozi podatke iz</string>
|
||||
<string name="importCatima">Izvoz iz aplikacije Catima</string>
|
||||
<string name="importStocard">Izvoz iz aplikacije Stocard</string>
|
||||
<string name="importVoucherVault">Izvoz iz aplikacije Voucher Vault</string>
|
||||
@@ -138,23 +138,142 @@
|
||||
<string name="accept">Sprejmi</string>
|
||||
<string name="importLoyaltyCardKeychain">Uvoz iz aplikacije Loyalty Card Keychain</string>
|
||||
<string name="barcodeId">Vsebina črtne kode</string>
|
||||
<string name="sameAsCardId">Enaka kot številka kartice</string>
|
||||
<string name="sameAsCardId">Enaka kot ID kartice</string>
|
||||
<string name="setBarcodeId">Nastavi vsebino črtne kode</string>
|
||||
<string name="wrongValueForBarcodeType">Ta vrednost ni veljavna pri izbranem tipu čtne kode</string>
|
||||
<string name="takePhoto">Naredi fotografijo</string>
|
||||
<string name="intent_import_card_from_url_share_multiple_text">Z vami želim deliti kartice zvestobe</string>
|
||||
<string name="copy_to_clipboard_multiple_toast">Številke kartic kopirane v odložišče</string>
|
||||
<string name="copy_to_clipboard_multiple_toast">ID številke kartic so kopirane v odložišče</string>
|
||||
<string name="importFidme">Uvoz iz aplikacije FidMe</string>
|
||||
<string name="no">Ne</string>
|
||||
<string name="yes">Da</string>
|
||||
<string name="frontImageDescription">Slika sprednje strani</string>
|
||||
<string name="backImageDescription">Slika zadnje strani</string>
|
||||
<string name="frontImageDescription">Prednja stran</string>
|
||||
<string name="backImageDescription">Zadnja stran</string>
|
||||
<string name="parsingBalanceFailed"><xliff:g>%s</xliff:g> ni veljavno stanje.</string>
|
||||
<string name="setBackImage">Nastavi sliko sprednje strani</string>
|
||||
<string name="setFrontImage">Nastavi sliko sprednje strani</string>
|
||||
<string name="photos">Fotografije</string>
|
||||
<string name="updateBarcodeQuestionText">Spremenili ste številko kartice. Želite posodobiti tudi črtno kodo na enako vrednost?</string>
|
||||
<string name="updateBarcodeQuestionText">Spremenili ste ID kartice. Želite posodobiti tudi črtno kodo na enako vrednost\?</string>
|
||||
<string name="updateBarcodeQuestionTitle">Posodobi črtno kodo?</string>
|
||||
<string name="removeImage">Odstrani sliko</string>
|
||||
<string name="unsupportedBarcodeType">Te vrste črtne kode aplikacija ne more prikazati. Morda bo to možno v prihodnosti.</string>
|
||||
<string name="shortcutSelectCard">Izberite kartico</string>
|
||||
<string name="starred">Priljubljene</string>
|
||||
<string name="set_scale">Nastavi velikost</string>
|
||||
<string name="include_if_asking_support">Ob zahtevani pomoči podpore je potrebno vključiti naslednje informacije:</string>
|
||||
<plurals name="balancePoints">
|
||||
<item quantity="one"><xliff:g>%s</xliff:g> točka</item>
|
||||
<item quantity="two"><xliff:g>%s</xliff:g> točki</item>
|
||||
<item quantity="few"><xliff:g>%s</xliff:g> točke</item>
|
||||
<item quantity="other"><xliff:g>%s</xliff:g> točk</item>
|
||||
</plurals>
|
||||
<string name="barcode">Črtna koda</string>
|
||||
<string name="editBarcode">Uredi črtno kodo</string>
|
||||
<string name="group_edit">Uredi skupino</string>
|
||||
<string name="never">Nikoli</string>
|
||||
<string name="importCards">Uvozite kartice</string>
|
||||
<string name="currentBalanceSentence">Trenutno stanje: <xliff:g>%s</xliff:g></string>
|
||||
<string name="newBalanceSentence">Novo stanje: <xliff:g>%s</xliff:g></string>
|
||||
<string name="app_loyalty_card_keychain">Loyalty Card Keychain</string>
|
||||
<plurals name="selectedCardCount">
|
||||
<item quantity="one"><xliff:g>%d</xliff:g> izbrana</item>
|
||||
<item quantity="two"><xliff:g>%d</xliff:g> izbrani</item>
|
||||
<item quantity="few"><xliff:g>%d</xliff:g> izbrane</item>
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> izbranih</item>
|
||||
</plurals>
|
||||
<string name="settings_card_orientation">Orientacija črtne kode</string>
|
||||
<string name="settings_follow_system_orientation">Sledi sistemu</string>
|
||||
<string name="settings_portrait_orientation">Podoba</string>
|
||||
<string name="settings_landscape_orientation">Pokrajina</string>
|
||||
<string name="settings_lock_on_opening_orientation">Ohrani usmerjenost uporabljeno pri odpiranju kartice</string>
|
||||
<string name="setIcon">Nastavite ikono</string>
|
||||
<string name="showMoreInfo">Prikaži informacije</string>
|
||||
<string name="hideMoreInfo">Skrij informacije</string>
|
||||
<string name="updateBalance">Posodobi stanje</string>
|
||||
<string name="failedToRetrieveImageFile">Slikovne datoteke ni bilo mogoče pridobiti</string>
|
||||
<string name="credits">Zasluge</string>
|
||||
<string name="action_show_details">Prikaži podrobnosti</string>
|
||||
<string name="translate_platform">na Weblate-u</string>
|
||||
<string name="options">Možnosti</string>
|
||||
<string name="duplicateCard">Podvoji</string>
|
||||
<string name="archive">Arhiviraj</string>
|
||||
<string name="unarchive">Odpakiraj arhiv</string>
|
||||
<string name="archived">Karta arhivirana</string>
|
||||
<string name="unarchived">Kartica ni arhivirana</string>
|
||||
<string name="archiveList">Arhiv</string>
|
||||
<string name="noUnarchivedCardsMessage">Ne obstajajo ne arhivirane kartice</string>
|
||||
<string name="failedLaunchingPhotoPicker">Ni mogoče najti podprte aplikacije za gledanje slik</string>
|
||||
<string name="previousCard">Prejšnje</string>
|
||||
<string name="nextCard">Naslednje</string>
|
||||
<string name="updateBalanceTitle">Koliko ste porabili\?</string>
|
||||
<string name="updateBalanceHint">Vpišite vrednost</string>
|
||||
<string name="group_name_already_in_use">Ime skupine je že uporabljeno</string>
|
||||
<string name="group_name_is_empty">Ime skupine ne more biti prazno polje</string>
|
||||
<string name="group_updated">Skupina posodobljena</string>
|
||||
<string name="groupsList">Skupine: <xliff:g>%s</xliff:g></string>
|
||||
<string name="app_libraries">Proste knjižnice tretjih oseb: <xliff:g id="app_libraries_list">%s</xliff:g></string>
|
||||
<string name="app_resources">Prosti viri tretjih oseb: <xliff:g id="app_resources_list">%s</xliff:g></string>
|
||||
<string name="expiryStateSentence">Poteče: <xliff:g>%s</xliff:g></string>
|
||||
<string name="expiryStateSentenceExpired">Poteklo: <xliff:g>%s</xliff:g></string>
|
||||
<string name="expiryDate">Datum poteka veljavnosti</string>
|
||||
<string name="chooseExpiryDate">Izberi datum poteka veljavnosti</string>
|
||||
<string name="moveBarcodeToTopOfScreen">Premakni črtno kodo na vrh zaslona</string>
|
||||
<string name="moveBarcodeToCenterOfScreen">Postavi črtno kodo na sredino zaslona</string>
|
||||
<string name="importCatimaMessage">Izberi svoj obstoječ Catima <i>catima.zip</i> izvoz podatkov za uvoz v aplikacijo.
|
||||
\nNajprej izvozi podatke v meniju \"Uvozi/Izvozi\" v drugi aplikaciji Catima s pritiskom na izbiro izvozi.</string>
|
||||
<string name="importStocardMessage">Izberi svoj <i>***-sync.zip</i> Stocard izvoz podatkov za uvoz.
|
||||
\nIzvoz podatkov dobiš s pošiljanjem elektronske pošte na support@stocardapp.com, kjer povprašaš za izvoz svojih podatkov.</string>
|
||||
<string name="importVoucherVaultMessage">Izberi svoj <i>vouchervault.json</i> Voucher Vault izvoz podatkov za uvoz.
|
||||
\nIzvoz podatkov dobiš s pritiskom na gumb \"Export\" v Voucher Vault first.</string>
|
||||
<string name="failedToOpenUrl">Prvo namestite spletni brskalnik</string>
|
||||
<string name="welcome">Pozdravljeni v Catimi</string>
|
||||
<string name="noGiftCardsGroup">Kreiraj kartice in jim dodeli skupino tukaj.</string>
|
||||
<string name="privacy_policy_popup_text">Obvestilo o politiki zasebnosti (nekatere trgovine aplikacij to zahtevajo):
|
||||
\n
|
||||
\nPODATKI SE NE ZBIRAJO, kar se lahko preveri v programski kodi, saj je aplikacija prosta programska oprema.</string>
|
||||
<plurals name="deleteCardsTitle">
|
||||
<item quantity="one">Izbriši <xliff:g>%d</xliff:g> kartico zvestobe</item>
|
||||
<item quantity="two">Izbriši <xliff:g>%d</xliff:g> kartici zvestobe</item>
|
||||
<item quantity="few">Izbriši <xliff:g>%d</xliff:g> kartice zvestobe</item>
|
||||
<item quantity="other">Izbriši <xliff:g>%d</xliff:g> kartic zvestobe</item>
|
||||
</plurals>
|
||||
<plurals name="deleteCardsConfirmation">
|
||||
<item quantity="one">Izbriši to <xliff:g>%d</xliff:g> kartico zvestobe dokončno\?</item>
|
||||
<item quantity="two">Izbriši ti dve <xliff:g>%d</xliff:g> kartici zvestobe dokončno\?</item>
|
||||
<item quantity="few">Izbriši te <xliff:g>%d</xliff:g> kartice zvestobe dokončno\?</item>
|
||||
<item quantity="other">Izbriši teh <xliff:g>%d</xliff:g> kartic zvestobe dokončno\?</item>
|
||||
</plurals>
|
||||
<string name="cameraPermissionDeniedTitle">Ni bilo mogoče dostopati do kamere</string>
|
||||
<string name="noCameraPermissionDirectToSystemSetting">Catima potrebuje dostop do vaše kamere za skeniranje črtnih kod. Pritisnite tukaj in spremenite nastavitve dovoljenj.</string>
|
||||
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Copyright © 2019–<xliff:g>%d</xliff:g> Sylvia van Os</string>
|
||||
<plurals name="groupCardCount">
|
||||
<item quantity="one"><xliff:g>%d</xliff:g> kartica</item>
|
||||
<item quantity="two"><xliff:g>%d</xliff:g> kartici</item>
|
||||
<item quantity="few"><xliff:g>%d</xliff:g> kartice</item>
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> kartic</item>
|
||||
</plurals>
|
||||
<string name="editGroup">Urejanje skupine: <xliff:g>%s</xliff:g></string>
|
||||
<string name="importFidmeMessage">Izberi svoj <i>fidme-export-request-xxxxxx.zip</i> FidMe izvoz podatkov za uvoz in naknadno ročno izberi tipe črtnih kod.
|
||||
\nFidMe izvoz podatkov naredi v svojem FidMe profilu z izbiro \"Data Protection\" in nato s pritiskom na gumb \"Extract my data first\".</string>
|
||||
<string name="importLoyaltyCardKeychainMessage">Izberi svoj <i>LoyaltyCardKeychain.csv</i> Loyalty Card Keychain izvoz podatkov za uvoz.
|
||||
\nLoyalty Card Keychain izvoz podatkov naredi s pritiskom na gumb \"Import/Export\" v meniju s pritiskom najprej na gumb \"Export\".</string>
|
||||
<string name="failedGeneratingShareURL">URL-ja za skupno rabo ni bilo mogoče ustvariti. Prosim prijavite napako.</string>
|
||||
<string name="settings_oled_dark">Čisto črno ozadje za temno temo</string>
|
||||
<string name="selectColor">Izberite barvo</string>
|
||||
<string name="settings_catima_theme">Catima</string>
|
||||
<string name="app_contributors">Omogočeno od: <xliff:g id="app_contributors">%s</xliff:g></string>
|
||||
<string name="barcodeLongPressMessage">V aplikaciji za gledanje slik lahko odpremo samo slike</string>
|
||||
<string name="action_hide_details">Skrij podrobnosti</string>
|
||||
<plurals name="groupCardCountWithArchived">
|
||||
<item quantity="one"><xliff:g>%1$d</xliff:g> kartica (<xliff:g id="archivedCount">%2$d</xliff:g> arhivirana)</item>
|
||||
<item quantity="two"><xliff:g>%1$d</xliff:g> kartici (<xliff:g id="archivedCount">%2$d</xliff:g> arhivirani)</item>
|
||||
<item quantity="few"><xliff:g>%1$d</xliff:g> kartice (<xliff:g id="archivedCount">%2$d</xliff:g> arhivirane)</item>
|
||||
<item quantity="other"><xliff:g>%1$d</xliff:g> kartic (<xliff:g id="archivedCount">%2$d</xliff:g> arhiviranih)</item>
|
||||
</plurals>
|
||||
<plurals name="viewArchivedCardsWithCount">
|
||||
<item quantity="one">Poglej arhiv (<xliff:g>%1$d</xliff:g> kartice)</item>
|
||||
<item quantity="two">Poglej arhiv (<xliff:g>%1$d</xliff:g> kartic)</item>
|
||||
<item quantity="few">Poglej arhiv (<xliff:g>%1$d</xliff:g> kartic)</item>
|
||||
<item quantity="other">Poglej arhiv (<xliff:g>%1$d</xliff:g> kartic)</item>
|
||||
</plurals>
|
||||
</resources>
|
||||
@@ -171,7 +171,6 @@
|
||||
<string name="note">Anteckning</string>
|
||||
<string name="settings_system_locale">System</string>
|
||||
<string name="settings_locale">Språk</string>
|
||||
<string name="noExternalStoragePermissionError">Bevilja tillstånd för extern lagring för att kunna importera eller exportera data</string>
|
||||
<string name="app_contributors">Möjliggjordes av: <xliff:g id="app_contributors">%s</xliff:g></string>
|
||||
<string name="settings_brown_theme">Brunt</string>
|
||||
<string name="settings_grey_theme">Grått</string>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
|
||||
<string name="swipeToSwitchImages">Resimler arasında geçiş yapmak için kaydırın veya uzun basın</string>
|
||||
<string name="swipeToSwitchImages">Resimler arasında geçiş yapmak için kaydırın, resmi galeri uygulamasında açmak için basılı tutun</string>
|
||||
<string name="app_contributors">Katkıda bulunanlar: <xliff:g id="app_contributors">%s</xliff:g></string>
|
||||
<string name="settings_brown_theme">Kahverengi</string>
|
||||
<string name="settings_grey_theme">Gri</string>
|
||||
@@ -128,7 +128,6 @@
|
||||
<string name="importOptionFilesystemExplanation">Dosya sisteminden belirli bir dosya seçin.</string>
|
||||
<string name="importOptionFilesystemTitle">Dosya sisteminden içe aktar</string>
|
||||
<string name="exportOptionExplanation">Veriler seçtiğiniz bir konuma yazılacak.</string>
|
||||
<string name="noExternalStoragePermissionError">Verileri içeri veya dışarı aktarmak için harici depolama izni verin</string>
|
||||
<string name="exporting">Dışa aktarılıyor…</string>
|
||||
<string name="importing">İçe aktarılıyor…</string>
|
||||
<string name="exportFailed">Dışa aktarma gerçekleştirilemedi</string>
|
||||
@@ -179,7 +178,7 @@
|
||||
<string name="note">Not</string>
|
||||
<string name="storeName">Ad</string>
|
||||
<string name="noMatchingGiftCards">Sonuç yok. Aramanızı değiştirmeyi deneyin.</string>
|
||||
<string name="noGiftCards">Bir kart eklemek için + artı düğmesine tıklayın veya ⋮ menüsünden birkaçını içe aktarın.</string>
|
||||
<string name="noGiftCards">Bir kart eklemek için + artı düğmesine tıklayın veya ⋮ menüsünden içe aktarın.</string>
|
||||
<plurals name="selectedCardCount">
|
||||
<item quantity="one"><xliff:g>%d</xliff:g> seçildi</item>
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> seçildi</item>
|
||||
@@ -253,4 +252,16 @@
|
||||
<item quantity="other">Arşivi görüntüle (<xliff:g>%1$d</xliff:g> kart)</item>
|
||||
</plurals>
|
||||
<string name="welcome">Catima\'ya Hoş Geldiniz</string>
|
||||
<string name="failedToRetrieveImageFile">Resim dosyası alınamadı</string>
|
||||
<string name="barcodeLongPressMessage">Galeri uygulamasında yalnızca resimler açılabilir</string>
|
||||
<string name="noCameraPermissionDirectToSystemSetting">Barkodları taramak için Catima\'nın kameranıza erişmesi gerekecektir. İzin ayarlarınızı değiştirmek için buraya dokunun.</string>
|
||||
<string name="currentBalanceSentence">Geçerli bakiye: <xliff:g>%s</xliff:g></string>
|
||||
<string name="updateBalanceHint">Miktarı girin</string>
|
||||
<string name="updateBalanceTitle">Ne kadar harcadınız\?</string>
|
||||
<string name="newBalanceSentence">Yeni bakiye: <xliff:g>%s</xliff:g></string>
|
||||
<string name="cameraPermissionDeniedTitle">Kameraya erişilemedi</string>
|
||||
<string name="updateBalance">Bakiyeyi güncelle</string>
|
||||
<string name="importCards">Kartları içe aktar</string>
|
||||
<string name="storageReadPermissionRequired">Bu eylem için depolama alanını okuma izni gerekiyor…</string>
|
||||
<string name="cameraPermissionRequired">Bu eylem için kameraya erişim izni gerekiyor…</string>
|
||||
</resources>
|
||||
@@ -2,8 +2,8 @@
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
|
||||
<string name="privacy_policy_popup_text">Політика конфіденційності (вимагається деякими магазинами):
|
||||
\n
|
||||
\nЖОДНОЇ ІНФОРМАЦІЇ НЕ ЗБИРАЄТЬСЯ, що може підтвердити будь-хто, адже наша програма це вільне програмне забезпечення.</string>
|
||||
<string name="noGiftCards">Натисніть + щоб додати карту чи імпортуйте з ⋮ меню.</string>
|
||||
\nЖОДНОЇ ІНФОРМАЦІЇ НЕ ЗБИРАЄТЬСЯ, що може підтвердити будь-хто, адже наш застосунок це вільне програмне забезпечення.</string>
|
||||
<string name="noGiftCards">Натисніть кнопку +, щоб додати картку, або ⋮ для імпорту з меню.</string>
|
||||
<string name="settings_display_barcode_max_brightness">Яскравіший штрих-код</string>
|
||||
<string name="enterBarcodeInstructions">Введіть ID та оберіть тип штрих-коду чи \"Не має штрих-коду\".</string>
|
||||
<string name="selectBarcodeTitle">Оберіть штрих-код</string>
|
||||
@@ -22,7 +22,7 @@
|
||||
<string name="updateBarcodeQuestionText">Ви змінили ID. Чи ви бажаєте оновити штрих-код для використання цього ж значення\?</string>
|
||||
<string name="updateBarcodeQuestionTitle">Оновити значення штрих-коду\?</string>
|
||||
<string name="wrongValueForBarcodeType">Значення не дійсне для обраного типу штрих-коду</string>
|
||||
<string name="unsupportedBarcodeType">Цей тип штрих-коду поки що не відображається. Підтримку може бути додано в подальших версіях програми.</string>
|
||||
<string name="unsupportedBarcodeType">Цей тип штрих-коду поки що не відображається. Підтримку може бути додано в подальших версіях застосунку.</string>
|
||||
<string name="setBarcodeId">Встановіть значення штрих-коду</string>
|
||||
<string name="sameAsCardId">Таке ж як ID</string>
|
||||
<string name="barcodeId">Значення штрих-коду</string>
|
||||
@@ -99,14 +99,13 @@
|
||||
\nавторські права © 2016–2020 Branden Archer</string>
|
||||
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Авторські права © 2019–<xliff:g>%d</xliff:g> Sylvia van Os</string>
|
||||
<string name="about">Про програму</string>
|
||||
<string name="importOptionApplicationButton">Вибір програми</string>
|
||||
<string name="importOptionApplicationExplanation">Використайте іншу програму чи ваш улюблений файл-менеджер для відкриття файлу.</string>
|
||||
<string name="importOptionApplicationTitle">З іншої програми</string>
|
||||
<string name="importOptionApplicationButton">Використовувати інший застосунок</string>
|
||||
<string name="importOptionApplicationExplanation">Використайте інший застосунок чи ваш улюблений файл-менеджер для відкриття файлу.</string>
|
||||
<string name="importOptionApplicationTitle">З іншого застосунку</string>
|
||||
<string name="importOptionFilesystemButton">Обрати файл</string>
|
||||
<string name="importOptionFilesystemExplanation">Оберіть файл у провіднику.</string>
|
||||
<string name="importOptionFilesystemTitle">Імпорт з файлу</string>
|
||||
<string name="exportOptionExplanation">Дані буде записано до локації обраної вами.</string>
|
||||
<string name="noExternalStoragePermissionError">Надайте дозвіл на доступ до пам\'яті пристрою для імпорту/експорту даних</string>
|
||||
<string name="exporting">Експортуємо…</string>
|
||||
<string name="importing">Імпортуємо…</string>
|
||||
<string name="exportFailed">Неможливо здійснити експорт</string>
|
||||
@@ -160,7 +159,7 @@
|
||||
<string name="importStocard">Імпорт із Stocard</string>
|
||||
<plurals name="selectedCardCount">
|
||||
<item quantity="one">Обрано: <xliff:g>%d</xliff:g></item>
|
||||
<item quantity="few">Обрано: <xliff:g>%d</xliff:g></item>
|
||||
<item quantity="few">Обрані: <xliff:g>%d</xliff:g></item>
|
||||
<item quantity="many">Обрано: <xliff:g>%d</xliff:g></item>
|
||||
<item quantity="other">Обрано: <xliff:g>%d</xliff:g></item>
|
||||
</plurals>
|
||||
@@ -193,7 +192,7 @@
|
||||
<string name="app_contributors">Стало можливим завдяки: <xliff:g id="app_contributors">%s</xliff:g></string>
|
||||
<string name="noGroupCards">Пуста група</string>
|
||||
<string name="barcodeImageDescriptionWithType">Зображення штрих-коду <xliff:g>%s</xliff:g></string>
|
||||
<string name="swipeToSwitchImages">Свайп чи довге натискання для зміни зображень</string>
|
||||
<string name="swipeToSwitchImages">Свайп для зміни зображень, довге натискання для перегляду в галереї</string>
|
||||
<string name="sort_by">Сортувати за</string>
|
||||
<string name="reverse">… у зворотному порядку</string>
|
||||
<string name="sort_by_balance">Баланс</string>
|
||||
@@ -202,13 +201,13 @@
|
||||
<string name="sort_by_name">Назва</string>
|
||||
<string name="sort">Сортувати</string>
|
||||
<string name="version_history">Історія версій</string>
|
||||
<string name="help_translate_this_app">Допомогти з перекладом програми</string>
|
||||
<string name="help_translate_this_app">Допомогти з перекладом застосунку</string>
|
||||
<string name="license">Ліцензія</string>
|
||||
<string name="source_repository">Початковий код</string>
|
||||
<string name="on_github">на GitHub</string>
|
||||
<string name="and_data_usage">та використання даних</string>
|
||||
<string name="credits">Подяки</string>
|
||||
<string name="rate_this_app">Оцінити програму</string>
|
||||
<string name="rate_this_app">Оцінити застосунок</string>
|
||||
<string name="on_google_play">у Google Play</string>
|
||||
<string name="report_error">Повідомити про помилку</string>
|
||||
<string name="exportPassword">Встановіть пароль для захисту експорту (необов\'язково)</string>
|
||||
@@ -256,15 +255,27 @@
|
||||
<item quantity="many"><xliff:g>%1$d</xliff:g> карт (<xliff:g id="archivedCount">%2$d</xliff:g> заархівовано)</item>
|
||||
<item quantity="other"><xliff:g>%1$d</xliff:g> карт (<xliff:g id="archivedCount">%2$d</xliff:g> заархівовано)</item>
|
||||
</plurals>
|
||||
<string name="failedLaunchingPhotoPicker">Підтримувану програму галереї не знайдено</string>
|
||||
<string name="failedLaunchingPhotoPicker">Підтримуваний застосунок галереї не знайдено</string>
|
||||
<string name="previousCard">Попередня</string>
|
||||
<string name="nextCard">Наступна</string>
|
||||
<plurals name="viewArchivedCardsWithCount">
|
||||
<item quantity="one">Переглянути архів (<xliff:g>%1$d</xliff:g> картка)</item>
|
||||
<item quantity="few">Переглянути архів (<xliff:g>%1$d</xliff:g> картки)</item>
|
||||
<item quantity="many">Переглянути архів (<xliff:g>%1$d</xliff:g> картки)</item>
|
||||
<item quantity="other">Переглянути архів (<xliff:g>%1$d</xliff:g> картки)</item>
|
||||
<item quantity="many">Переглянути архів (<xliff:g>%1$d</xliff:g> карток)</item>
|
||||
<item quantity="other">Переглянути архів (<xliff:g>%1$d</xliff:g> карток)</item>
|
||||
</plurals>
|
||||
<string name="failedToOpenUrl">Спочатку встановіть браузер</string>
|
||||
<string name="welcome">Ласкаво просимо до Катіма</string>
|
||||
<string name="welcome">Ласкаво просимо до Catima</string>
|
||||
<string name="failedToRetrieveImageFile">Збій доступу до файлу зображення</string>
|
||||
<string name="barcodeLongPressMessage">Галерея може відкривати лише зображення</string>
|
||||
<string name="importCards">Імпорт карток</string>
|
||||
<string name="updateBalanceTitle">Скільки витратили\?</string>
|
||||
<string name="updateBalanceHint">Введіть суму</string>
|
||||
<string name="currentBalanceSentence">Поточний баланс: <xliff:g>%s</xliff:g></string>
|
||||
<string name="newBalanceSentence">Новий баланс: <xliff:g>%s</xliff:g></string>
|
||||
<string name="cameraPermissionDeniedTitle">Не вдалося отримати доступ до камери</string>
|
||||
<string name="noCameraPermissionDirectToSystemSetting">Для сканування штрих-кодів програмі Catima потрібен доступ до вашої камери. Натисніть тут, щоб змінити дозволи.</string>
|
||||
<string name="updateBalance">Оновити баланс</string>
|
||||
<string name="storageReadPermissionRequired">Дозвіл на читання сховища, необхідний для цієї дії…</string>
|
||||
<string name="cameraPermissionRequired">Дозвіл на доступ до камери, необхідний для цієї дії…</string>
|
||||
</resources>
|
||||
@@ -40,7 +40,7 @@
|
||||
\n
|
||||
\n本应用没有收集任何数据,任何人都可以查阅源码来确认,因为本软件是自由软件。</string>
|
||||
<string name="privacy_policy">隐私政策</string>
|
||||
<string name="app_loyalty_card_keychain">Loyalty Card Keychain</string>
|
||||
<string name="app_loyalty_card_keychain">会员卡卡包</string>
|
||||
<string name="chooseImportType">数据导入源</string>
|
||||
<string name="parsingBalanceFailed"><xliff:g>%s</xliff:g>似乎不是有效的余额。</string>
|
||||
<string name="points">积分</string>
|
||||
@@ -94,7 +94,8 @@
|
||||
<string name="importOptionFilesystemExplanation">请从文件系统选择文件.</string>
|
||||
<string name="importOptionFilesystemTitle">从文件系统导入</string>
|
||||
<string name="exportOptionExplanation">导出的数据将储存至你选择的位置.</string>
|
||||
<string name="noExternalStoragePermissionError">在导入导出前需要获得外部储存权限</string>
|
||||
<string name="cameraPermissionDeniedTitle">无法访问相机</string>
|
||||
<string name="noCameraPermissionDirectToSystemSetting">Catima需要访问您的相机来扫描条形码. 轻触这里以更改您的权限设置。</string>
|
||||
<string name="exporting">导出中…</string>
|
||||
<string name="importing">导入中…</string>
|
||||
<string name="exportFailed">无法导出卡片</string>
|
||||
@@ -133,7 +134,7 @@
|
||||
<string name="note">备注</string>
|
||||
<string name="storeName">名称</string>
|
||||
<string name="noMatchingGiftCards">没有结果。尝试改变你的搜索。</string>
|
||||
<string name="noGiftCards">点击 \"+\"加号按钮来添加卡片,或者从⋮ 菜单导入一些。</string>
|
||||
<string name="noGiftCards">点击 \"+\"加号按钮来添加卡片,或者从⋮ 菜单导入。</string>
|
||||
<string name="action_add">添加</string>
|
||||
<string name="action_search">搜索</string>
|
||||
<string name="deleteConfirmation">删除此卡?</string>
|
||||
@@ -199,7 +200,7 @@
|
||||
<string name="sort_by_name">名称</string>
|
||||
<string name="help_translate_this_app">帮助翻译此应用</string>
|
||||
<string name="sort_by_balance">余额</string>
|
||||
<string name="swipeToSwitchImages">滑动或长按来切换图片</string>
|
||||
<string name="swipeToSwitchImages">滑动切换图片,按住打开图库应用中的图片</string>
|
||||
<string name="reverse">倒序</string>
|
||||
<string name="sort_by">排序方式</string>
|
||||
<string name="selectColor">选择颜色</string>
|
||||
@@ -243,4 +244,15 @@
|
||||
<string name="noUnarchivedCardsMessage">没有未归档卡</string>
|
||||
<string name="failedToOpenUrl">先安装一个浏览器</string>
|
||||
<string name="welcome">欢迎使用Catima</string>
|
||||
<string name="updateBalanceHint">输入金额</string>
|
||||
<string name="importCards">导入卡</string>
|
||||
<plurals name="viewArchivedCardsWithCount">
|
||||
<item quantity="other">查看存档(<xliff:g>%1$d</xliff:g> 张卡片)</item>
|
||||
</plurals>
|
||||
<string name="updateBalance">更新余额</string>
|
||||
<string name="updateBalanceTitle">你花了多少钱?</string>
|
||||
<string name="currentBalanceSentence">当前余额:<xliff:g>%s</xliff:g></string>
|
||||
<string name="failedToRetrieveImageFile">无法检索图像文件</string>
|
||||
<string name="newBalanceSentence">新余额:<xliff:g>%s</xliff:g></string>
|
||||
<string name="barcodeLongPressMessage">只能在图库应用程序中打开图像</string>
|
||||
</resources>
|
||||
@@ -161,7 +161,6 @@
|
||||
<string name="scanCardBarcode">掃描條碼</string>
|
||||
<string name="noStoreError">尚未輸入卡片名稱</string>
|
||||
<string name="importExportHelp">備份您的資料以將其轉移至其他裝置中。</string>
|
||||
<string name="noExternalStoragePermissionError">在匯入及匯出資料前,請先允許外部儲存裝置存取權限</string>
|
||||
<string name="importOptionFilesystemTitle">自檔案系統中匯入</string>
|
||||
<string name="importOptionFilesystemExplanation">自檔案系統中選取檔案。</string>
|
||||
<string name="importOptionFilesystemButton">自檔案系統</string>
|
||||
@@ -224,4 +223,28 @@
|
||||
<string name="set_scale">設定大小</string>
|
||||
<string name="include_if_asking_support">如果您想請求協助,請附上以下訊息:</string>
|
||||
<string name="settings_card_orientation">條碼方向</string>
|
||||
<string name="failedToRetrieveImageFile">無法擷取圖片檔案</string>
|
||||
<string name="barcodeLongPressMessage">圖庫應用程式僅可開啟圖片</string>
|
||||
<string name="duplicateCard">重複</string>
|
||||
<string name="archive">封存</string>
|
||||
<string name="unarchive">解除封存</string>
|
||||
<string name="archived">卡片已封存</string>
|
||||
<string name="unarchived">卡片已解除封存</string>
|
||||
<plurals name="groupCardCountWithArchived">
|
||||
<item quantity="other"><xliff:g>%1$d</xliff:g> 張卡片 (<xliff:g id="archivedCount">%2$d</xliff:g> 張已封存)</item>
|
||||
</plurals>
|
||||
<string name="settings_portrait_orientation">直向</string>
|
||||
<string name="settings_follow_system_orientation">跟隨系統</string>
|
||||
<string name="settings_landscape_orientation">橫向</string>
|
||||
<string name="failedToOpenUrl">先安裝網頁瀏覽器</string>
|
||||
<string name="archiveList">封存</string>
|
||||
<string name="failedLaunchingPhotoPicker">無法找到支援的圖庫應用程式</string>
|
||||
<string name="previousCard">上一張</string>
|
||||
<string name="noUnarchivedCardsMessage">沒有已封存的卡片</string>
|
||||
<string name="nextCard">下一張</string>
|
||||
<string name="welcome">歡迎使用 Catima</string>
|
||||
<plurals name="viewArchivedCardsWithCount">
|
||||
<item quantity="other">檢視封存 (<xliff:g>%1$d</xliff:g> 張卡片)</item>
|
||||
</plurals>
|
||||
<string name="settings_lock_on_opening_orientation">開啟卡片時鎖定的方向</string>
|
||||
</resources>
|
||||
@@ -32,7 +32,10 @@
|
||||
|
||||
<dimen name="activity_margin_small">8dp</dimen>
|
||||
<dimen name="activity_margin">16dp</dimen>
|
||||
|
||||
<!-- Padding for layouts-->
|
||||
<dimen name="activity_scanner_padding">10dp</dimen>
|
||||
<dimen name="alert_dialog_content_padding">@dimen/mtrl_alert_dialog_picker_background_inset</dimen>
|
||||
<dimen name="alert_dialog_title_padding">8dp</dimen>
|
||||
<!-- The default letter tile text size -->
|
||||
<dimen name="tileLetterFontSize">66sp</dimen>
|
||||
<dimen name="tileLetterFontSizeForShortcut">48dp</dimen>
|
||||
|
||||
@@ -62,6 +62,7 @@
|
||||
<item />
|
||||
<item>ar</item>
|
||||
<item>bg</item>
|
||||
<item>bn</item>
|
||||
<item>bn-rIN</item>
|
||||
<item>bs</item>
|
||||
<item>cs</item>
|
||||
@@ -76,8 +77,11 @@
|
||||
<item>fi</item>
|
||||
<item>fr</item>
|
||||
<item>he-rIL</item>
|
||||
<item>hi</item>
|
||||
<item>hr</item>
|
||||
<item>hu</item>
|
||||
<item>in-rID</item>
|
||||
<item>is</item>
|
||||
<item>it</item>
|
||||
<item>ja</item>
|
||||
<item>ko</item>
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<item quantity="one"><xliff:g>%d</xliff:g> selected</item>
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> selected</item>
|
||||
</plurals>
|
||||
<string name="noGiftCards">Click the + plus button to add a card, or import some from the ⋮ menu.</string>
|
||||
<string name="noGiftCards">Click the + plus button to add a card, or import from the ⋮ menu.</string>
|
||||
<string name="noGiftCardsGroup">Create some cards, and then assign them to the group here.</string>
|
||||
<string name="noMatchingGiftCards">No results. Try changing your search.</string>
|
||||
<string name="storeName">Name</string>
|
||||
@@ -65,7 +65,10 @@
|
||||
<string name="exportFailed">Could not perform export</string>
|
||||
<string name="importing">Importing…</string>
|
||||
<string name="exporting">Exporting…</string>
|
||||
<string name="noExternalStoragePermissionError">Grant external storage permission to import or export data</string>
|
||||
<string name="storageReadPermissionRequired">Permission to read storage needed for this action…</string>
|
||||
<string name="cameraPermissionRequired">Permission to access camera needed for this action…</string>
|
||||
<string name="cameraPermissionDeniedTitle">Could not access the camera</string>
|
||||
<string name="noCameraPermissionDirectToSystemSetting">To scan barcodes, Catima will need access to your camera. Tap here to change your permission settings.</string>
|
||||
<string name="exportOptionExplanation">The data will be written to a location of your choice.</string>
|
||||
<string name="importOptionFilesystemTitle">Import from filesystem</string>
|
||||
<string name="importOptionFilesystemExplanation">Choose a specific file from the filesystem.</string>
|
||||
@@ -250,6 +253,7 @@
|
||||
<string name="sort">Sort</string>
|
||||
<string name="showMoreInfo">Show info</string>
|
||||
<string name="hideMoreInfo">Hide info</string>
|
||||
<string name="updateBalance">Update balance</string>
|
||||
<string name="swipeToSwitchImages">Swipe to switch images, hold to open image in the gallery app</string>
|
||||
<string name="failedToRetrieveImageFile">Failed to retrieve image file</string>
|
||||
<string name="barcodeLongPressMessage">Only images can be opened in the gallery app</string>
|
||||
@@ -300,4 +304,9 @@
|
||||
<item quantity="other">View archive (<xliff:g>%1$d</xliff:g> cards)</item>
|
||||
</plurals>
|
||||
<string name="welcome">Welcome to Catima</string>
|
||||
<string name="importCards">Import cards</string>
|
||||
<string name="updateBalanceTitle">How much did you spend?</string>
|
||||
<string name="updateBalanceHint">Enter amount</string>
|
||||
<string name="currentBalanceSentence">Current balance: <xliff:g>%s</xliff:g></string>
|
||||
<string name="newBalanceSentence">New balance: <xliff:g>%s</xliff:g></string>
|
||||
</resources>
|
||||
@@ -504,4 +504,30 @@ public class DatabaseTest {
|
||||
assertEquals(0, card2.lastUsed);
|
||||
assertEquals(100, card2.zoomLevel);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void updateGiftCardOnlyBalance() {
|
||||
long id = DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, new BigDecimal("100"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0, null,0);
|
||||
boolean result = (id != -1);
|
||||
assertTrue(result);
|
||||
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
|
||||
|
||||
result = DBHelper.updateLoyaltyCardBalance(mDatabase, 1, new BigDecimal(60));
|
||||
assertTrue(result);
|
||||
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
|
||||
|
||||
LoyaltyCard loyaltyCard = DBHelper.getLoyaltyCard(mDatabase, 1);
|
||||
assertNotNull(loyaltyCard);
|
||||
assertEquals("store", loyaltyCard.store);
|
||||
assertEquals("note", loyaltyCard.note);
|
||||
assertEquals(null, loyaltyCard.expiry);
|
||||
assertEquals(new BigDecimal(60), loyaltyCard.balance);
|
||||
assertEquals(null, loyaltyCard.balanceType);
|
||||
assertEquals("cardId", loyaltyCard.cardId);
|
||||
assertEquals(null, loyaltyCard.barcodeId);
|
||||
assertEquals(BarcodeFormat.UPC_A, loyaltyCard.barcodeType.format());
|
||||
assertEquals(DEFAULT_HEADER_COLOR, loyaltyCard.headerColor);
|
||||
assertEquals(0, loyaltyCard.starStatus);
|
||||
assertEquals(0, loyaltyCard.archiveStatus);
|
||||
}
|
||||
}
|
||||
|
||||
24
build.gradle
24
build.gradle
@@ -1,29 +1,11 @@
|
||||
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
||||
|
||||
buildscript {
|
||||
repositories {
|
||||
google()
|
||||
mavenCentral()
|
||||
maven { url "https://jitpack.io" }
|
||||
gradlePluginPortal()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:7.0.4'
|
||||
classpath 'gradle.plugin.com.github.spotbugs.snom:spotbugs-gradle-plugin:4.7.5'
|
||||
|
||||
// NOTE: Do not place your application dependencies here; they belong
|
||||
// in the individual module build.gradle files
|
||||
}
|
||||
plugins {
|
||||
id 'com.android.application' version '7.0.4' apply false
|
||||
id 'com.github.spotbugs' version "4.7.5" apply false
|
||||
}
|
||||
|
||||
allprojects {
|
||||
repositories {
|
||||
google()
|
||||
mavenCentral()
|
||||
maven { url "https://jitpack.io" }
|
||||
gradlePluginPortal()
|
||||
}
|
||||
tasks.withType(JavaCompile) {
|
||||
options.compilerArgs << "-Xlint:deprecation"
|
||||
}
|
||||
|
||||
51
build.sh
Executable file
51
build.sh
Executable file
@@ -0,0 +1,51 @@
|
||||
#!/bin/bash
|
||||
set -euo pipefail
|
||||
IFS=$'\n\t'
|
||||
|
||||
### build.sh
|
||||
### Builds Catima the same way F-Droid does for reproducible builds
|
||||
|
||||
if [ -z "${ANDROID_SDK_ROOT:-}" ]; then
|
||||
echo "ANDROID_SDK_ROOT is not set, setting to $HOME/Android/Sdk";
|
||||
export ANDROID_SDK_ROOT=$HOME/Android/Sdk
|
||||
fi
|
||||
|
||||
if [ -z "${JAVA_HOME:-}" ]; then
|
||||
echo "JAVA_HOME is not set, setting to Java 11 (like F-Droid)"
|
||||
if [ -f "/etc/debian_version" ]; then
|
||||
echo "Debian-based distro, Java 11 is /usr/lib/jvm/java-11-openjdk-amd64"
|
||||
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
|
||||
else
|
||||
echo "Not Debian-based, assuming Fedora and setting Java 11 as /usr/lib/jvm/java-11-openjdk"
|
||||
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "Starting build"
|
||||
./gradlew clean assembleRelease
|
||||
|
||||
echo "Build finished (unsigned)"
|
||||
echo "Your build is at app/build/outputs/apk/release/app-release-unsigned.apk"
|
||||
|
||||
if [ -z "${KEYSTORE:-}" ]; then
|
||||
echo "KEYSTORE not set, skipping signing..."
|
||||
else
|
||||
if [ -z "${KEYSTORE_ALIAS:-}" ]; then
|
||||
echo "KEYSTORE_ALIAS is not set, setting to catima"
|
||||
KEYSTORE_ALIAS=catima
|
||||
fi
|
||||
|
||||
apksigner_version="$(ls -1 "$HOME/Android/Sdk/build-tools/" | tail -n 1)"
|
||||
cp app/build/outputs/apk/release/app-release-unsigned.apk app/build/outputs/apk/release/app-release.apk
|
||||
"$HOME/Android/Sdk/build-tools/$apksigner_version/apksigner" sign -v --ks "$KEYSTORE" --ks-key-alias "$KEYSTORE_ALIAS" app/build/outputs/apk/release/app-release.apk
|
||||
|
||||
echo "Build finished (signed)"
|
||||
echo "Your build is at app/build/outputs/apk/release/app-release.apk"
|
||||
fi
|
||||
|
||||
pushd app/build/outputs/apk/release/
|
||||
sha256sum -- *.apk > SHA256SUMS
|
||||
popd
|
||||
|
||||
echo "SHA256SUMS generated"
|
||||
echo "Your SHA256SUMS is at app/build/outputs/apk/release/SHA256SUMS"
|
||||
@@ -5,7 +5,7 @@ Copylefted libre software (GPLv3+) card management app.
|
||||
[](https://github.com/TheLastProject/Catima/releases)
|
||||
[](https://f-droid.org/packages/me.hackerchick.catima/)
|
||||
[](https://apt.izzysoft.de/fdroid/index/apk/me.hackerchick.catima)
|
||||
[](https://play.google.com/store/apps/details?id=me.hackerchick.catima)
|
||||
[](https://play.google.com/store/apps/details?id=me.hackerchick.catima)
|
||||
|
||||

|
||||
[](https://hosted.weblate.org/engage/catima/)
|
||||
@@ -18,7 +18,7 @@ Copylefted libre software (GPLv3+) card management app.
|
||||
<a href="https://play.google.com/store/apps/details?id=me.hackerchick.catima" target="_blank">
|
||||
<img src="https://play.google.com/intl/en_us/badges/images/generic/en-play-badge.png" alt="Get it on Google Play" height="90"/></a>
|
||||
|
||||

|
||||

|
||||
|
||||
*Logo by [Rose (TangentFoxy)](http://github.com/TangentFoxy)*
|
||||
|
||||
@@ -42,14 +42,14 @@ Supported barcodes:
|
||||
|
||||
# Screenshots
|
||||
|
||||
[<img src="https://github.com/TheLastProject/Catima/raw/master/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-01.png" width=250>](https://github.com/TheLastProject/Catima/raw/master/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-01.png)
|
||||
[<img src="https://github.com/TheLastProject/Catima/raw/master/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-02.png" width=250>](https://github.com/TheLastProject/Catima/raw/master/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-02.png)
|
||||
[<img src="https://github.com/TheLastProject/Catima/raw/master/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-03.png" width=250>](https://github.com/TheLastProject/Catima/raw/master/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-03.png)
|
||||
[<img src="https://github.com/TheLastProject/Catima/raw/master/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-04.png" width=250>](https://github.com/TheLastProject/Catima/raw/master/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-04.png)
|
||||
[<img src="https://github.com/TheLastProject/Catima/raw/master/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-05.png" width=250>](https://github.com/TheLastProject/Catima/raw/master/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-05.png)
|
||||
[<img src="https://github.com/TheLastProject/Catima/raw/master/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-06.png" width=250>](https://github.com/TheLastProject/Catima/raw/master/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-06.png)
|
||||
[<img src="https://github.com/TheLastProject/Catima/raw/master/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-07.png" width=250>](https://github.com/TheLastProject/Catima/raw/master/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-07.png)
|
||||
[<img src="https://github.com/TheLastProject/Catima/raw/master/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-08.png" width=250>](https://github.com/TheLastProject/Catima/raw/master/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-08.png)
|
||||
[<img src="https://github.com/TheLastProject/Catima/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-01.png" width=250>](https://github.com/TheLastProject/Catima/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-01.png)
|
||||
[<img src="https://github.com/TheLastProject/Catima/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-02.png" width=250>](https://github.com/TheLastProject/Catima/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-02.png)
|
||||
[<img src="https://github.com/TheLastProject/Catima/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-03.png" width=250>](https://github.com/TheLastProject/Catima/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-03.png)
|
||||
[<img src="https://github.com/TheLastProject/Catima/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-04.png" width=250>](https://github.com/TheLastProject/Catima/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-04.png)
|
||||
[<img src="https://github.com/TheLastProject/Catima/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-05.png" width=250>](https://github.com/TheLastProject/Catima/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-05.png)
|
||||
[<img src="https://github.com/TheLastProject/Catima/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-06.png" width=250>](https://github.com/TheLastProject/Catima/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-06.png)
|
||||
[<img src="https://github.com/TheLastProject/Catima/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-07.png" width=250>](https://github.com/TheLastProject/Catima/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-07.png)
|
||||
[<img src="https://github.com/TheLastProject/Catima/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-08.png" width=250>](https://github.com/TheLastProject/Catima/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-08.png)
|
||||
|
||||
# Moving data from other apps
|
||||
|
||||
@@ -58,17 +58,16 @@ For FidMe you need to select the barcode type for each entry afterwards.
|
||||
|
||||
# Building
|
||||
|
||||
Use the Gradle wrapper scripts provided in the top level directory of the project.
|
||||
To compile the app and run all unit tests:
|
||||
Building can either be done through Android Studio (not reproducible!) or the build.sh script in this repository (reproducibly with Java 11, same way F-Droid builds it). This script can also sign the build.
|
||||
|
||||
Linux|GNU, Unix-like, macOS:
|
||||
Build without signing:
|
||||
```
|
||||
./gradlew build
|
||||
./build.sh
|
||||
```
|
||||
|
||||
Windows:
|
||||
Build with signing:
|
||||
```
|
||||
./gradlew.bat build
|
||||
KEYSTORE=/path/to/keystore KEYSTORE_ALIAS=catima ./build.sh
|
||||
```
|
||||
|
||||
# Translating
|
||||
|
||||
1
fastlane/metadata/android/bg/changelogs/112.txt
Normal file
1
fastlane/metadata/android/bg/changelogs/112.txt
Normal file
@@ -0,0 +1 @@
|
||||
- Добавена е възможност потребителското заглавие да бъде по-видимо
|
||||
3
fastlane/metadata/android/bg/changelogs/114.txt
Normal file
3
fastlane/metadata/android/bg/changelogs/114.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
- Добавена е едноцветна пиктиграма за Android 13
|
||||
- Подобрен е първия екран при стартиране
|
||||
- Поправки при внасяне от Fidme
|
||||
2
fastlane/metadata/android/bg/changelogs/115.txt
Normal file
2
fastlane/metadata/android/bg/changelogs/115.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
- Отваряне на изображение в галерията при задържане
|
||||
- Прилагане на стила Material към диалоговите прозорци
|
||||
1
fastlane/metadata/android/bs/short_description.txt
Normal file
1
fastlane/metadata/android/bs/short_description.txt
Normal file
@@ -0,0 +1 @@
|
||||
Za vaše barkodove, članstva, loyalty programe, kupone i tikete.
|
||||
1
fastlane/metadata/android/bs/title.txt
Normal file
1
fastlane/metadata/android/bs/title.txt
Normal file
@@ -0,0 +1 @@
|
||||
Catima - Loyalty card novčanik
|
||||
4
fastlane/metadata/android/cs-CZ/changelogs/115.txt
Normal file
4
fastlane/metadata/android/cs-CZ/changelogs/115.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
- Otevření obrázku v aplikaci pro galerii při dlouhém stisku
|
||||
- Styl Material použit na dialogová okna
|
||||
- Podpora vytváření karty pomocí sdílení obrázku do Catima
|
||||
- Na obrazovku karty přidáno tlačítko pro rychlé zadání útraty
|
||||
2
fastlane/metadata/android/cs-CZ/changelogs/116.txt
Normal file
2
fastlane/metadata/android/cs-CZ/changelogs/116.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
- Oprava dialogu pro rychlé zadání útraty, který neumožňuje oddělovač , (čárku)
|
||||
- Podpora načítání obrázku ze správce souborů
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user