Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e212fb27cf | ||
|
|
a8973296ee | ||
|
|
0d3fe0b253 | ||
|
|
275880944d | ||
|
|
36f38f9b3e | ||
|
|
e68dbe255f | ||
|
|
3fffc83c08 | ||
|
|
03e1f5c672 | ||
|
|
40295f7f37 | ||
|
|
bbf00e1d90 | ||
|
|
61637599e3 | ||
|
|
b748f2e002 | ||
|
|
f3424b716d | ||
|
|
3a413127a5 | ||
|
|
352086887d | ||
|
|
2e3770706c | ||
|
|
92abf69236 | ||
|
|
c9e6606524 | ||
|
|
9e58c9da44 | ||
|
|
b99204c55b | ||
|
|
15035fe38e | ||
|
|
5d58fae618 | ||
|
|
363fce3064 | ||
|
|
868f12f072 | ||
|
|
3332cf732e | ||
|
|
abec7ea821 | ||
|
|
555f3dff46 | ||
|
|
59e14a516f | ||
|
|
6fc798dfc6 | ||
|
|
b9462df24a | ||
|
|
9344df33d7 | ||
|
|
fbec74ae54 | ||
|
|
d493733abd | ||
|
|
dbae33492d | ||
|
|
2b8b48afdc | ||
|
|
3bb8b94c6d | ||
|
|
3b0f3b3a5b | ||
|
|
2885357b80 | ||
|
|
d08bbb5e3c | ||
|
|
1da01b846a | ||
|
|
1f2870d3d8 | ||
|
|
a0a2f061bd | ||
|
|
c70b3ec172 | ||
|
|
a3ad6a8568 | ||
|
|
1a9d162370 | ||
|
|
950d19ce8c | ||
|
|
b531081806 | ||
|
|
b46313a112 | ||
|
|
b54fc85fdb | ||
|
|
b71a2a0bbf | ||
|
|
8ba44eeba5 | ||
|
|
8ef9f39fb7 | ||
|
|
86543c8fb9 | ||
|
|
3c8bae3acc | ||
|
|
0a19db7c7e | ||
|
|
7b55f593d0 | ||
|
|
ced6b08e6c | ||
|
|
23589e88df | ||
|
|
4bc38a1162 | ||
|
|
69ce67cda4 | ||
|
|
ce76901d6e | ||
|
|
fa4b89d3a9 | ||
|
|
3bac76db8f | ||
|
|
f93e7d857a | ||
|
|
1b894e5043 | ||
|
|
08508952fc | ||
|
|
e7159b7980 | ||
|
|
223b5a04db | ||
|
|
b7aa25a5e3 | ||
|
|
1d9fbd6633 | ||
|
|
4be04fb057 | ||
|
|
efdb68cb90 | ||
|
|
1f61b00ed5 | ||
|
|
7afa0399d4 | ||
|
|
efe441b0bd | ||
|
|
59efd0892f | ||
|
|
1cee23baad | ||
|
|
d13519a75f | ||
|
|
5a12769f22 | ||
|
|
14ed18c4d0 | ||
|
|
59e2083511 | ||
|
|
a9daca77a2 | ||
|
|
8b67797e71 | ||
|
|
4195c2b75e | ||
|
|
5e3bb55ba5 | ||
|
|
0a0c378f56 | ||
|
|
2e4fb34dbe | ||
|
|
2df681a5b8 | ||
|
|
7c11508b12 | ||
|
|
54bbe1e99a | ||
|
|
24bd17eb9c | ||
|
|
33653fab99 | ||
|
|
9efb246133 | ||
|
|
e807e1f4ff | ||
|
|
d1d8eaacae | ||
|
|
4030cd0284 | ||
|
|
80ec71d9d9 | ||
|
|
2cd3b4a131 | ||
|
|
e90ab64194 | ||
|
|
0656767d07 | ||
|
|
ab4685b725 | ||
|
|
42beafa255 | ||
|
|
3df40a8808 | ||
|
|
eefe52320a | ||
|
|
96cf6c04be | ||
|
|
f397692f3b | ||
|
|
ec17b3a8d9 | ||
|
|
03ba942423 | ||
|
|
67d812b291 | ||
|
|
e9ca16ffd3 | ||
|
|
66f96b64e2 | ||
|
|
f165ae525a | ||
|
|
dfc27cf4fe | ||
|
|
c6bf7101c3 | ||
|
|
a1a97aea9c | ||
|
|
a338eb6e1b | ||
|
|
74b248f565 | ||
|
|
dae297a41f | ||
|
|
944fa35f83 | ||
|
|
d4196e4029 | ||
|
|
62866c93db | ||
|
|
db03cdcb3e | ||
|
|
0c28c3e5f7 | ||
|
|
bbe39f3d6a | ||
|
|
4e976caaaf | ||
|
|
ff804f9352 | ||
|
|
a3805c48d3 | ||
|
|
8eb2dc61d7 | ||
|
|
5b7bb3acc4 | ||
|
|
c001e317ec | ||
|
|
4eb02446aa | ||
|
|
84e092fce4 | ||
|
|
b84730877b | ||
|
|
bad9e0d9d8 | ||
|
|
10ea218b34 | ||
|
|
59f52608db | ||
|
|
239fc9754d | ||
|
|
f520534890 | ||
|
|
d91a7dd4a1 | ||
|
|
b3573891bf | ||
|
|
fb75cf91c3 | ||
|
|
15022515bf | ||
|
|
19c277b5b7 | ||
|
|
0af89b9516 | ||
|
|
0450bc5e9b | ||
|
|
2ca2840c3c | ||
|
|
192d516acd | ||
|
|
d636097845 | ||
|
|
e5b1c209de | ||
|
|
61ddf10df5 | ||
|
|
96533db864 | ||
|
|
2f84e53257 | ||
|
|
bb760c5db4 | ||
|
|
078b708c8a | ||
|
|
edb14da576 | ||
|
|
a321edde1c | ||
|
|
449a89a6f3 | ||
|
|
246605e3ca | ||
|
|
2ddc36bada | ||
|
|
1e512bac09 | ||
|
|
60ec5d2520 | ||
|
|
a790762071 | ||
|
|
07709873c9 | ||
|
|
fa06b40a97 | ||
|
|
537a66ad5d | ||
|
|
0b618e57a9 | ||
|
|
28c6afa9ba | ||
|
|
0ccc29bfc6 | ||
|
|
85ea4c0000 | ||
|
|
9c21e1f3c1 | ||
|
|
1ba2a44dde | ||
|
|
3a2d125bb2 | ||
|
|
de8d2f78c2 | ||
|
|
e55d6f3189 | ||
|
|
ad5449488f | ||
|
|
5d9caa27fe | ||
|
|
22193b1872 | ||
|
|
306e7b5201 | ||
|
|
0c8104af96 | ||
|
|
3b06f7a105 | ||
|
|
0869623c1d | ||
|
|
bfa79a6f68 | ||
|
|
cda842485f | ||
|
|
db35306a26 | ||
|
|
2363861a62 | ||
|
|
2960585250 | ||
|
|
ff830ee50d | ||
|
|
3c917da56a | ||
|
|
6ea1d9ec73 | ||
|
|
5ebd7cbb63 | ||
|
|
0d91444ee2 | ||
|
|
9459c78e7c | ||
|
|
b326a7148d | ||
|
|
5ae850dbe8 | ||
|
|
2ef9c9c68e | ||
|
|
613bd000d2 | ||
|
|
f7ea5bcb7b | ||
|
|
b8b5b8ae9b | ||
|
|
e6085a64be | ||
|
|
e77acf9b1e | ||
|
|
dc4299d315 | ||
|
|
1c8d2ba19e | ||
|
|
d46455c021 | ||
|
|
abd4c24138 | ||
|
|
1e922ae074 | ||
|
|
335059a681 | ||
|
|
a530991119 | ||
|
|
45130b5f85 | ||
|
|
70fd411640 | ||
|
|
4d47cd4a4a | ||
|
|
bb694ca9cb | ||
|
|
7ede8424d0 | ||
|
|
1167cf51b5 | ||
|
|
13d2c81c5c | ||
|
|
102a34a3f3 | ||
|
|
0c490f2bdb | ||
|
|
8f69f9cef9 | ||
|
|
00e65a39de | ||
|
|
8698c6099c | ||
|
|
da3fbdb401 | ||
|
|
b28052c46c | ||
|
|
b438a7f03d | ||
|
|
c144035d95 | ||
|
|
7658c3980a | ||
|
|
c11297a733 | ||
|
|
c89e60adf6 | ||
|
|
fa33f61183 | ||
|
|
f3e57d816c | ||
|
|
bf2e1eface | ||
|
|
a69fff9b53 | ||
|
|
9fc0038bd5 | ||
|
|
ffd8dd5633 | ||
|
|
c3947b0f6a | ||
|
|
84b17b17fe | ||
|
|
3956a1123e | ||
|
|
f04185f6fd | ||
|
|
10d188ee40 | ||
|
|
63e2d3740f | ||
|
|
672173437f | ||
|
|
2c851158f5 | ||
|
|
367733676a | ||
|
|
538cd2078b | ||
|
|
731833d9be | ||
|
|
7ebd71283f | ||
|
|
5eb1942ad2 | ||
|
|
999222f3a4 | ||
|
|
e82d726898 | ||
|
|
0f48c75512 | ||
|
|
183d3ea666 | ||
|
|
4e4e9123f2 | ||
|
|
c09566d38a | ||
|
|
750ac6f2ec | ||
|
|
1ed78fa680 | ||
|
|
48a26cf1f7 | ||
|
|
bc6a63a1f0 | ||
|
|
45f360904f | ||
|
|
bdf39a1dd7 | ||
|
|
abff198d01 | ||
|
|
6721ecf113 | ||
|
|
3899c71317 | ||
|
|
b8e4ec9c9f | ||
|
|
92cb120dd0 | ||
|
|
7a8f9c38eb | ||
|
|
dc7498e505 | ||
|
|
02e925f77a | ||
|
|
7dc2a479b6 | ||
|
|
1913d629e7 | ||
|
|
59a750f41c | ||
|
|
46dfafe0b2 | ||
|
|
1faab05032 | ||
|
|
c895f0db56 | ||
|
|
c622df96f0 | ||
|
|
30ac13ec73 | ||
|
|
efbe809982 | ||
|
|
92df5dd36a | ||
|
|
ebdf13678a | ||
|
|
0a0d46033c | ||
|
|
7f72565e24 | ||
|
|
cfcf1e2fcb | ||
|
|
faf2f7a38c | ||
|
|
ace7e5abdd | ||
|
|
f50e547980 | ||
|
|
c05a303568 | ||
|
|
4fcd41d3cc | ||
|
|
3e6c4c1b13 | ||
|
|
55d356ea40 | ||
|
|
a752421efe | ||
|
|
aa4b41612f | ||
|
|
f576228c2d | ||
|
|
c93add3b83 | ||
|
|
117446cebb | ||
|
|
4bee5ec6c8 | ||
|
|
92776c9e8d | ||
|
|
eea3fb5c54 | ||
|
|
dbd0727af2 | ||
|
|
a4cf49754a | ||
|
|
587c5991f1 | ||
|
|
10234ffcef | ||
|
|
2a2710e391 | ||
|
|
f1b5423d94 | ||
|
|
1cb916d16a | ||
|
|
6396120fb0 | ||
|
|
2fe5157519 | ||
|
|
4ce480defb | ||
|
|
3ea5d16f19 | ||
|
|
31fc58576c | ||
|
|
9573799eba | ||
|
|
df94e94b31 | ||
|
|
98b561b186 | ||
|
|
8ee469343c | ||
|
|
e54d129577 | ||
|
|
a7a3237f4f | ||
|
|
4b17c3963f | ||
|
|
93925a03b9 | ||
|
|
a74707ee82 | ||
|
|
909034d4f3 | ||
|
|
c261d33980 | ||
|
|
e9654c9b04 | ||
|
|
4742a290c8 | ||
|
|
bbae3351a5 | ||
|
|
db149cd3aa | ||
|
|
1a94748958 | ||
|
|
a20ad88532 | ||
|
|
93b4ba1167 | ||
|
|
693d6d6663 | ||
|
|
67bb1a2627 | ||
|
|
d20f91018d | ||
|
|
9414627772 | ||
|
|
6134fb26c6 | ||
|
|
6445df4d2f | ||
|
|
1069803681 | ||
|
|
60f9d19c6c | ||
|
|
b2d001d238 | ||
|
|
ea26cdbb9f | ||
|
|
f3154081f4 | ||
|
|
5388bbfc16 | ||
|
|
48284acf06 | ||
|
|
852830c894 | ||
|
|
97b2c8f080 | ||
|
|
888869d5fc | ||
|
|
9452c65438 | ||
|
|
08db580076 | ||
|
|
649135e6d4 | ||
|
|
fb255fd46a | ||
|
|
ba01e9f0fe | ||
|
|
c6b6a4012e | ||
|
|
964c1a82db | ||
|
|
6eb2a8db45 | ||
|
|
abf5466883 | ||
|
|
c40fcdee9e | ||
|
|
ca66205493 | ||
|
|
8bdea4a3cd | ||
|
|
d11797be41 | ||
|
|
332a5df506 | ||
|
|
024125cf52 | ||
|
|
5b747d6fea | ||
|
|
f4b2597d95 | ||
|
|
4a24b98868 | ||
|
|
932f82a08b | ||
|
|
c20709b377 | ||
|
|
f1fd813ddc | ||
|
|
dfb8089db3 | ||
|
|
cf6cd74e8f | ||
|
|
5b93bd79a9 | ||
|
|
5831adbcc6 | ||
|
|
133b6df382 | ||
|
|
0e9abac8a2 | ||
|
|
b6b172ebfd | ||
|
|
561f508e02 | ||
|
|
b36a29a5c7 | ||
|
|
938f17b559 | ||
|
|
9feec7f6e3 | ||
|
|
b1f0e7bbfd | ||
|
|
24335cb2fc | ||
|
|
4d41ae9448 | ||
|
|
d380560ff0 | ||
|
|
aa649ca9a9 | ||
|
|
754f9c51ea | ||
|
|
c6a2f79946 | ||
|
|
3e6a735217 | ||
|
|
d0d9d70445 | ||
|
|
9db715b916 | ||
|
|
7c88c004b6 | ||
|
|
6215d77b72 | ||
|
|
c947f53d2c | ||
|
|
d9029284c3 | ||
|
|
48b099e182 | ||
|
|
cbac258a6a | ||
|
|
256a39643b | ||
|
|
9dc21315b8 | ||
|
|
d27ada63b1 | ||
|
|
97a2874218 | ||
|
|
1c3471f7b9 | ||
|
|
b8b677e7a8 | ||
|
|
986873e945 | ||
|
|
7e90a439a6 | ||
|
|
ba2dab02a6 | ||
|
|
5aad361ebd | ||
|
|
418443300c | ||
|
|
3958a48137 | ||
|
|
c829b2d9bf | ||
|
|
12d78786f0 | ||
|
|
87655c9e28 | ||
|
|
eb54d7c250 | ||
|
|
78a7b93c21 | ||
|
|
4da8378aef | ||
|
|
2f6687ec90 | ||
|
|
38b2584153 | ||
|
|
a25d36da29 | ||
|
|
6f7c3ec39c | ||
|
|
d9e94d52f5 | ||
|
|
035f651b9f | ||
|
|
98d2c69640 | ||
|
|
0dfeb2dcc8 | ||
|
|
645e7780f3 | ||
|
|
d635e31afc | ||
|
|
91d0882ad8 | ||
|
|
4ab4ac7668 | ||
|
|
48115b3f2d | ||
|
|
f55559d6d6 | ||
|
|
0bf1afd7af | ||
|
|
1ff4f47102 | ||
|
|
70dbd7eac1 | ||
|
|
ff7ebe0629 | ||
|
|
0d847607a2 | ||
|
|
dd53862d37 | ||
|
|
9df5366fc6 | ||
|
|
69f888fe29 | ||
|
|
bdc08ef95c | ||
|
|
7b098bb6dd | ||
|
|
43085d0c13 | ||
|
|
89885f5e9d | ||
|
|
3d48bdeee6 | ||
|
|
e331f2e293 | ||
|
|
0a605d518b | ||
|
|
72f02bd16d | ||
|
|
ff9a6884a9 | ||
|
|
9fd6c89c5b | ||
|
|
73d2644e96 | ||
|
|
e8de07bdb8 | ||
|
|
3003acdc81 | ||
|
|
350241f517 | ||
|
|
ed6289341a | ||
|
|
0811eb75df | ||
|
|
619408e272 | ||
|
|
c43ff9dc95 | ||
|
|
7fd461ef61 | ||
|
|
3b17a24f29 | ||
|
|
95358bf16b | ||
|
|
d8de262111 | ||
|
|
5f78ee7f95 | ||
|
|
c3cbdf5a24 | ||
|
|
ac1f7d158a | ||
|
|
bdf8823855 | ||
|
|
17693ec3f2 | ||
|
|
1afea8f39c | ||
|
|
f0068144dc | ||
|
|
90a4de1343 | ||
|
|
e83a8ef7e7 | ||
|
|
2526cb65ba | ||
|
|
4f419b86e2 | ||
|
|
6c1baa9ec1 | ||
|
|
b499d540dc | ||
|
|
522bd5d4b0 | ||
|
|
d3d6d1a565 | ||
|
|
e6b639040b | ||
|
|
64259502db | ||
|
|
a5a9c1330b | ||
|
|
c9fb6ad2ac | ||
|
|
3ecc752c6c | ||
|
|
db0f97542f | ||
|
|
c9d372223e | ||
|
|
d5be79198c | ||
|
|
b75a5b56d2 | ||
|
|
a1da000157 | ||
|
|
965d1fd2b7 | ||
|
|
bc34cd9b5e | ||
|
|
d3d2368be0 | ||
|
|
afb78ac8b8 |
No files matched your search
@@ -4,11 +4,7 @@ on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- staging
|
||||
- trying
|
||||
pull_request:
|
||||
branches:
|
||||
- main
|
||||
permissions:
|
||||
actions: none
|
||||
checks: none
|
||||
@@ -30,41 +26,60 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
flavor: [Foss, Gplay]
|
||||
flavor: [fdroidLegacy, foss, gplay]
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: gradle/actions/wrapper-validation@v5
|
||||
- uses: actions/checkout@v7.0.1
|
||||
- name: Ensure sentence-cased flavor variables
|
||||
run: |
|
||||
flavor="$(echo ${{ matrix.flavor }})"
|
||||
echo "sentenceCasedFlavor=${flavor^}" >> "$GITHUB_ENV"
|
||||
- uses: gradle/actions/wrapper-validation@v6.3.0
|
||||
- name: set up OpenJDK 25
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y openjdk-25-jdk-headless
|
||||
sudo update-alternatives --auto java
|
||||
- name: Build
|
||||
run: ./gradlew assemble${{ matrix.flavor }}Release
|
||||
run: ./gradlew assemble${sentenceCasedFlavor}Release
|
||||
- name: Check for non-free libraries
|
||||
run: |
|
||||
# Get Katastima APK scanner
|
||||
wget -q https://codeberg.org/Katastima/apkscanner/releases/download/v0.0.9/apk-scanner_v0.0.9.jar
|
||||
# Print pretty result
|
||||
java -jar apk-scanner_v0.0.9.jar scan-apk "$(echo 'app/build/outputs/apk/${{ matrix.flavor }}/release/app-${{ matrix.flavor }}-release-unsigned.apk')"
|
||||
# Check for offending libraries
|
||||
# Exit code 4 = no result, which is what we want
|
||||
set +e
|
||||
java -jar apk-scanner_v0.0.9.jar scan-apk --json=yes "$(echo 'app/build/outputs/apk/${{ matrix.flavor }}/release/app-${{ matrix.flavor }}-release-unsigned.apk')" | jq --exit-status '.libraryCheckResult.offendingLibraries[] | select((.libraryId == "/org/acra" and .license == "Apache-2.0")|not)'
|
||||
if [ "$?" -ne 4 ]; then
|
||||
echo "Bad libraries found!"
|
||||
exit 1
|
||||
fi
|
||||
set -e
|
||||
- name: Check lint
|
||||
run: ./gradlew lint${{ matrix.flavor }}Release
|
||||
run: ./gradlew lint${sentenceCasedFlavor}Release
|
||||
- name: Run unit tests
|
||||
run: timeout 5m ./gradlew test${{ matrix.flavor }}DebugUnitTest || { ./gradlew --stop && timeout 5m ./gradlew test${{ matrix.flavor }}DebugUnitTest; }
|
||||
run: timeout 5m ./gradlew test${sentenceCasedFlavor}DebugUnitTest || { ./gradlew --stop && timeout 5m ./gradlew test${sentenceCasedFlavor}DebugUnitTest; }
|
||||
- name: Enable KVM
|
||||
run: |
|
||||
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
|
||||
sudo udevadm control --reload-rules
|
||||
sudo udevadm trigger --name-match=kvm
|
||||
- name: Run instrumented tests (API 23)
|
||||
uses: ReactiveCircus/android-emulator-runner@v2
|
||||
uses: ReactiveCircus/android-emulator-runner@v2.38.0
|
||||
with:
|
||||
api-level: 23
|
||||
arch: x86_64
|
||||
script: ./gradlew connected${{ matrix.flavor }}DebugAndroidTest
|
||||
script: ./gradlew connected${sentenceCasedFlavor}DebugAndroidTest
|
||||
- name: Run instrumented tests (API 35)
|
||||
uses: ReactiveCircus/android-emulator-runner@v2
|
||||
uses: ReactiveCircus/android-emulator-runner@v2.38.0
|
||||
with:
|
||||
api-level: 35
|
||||
arch: x86_64
|
||||
script: ./gradlew connected${{ matrix.flavor }}DebugAndroidTest
|
||||
script: ./gradlew connected${sentenceCasedFlavor}DebugAndroidTest
|
||||
- name: Archive test results
|
||||
if: always()
|
||||
uses: actions/upload-artifact@v7.0.1
|
||||
with:
|
||||
name: test-results-flavor${{ matrix.flavor }}
|
||||
name: test-results-flavor-${{ matrix.flavor }}
|
||||
path: app/build/reports
|
||||
@@ -19,9 +19,9 @@ jobs:
|
||||
steps:
|
||||
- name: Checkout repo
|
||||
id: checkout
|
||||
uses: actions/checkout@v6
|
||||
uses: actions/checkout@v7.0.1
|
||||
- name: Setup Python
|
||||
uses: actions/setup-python@v6.2.0
|
||||
uses: actions/setup-python@v7.0.0
|
||||
with:
|
||||
python-version: '3.x'
|
||||
- name: Run converter script
|
||||
|
||||
@@ -17,7 +17,7 @@ jobs:
|
||||
steps:
|
||||
- name: Checkout repo
|
||||
id: checkout
|
||||
uses: actions/checkout@v6
|
||||
uses: actions/checkout@v7.0.1
|
||||
- name: Update contributors
|
||||
id: update_contributors
|
||||
uses: TheLastProject/contributors-to-file-action@v3.2.0
|
||||
|
||||
@@ -17,7 +17,7 @@ jobs:
|
||||
generate-feature-graphic:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v7.0.1
|
||||
- name: Install requirements
|
||||
run: |
|
||||
sudo apt-get update
|
||||
|
||||
@@ -4,11 +4,7 @@ on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- staging
|
||||
- trying
|
||||
pull_request:
|
||||
branches:
|
||||
- main
|
||||
permissions:
|
||||
actions: none
|
||||
checks: none
|
||||
@@ -27,7 +23,7 @@ jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v7.0.1
|
||||
- name: Fail on bad translations
|
||||
run: if grep -ri "<xliff" app/src/main/res/values*/strings.xml; then echo "Invalidly escaped translations found"; exit 1; fi
|
||||
- name: Check app_name consistency
|
||||
|
||||
@@ -17,7 +17,7 @@ jobs:
|
||||
update-locales:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v7.0.1
|
||||
- name: Add new locales
|
||||
run: .scripts/new-locales.py
|
||||
- name: Update locales
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
name: Android Wear CI
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
pull_request:
|
||||
permissions:
|
||||
actions: none
|
||||
checks: none
|
||||
contents: read
|
||||
deployments: none
|
||||
discussions: none
|
||||
id-token: none
|
||||
issues: none
|
||||
packages: none
|
||||
pages: none
|
||||
pull-requests: none
|
||||
repository-projects: none
|
||||
security-events: none
|
||||
statuses: none
|
||||
env:
|
||||
JAVA_HOME: /usr/lib/jvm/java-25-openjdk-amd64
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v7.0.1
|
||||
- uses: gradle/actions/wrapper-validation@v6.3.0
|
||||
- name: set up OpenJDK 25
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y openjdk-25-jdk-headless
|
||||
sudo update-alternatives --auto java
|
||||
- name: Build
|
||||
run: ./gradlew :wear:assembleRelease
|
||||
- name: Check for non-free libraries
|
||||
run: |
|
||||
# Get Katastima APK scanner
|
||||
wget -q https://codeberg.org/Katastima/apkscanner/releases/download/v0.0.9/apk-scanner_v0.0.9.jar
|
||||
# Print pretty result
|
||||
java -jar apk-scanner_v0.0.9.jar scan-apk "wear/build/outputs/apk/release/wear-release-unsigned.apk"
|
||||
# Check for offending libraries
|
||||
# Exit code 4 = no result, which is what we want
|
||||
set +e
|
||||
java -jar apk-scanner_v0.0.9.jar scan-apk --json=yes "wear/build/outputs/apk/release/wear-release-unsigned.apk" | jq --exit-status '.libraryCheckResult.offendingLibraries[]'
|
||||
if [ "$?" -ne 4 ]; then
|
||||
echo "Bad libraries found!"
|
||||
exit 1
|
||||
fi
|
||||
set -e
|
||||
- name: Check lint
|
||||
run: ./gradlew :wear:lintRelease
|
||||
@@ -19,6 +19,8 @@
|
||||
/app/*.log
|
||||
/app/build
|
||||
/app/release
|
||||
/wear/build
|
||||
/wear/release
|
||||
/.idea/*
|
||||
!/.idea/icon.svg
|
||||
# Bundle
|
||||
@@ -28,3 +30,4 @@
|
||||
|
||||
# Catima-specific
|
||||
SHA256SUMS
|
||||
/shared/build
|
||||
@@ -15,7 +15,7 @@ with open('CHANGELOG.md') as changelog:
|
||||
changelogs[version_code] = text
|
||||
|
||||
text = []
|
||||
match = re.match("## \S* - (\d*).*", line)
|
||||
match = re.match("## .+ - (\d*).*", line)
|
||||
if not match:
|
||||
raise ValueError(f"Invalid version line: {line}")
|
||||
version_code = match.group(1)
|
||||
|
||||
@@ -1,5 +1,36 @@
|
||||
# Changelog
|
||||
|
||||
## Unreleased (Android) - 1003
|
||||
|
||||
- Fix list widget not updating when opening a card from it
|
||||
- Fix opening pkpass/pdf files from network locations sometimes failing
|
||||
|
||||
## v1.0.1 (Wear OS) - 201 (2026-08-28)
|
||||
|
||||
- Add scroll bar to card list
|
||||
- Add splash screen
|
||||
- Fix some padding issues
|
||||
- Remove barcode value from card view
|
||||
|
||||
## v2.45.0 (Android) - 1002 (2026-08-12)
|
||||
|
||||
- Add a Bluetooth server for Wear OS companion app support
|
||||
- Remove embedded CHANGELOG
|
||||
|
||||
## v1.0.0 (Wear OS) - 200 (2026-08-12)
|
||||
|
||||
- Initial release of Wear OS companion app
|
||||
|
||||
## v2.44.0 - 168 (2026-07-28)
|
||||
|
||||
- Add option to open image in internal image viewer in gallery
|
||||
|
||||
## v2.43.0 - 167 (2026-07-12)
|
||||
|
||||
- Add support for showing the card ID in the card list
|
||||
- Add support to sort by most recently added
|
||||
- Add internal image viewer for zooming card front/back/icon images
|
||||
|
||||
## v2.42.1 - 166 (2026-05-16)
|
||||
|
||||
- Prevent crash on devices with misbehaving NFC
|
||||
|
||||
@@ -23,7 +23,9 @@ for good reason.
|
||||
|
||||
## Code Changes
|
||||
|
||||
Note: submitting LLM ("AI") generated code is strongly discouraged, as such
|
||||
### LLM ("AI") and coding agents
|
||||
|
||||
**Note:** submitting LLM ("AI") generated code is strongly discouraged, as such
|
||||
code is often (subtly) incorrect or overcomplicated (for example: unnecessarily
|
||||
pulling in extra libraries for functionality already covered by existing
|
||||
libraries). It also often makes unrelated changes that increase the risk of
|
||||
@@ -47,6 +49,14 @@ risk.
|
||||
|
||||
Please never submit LLM-generated code as-is.
|
||||
|
||||
### Kotlin and Compose migration
|
||||
|
||||
Catima uses a lot of "legacy" tech, Java, Android XML. This will be ported to Kotlin,
|
||||
then Jetpack Compose; for further details, see
|
||||
<https://github.com/CatimaLoyalty/Android/issues/2483>.
|
||||
|
||||
Thus, prefer Kotlin and Jetpack Compose for new code/UI where practical, especially new files/features.
|
||||
|
||||
### Test Your Code
|
||||
|
||||
There are four possible tests you can run to verify your code. The first
|
||||
|
||||
@@ -8,8 +8,8 @@ GEM
|
||||
artifactory (3.0.17)
|
||||
atomos (0.1.3)
|
||||
aws-eventstream (1.4.0)
|
||||
aws-partitions (1.1246.0)
|
||||
aws-sdk-core (3.246.0)
|
||||
aws-partitions (1.1269.0)
|
||||
aws-sdk-core (3.254.0)
|
||||
aws-eventstream (~> 1, >= 1.3.0)
|
||||
aws-partitions (~> 1, >= 1.992.0)
|
||||
aws-sigv4 (~> 1.9)
|
||||
@@ -17,17 +17,18 @@ GEM
|
||||
bigdecimal
|
||||
jmespath (~> 1, >= 1.6.1)
|
||||
logger
|
||||
aws-sdk-kms (1.124.0)
|
||||
aws-sdk-core (~> 3, >= 3.244.0)
|
||||
aws-sdk-kms (1.130.0)
|
||||
aws-sdk-core (~> 3, >= 3.254.0)
|
||||
aws-sigv4 (~> 1.5)
|
||||
aws-sdk-s3 (1.221.0)
|
||||
aws-sdk-core (~> 3, >= 3.244.0)
|
||||
aws-sdk-s3 (1.227.0)
|
||||
aws-sdk-core (~> 3, >= 3.254.0)
|
||||
aws-sdk-kms (~> 1)
|
||||
aws-sigv4 (~> 1.5)
|
||||
aws-sigv4 (1.12.1)
|
||||
aws-eventstream (~> 1, >= 1.0.2)
|
||||
babosa (1.0.4)
|
||||
base64 (0.3.0)
|
||||
benchmark (0.5.0)
|
||||
bigdecimal (4.1.2)
|
||||
claide (1.1.0)
|
||||
colored (1.2)
|
||||
@@ -41,8 +42,9 @@ GEM
|
||||
domain_name (0.6.20240107)
|
||||
dotenv (2.8.1)
|
||||
emoji_regex (3.2.3)
|
||||
excon (0.112.0)
|
||||
faraday (1.10.5)
|
||||
excon (1.5.0)
|
||||
logger
|
||||
faraday (1.10.6)
|
||||
faraday-em_http (~> 1.0)
|
||||
faraday-em_synchrony (~> 1.0)
|
||||
faraday-excon (~> 1.1)
|
||||
@@ -71,39 +73,45 @@ GEM
|
||||
faraday_middleware (1.2.1)
|
||||
faraday (~> 1.0)
|
||||
fastimage (2.4.1)
|
||||
fastlane (2.229.0)
|
||||
CFPropertyList (>= 2.3, < 4.0.0)
|
||||
abbrev (~> 0.1.2)
|
||||
addressable (>= 2.8, < 3.0.0)
|
||||
fastlane (2.237.0)
|
||||
CFPropertyList (>= 2.3, < 5.0.0)
|
||||
abbrev (~> 0.1)
|
||||
addressable (>= 2.9.0, < 3.0.0)
|
||||
artifactory (~> 3.0)
|
||||
aws-sdk-s3 (~> 1.0)
|
||||
aws-sdk-s3 (~> 1.197)
|
||||
babosa (>= 1.0.3, < 2.0.0)
|
||||
bundler (>= 1.12.0, < 3.0.0)
|
||||
base64 (~> 0.2)
|
||||
benchmark (>= 0.1.0)
|
||||
bundler (>= 2.4.0, < 5.0.0)
|
||||
colored (~> 1.2)
|
||||
commander (~> 4.6)
|
||||
csv (~> 3.3)
|
||||
dotenv (>= 2.1.1, < 3.0.0)
|
||||
emoji_regex (>= 0.1, < 4.0)
|
||||
excon (>= 0.71.0, < 1.0.0)
|
||||
excon (>= 0.71.0, < 2.0.0)
|
||||
faraday (~> 1.0)
|
||||
faraday-cookie_jar (~> 0.0.6)
|
||||
faraday_middleware (~> 1.0)
|
||||
fastimage (>= 2.1.0, < 3.0.0)
|
||||
fastlane-sirp (>= 1.0.0)
|
||||
fastlane-sirp (>= 1.1.0)
|
||||
gh_inspector (>= 1.1.2, < 2.0.0)
|
||||
google-apis-androidpublisher_v3 (~> 0.3)
|
||||
google-apis-playcustomapp_v1 (~> 0.1)
|
||||
google-cloud-env (>= 1.6.0, < 2.0.0)
|
||||
google-cloud-env (>= 1.6.0, < 2.3.0)
|
||||
google-cloud-storage (~> 1.31)
|
||||
highline (~> 2.0)
|
||||
http-cookie (~> 1.0.5)
|
||||
json (< 3.0.0)
|
||||
jwt (>= 2.1.0, < 3)
|
||||
jwt (>= 2.10.3, < 4)
|
||||
logger (>= 1.6, < 2.0)
|
||||
mini_magick (>= 4.9.4, < 5.0.0)
|
||||
multi_json (~> 1.12)
|
||||
multipart-post (>= 2.0.0, < 3.0.0)
|
||||
mutex_m (~> 0.3.0)
|
||||
mutex_m (~> 0.3)
|
||||
naturally (~> 2.2)
|
||||
nkf (~> 0.2)
|
||||
optparse (>= 0.1.1, < 1.0.0)
|
||||
ostruct (>= 0.1.0)
|
||||
plist (>= 3.1.0, < 4.0.0)
|
||||
rubyzip (>= 2.0.0, < 3.0.0)
|
||||
security (= 0.1.5)
|
||||
@@ -118,41 +126,46 @@ GEM
|
||||
xcpretty-travis-formatter (>= 0.0.3, < 2.0.0)
|
||||
fastlane-sirp (1.1.0)
|
||||
gh_inspector (1.1.3)
|
||||
google-apis-androidpublisher_v3 (0.54.0)
|
||||
google-apis-core (>= 0.11.0, < 2.a)
|
||||
google-apis-core (0.11.3)
|
||||
google-apis-androidpublisher_v3 (0.104.0)
|
||||
google-apis-core (>= 0.15.0, < 2.a)
|
||||
google-apis-core (0.18.0)
|
||||
addressable (~> 2.5, >= 2.5.1)
|
||||
googleauth (>= 0.16.2, < 2.a)
|
||||
httpclient (>= 2.8.1, < 3.a)
|
||||
googleauth (~> 1.9)
|
||||
httpclient (>= 2.8.3, < 3.a)
|
||||
mini_mime (~> 1.0)
|
||||
mutex_m
|
||||
representable (~> 3.0)
|
||||
retriable (>= 2.0, < 4.a)
|
||||
rexml
|
||||
google-apis-iamcredentials_v1 (0.17.0)
|
||||
google-apis-core (>= 0.11.0, < 2.a)
|
||||
google-apis-playcustomapp_v1 (0.13.0)
|
||||
google-apis-core (>= 0.11.0, < 2.a)
|
||||
google-apis-storage_v1 (0.31.0)
|
||||
google-apis-core (>= 0.11.0, < 2.a)
|
||||
google-cloud-core (1.8.0)
|
||||
google-apis-iamcredentials_v1 (0.28.0)
|
||||
google-apis-core (>= 0.15.0, < 2.a)
|
||||
google-apis-playcustomapp_v1 (0.18.0)
|
||||
google-apis-core (>= 0.15.0, < 2.a)
|
||||
google-apis-storage_v1 (0.64.0)
|
||||
google-apis-core (>= 0.15.0, < 2.a)
|
||||
google-cloud-core (1.9.0)
|
||||
google-cloud-env (>= 1.0, < 3.a)
|
||||
google-cloud-errors (~> 1.0)
|
||||
google-cloud-env (1.6.0)
|
||||
faraday (>= 0.17.3, < 3.0)
|
||||
google-cloud-errors (1.6.0)
|
||||
google-cloud-storage (1.47.0)
|
||||
google-cloud-env (2.2.2)
|
||||
base64 (~> 0.2)
|
||||
faraday (>= 1.0, < 3.a)
|
||||
google-cloud-errors (1.7.0)
|
||||
google-cloud-storage (1.62.0)
|
||||
addressable (~> 2.8)
|
||||
digest-crc (~> 0.4)
|
||||
google-apis-iamcredentials_v1 (~> 0.1)
|
||||
google-apis-storage_v1 (~> 0.31.0)
|
||||
google-apis-core (>= 0.18, < 2)
|
||||
google-apis-iamcredentials_v1 (~> 0.18)
|
||||
google-apis-storage_v1 (>= 0.42)
|
||||
google-cloud-core (~> 1.6)
|
||||
googleauth (>= 0.16.2, < 2.a)
|
||||
googleauth (~> 1.9)
|
||||
mini_mime (~> 1.0)
|
||||
googleauth (1.8.1)
|
||||
faraday (>= 0.17.3, < 3.a)
|
||||
jwt (>= 1.4, < 3.0)
|
||||
multi_json (~> 1.11)
|
||||
google-logging-utils (0.2.0)
|
||||
googleauth (1.17.1)
|
||||
faraday (>= 1.0, < 3.a)
|
||||
google-cloud-env (~> 2.2)
|
||||
google-logging-utils (~> 0.1)
|
||||
jwt (>= 1.4, < 4.0)
|
||||
os (>= 0.9, < 2.0)
|
||||
pstore (~> 0.1)
|
||||
signet (>= 0.16, < 2.a)
|
||||
highline (2.0.3)
|
||||
http-cookie (1.0.8)
|
||||
@@ -160,8 +173,8 @@ GEM
|
||||
httpclient (2.9.0)
|
||||
mutex_m
|
||||
jmespath (1.6.2)
|
||||
json (2.19.5)
|
||||
jwt (2.10.2)
|
||||
json (2.21.1)
|
||||
jwt (3.2.0)
|
||||
base64
|
||||
logger (1.7.0)
|
||||
mini_magick (4.13.2)
|
||||
@@ -171,26 +184,28 @@ GEM
|
||||
mutex_m (0.3.0)
|
||||
nanaimo (0.4.0)
|
||||
naturally (2.3.0)
|
||||
nkf (0.3.0)
|
||||
optparse (0.8.1)
|
||||
os (1.1.4)
|
||||
ostruct (0.6.3)
|
||||
plist (3.7.2)
|
||||
pstore (0.2.1)
|
||||
public_suffix (7.0.5)
|
||||
rake (13.4.2)
|
||||
representable (3.2.0)
|
||||
declarative (< 0.1.0)
|
||||
trailblazer-option (>= 0.1.1, < 0.2.0)
|
||||
uber (< 0.2.0)
|
||||
retriable (3.4.1)
|
||||
retriable (3.8.0)
|
||||
rexml (3.4.4)
|
||||
rouge (3.28.0)
|
||||
ruby2_keywords (0.0.5)
|
||||
rubyzip (2.4.1)
|
||||
security (0.1.5)
|
||||
signet (0.21.0)
|
||||
signet (0.22.0)
|
||||
addressable (~> 2.8)
|
||||
faraday (>= 0.17.5, < 3.a)
|
||||
jwt (>= 1.5, < 4.0)
|
||||
multi_json (~> 1.10)
|
||||
simctl (1.6.10)
|
||||
CFPropertyList
|
||||
naturally
|
||||
@@ -205,12 +220,14 @@ GEM
|
||||
uber (0.1.0)
|
||||
unicode-display_width (2.6.0)
|
||||
word_wrap (1.0.0)
|
||||
xcodeproj (1.27.0)
|
||||
xcodeproj (1.28.1)
|
||||
CFPropertyList (>= 2.3.3, < 4.0)
|
||||
atomos (~> 0.1.3)
|
||||
base64
|
||||
claide (>= 1.0.2, < 2.0)
|
||||
colored2 (~> 3.1)
|
||||
nanaimo (~> 0.4.0)
|
||||
nkf
|
||||
rexml (>= 3.3.6, < 4.0)
|
||||
xcpretty (0.4.1)
|
||||
rouge (~> 3.28.0)
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
**Last updated**
|
||||
April 29 2026
|
||||
August 7 2026
|
||||
|
||||
# Privacy Policy
|
||||
Catima does not collect or transmit any personal information.
|
||||
|
||||
To ensure correct app functionality, we require access to the following:
|
||||
|
||||
- Bluetooth: When using Catima together with the Wear OS companion app, Bluetooth access is needed to be able to communicate to Wear OS. This may show up as "find, connect to, and determine the relative position of nearby devices" because Android considers Bluetooth as part of location, but location information is never collected or used. The app can still be used when Bluetooth permission is denied, but you will not be able to use the Wear OS companion app.
|
||||
- Camera: We need access to your camera to be able to scan barcodes. The app can still be used when camera access is denied, but you will have to manually type the barcode information.
|
||||
- NFC: We need NFC access to temporarily disable NFC while showing a barcode to prevent NFC payment apps from triggering (such as when using a check-in gates which support both barcodes and NFC payments). This functionality can be disabled in settings.
|
||||
- Storage (Android 5 and 6 only): We need access to your device storage to create or import backups. The app can still be used when storage access is denied, but you will not be able to create or import backups.
|
||||
|
||||
@@ -19,8 +19,8 @@ android {
|
||||
applicationId = "me.hackerchick.catima"
|
||||
minSdk = 23
|
||||
targetSdk = 36
|
||||
versionCode = 166
|
||||
versionName = "2.42.1"
|
||||
versionCode = 1002
|
||||
versionName = "2.45.0"
|
||||
|
||||
vectorDrawables.useSupportLibrary = true
|
||||
multiDexEnabled = true
|
||||
@@ -59,8 +59,14 @@ android {
|
||||
dimension = "type"
|
||||
isDefault = true
|
||||
}
|
||||
create("fdroidLegacy") {
|
||||
dimension = "type"
|
||||
versionNameSuffix = " (F-Droid)"
|
||||
versionCode = defaultConfig.versionCode!! - 1
|
||||
}
|
||||
create("gplay") {
|
||||
dimension = "type"
|
||||
versionNameSuffix = " (Google)"
|
||||
|
||||
// Google doesn't allow donation links
|
||||
buildConfigField("boolean", "showDonate", "false")
|
||||
@@ -113,6 +119,8 @@ android {
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation(project(":shared"))
|
||||
|
||||
// AndroidX
|
||||
implementation(libs.androidx.appcompat.appcompat)
|
||||
implementation(libs.androidx.constraintlayout.constraintlayout)
|
||||
@@ -165,7 +173,6 @@ dependencies {
|
||||
|
||||
tasks.register("copyRawResFiles", Copy::class) {
|
||||
from(
|
||||
layout.projectDirectory.file("../CHANGELOG.md"),
|
||||
layout.projectDirectory.file("../PRIVACY.md")
|
||||
)
|
||||
into(layout.projectDirectory.dir("src/main/res/raw"))
|
||||
@@ -173,7 +180,7 @@ tasks.register("copyRawResFiles", Copy::class) {
|
||||
}.also {
|
||||
tasks.preBuild.dependsOn(it)
|
||||
tasks.getByName<Delete>("clean") {
|
||||
val filesNamesToDelete = listOf("CHANGELOG", "PRIVACY")
|
||||
val filesNamesToDelete = listOf("PRIVACY")
|
||||
filesNamesToDelete.forEach { fileName ->
|
||||
delete(layout.projectDirectory.file("src/main/res/raw/${fileName.lowercase()}.md"))
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name">Catima Ladění</string>
|
||||
<string name="app_name">Catima (ladicí verze)</string>
|
||||
</resources>
|
||||
@@ -1,4 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name">Catima Debug</string>
|
||||
</resources>
|
||||
<string name="app_name">Catima silumine ja veaotsing</string>
|
||||
</resources>
|
||||
@@ -13,6 +13,12 @@
|
||||
|
||||
<uses-permission android:name="android.permission.CAMERA" />
|
||||
<uses-permission android:name="android.permission.NFC" />
|
||||
<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
|
||||
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />
|
||||
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
|
||||
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_CONNECTED_DEVICE" />
|
||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="23" />
|
||||
|
||||
<uses-feature
|
||||
@@ -101,6 +107,9 @@
|
||||
android:name=".cardview.LoyaltyCardViewActivity"
|
||||
android:exported="true"
|
||||
android:theme="@style/AppTheme.NoActionBar" />
|
||||
<activity
|
||||
android:name=".cardimageview.LoyaltyCardImageViewActivity"
|
||||
android:theme="@style/AppTheme.NoActionBar" />
|
||||
<activity
|
||||
android:name=".LoyaltyCardEditActivity"
|
||||
android:exported="true"
|
||||
@@ -223,5 +232,26 @@
|
||||
<action android:name="android.service.controls.ControlsProviderService" />
|
||||
</intent-filter>
|
||||
</service>
|
||||
|
||||
<service
|
||||
android:name=".wearos.BluetoothServerService"
|
||||
android:exported="false"
|
||||
android:foregroundServiceType="connectedDevice" />
|
||||
|
||||
<activity
|
||||
android:name=".wearos.BluetoothPairingActivity"
|
||||
android:exported="false"
|
||||
android:excludeFromRecents="true"
|
||||
android:launchMode="singleTop"
|
||||
android:theme="@style/AppTheme.Transparent" />
|
||||
|
||||
<receiver
|
||||
android:name=".wearos.BluetoothPairingReceiver"
|
||||
android:exported="false">
|
||||
<intent-filter>
|
||||
<action android:name="protect.card_locker.wearos.action.ALLOW_DEVICE" />
|
||||
<action android:name="protect.card_locker.wearos.action.BLOCK_DEVICE" />
|
||||
</intent-filter>
|
||||
</receiver>
|
||||
</application>
|
||||
</manifest>
|
||||
@@ -69,16 +69,7 @@ fun AboutScreenContent(
|
||||
stringResource(R.string.version_history),
|
||||
content.versionHistory,
|
||||
modifier = Modifier.testTag("card_version_history"),
|
||||
onClickUrl = "https://catima.app/changelog/",
|
||||
onClickDialogText = AnnotatedString.fromHtml(
|
||||
htmlString = content.historyHtml,
|
||||
linkStyles = TextLinkStyles(
|
||||
style = SpanStyle(
|
||||
textDecoration = TextDecoration.Underline,
|
||||
color = MaterialTheme.colorScheme.primary
|
||||
)
|
||||
)
|
||||
)
|
||||
onClickUrl = "https://catima.app/changelog/"
|
||||
)
|
||||
CatimaAboutSection(
|
||||
stringResource(R.string.credits),
|
||||
|
||||
@@ -62,18 +62,6 @@ public class AboutContent {
|
||||
return contributors.replace("\n", "<br />");
|
||||
}
|
||||
|
||||
public String getHistoryHtml() {
|
||||
String versionHistory;
|
||||
try {
|
||||
versionHistory = Utils.readTextFile(context, R.raw.changelog)
|
||||
.replace("# Changelog\n\n", "");
|
||||
} catch (IOException ignored) {
|
||||
return "";
|
||||
}
|
||||
return Utils.linkify(Utils.basicMDToHTML(versionHistory))
|
||||
.replace("\n", "<br />");
|
||||
}
|
||||
|
||||
public String getLicenseHtml() {
|
||||
try {
|
||||
return Utils.readTextFile(context, R.raw.license);
|
||||
|
||||
@@ -76,6 +76,7 @@ public class DBHelper extends SQLiteOpenHelper {
|
||||
|
||||
public enum LoyaltyCardOrder {
|
||||
Alpha,
|
||||
LastAdded,
|
||||
LastUsed,
|
||||
ValidFrom,
|
||||
Expiry
|
||||
@@ -1089,6 +1090,10 @@ public class DBHelper extends SQLiteOpenHelper {
|
||||
return LoyaltyCardDbIds.STORE;
|
||||
}
|
||||
|
||||
if (order == LoyaltyCardOrder.LastAdded) {
|
||||
return LoyaltyCardDbIds.ID;
|
||||
}
|
||||
|
||||
if (order == LoyaltyCardOrder.LastUsed) {
|
||||
return LoyaltyCardDbIds.LAST_USED;
|
||||
}
|
||||
@@ -1105,8 +1110,8 @@ public class DBHelper extends SQLiteOpenHelper {
|
||||
}
|
||||
|
||||
private static String getDbDirection(LoyaltyCardOrder order, LoyaltyCardOrderDirection direction) {
|
||||
if (order == LoyaltyCardOrder.LastUsed) {
|
||||
// We want the default sorting to put the most recently used first
|
||||
if (order == LoyaltyCardOrder.LastAdded || order == LoyaltyCardOrder.LastUsed) {
|
||||
// We want the default sorting to put the most recently added/used first
|
||||
return direction == LoyaltyCardOrderDirection.Descending ? "ASC" : "DESC";
|
||||
}
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@ import android.widget.RemoteViews
|
||||
import androidx.core.widget.RemoteViewsCompat
|
||||
import protect.card_locker.DBHelper.LoyaltyCardArchiveFilter
|
||||
import protect.card_locker.cardview.LoyaltyCardViewActivity
|
||||
import protect.card_locker.shared.ForegroundColorHelper
|
||||
|
||||
class ListWidget : AppWidgetProvider() {
|
||||
fun updateAll(context: Context) {
|
||||
@@ -100,7 +101,7 @@ class ListWidget : AppWidgetProvider() {
|
||||
// Note: Android 5 will not use bitmaps
|
||||
val remoteViews = RemoteViews(context.packageName, R.layout.list_widget_item).apply {
|
||||
val headerColor = Utils.getHeaderColor(context, loyaltyCard)
|
||||
val foreground = if (Utils.needsDarkForeground(headerColor)) Color.BLACK else Color.WHITE
|
||||
val foreground = if (ForegroundColorHelper.needsDarkForeground(headerColor)) Color.BLACK else Color.WHITE
|
||||
setInt(R.id.item_container_foreground, "setBackgroundColor", headerColor)
|
||||
val icon = loyaltyCard.getImageThumbnail(context)
|
||||
// FIXME: The icon flow causes a crash up to Android 12L, so force anything below 33 down this path
|
||||
|
||||
@@ -105,6 +105,12 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
|
||||
inputHolder.setNoteField(null);
|
||||
}
|
||||
|
||||
if (mLoyaltyCardListDisplayOptions.showingCardId() && !loyaltyCard.cardId.isEmpty()) {
|
||||
inputHolder.setExtraField(inputHolder.mCardIdField, loyaltyCard.cardId, null, showDivider);
|
||||
} else {
|
||||
inputHolder.setExtraField(inputHolder.mCardIdField, null, null, false);
|
||||
}
|
||||
|
||||
if (mLoyaltyCardListDisplayOptions.showingBalance() && !loyaltyCard.balance.equals(new BigDecimal("0"))) {
|
||||
inputHolder.setExtraField(inputHolder.mBalanceField, Utils.formatBalance(mContext, loyaltyCard.balance, loyaltyCard.balanceType), null, showDivider);
|
||||
} else {
|
||||
@@ -211,7 +217,7 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
|
||||
|
||||
public class LoyaltyCardListItemViewHolder extends RecyclerView.ViewHolder {
|
||||
|
||||
public TextView mCardText, mStoreField, mNoteField, mBalanceField, mValidFromField, mExpiryField;
|
||||
public TextView mCardText, mStoreField, mNoteField, mCardIdField, mBalanceField, mValidFromField, mExpiryField;
|
||||
public ImageView mCardIcon, mTickIcon;
|
||||
public MaterialCardView mRow;
|
||||
public ConstraintLayout mStar, mArchived;
|
||||
@@ -224,6 +230,7 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
|
||||
mDivider = loyaltyCardLayoutBinding.infoDivider;
|
||||
mStoreField = loyaltyCardLayoutBinding.store;
|
||||
mNoteField = loyaltyCardLayoutBinding.note;
|
||||
mCardIdField = loyaltyCardLayoutBinding.cardId;
|
||||
mBalanceField = loyaltyCardLayoutBinding.balance;
|
||||
mValidFromField = loyaltyCardLayoutBinding.validFrom;
|
||||
mExpiryField = loyaltyCardLayoutBinding.expiry;
|
||||
|
||||
@@ -91,6 +91,7 @@ import java.util.concurrent.Callable;
|
||||
import protect.card_locker.async.TaskHandler;
|
||||
import protect.card_locker.databinding.LayoutChipChoiceBinding;
|
||||
import protect.card_locker.databinding.LoyaltyCardEditActivityBinding;
|
||||
import protect.card_locker.shared.ForegroundColorHelper;
|
||||
import protect.card_locker.viewmodels.LoyaltyCardEditActivityViewModel;
|
||||
|
||||
public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements BarcodeImageWriterResultCallback, ColorPickerDialogListener {
|
||||
@@ -896,8 +897,8 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements
|
||||
Integer headerColor = viewModel.getLoyaltyCard().headerColor;
|
||||
if (headerColor != null) {
|
||||
thumbnail.setOnClickListener(new ChooseCardImage());
|
||||
thumbnailEditIcon.setBackgroundColor(Utils.needsDarkForeground(headerColor) ? Color.BLACK : Color.WHITE);
|
||||
thumbnailEditIcon.setColorFilter(Utils.needsDarkForeground(headerColor) ? Color.WHITE : Color.BLACK);
|
||||
thumbnailEditIcon.setBackgroundColor(ForegroundColorHelper.Companion.needsDarkForeground(headerColor) ? Color.BLACK : Color.WHITE);
|
||||
thumbnailEditIcon.setColorFilter(ForegroundColorHelper.Companion.needsDarkForeground(headerColor) ? Color.WHITE : Color.BLACK);
|
||||
}
|
||||
|
||||
onResuming = false;
|
||||
@@ -919,18 +920,18 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements
|
||||
|
||||
setLoyaltyCardHeaderColor(headerColor);
|
||||
|
||||
thumbnail.setBackgroundColor(Utils.needsDarkForeground(headerColor) ? Color.BLACK : Color.WHITE);
|
||||
thumbnail.setBackgroundColor(ForegroundColorHelper.Companion.needsDarkForeground(headerColor) ? Color.BLACK : Color.WHITE);
|
||||
|
||||
thumbnailEditIcon.setBackgroundColor(Utils.needsDarkForeground(headerColor) ? Color.BLACK : Color.WHITE);
|
||||
thumbnailEditIcon.setColorFilter(Utils.needsDarkForeground(headerColor) ? Color.WHITE : Color.BLACK);
|
||||
thumbnailEditIcon.setBackgroundColor(ForegroundColorHelper.Companion.needsDarkForeground(headerColor) ? Color.BLACK : Color.WHITE);
|
||||
thumbnailEditIcon.setColorFilter(ForegroundColorHelper.Companion.needsDarkForeground(headerColor) ? Color.WHITE : Color.BLACK);
|
||||
} else {
|
||||
generateIcon(storeFieldEdit.getText().toString().trim());
|
||||
|
||||
Integer headerColor = viewModel.getLoyaltyCard().headerColor;
|
||||
|
||||
if (headerColor != null) {
|
||||
thumbnailEditIcon.setBackgroundColor(Utils.needsDarkForeground(headerColor) ? Color.BLACK : Color.WHITE);
|
||||
thumbnailEditIcon.setColorFilter(Utils.needsDarkForeground(headerColor) ? Color.WHITE : Color.BLACK);
|
||||
thumbnailEditIcon.setBackgroundColor(ForegroundColorHelper.Companion.needsDarkForeground(headerColor) ? Color.BLACK : Color.WHITE);
|
||||
thumbnailEditIcon.setColorFilter(ForegroundColorHelper.Companion.needsDarkForeground(headerColor) ? Color.WHITE : Color.BLACK);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -35,6 +35,7 @@ public class LoyaltyCardListDisplayOptionsManager {
|
||||
|
||||
private boolean mShowNameBelowThumbnail;
|
||||
private boolean mShowNote;
|
||||
private boolean mShowCardId;
|
||||
private boolean mShowBalance;
|
||||
private boolean mShowValidity;
|
||||
private boolean mShowArchivedCards;
|
||||
@@ -50,6 +51,7 @@ public class LoyaltyCardListDisplayOptionsManager {
|
||||
Context.MODE_PRIVATE);
|
||||
mShowNameBelowThumbnail = mCardDetailsPref.getBoolean(mContext.getString(R.string.sharedpreference_card_details_show_name_below_thumbnail), false);
|
||||
mShowNote = mCardDetailsPref.getBoolean(mContext.getString(R.string.sharedpreference_card_details_show_note), true);
|
||||
mShowCardId = mCardDetailsPref.getBoolean(mContext.getString(R.string.sharedpreference_card_details_show_card_id), false);
|
||||
mShowBalance = mCardDetailsPref.getBoolean(mContext.getString(R.string.sharedpreference_card_details_show_balance), true);
|
||||
mShowValidity = mCardDetailsPref.getBoolean(mContext.getString(R.string.sharedpreference_card_details_show_validity), true);
|
||||
mShowArchivedCards = mCardDetailsPref.getBoolean(mContext.getString(R.string.sharedpreference_card_details_show_archived_cards), true);
|
||||
@@ -83,6 +85,17 @@ public class LoyaltyCardListDisplayOptionsManager {
|
||||
return mShowNote;
|
||||
}
|
||||
|
||||
public void showCardId(boolean show) {
|
||||
mShowCardId = show;
|
||||
mRefreshCardsCallback.run();
|
||||
|
||||
saveDetailState(R.string.sharedpreference_card_details_show_card_id, show);
|
||||
}
|
||||
|
||||
public boolean showingCardId() {
|
||||
return mShowCardId;
|
||||
}
|
||||
|
||||
public void showBalance(boolean show) {
|
||||
mShowBalance = show;
|
||||
mRefreshCardsCallback.run();
|
||||
@@ -137,6 +150,11 @@ public class LoyaltyCardListDisplayOptionsManager {
|
||||
showingNote(),
|
||||
this::showNote
|
||||
));
|
||||
displayOptions.add(new LoyaltyCardDisplayOption(
|
||||
mContext.getString(R.string.show_card_id),
|
||||
showingCardId(),
|
||||
this::showCardId
|
||||
));
|
||||
displayOptions.add(new LoyaltyCardDisplayOption(
|
||||
mContext.getString(R.string.show_balance),
|
||||
showingBalance(),
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
package protect.card_locker;
|
||||
|
||||
import android.app.Application;
|
||||
import android.content.Intent;
|
||||
|
||||
import androidx.appcompat.app.AppCompatDelegate;
|
||||
|
||||
import org.acra.ACRA;
|
||||
import org.acra.config.CoreConfigurationBuilder;
|
||||
import org.acra.config.DialogConfigurationBuilder;
|
||||
@@ -11,6 +11,7 @@ import org.acra.config.MailSenderConfigurationBuilder;
|
||||
import org.acra.data.StringFormat;
|
||||
|
||||
import protect.card_locker.preferences.Settings;
|
||||
import protect.card_locker.wearos.WearSyncServiceManager;
|
||||
|
||||
public class LoyaltyCardLockerApplication extends Application {
|
||||
|
||||
@@ -41,5 +42,10 @@ public class LoyaltyCardLockerApplication extends Application {
|
||||
// Set theme
|
||||
Settings settings = new Settings(this);
|
||||
AppCompatDelegate.setDefaultNightMode(settings.getTheme());
|
||||
|
||||
// Start Bluetooth server for Wear OS companion if enabled.
|
||||
// The service checks BLUETOOTH_CONNECT itself and stops if the permission is missing.
|
||||
// The permission is requested from the launcher Activity when the UI resumes.
|
||||
WearSyncServiceManager.INSTANCE.synchronize(this, null);
|
||||
}
|
||||
}
|
||||
@@ -23,7 +23,9 @@ import androidx.activity.result.ActivityResultLauncher
|
||||
import androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult
|
||||
import androidx.appcompat.view.ActionMode
|
||||
import androidx.appcompat.widget.SearchView
|
||||
import androidx.core.content.edit
|
||||
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import androidx.recyclerview.widget.GridLayoutManager
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import com.google.android.material.tabs.TabLayout
|
||||
@@ -37,9 +39,12 @@ import protect.card_locker.databinding.MainActivityBinding
|
||||
import protect.card_locker.databinding.SortingOptionBinding
|
||||
import protect.card_locker.preferences.Settings
|
||||
import protect.card_locker.preferences.SettingsActivity
|
||||
import protect.card_locker.wearos.WearSyncPermissionRequester
|
||||
import java.io.UnsupportedEncodingException
|
||||
import java.util.concurrent.atomic.AtomicInteger
|
||||
import androidx.core.content.edit
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
|
||||
class MainActivity : CatimaAppCompatActivity(), CardAdapterListener {
|
||||
private lateinit var binding: MainActivityBinding
|
||||
@@ -61,6 +66,7 @@ class MainActivity : CatimaAppCompatActivity(), CardAdapterListener {
|
||||
private lateinit var mUpdateLoyaltyCardListRunnable: Runnable
|
||||
private lateinit var mBarcodeScannerLauncher: ActivityResultLauncher<Intent>
|
||||
private lateinit var mSettingsLauncher: ActivityResultLauncher<Intent>
|
||||
private lateinit var mWearSyncPermissionRequester: WearSyncPermissionRequester
|
||||
|
||||
private val mCurrentActionModeCallback: ActionMode.Callback = object : ActionMode.Callback {
|
||||
override fun onCreateActionMode(inputMode: ActionMode, inputMenu: Menu?): Boolean {
|
||||
@@ -318,6 +324,8 @@ class MainActivity : CatimaAppCompatActivity(), CardAdapterListener {
|
||||
}
|
||||
}
|
||||
|
||||
mWearSyncPermissionRequester = WearSyncPermissionRequester(this, this)
|
||||
|
||||
onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
|
||||
override fun handleOnBackPressed() {
|
||||
if (mSearchView != null && !mSearchView!!.isIconified) {
|
||||
@@ -394,6 +402,8 @@ class MainActivity : CatimaAppCompatActivity(), CardAdapterListener {
|
||||
val settings = Settings(this)
|
||||
layoutManager.setSpanCount(settings.getPreferredColumnCount())
|
||||
}
|
||||
|
||||
mWearSyncPermissionRequester.synchronize()
|
||||
}
|
||||
|
||||
private fun displayCardSetupOptions(menu: Menu, shouldShow: Boolean) {
|
||||
@@ -467,11 +477,7 @@ class MainActivity : CatimaAppCompatActivity(), CardAdapterListener {
|
||||
ShortcutHelper.updateShortcuts(mAdapter.mContext)
|
||||
}
|
||||
|
||||
private fun processParseResultList(
|
||||
parseResultList: MutableList<ParseResult?>,
|
||||
group: String?,
|
||||
closeAppOnNoBarcode: Boolean
|
||||
) {
|
||||
private fun processParseResultList(parseResultList: MutableList<ParseResult?>) {
|
||||
require(!parseResultList.isEmpty()) { "parseResultList may not be empty" }
|
||||
|
||||
Utils.makeUserChooseParseResultFromList(
|
||||
@@ -482,17 +488,12 @@ class MainActivity : CatimaAppCompatActivity(), CardAdapterListener {
|
||||
val intent =
|
||||
Intent(applicationContext, LoyaltyCardEditActivity::class.java)
|
||||
val bundle = parseResult.toLoyaltyCardBundle(this@MainActivity)
|
||||
if (group != null) {
|
||||
bundle.putString(LoyaltyCardEditActivity.BUNDLE_ADDGROUP, group)
|
||||
}
|
||||
intent.putExtras(bundle)
|
||||
startActivity(intent)
|
||||
}
|
||||
|
||||
override fun onUserDismissedSelector() {
|
||||
if (closeAppOnNoBarcode) {
|
||||
finish()
|
||||
}
|
||||
finish()
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -505,13 +506,11 @@ class MainActivity : CatimaAppCompatActivity(), CardAdapterListener {
|
||||
return
|
||||
}
|
||||
|
||||
val parseResultList: MutableList<ParseResult?>?
|
||||
|
||||
// Check for shared text
|
||||
if (receivedAction == Intent.ACTION_SEND && receivedType == "text/plain") {
|
||||
val loyaltyCard = LoyaltyCard()
|
||||
loyaltyCard.setCardId(intent.getStringExtra(Intent.EXTRA_TEXT)!!)
|
||||
parseResultList = mutableListOf(ParseResult(ParseResultType.BARCODE_ONLY, loyaltyCard))
|
||||
processParseResultList(mutableListOf(ParseResult(ParseResultType.BARCODE_ONLY, loyaltyCard)))
|
||||
} else {
|
||||
// Parse whatever file was sent, regardless of opening or sharing
|
||||
val data: Uri? = when (receivedAction) {
|
||||
@@ -527,36 +526,54 @@ class MainActivity : CatimaAppCompatActivity(), CardAdapterListener {
|
||||
}
|
||||
}
|
||||
|
||||
if (receivedType.startsWith("image/")) {
|
||||
parseResultList = Utils.retrieveBarcodesFromImage(this, data)
|
||||
} else if (receivedType == "application/pdf") {
|
||||
parseResultList = Utils.retrieveBarcodesFromPdf(this, data)
|
||||
} else if (mutableListOf<String?>(
|
||||
"application/vnd.apple.pkpass",
|
||||
"application/vnd-com.apple.pkpass"
|
||||
).contains(receivedType)
|
||||
) {
|
||||
parseResultList = Utils.retrieveBarcodesFromPkPass(this, data)
|
||||
} else if (receivedType == "application/vnd.espass-espass") {
|
||||
// FIXME: espass is not pkpass
|
||||
// However, several users stated in https://github.com/CatimaLoyalty/Android/issues/2197 that the formats are extremely similar to the point they could rename an .espass file to .pkpass and have it imported
|
||||
// So it makes sense to "unofficially" treat it as a PKPASS for now, even though not completely correct
|
||||
parseResultList = Utils.retrieveBarcodesFromPkPass(this, data)
|
||||
} else if (receivedType == "application/vnd.apple.pkpasses") {
|
||||
parseResultList = Utils.retrieveBarcodesFromPkPasses(this, data)
|
||||
} else {
|
||||
Log.e(TAG, "Wrong mime-type")
|
||||
return
|
||||
importFile(data, receivedType)
|
||||
}
|
||||
}
|
||||
|
||||
private fun importFile(data: Uri?, receivedType: String) {
|
||||
lifecycleScope.launch {
|
||||
val parseResultList: MutableList<ParseResult?> = withContext(Dispatchers.IO) {
|
||||
try {
|
||||
when {
|
||||
receivedType.startsWith("image/") ->
|
||||
Utils.retrieveBarcodesFromImage(this@MainActivity, data)
|
||||
|
||||
receivedType == "application/pdf" ->
|
||||
Utils.retrieveBarcodesFromPdf(this@MainActivity, data)
|
||||
|
||||
receivedType == "application/vnd.apple.pkpass" ||
|
||||
receivedType == "application/vnd-com.apple.pkpass" ->
|
||||
Utils.retrieveBarcodesFromPkPass(this@MainActivity, data)
|
||||
// FIXME: espass is not pkpass
|
||||
// However, several users stated in https://github.com/CatimaLoyalty/Android/issues/2197 that the formats are extremely similar to the point they could rename an .espass file to .pkpass and have it imported
|
||||
// So it makes sense to "unofficially" treat it as a PKPASS for now, even though not completely correct
|
||||
receivedType == "application/vnd.espass-espass" ->
|
||||
Utils.retrieveBarcodesFromPkPass(this@MainActivity, data)
|
||||
|
||||
receivedType == "application/vnd.apple.pkpasses" ->
|
||||
Utils.retrieveBarcodesFromPkPasses(this@MainActivity, data)
|
||||
|
||||
else -> {
|
||||
Log.e(TAG, "Wrong mime-type")
|
||||
return@withContext null
|
||||
}
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
Log.e(TAG, "Parsing failed: $e");
|
||||
e.printStackTrace();
|
||||
Utils.showToast(this@MainActivity, R.string.errorReadingFile, Toast.LENGTH_LONG);
|
||||
return@withContext null;
|
||||
}
|
||||
} ?: return@launch
|
||||
|
||||
if (parseResultList.isEmpty()) {
|
||||
Utils.showToast(this@MainActivity, R.string.noBarcodeFound, Toast.LENGTH_LONG);
|
||||
finish()
|
||||
return@launch
|
||||
}
|
||||
}
|
||||
|
||||
// Give up if we should parse but there is nothing to parse
|
||||
if (parseResultList == null || parseResultList.isEmpty()) {
|
||||
finish()
|
||||
return
|
||||
processParseResultList(parseResultList)
|
||||
}
|
||||
|
||||
processParseResultList(parseResultList, null, true)
|
||||
}
|
||||
|
||||
private fun extractIntentFields(intent: Intent) {
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
package protect.card_locker
|
||||
|
||||
object NotificationInfo {
|
||||
object WearBluetooth {
|
||||
const val NOTIFICATION_ID = 1001
|
||||
const val CHANNEL_ID = "catima_wear_bt"
|
||||
const val PAIRING_CHANNEL_ID = "catima_wear_bt_pairing"
|
||||
const val CRITICAL_ERROR_NOTIFICATION_ID = 1002
|
||||
const val CRITICAL_ERROR_CHANNEL_ID = "catima_wear_bt_critical_error"
|
||||
}
|
||||
}
|
||||
@@ -22,6 +22,8 @@ class PkpassesParser(context: Context, uri: Uri?) {
|
||||
throw IOException(context.getString(R.string.errorReadingFile))
|
||||
}
|
||||
|
||||
var hasPkpassFiles = false
|
||||
|
||||
try {
|
||||
mContext.contentResolver.openInputStream(uri).use { inputStream ->
|
||||
ZipInputStream(inputStream).use { zipInputStream ->
|
||||
@@ -42,6 +44,9 @@ class PkpassesParser(context: Context, uri: Uri?) {
|
||||
// Ignore non-pkpass files
|
||||
if (!localFileHeader.fileName.endsWith(".pkpass")) continue
|
||||
|
||||
// Mark as found
|
||||
hasPkpassFiles = true
|
||||
|
||||
// Extract .pkpass (.zip) inside .pkpasses to cache directory
|
||||
val tempFileName = "pkpassparser_" + System.currentTimeMillis() + "_" + localFileHeader.fileName
|
||||
val tempFile = Utils.copyToTempFile(mContext, zipInputStream, tempFileName)
|
||||
@@ -61,6 +66,11 @@ class PkpassesParser(context: Context, uri: Uri?) {
|
||||
} catch (e: Exception) {
|
||||
throw e
|
||||
}
|
||||
|
||||
if (!hasPkpassFiles) {
|
||||
Log.d(TAG, "No pkpass files found")
|
||||
throw IOException(mContext.getString(R.string.errorReadingFile))
|
||||
}
|
||||
}
|
||||
|
||||
fun getPkpassParsers(): ArrayList<PkpassParser> {
|
||||
|
||||
@@ -30,6 +30,7 @@ import androidx.activity.result.contract.ActivityResultContracts
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.core.widget.doOnTextChanged
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import com.google.zxing.DecodeHintType
|
||||
import com.google.zxing.ResultPoint
|
||||
@@ -37,6 +38,9 @@ import com.journeyapps.barcodescanner.BarcodeCallback
|
||||
import com.journeyapps.barcodescanner.BarcodeResult
|
||||
import com.journeyapps.barcodescanner.CaptureManager
|
||||
import com.journeyapps.barcodescanner.DecoratedBarcodeView
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
import protect.card_locker.databinding.CustomBarcodeScannerBinding
|
||||
import protect.card_locker.databinding.ScanActivityBinding
|
||||
|
||||
@@ -322,15 +326,29 @@ class ScanActivity : CatimaAppCompatActivity() {
|
||||
private fun handleActivityResult(requestCode: Int, resultCode: Int, intent: Intent?) {
|
||||
super.onActivityResult(resultCode, resultCode, intent)
|
||||
|
||||
val parseResultList: List<ParseResult> =
|
||||
Utils.parseSetBarcodeActivityResult(requestCode, resultCode, intent, this)
|
||||
lifecycleScope.launch(Dispatchers.IO) {
|
||||
val parseResultList =
|
||||
Utils.parseSetBarcodeActivityResult(requestCode, resultCode, intent, this@ScanActivity)
|
||||
|
||||
if (parseResultList.isEmpty()) {
|
||||
setScannerActive(true)
|
||||
return
|
||||
withContext(Dispatchers.Main) {
|
||||
if (parseResultList == null) {
|
||||
Utils.showToast(this@ScanActivity, R.string.errorReadingFile, Toast.LENGTH_LONG)
|
||||
setScannerActive(true)
|
||||
return@withContext
|
||||
}
|
||||
|
||||
if (parseResultList.isEmpty()) {
|
||||
Utils.showToast(this@ScanActivity, R.string.noBarcodeFound, Toast.LENGTH_LONG)
|
||||
setScannerActive(true)
|
||||
return@withContext
|
||||
}
|
||||
|
||||
processParseResultList(parseResultList)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private fun processParseResultList(parseResultList: List<ParseResult>) {
|
||||
Utils.makeUserChooseParseResultFromList(
|
||||
this,
|
||||
parseResultList,
|
||||
|
||||
@@ -18,6 +18,7 @@ import org.jetbrains.annotations.NotNull;
|
||||
import java.util.LinkedList;
|
||||
|
||||
import protect.card_locker.cardview.LoyaltyCardViewActivity;
|
||||
import protect.card_locker.shared.ForegroundColorHelper;
|
||||
|
||||
public class ShortcutHelper {
|
||||
/**
|
||||
@@ -102,7 +103,7 @@ public class ShortcutHelper {
|
||||
if (iconBitmap == null) {
|
||||
iconBitmap = Utils.generateIcon(context, loyaltyCard, true).getLetterTile();
|
||||
} else {
|
||||
iconBitmap = createAdaptiveBitmap(iconBitmap, Utils.needsDarkForeground(Utils.getHeaderColor(context, loyaltyCard)) ? Color.BLACK : Color.WHITE);
|
||||
iconBitmap = createAdaptiveBitmap(iconBitmap, ForegroundColorHelper.Companion.needsDarkForeground(Utils.getHeaderColor(context, loyaltyCard)) ? Color.BLACK : Color.WHITE);
|
||||
}
|
||||
|
||||
IconCompat icon = IconCompat.createWithAdaptiveBitmap(iconBitmap);
|
||||
|
||||
@@ -19,6 +19,8 @@ import android.hardware.camera2.CameraAccessException;
|
||||
import android.hardware.camera2.CameraManager;
|
||||
import android.net.Uri;
|
||||
import android.os.Build;
|
||||
import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
import android.os.ParcelFileDescriptor;
|
||||
import android.provider.MediaStore;
|
||||
import android.text.Layout;
|
||||
@@ -39,7 +41,6 @@ import androidx.annotation.Nullable;
|
||||
import androidx.annotation.RawRes;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.appcompat.app.AppCompatDelegate;
|
||||
import androidx.core.graphics.ColorUtils;
|
||||
import androidx.core.graphics.Insets;
|
||||
import androidx.core.os.LocaleListCompat;
|
||||
import androidx.core.view.ViewCompat;
|
||||
@@ -95,6 +96,7 @@ import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import protect.card_locker.preferences.Settings;
|
||||
import protect.card_locker.shared.ForegroundColorHelper;
|
||||
|
||||
public class Utils {
|
||||
private static final String TAG = "Catima";
|
||||
@@ -115,11 +117,19 @@ public class Utils {
|
||||
|
||||
public static final String CARD_IMAGE_FILENAME_REGEX = "^(card_)(\\d+)(_(?:front|back|icon)\\.png)$";
|
||||
|
||||
static final double LUMINANCE_MIDPOINT = 0.5;
|
||||
|
||||
static final int BITMAP_SIZE_SMALL = 512;
|
||||
static final int BITMAP_SIZE_BIG = 1600;
|
||||
|
||||
// Displays the toast immediately on the main UI loop, or asks Android to display it there otherwise.
|
||||
static public void showToast(Context context, int message, int duration) {
|
||||
if (Looper.myLooper() == Looper.getMainLooper()) {
|
||||
Toast.makeText(context, message, duration).show();
|
||||
} else {
|
||||
new Handler(Looper.getMainLooper()).post(
|
||||
() -> Toast.makeText(context, message, duration).show());
|
||||
}
|
||||
}
|
||||
|
||||
static public LetterBitmap generateIcon(Context context, LoyaltyCard loyaltyCard, boolean forShortcut) {
|
||||
return generateIcon(context, loyaltyCard.store, loyaltyCard.headerColor, forShortcut);
|
||||
}
|
||||
@@ -147,57 +157,38 @@ public class Utils {
|
||||
}
|
||||
|
||||
return new LetterBitmap(context, store, store,
|
||||
tileLetterFontSize, pixelSize, pixelSize, backgroundColor, needsDarkForeground(backgroundColor) ? Color.BLACK : Color.WHITE);
|
||||
tileLetterFontSize, pixelSize, pixelSize, backgroundColor, ForegroundColorHelper.Companion.needsDarkForeground(backgroundColor) ? Color.BLACK : Color.WHITE);
|
||||
}
|
||||
|
||||
static public boolean needsDarkForeground(Integer backgroundColor) {
|
||||
return ColorUtils.calculateLuminance(backgroundColor) > LUMINANCE_MIDPOINT;
|
||||
}
|
||||
|
||||
static public List<ParseResult> retrieveBarcodesFromImage(Context context, Uri uri) {
|
||||
static public List<ParseResult> retrieveBarcodesFromImage(Context context, Uri uri) throws FileNotFoundException {
|
||||
Log.i(TAG, "Received image file with possible barcode");
|
||||
|
||||
if (uri == null) {
|
||||
Log.e(TAG, "Uri did not contain any data");
|
||||
Toast.makeText(context, R.string.errorReadingImage, Toast.LENGTH_LONG).show();
|
||||
return new ArrayList<>();
|
||||
throw new FileNotFoundException("Uri did not contain any data");
|
||||
}
|
||||
|
||||
Bitmap bitmap;
|
||||
try {
|
||||
bitmap = retrieveImageFromUri(context, uri);
|
||||
} catch (IOException e) {
|
||||
Log.e(TAG, "Error getting data from image file");
|
||||
e.printStackTrace();
|
||||
Toast.makeText(context, R.string.errorReadingImage, Toast.LENGTH_LONG).show();
|
||||
return new ArrayList<>();
|
||||
throw new IllegalArgumentException("Error reading image file", e);
|
||||
}
|
||||
|
||||
List<ParseResult> barcodesFromBitmap = getBarcodesFromBitmap(bitmap);
|
||||
|
||||
if (barcodesFromBitmap.isEmpty()) {
|
||||
Log.i(TAG, "No barcode found in image file");
|
||||
Toast.makeText(context, R.string.noBarcodeFound, Toast.LENGTH_LONG).show();
|
||||
}
|
||||
|
||||
return barcodesFromBitmap;
|
||||
// Returns barcodes or an empty list if nothing found
|
||||
return getBarcodesFromBitmap(bitmap);
|
||||
}
|
||||
|
||||
static public List<ParseResult> retrieveBarcodesFromPkPass(Context context, Uri uri) {
|
||||
static public List<ParseResult> retrieveBarcodesFromPkPass(Context context, Uri uri) throws FileNotFoundException {
|
||||
Log.i(TAG, "Received Pkpass file with possible barcode");
|
||||
if (uri == null) {
|
||||
Log.e(TAG, "Pkpass did not contain any data");
|
||||
Toast.makeText(context, R.string.errorReadingFile, Toast.LENGTH_LONG).show();
|
||||
return new ArrayList<>();
|
||||
throw new FileNotFoundException("Uri did not contain any data");
|
||||
}
|
||||
|
||||
PkpassParser pkpassParser;
|
||||
try {
|
||||
pkpassParser = new PkpassParser(context, uri);
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error reading pkpass file", e);
|
||||
Toast.makeText(context, R.string.errorReadingFile, Toast.LENGTH_LONG).show();
|
||||
return new ArrayList<>();
|
||||
throw new IllegalArgumentException("Error reading pkpass file", e);
|
||||
}
|
||||
|
||||
List<String> locales = pkpassParser.listLocales();
|
||||
@@ -205,9 +196,7 @@ public class Utils {
|
||||
try {
|
||||
return Collections.singletonList(new ParseResult(ParseResultType.FULL, pkpassParser.toLoyaltyCard(null)));
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error calling toLoyaltyCard on pkpass file", e);
|
||||
Toast.makeText(context, R.string.errorReadingFile, Toast.LENGTH_LONG).show();
|
||||
return new ArrayList<>();
|
||||
throw new IllegalArgumentException("Error calling toLoyaltyCard on pkpass file", e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -217,9 +206,7 @@ public class Utils {
|
||||
try {
|
||||
parseResult = new ParseResult(ParseResultType.FULL, pkpassParser.toLoyaltyCard(locale));
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error calling toLoyaltyCard on pkpass file", e);
|
||||
Toast.makeText(context, R.string.errorReadingFile, Toast.LENGTH_LONG).show();
|
||||
return new ArrayList<>();
|
||||
throw new IllegalArgumentException("Error calling toLoyaltyCard on pkpass file", e);
|
||||
}
|
||||
parseResult.setNote(locale);
|
||||
parseResultList.add(parseResult);
|
||||
@@ -228,21 +215,17 @@ public class Utils {
|
||||
return parseResultList;
|
||||
}
|
||||
|
||||
static public List<ParseResult> retrieveBarcodesFromPkPasses(Context context, Uri uri) {
|
||||
static public List<ParseResult> retrieveBarcodesFromPkPasses(Context context, Uri uri) throws FileNotFoundException {
|
||||
Log.i(TAG, "Received Pkpasses file with possible barcode");
|
||||
if (uri == null) {
|
||||
Log.e(TAG, "Pkpasses did not contain any data");
|
||||
Toast.makeText(context, R.string.errorReadingFile, Toast.LENGTH_LONG).show();
|
||||
return new ArrayList<>();
|
||||
throw new FileNotFoundException("Uri did not contain any data");
|
||||
}
|
||||
|
||||
PkpassesParser pkpassesParser;
|
||||
try {
|
||||
pkpassesParser = new PkpassesParser(context, uri);
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error reading pkpasses file", e);
|
||||
Toast.makeText(context, R.string.errorReadingFile, Toast.LENGTH_LONG).show();
|
||||
return new ArrayList<>();
|
||||
throw new IllegalArgumentException("Error reading pkpasses file", e);
|
||||
}
|
||||
|
||||
List<ParseResult> parseResultList = new ArrayList<>();
|
||||
@@ -254,9 +237,7 @@ public class Utils {
|
||||
try {
|
||||
parseResult = new ParseResult(ParseResultType.FULL, pkpassParser.toLoyaltyCard(null));
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error calling toLoyaltyCard on pkpass file", e);
|
||||
Toast.makeText(context, R.string.errorReadingFile, Toast.LENGTH_LONG).show();
|
||||
return new ArrayList<>();
|
||||
throw new IllegalArgumentException("Error calling toLoyaltyCard on pkpass file", e);
|
||||
}
|
||||
parseResult.setNote(String.format(context.getString(R.string.cardWithNumber), i+1));
|
||||
parseResultList.add(parseResult);
|
||||
@@ -265,9 +246,7 @@ public class Utils {
|
||||
try {
|
||||
parseResult = new ParseResult(ParseResultType.FULL, pkpassParser.toLoyaltyCard(locale));
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error calling toLoyaltyCard on pkpass file", e);
|
||||
Toast.makeText(context, R.string.errorReadingFile, Toast.LENGTH_LONG).show();
|
||||
return new ArrayList<>();
|
||||
throw new IllegalArgumentException("Error calling toLoyaltyCard on pkpass file", e);
|
||||
}
|
||||
parseResult.setNote(String.format(context.getString(R.string.cardWithNumberAndLocale), i+1, locale));
|
||||
parseResultList.add(parseResult);
|
||||
@@ -280,12 +259,10 @@ public class Utils {
|
||||
return parseResultList;
|
||||
}
|
||||
|
||||
static public List<ParseResult> retrieveBarcodesFromPdf(Context context, Uri uri) {
|
||||
static public List<ParseResult> retrieveBarcodesFromPdf(Context context, Uri uri) throws FileNotFoundException {
|
||||
Log.i(TAG, "Received PDF file with possible barcode");
|
||||
if (uri == null) {
|
||||
Log.e(TAG, "Uri did not contain any data");
|
||||
Toast.makeText(context, R.string.errorReadingFile, Toast.LENGTH_LONG).show();
|
||||
return new ArrayList<>();
|
||||
throw new FileNotFoundException("Uri did not contain any data");
|
||||
}
|
||||
|
||||
ParcelFileDescriptor parcelFileDescriptor = null;
|
||||
@@ -320,8 +297,7 @@ public class Utils {
|
||||
}
|
||||
}
|
||||
} catch (IOException e) {
|
||||
Log.e(TAG, "Error reading PDF file", e);
|
||||
Toast.makeText(context, R.string.errorReadingFile, Toast.LENGTH_LONG).show();
|
||||
throw new IllegalArgumentException("Error reading PDF file", e);
|
||||
} finally {
|
||||
// Resource handling
|
||||
if (renderer != null) {
|
||||
@@ -336,10 +312,7 @@ public class Utils {
|
||||
}
|
||||
}
|
||||
|
||||
if (barcodesFromPdfPages.isEmpty()) {
|
||||
Log.i(TAG, "No barcode found in pdf file");
|
||||
Toast.makeText(context, R.string.noBarcodeFound, Toast.LENGTH_LONG).show();
|
||||
}
|
||||
// Returns barcodes or an empty list if nothing found
|
||||
return barcodesFromPdfPages;
|
||||
}
|
||||
|
||||
@@ -354,6 +327,7 @@ public class Utils {
|
||||
* @param context
|
||||
* @return List<ParseResult>
|
||||
*/
|
||||
@Nullable
|
||||
static public List<ParseResult> parseSetBarcodeActivityResult(int requestCode, int resultCode, Intent intent, Context context) {
|
||||
String contents;
|
||||
String format;
|
||||
@@ -362,28 +336,35 @@ public class Utils {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
|
||||
if (requestCode == Utils.BARCODE_IMPORT_FROM_IMAGE_FILE) {
|
||||
return retrieveBarcodesFromImage(context, intent.getData());
|
||||
}
|
||||
|
||||
if (requestCode == Utils.BARCODE_IMPORT_FROM_PDF_FILE) {
|
||||
return retrieveBarcodesFromPdf(context, intent.getData());
|
||||
}
|
||||
|
||||
if (requestCode == Utils.BARCODE_IMPORT_FROM_PKPASS_FILE) {
|
||||
Uri intentData = intent.getData();
|
||||
|
||||
if (intentData == null) {
|
||||
Log.e(TAG, "Uri did not contain any data");
|
||||
Toast.makeText(context, R.string.errorReadingFile, Toast.LENGTH_LONG).show();
|
||||
return new ArrayList<>();
|
||||
try {
|
||||
if (requestCode == Utils.BARCODE_IMPORT_FROM_IMAGE_FILE) {
|
||||
return retrieveBarcodesFromImage(context, intent.getData());
|
||||
}
|
||||
|
||||
if (Objects.equals(context.getContentResolver().getType(intentData), "application/vnd.apple.pkpasses")) {
|
||||
return retrieveBarcodesFromPkPasses(context, intentData);
|
||||
if (requestCode == Utils.BARCODE_IMPORT_FROM_PDF_FILE) {
|
||||
return retrieveBarcodesFromPdf(context, intent.getData());
|
||||
}
|
||||
|
||||
return retrieveBarcodesFromPkPass(context, intentData);
|
||||
if (requestCode == Utils.BARCODE_IMPORT_FROM_PKPASS_FILE) {
|
||||
Uri intentData = intent != null ? intent.getData() : null;
|
||||
|
||||
if (intentData == null) {
|
||||
throw new FileNotFoundException("Uri did not contain any data");
|
||||
}
|
||||
|
||||
// Mime type info is not always available. So we're going to first guess it's a pkpass file and if that fails, try pkpasses
|
||||
try {
|
||||
return retrieveBarcodesFromPkPass(context, intentData);
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error reading pkpass file, attempting as pkpasses file", e);
|
||||
return retrieveBarcodesFromPkPasses(context, intentData);
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
// Return null instead of an empty list to differentiate between error or no result
|
||||
Log.e(TAG, "Parsing failed: " + e);
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
|
||||
if (requestCode == Utils.BARCODE_SCAN || requestCode == Utils.SELECT_BARCODE_REQUEST) {
|
||||
@@ -1070,7 +1051,7 @@ public class Utils {
|
||||
|
||||
if (icon != null) {
|
||||
// Use header colour to decide if this image will need a white or black background
|
||||
backgroundOrIcon.setBackgroundColor(needsDarkForeground(headerColor) ? Color.BLACK : Color.WHITE);
|
||||
backgroundOrIcon.setBackgroundColor(ForegroundColorHelper.Companion.needsDarkForeground(headerColor) ? Color.BLACK : Color.WHITE);
|
||||
|
||||
// Ensure correct cropping style
|
||||
backgroundOrIcon.setScaleType(Utils.getRecommendedScaleTypeForThumbnailImage(icon));
|
||||
@@ -1100,7 +1081,7 @@ public class Utils {
|
||||
// Actually set the text and colour
|
||||
textWhenNoImage.setVisibility(View.VISIBLE);
|
||||
textWhenNoImage.setText(loyaltyCard.store);
|
||||
textWhenNoImage.setTextColor(Utils.needsDarkForeground(headerColor) ? Color.BLACK : Color.WHITE);
|
||||
textWhenNoImage.setTextColor(ForegroundColorHelper.Companion.needsDarkForeground(headerColor) ? Color.BLACK : Color.WHITE);
|
||||
}
|
||||
|
||||
return headerColor;
|
||||
|
||||
@@ -0,0 +1,240 @@
|
||||
package protect.card_locker.cardimageview
|
||||
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.content.Intent.FLAG_GRANT_READ_URI_PERMISSION
|
||||
import android.graphics.Bitmap
|
||||
import android.os.Bundle
|
||||
import android.view.WindowManager
|
||||
import android.widget.Toast
|
||||
import androidx.activity.OnBackPressedDispatcher
|
||||
import androidx.activity.compose.setContent
|
||||
import androidx.annotation.StringRes
|
||||
import androidx.compose.foundation.Image
|
||||
import androidx.compose.foundation.background
|
||||
import androidx.compose.foundation.gestures.detectTapGestures
|
||||
import androidx.compose.foundation.gestures.rememberTransformableState
|
||||
import androidx.compose.foundation.gestures.transformable
|
||||
import androidx.compose.foundation.layout.Box
|
||||
import androidx.compose.foundation.layout.fillMaxSize
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.filled.MoreVert
|
||||
import androidx.compose.material3.DropdownMenu
|
||||
import androidx.compose.material3.DropdownMenuItem
|
||||
import androidx.compose.material3.Icon
|
||||
import androidx.compose.material3.IconButton
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.Scaffold
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableFloatStateOf
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.runtime.setValue
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.geometry.Offset
|
||||
import androidx.compose.ui.graphics.asImageBitmap
|
||||
import androidx.compose.ui.graphics.graphicsLayer
|
||||
import androidx.compose.ui.input.pointer.pointerInput
|
||||
import androidx.compose.ui.layout.ContentScale
|
||||
import androidx.compose.ui.layout.onSizeChanged
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import androidx.compose.ui.platform.testTag
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.unit.IntSize
|
||||
import androidx.core.content.FileProvider
|
||||
import protect.card_locker.CatimaComponentActivity
|
||||
import protect.card_locker.ImageLocationType
|
||||
import protect.card_locker.R
|
||||
import protect.card_locker.Utils
|
||||
import protect.card_locker.compose.CatimaTopAppBar
|
||||
import protect.card_locker.compose.theme.CatimaTheme
|
||||
import protect.card_locker.preferences.Settings
|
||||
|
||||
class LoyaltyCardImageViewActivity : CatimaComponentActivity() {
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
|
||||
fixedEdgeToEdge()
|
||||
applyWindowPreferences()
|
||||
|
||||
val imageLocationType = intent.imageLocationType()
|
||||
val loyaltyCardId = intent.getIntExtra(BUNDLE_ID, 0)
|
||||
val bitmap = imageLocationType?.let {
|
||||
Utils.retrieveCardImage(this, loyaltyCardId, it)
|
||||
}
|
||||
|
||||
if (loyaltyCardId == 0 || imageLocationType == null || bitmap == null) {
|
||||
Toast.makeText(this, R.string.failedToRetrieveImageFile, Toast.LENGTH_SHORT).show()
|
||||
finish()
|
||||
return
|
||||
}
|
||||
|
||||
title = getString(imageLocationType.descriptionRes())
|
||||
|
||||
setContent {
|
||||
CatimaTheme {
|
||||
LoyaltyCardImageViewScreen(
|
||||
bitmap = bitmap,
|
||||
imageLocationType = imageLocationType,
|
||||
cardId = loyaltyCardId,
|
||||
contentDescriptionRes = imageLocationType.descriptionRes(),
|
||||
onBackPressedDispatcher = onBackPressedDispatcher
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun applyWindowPreferences() {
|
||||
val settings = Settings(this)
|
||||
val currentWindow = window ?: return
|
||||
|
||||
val attributes = currentWindow.attributes
|
||||
if (settings.useMaxBrightnessDisplayingBarcode()) {
|
||||
attributes.screenBrightness = 1F
|
||||
}
|
||||
|
||||
if (settings.keepScreenOn) {
|
||||
currentWindow.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
|
||||
}
|
||||
|
||||
currentWindow.attributes = attributes
|
||||
}
|
||||
|
||||
private fun Intent.imageLocationType(): ImageLocationType? {
|
||||
val name = getStringExtra(BUNDLE_IMAGE_LOCATION_TYPE) ?: return null
|
||||
return runCatching { ImageLocationType.valueOf(name) }.getOrNull()
|
||||
}
|
||||
|
||||
private fun ImageLocationType.descriptionRes(): Int {
|
||||
return when (this) {
|
||||
ImageLocationType.icon -> R.string.thumbnailDescription
|
||||
ImageLocationType.front -> R.string.frontImageDescription
|
||||
ImageLocationType.back -> R.string.backImageDescription
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val BUNDLE_ID = "id"
|
||||
const val BUNDLE_IMAGE_LOCATION_TYPE = "imageLocationType"
|
||||
|
||||
@JvmStatic
|
||||
fun createIntent(
|
||||
context: Context,
|
||||
loyaltyCardId: Int,
|
||||
imageLocationType: ImageLocationType
|
||||
): Intent {
|
||||
return Intent(context, LoyaltyCardImageViewActivity::class.java)
|
||||
.putExtra(BUNDLE_ID, loyaltyCardId)
|
||||
.putExtra(BUNDLE_IMAGE_LOCATION_TYPE, imageLocationType.name)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun LoyaltyCardImageViewScreen(
|
||||
bitmap: Bitmap,
|
||||
imageLocationType: ImageLocationType,
|
||||
cardId: Int,
|
||||
@StringRes contentDescriptionRes: Int,
|
||||
onBackPressedDispatcher: OnBackPressedDispatcher,
|
||||
) {
|
||||
val context = LocalContext.current
|
||||
var scale by remember { mutableFloatStateOf(1F) }
|
||||
var offset by remember { mutableStateOf(Offset.Zero) }
|
||||
var size by remember { mutableStateOf(IntSize.Zero) }
|
||||
val zoomState = rememberTransformableState { _, zoomChange, panChange, _ ->
|
||||
val nextScale = (scale * zoomChange).coerceIn(1F, MAX_IMAGE_SCALE)
|
||||
scale = nextScale
|
||||
offset = if (nextScale == 1F) {
|
||||
Offset.Zero
|
||||
} else {
|
||||
(offset + panChange).clampTo(size, nextScale)
|
||||
}
|
||||
}
|
||||
|
||||
Scaffold(
|
||||
topBar = {
|
||||
CatimaTopAppBar(
|
||||
title = stringResource(contentDescriptionRes),
|
||||
onBackPressedDispatcher = onBackPressedDispatcher,
|
||||
actions = {
|
||||
var expanded by remember { mutableStateOf(false) }
|
||||
IconButton(onClick = { expanded = !expanded }) {
|
||||
Icon(
|
||||
imageVector = Icons.Filled.MoreVert,
|
||||
contentDescription = stringResource(R.string.action_more_options)
|
||||
)
|
||||
}
|
||||
DropdownMenu(
|
||||
expanded = expanded,
|
||||
onDismissRequest = { expanded = false }
|
||||
) {
|
||||
DropdownMenuItem(onClick = { openInImageGallery(context, cardId, imageLocationType) },
|
||||
text = { Text(stringResource(R.string.open_in_gallery)) },
|
||||
)
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
) { innerPadding ->
|
||||
Box(
|
||||
modifier = Modifier
|
||||
.fillMaxSize()
|
||||
.padding(innerPadding)
|
||||
.background(MaterialTheme.colorScheme.background)
|
||||
.testTag("card_image_zoom")
|
||||
) {
|
||||
Image(
|
||||
bitmap = bitmap.asImageBitmap(),
|
||||
contentDescription = stringResource(contentDescriptionRes),
|
||||
contentScale = ContentScale.Fit,
|
||||
modifier = Modifier
|
||||
.fillMaxSize()
|
||||
.onSizeChanged { size = it }
|
||||
.pointerInput(bitmap) {
|
||||
detectTapGestures(
|
||||
onDoubleTap = {
|
||||
scale = 1F
|
||||
offset = Offset.Zero
|
||||
}
|
||||
)
|
||||
}
|
||||
.transformable(zoomState)
|
||||
.graphicsLayer {
|
||||
scaleX = scale
|
||||
scaleY = scale
|
||||
translationX = offset.x
|
||||
translationY = offset.y
|
||||
}
|
||||
.testTag("card_image")
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun Offset.clampTo(size: IntSize, scale: Float): Offset {
|
||||
if (size.width == 0 || size.height == 0) {
|
||||
return this
|
||||
}
|
||||
|
||||
val maxX = size.width * (scale - 1F) / 2F
|
||||
val maxY = size.height * (scale - 1F) / 2F
|
||||
return Offset(
|
||||
x = x.coerceIn(-maxX, maxX),
|
||||
y = y.coerceIn(-maxY, maxY)
|
||||
)
|
||||
}
|
||||
|
||||
private fun openInImageGallery(context: Context, cardId: Int, imageLocationType: ImageLocationType){
|
||||
val imagePath = Utils.getCardImageFileName(cardId, imageLocationType)
|
||||
val viewInGalleryIntent = Intent(Intent.ACTION_VIEW).apply {
|
||||
setDataAndType(FileProvider.getUriForFile(context, context.packageName, context.getFileStreamPath(imagePath)), "image/*")
|
||||
flags = FLAG_GRANT_READ_URI_PERMISSION
|
||||
}
|
||||
context.startActivity(viewInGalleryIntent)
|
||||
}
|
||||
|
||||
private const val MAX_IMAGE_SCALE = 5F
|
||||
@@ -1,6 +1,5 @@
|
||||
package protect.card_locker.cardview;
|
||||
|
||||
import android.content.ActivityNotFoundException;
|
||||
import android.content.ClipData;
|
||||
import android.content.ClipboardManager;
|
||||
import android.content.Intent;
|
||||
@@ -34,7 +33,6 @@ import androidx.activity.OnBackPressedCallback;
|
||||
import androidx.appcompat.app.ActionBar;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
import androidx.core.content.FileProvider;
|
||||
import androidx.core.graphics.BlendModeColorFilterCompat;
|
||||
import androidx.core.graphics.BlendModeCompat;
|
||||
import androidx.core.graphics.ColorUtils;
|
||||
@@ -44,7 +42,6 @@ import androidx.core.view.accessibility.AccessibilityNodeInfoCompat;
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.google.android.material.snackbar.Snackbar;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.math.BigDecimal;
|
||||
import java.nio.charset.Charset;
|
||||
@@ -53,9 +50,11 @@ import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import protect.card_locker.*;
|
||||
import protect.card_locker.cardimageview.LoyaltyCardImageViewActivity;
|
||||
import protect.card_locker.databinding.LoyaltyCardViewLayoutBinding;
|
||||
import protect.card_locker.preferences.Settings;
|
||||
import protect.card_locker.preferences.SettingsActivity;
|
||||
import protect.card_locker.shared.ForegroundColorHelper;
|
||||
|
||||
public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements BarcodeImageWriterResultCallback {
|
||||
private LoyaltyCardViewLayoutBinding binding;
|
||||
@@ -97,6 +96,8 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
|
||||
|
||||
private long initTime = System.currentTimeMillis();
|
||||
|
||||
private final ListWidget listWidget = new ListWidget();
|
||||
|
||||
private enum AdjacentCardDirection {
|
||||
PREVIOUS,
|
||||
NEXT
|
||||
@@ -136,46 +137,27 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
|
||||
return;
|
||||
}
|
||||
|
||||
// If this is an image, open it in the gallery.
|
||||
openImageInGallery(imageType);
|
||||
openImage(imageType);
|
||||
}
|
||||
|
||||
private void openImageInGallery(LoyaltyCardImageType imageType) {
|
||||
File file = null;
|
||||
|
||||
private void openImage(LoyaltyCardImageType imageType) {
|
||||
switch (imageType) {
|
||||
case NONE:
|
||||
return;
|
||||
case ICON:
|
||||
file = Utils.retrieveCardImageAsFile(this, loyaltyCardId, ImageLocationType.icon);
|
||||
startImageActivity(ImageLocationType.icon);
|
||||
break;
|
||||
case IMAGE_FRONT:
|
||||
file = Utils.retrieveCardImageAsFile(this, loyaltyCardId, ImageLocationType.front);
|
||||
startImageActivity(ImageLocationType.front);
|
||||
break;
|
||||
case IMAGE_BACK:
|
||||
file = Utils.retrieveCardImageAsFile(this, loyaltyCardId, ImageLocationType.back);
|
||||
startImageActivity(ImageLocationType.back);
|
||||
break;
|
||||
case BARCODE:
|
||||
Toast.makeText(this, R.string.barcodeLongPressMessage, Toast.LENGTH_SHORT).show();
|
||||
return;
|
||||
default:
|
||||
Log.w(TAG, "openImage called with unsupported image type!");
|
||||
}
|
||||
}
|
||||
|
||||
// Do nothing if there is no file
|
||||
if (file == null) {
|
||||
Toast.makeText(this, R.string.failedToRetrieveImageFile, Toast.LENGTH_SHORT).show();
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
Intent intent = new Intent(Intent.ACTION_VIEW)
|
||||
.setDataAndType(FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID, file), "image/*")
|
||||
.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
|
||||
startActivity(intent);
|
||||
} catch (ActivityNotFoundException e) {
|
||||
// Display a toast message if an image viewer is not installed on device
|
||||
Toast.makeText(this, R.string.failedLaunchingPhotoPicker, Toast.LENGTH_SHORT).show();
|
||||
e.printStackTrace();
|
||||
}
|
||||
private void startImageActivity(ImageLocationType imageLocationType) {
|
||||
startActivity(LoyaltyCardImageViewActivity.createIntent(this, loyaltyCardId, imageLocationType));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -291,7 +273,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
|
||||
|
||||
binding.iconContainer.setOnClickListener(view -> {
|
||||
if (loyaltyCard.getImageThumbnail(this) != null) {
|
||||
openImageInGallery(LoyaltyCardImageType.ICON);
|
||||
openImage(LoyaltyCardImageType.ICON);
|
||||
} else {
|
||||
Toast.makeText(LoyaltyCardViewActivity.this, R.string.icon_header_click_text, Toast.LENGTH_LONG).show();
|
||||
}
|
||||
@@ -474,6 +456,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
|
||||
invalidateOptionsMenu();
|
||||
|
||||
ShortcutHelper.updateShortcuts(this);
|
||||
listWidget.updateAll(LoyaltyCardViewActivity.this);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -619,20 +602,20 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
|
||||
|
||||
// Set bottomAppBar and system navigation bar color
|
||||
binding.bottomAppBar.setBackgroundColor(darkenedColor);
|
||||
Utils.setNavigationBarColor(null, window, darkenedColor, Utils.needsDarkForeground(darkenedColor));
|
||||
Utils.setNavigationBarColor(null, window, darkenedColor, ForegroundColorHelper.Companion.needsDarkForeground(darkenedColor));
|
||||
|
||||
int complementaryColor = Utils.getComplementaryColor(darkenedColor);
|
||||
binding.fabEdit.setBackgroundTintList(ColorStateList.valueOf(complementaryColor));
|
||||
Drawable editButtonIcon = binding.fabEdit.getDrawable();
|
||||
editButtonIcon.mutate();
|
||||
editButtonIcon.setTint(Utils.needsDarkForeground(complementaryColor) ? Color.BLACK : Color.WHITE);
|
||||
editButtonIcon.setTint(ForegroundColorHelper.Companion.needsDarkForeground(complementaryColor) ? Color.BLACK : Color.WHITE);
|
||||
binding.fabEdit.setImageDrawable(editButtonIcon);
|
||||
|
||||
Bitmap icon = loyaltyCard.getImageThumbnail(this);
|
||||
Utils.setIconOrTextWithBackground(this, loyaltyCard, icon, binding.iconImage, binding.iconText, 1);
|
||||
|
||||
// If the background is very bright, we should use dark icons
|
||||
backgroundNeedsDarkIcons = Utils.needsDarkForeground(backgroundHeaderColor);
|
||||
backgroundNeedsDarkIcons = ForegroundColorHelper.Companion.needsDarkForeground(backgroundHeaderColor);
|
||||
|
||||
fixBottomAppBarImageButtonColor(binding.bottomAppBarInfoButton);
|
||||
fixBottomAppBarImageButtonColor(binding.bottomAppBarPreviousButton);
|
||||
@@ -795,7 +778,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
|
||||
} else if (id == R.id.action_star_unstar) {
|
||||
DBHelper.updateLoyaltyCardStarStatus(database, loyaltyCardId, loyaltyCard.starStatus == 0 ? 1 : 0);
|
||||
|
||||
new ListWidget().updateAll(LoyaltyCardViewActivity.this);
|
||||
listWidget.updateAll(LoyaltyCardViewActivity.this);
|
||||
|
||||
// Re-init loyaltyCard with new data from DB
|
||||
onResume();
|
||||
@@ -806,7 +789,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
|
||||
DBHelper.updateLoyaltyCardArchiveStatus(database, loyaltyCardId, 1);
|
||||
Toast.makeText(LoyaltyCardViewActivity.this, R.string.archived, Toast.LENGTH_LONG).show();
|
||||
|
||||
new ListWidget().updateAll(LoyaltyCardViewActivity.this);
|
||||
listWidget.updateAll(LoyaltyCardViewActivity.this);
|
||||
|
||||
// Re-init loyaltyCard with new data from DB
|
||||
onResume();
|
||||
@@ -831,7 +814,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
|
||||
|
||||
DBHelper.deleteLoyaltyCard(database, LoyaltyCardViewActivity.this, loyaltyCardId);
|
||||
|
||||
new ListWidget().updateAll(LoyaltyCardViewActivity.this);
|
||||
listWidget.updateAll(LoyaltyCardViewActivity.this);
|
||||
|
||||
finish();
|
||||
dialog.dismiss();
|
||||
@@ -887,9 +870,9 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
|
||||
int accessibilityClickAction;
|
||||
LoyaltyCardImageType currentImageType = cardNavigator.getCurrent();
|
||||
if (currentImageType == LoyaltyCardImageType.IMAGE_FRONT) {
|
||||
accessibilityClickAction = R.string.openFrontImageInGalleryApp;
|
||||
accessibilityClickAction = R.string.zoomFrontImage;
|
||||
} else if (currentImageType == LoyaltyCardImageType.IMAGE_BACK) {
|
||||
accessibilityClickAction = R.string.openBackImageInGalleryApp;
|
||||
accessibilityClickAction = R.string.zoomBackImage;
|
||||
} else {
|
||||
accessibilityClickAction = R.string.moveBarcodeToTopOfScreen;
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ package protect.card_locker.compose
|
||||
import androidx.activity.OnBackPressedDispatcher
|
||||
import androidx.appcompat.app.AppCompatDelegate
|
||||
import androidx.compose.foundation.isSystemInDarkTheme
|
||||
import androidx.compose.foundation.layout.RowScope
|
||||
import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.automirrored.filled.ArrowBack
|
||||
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||
@@ -22,7 +23,9 @@ import protect.card_locker.preferences.Settings
|
||||
|
||||
@OptIn(ExperimentalMaterial3Api::class)
|
||||
@Composable
|
||||
fun CatimaTopAppBar(title: String, onBackPressedDispatcher: OnBackPressedDispatcher?) {
|
||||
fun CatimaTopAppBar(title: String,
|
||||
onBackPressedDispatcher: OnBackPressedDispatcher?,
|
||||
actions : @Composable RowScope.() -> Unit = {}) {
|
||||
// Use pure black in OLED theme
|
||||
val context = LocalContext.current
|
||||
val settings = Settings(context)
|
||||
@@ -51,6 +54,7 @@ fun CatimaTopAppBar(title: String, onBackPressedDispatcher: OnBackPressedDispatc
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
actions = actions
|
||||
)
|
||||
}
|
||||
@@ -112,4 +112,8 @@ public class Settings {
|
||||
public boolean useVolumeKeysForNavigation() {
|
||||
return getBoolean(R.string.settings_key_use_volume_keys_navigation, false);
|
||||
}
|
||||
|
||||
public boolean getWearSyncEnabled() {
|
||||
return getBoolean(R.string.settings_key_wear_sync, false);
|
||||
}
|
||||
}
|
||||
@@ -1,22 +1,42 @@
|
||||
package protect.card_locker.preferences
|
||||
|
||||
import android.app.Activity
|
||||
import android.annotation.SuppressLint
|
||||
import android.bluetooth.BluetoothDevice
|
||||
import android.bluetooth.BluetoothManager
|
||||
import android.content.BroadcastReceiver
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.content.IntentFilter
|
||||
import android.net.Uri
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import android.provider.Settings
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.MenuItem
|
||||
import android.widget.LinearLayout
|
||||
import android.widget.TextView
|
||||
import androidx.activity.OnBackPressedCallback
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import androidx.appcompat.app.AppCompatDelegate
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.core.os.LocaleListCompat
|
||||
import androidx.preference.ListPreference
|
||||
import androidx.preference.Preference
|
||||
import androidx.preference.PreferenceFragmentCompat
|
||||
import androidx.preference.SwitchPreferenceCompat
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import com.google.android.material.snackbar.Snackbar
|
||||
import protect.card_locker.BuildConfig
|
||||
import protect.card_locker.CatimaAppCompatActivity
|
||||
import protect.card_locker.MainActivity
|
||||
import protect.card_locker.R
|
||||
import protect.card_locker.Utils
|
||||
import protect.card_locker.databinding.SettingsActivityBinding
|
||||
import protect.card_locker.shared.BluetoothPermissionHelper
|
||||
import protect.card_locker.shared.WearBluetoothSecurity
|
||||
import protect.card_locker.wearos.BluetoothPairingNotificationManager
|
||||
import protect.card_locker.wearos.WearSyncPermissionRequester
|
||||
|
||||
class SettingsActivity : CatimaAppCompatActivity() {
|
||||
|
||||
@@ -81,11 +101,62 @@ class SettingsActivity : CatimaAppCompatActivity() {
|
||||
class SettingsFragment : PreferenceFragmentCompat() {
|
||||
var mReloadMain: Boolean = false
|
||||
|
||||
private lateinit var wearSyncPermissionRequester: WearSyncPermissionRequester
|
||||
private var currentDevicesDialog: AlertDialog? = null
|
||||
private var currentDevicesDialogIsBlocked: Boolean = false
|
||||
private val devicesChangedReceiver = object : BroadcastReceiver() {
|
||||
override fun onReceive(context: Context, intent: Intent) {
|
||||
if (intent.action != BluetoothPairingNotificationManager.ACTION_DEVICES_CHANGED) {
|
||||
return
|
||||
}
|
||||
findPreference<Preference>(getString(R.string.settings_key_wear_sync_devices))?.let { updateWearSyncAllowedDevicesSummary(it) }
|
||||
findPreference<Preference>(getString(R.string.settings_key_wear_sync_blocked_devices))?.let { updateWearSyncBlockedDevicesSummary(it) }
|
||||
if (currentDevicesDialog?.isShowing != true) {
|
||||
return
|
||||
}
|
||||
val isBlocked = currentDevicesDialogIsBlocked
|
||||
currentDevicesDialog?.dismiss()
|
||||
if (isBlocked) {
|
||||
showWearSyncBlockedDevicesDialog()
|
||||
} else {
|
||||
showWearSyncAllowedDevicesDialog()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
wearSyncPermissionRequester.synchronize()
|
||||
findPreference<Preference>(getString(R.string.settings_key_wear_sync_devices))?.let { updateWearSyncAllowedDevicesSummary(it) }
|
||||
findPreference<Preference>(getString(R.string.settings_key_wear_sync_blocked_devices))?.let { updateWearSyncBlockedDevicesSummary(it) }
|
||||
ContextCompat.registerReceiver(
|
||||
requireContext(),
|
||||
devicesChangedReceiver,
|
||||
IntentFilter(BluetoothPairingNotificationManager.ACTION_DEVICES_CHANGED),
|
||||
ContextCompat.RECEIVER_NOT_EXPORTED
|
||||
)
|
||||
}
|
||||
|
||||
override fun onPause() {
|
||||
super.onPause()
|
||||
requireContext().unregisterReceiver(devicesChangedReceiver)
|
||||
}
|
||||
|
||||
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
|
||||
wearSyncPermissionRequester = WearSyncPermissionRequester(this, requireContext())
|
||||
|
||||
// Load the preferences from an XML resource
|
||||
addPreferencesFromResource(R.xml.preferences)
|
||||
|
||||
// Show pretty names and summaries
|
||||
setupThemePreference()
|
||||
setupOledDarkPreference()
|
||||
setupLocalePreference()
|
||||
setupCrashReporterPreference()
|
||||
setupWearSyncPreference()
|
||||
setupWearSyncDevicePreferences()
|
||||
}
|
||||
|
||||
private fun setupThemePreference() {
|
||||
val themePreference = findPreference<ListPreference>(getString(R.string.settings_key_theme))
|
||||
themePreference!!.setOnPreferenceChangeListener { _, o ->
|
||||
when (o.toString()) {
|
||||
@@ -101,13 +172,17 @@ class SettingsActivity : CatimaAppCompatActivity() {
|
||||
}
|
||||
true
|
||||
}
|
||||
}
|
||||
|
||||
private fun setupOledDarkPreference() {
|
||||
val oledDarkPreference = findPreference<Preference>(getString(R.string.settings_key_oled_dark))
|
||||
oledDarkPreference!!.setOnPreferenceChangeListener { _, _ ->
|
||||
refreshActivity(true)
|
||||
refreshActivity()
|
||||
true
|
||||
}
|
||||
}
|
||||
|
||||
private fun setupLocalePreference() {
|
||||
val localePreference =
|
||||
findPreference<ListPreference>(getString(R.string.settings_key_locale))!!
|
||||
localePreference.let {
|
||||
@@ -148,7 +223,7 @@ class SettingsActivity : CatimaAppCompatActivity() {
|
||||
localePreference.setOnPreferenceChangeListener { _, newValue ->
|
||||
// See corresponding comment in Utils.updateBaseContextLocale for Android 6- notes
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
|
||||
refreshActivity(true)
|
||||
refreshActivity()
|
||||
return@setOnPreferenceChangeListener true
|
||||
}
|
||||
val newLocale = newValue as String
|
||||
@@ -156,14 +231,205 @@ class SettingsActivity : CatimaAppCompatActivity() {
|
||||
AppCompatDelegate.setApplicationLocales(if (newLocale.isEmpty()) LocaleListCompat.getEmptyLocaleList() else LocaleListCompat.create(Utils.stringToLocale(newLocale)))
|
||||
true
|
||||
}
|
||||
}
|
||||
|
||||
private fun setupCrashReporterPreference() {
|
||||
// Hide crash reporter settings on builds it's not enabled on
|
||||
val crashReporterPreference = findPreference<Preference>("acra.enable")
|
||||
crashReporterPreference!!.isVisible = BuildConfig.useAcraCrashReporter
|
||||
}
|
||||
|
||||
private fun refreshActivity(reloadMain: Boolean) {
|
||||
mReloadMain = reloadMain || mReloadMain
|
||||
private fun setupWearSyncPreference() {
|
||||
val wearSyncPreference = findPreference<SwitchPreferenceCompat>(getString(R.string.settings_key_wear_sync))
|
||||
wearSyncPreference!!.setOnPreferenceChangeListener { preference, newValue ->
|
||||
val enabled = newValue as Boolean
|
||||
if (enabled) {
|
||||
wearSyncPermissionRequester.onWearSyncChanged(true) { granted ->
|
||||
if (granted) {
|
||||
(preference as? SwitchPreferenceCompat)?.isChecked = true
|
||||
} else {
|
||||
showWearSyncPermissionDeniedSnackbar()
|
||||
}
|
||||
}
|
||||
false
|
||||
} else {
|
||||
wearSyncPermissionRequester.onWearSyncChanged(false)
|
||||
true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun setupWearSyncDevicePreferences() {
|
||||
val allowedPreference = findPreference<Preference>(getString(R.string.settings_key_wear_sync_devices))
|
||||
allowedPreference!!.setOnPreferenceClickListener {
|
||||
showWearSyncAllowedDevicesDialog()
|
||||
true
|
||||
}
|
||||
updateWearSyncAllowedDevicesSummary(allowedPreference)
|
||||
|
||||
val blockedPreference = findPreference<Preference>(getString(R.string.settings_key_wear_sync_blocked_devices))
|
||||
blockedPreference!!.setOnPreferenceClickListener {
|
||||
showWearSyncBlockedDevicesDialog()
|
||||
true
|
||||
}
|
||||
updateWearSyncBlockedDevicesSummary(blockedPreference)
|
||||
}
|
||||
|
||||
private fun updateWearSyncAllowedDevicesSummary(preference: Preference) {
|
||||
val count = WearBluetoothSecurity.listTrustedDevices(requireContext()).size
|
||||
preference.summary = if (count == 0) {
|
||||
getString(R.string.settings_wear_sync_no_devices)
|
||||
} else {
|
||||
resources.getQuantityString(R.plurals.settings_wear_sync_devices_summary_count, count, count)
|
||||
}
|
||||
}
|
||||
|
||||
private fun updateWearSyncBlockedDevicesSummary(preference: Preference) {
|
||||
val count = WearBluetoothSecurity.listBlockedDevices(requireContext()).size
|
||||
preference.summary = if (count == 0) {
|
||||
getString(R.string.settings_wear_sync_no_blocked_devices)
|
||||
} else {
|
||||
resources.getQuantityString(R.plurals.settings_wear_sync_blocked_devices_summary_count, count, count)
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressLint("MissingPermission")
|
||||
private fun showWearSyncDeviceListDialog(
|
||||
titleRes: Int,
|
||||
noDevicesRes: Int,
|
||||
messageRes: Int,
|
||||
addresses: Set<String>,
|
||||
isBlocked: Boolean,
|
||||
onRemove: (String, String) -> Unit
|
||||
) {
|
||||
val context = requireContext()
|
||||
if (!BluetoothPermissionHelper.isBluetoothConnectGranted(context)) {
|
||||
showWearSyncPermissionDeniedSnackbar()
|
||||
return
|
||||
}
|
||||
val knownAddresses = addresses.toList()
|
||||
currentDevicesDialog?.dismiss()
|
||||
currentDevicesDialogIsBlocked = isBlocked
|
||||
if (knownAddresses.isEmpty()) {
|
||||
currentDevicesDialog = MaterialAlertDialogBuilder(context)
|
||||
.setTitle(titleRes)
|
||||
.setMessage(noDevicesRes)
|
||||
.setOnDismissListener {
|
||||
currentDevicesDialog = null
|
||||
currentDevicesDialogIsBlocked = false
|
||||
}
|
||||
.setPositiveButton(android.R.string.ok) { dialog, _ -> dialog.dismiss() }
|
||||
.show()
|
||||
return
|
||||
}
|
||||
|
||||
val adapter = context.getSystemService(BLUETOOTH_SERVICE) as? BluetoothManager
|
||||
val bondedDevices = try {
|
||||
adapter?.adapter?.bondedDevices ?: emptySet()
|
||||
} catch (_: SecurityException) {
|
||||
emptySet<BluetoothDevice>()
|
||||
}
|
||||
val deviceMap = bondedDevices.associateBy { it.address }
|
||||
|
||||
val content = View.inflate(context, R.layout.wear_sync_device_list, null)
|
||||
content.findViewById<TextView>(R.id.wear_sync_device_list_message).text = getString(messageRes)
|
||||
val container = content.findViewById<LinearLayout>(R.id.wear_sync_device_list_container)
|
||||
|
||||
knownAddresses.forEach { address ->
|
||||
val name = deviceName(deviceMap[address], address)
|
||||
val itemView = LayoutInflater.from(context).inflate(R.layout.wear_sync_device_list_item, container, false) as TextView
|
||||
itemView.text = getString(R.string.settings_wear_sync_device_name, name, address)
|
||||
itemView.setOnClickListener { onRemove(address, name) }
|
||||
container.addView(itemView)
|
||||
}
|
||||
|
||||
currentDevicesDialog = MaterialAlertDialogBuilder(context)
|
||||
.setTitle(titleRes)
|
||||
.setView(content)
|
||||
.setOnDismissListener {
|
||||
currentDevicesDialog = null
|
||||
currentDevicesDialogIsBlocked = false
|
||||
}
|
||||
.setNegativeButton(android.R.string.cancel) { dialog, _ -> dialog.dismiss() }
|
||||
.show()
|
||||
}
|
||||
|
||||
private fun showWearSyncAllowedDevicesDialog() {
|
||||
showWearSyncDeviceListDialog(
|
||||
R.string.settings_wear_sync_devices,
|
||||
R.string.settings_wear_sync_no_devices,
|
||||
R.string.settings_wear_sync_tap_to_remove,
|
||||
WearBluetoothSecurity.listTrustedDevices(requireContext()),
|
||||
isBlocked = false
|
||||
) { address, name -> confirmRemoveAllowedDevice(address, name) }
|
||||
}
|
||||
|
||||
private fun showWearSyncBlockedDevicesDialog() {
|
||||
showWearSyncDeviceListDialog(
|
||||
R.string.settings_wear_sync_blocked_devices,
|
||||
R.string.settings_wear_sync_no_blocked_devices,
|
||||
R.string.settings_wear_sync_tap_to_remove,
|
||||
WearBluetoothSecurity.listBlockedDevices(requireContext()),
|
||||
isBlocked = true
|
||||
) { address, name -> confirmRemoveBlockedDevice(address, name) }
|
||||
}
|
||||
|
||||
private fun confirmRemoveAllowedDevice(address: String, name: String) {
|
||||
confirmRemoveDevice(
|
||||
address,
|
||||
name,
|
||||
R.string.settings_wear_sync_unpair_message,
|
||||
onRemove = { WearBluetoothSecurity.untrustDevice(requireContext(), address) }
|
||||
)
|
||||
}
|
||||
|
||||
private fun confirmRemoveBlockedDevice(address: String, name: String) {
|
||||
confirmRemoveDevice(
|
||||
address,
|
||||
name,
|
||||
R.string.settings_wear_sync_unblock_message,
|
||||
onRemove = { WearBluetoothSecurity.unblockDevice(requireContext(), address) }
|
||||
)
|
||||
}
|
||||
|
||||
private fun confirmRemoveDevice(address: String, name: String, messageRes: Int, onRemove: () -> Unit) {
|
||||
val context = requireContext()
|
||||
MaterialAlertDialogBuilder(context)
|
||||
.setTitle(R.string.settings_wear_sync_unpair_title)
|
||||
.setMessage(getString(messageRes, name))
|
||||
.setPositiveButton(R.string.settings_wear_sync_unpair) { dialog, _ ->
|
||||
onRemove()
|
||||
BluetoothPairingNotificationManager.cancel(context, address)
|
||||
BluetoothPairingNotificationManager.notifyDevicesChanged(context)
|
||||
findPreference<Preference>(getString(R.string.settings_key_wear_sync_devices))?.let { updateWearSyncAllowedDevicesSummary(it) }
|
||||
findPreference<Preference>(getString(R.string.settings_key_wear_sync_blocked_devices))?.let { updateWearSyncBlockedDevicesSummary(it) }
|
||||
dialog.dismiss()
|
||||
}
|
||||
.setNegativeButton(android.R.string.cancel) { dialog, _ -> dialog.dismiss() }
|
||||
.show()
|
||||
}
|
||||
|
||||
private fun deviceName(device: BluetoothDevice?, fallback: String): String {
|
||||
return try { device?.name } catch (_: SecurityException) { null } ?: fallback
|
||||
}
|
||||
|
||||
private fun showWearSyncPermissionDeniedSnackbar() {
|
||||
Snackbar.make(
|
||||
requireView(),
|
||||
R.string.wear_sync_permission_required,
|
||||
Snackbar.LENGTH_LONG
|
||||
).setAction(R.string.open_settings) {
|
||||
startActivity(
|
||||
Intent(
|
||||
Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
|
||||
Uri.fromParts("package", requireContext().packageName, null)
|
||||
)
|
||||
)
|
||||
}.show()
|
||||
}
|
||||
|
||||
private fun refreshActivity() {
|
||||
mReloadMain = true
|
||||
activity?.recreate()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,68 @@
|
||||
package protect.card_locker.wearos
|
||||
|
||||
import android.content.Intent
|
||||
import android.os.Bundle
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import protect.card_locker.R
|
||||
import protect.card_locker.shared.WearBluetoothSecurity
|
||||
|
||||
class BluetoothPairingActivity : AppCompatActivity() {
|
||||
|
||||
private var currentDialog: AlertDialog? = null
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
showPairingDialog(intent)
|
||||
}
|
||||
|
||||
override fun onNewIntent(intent: Intent) {
|
||||
super.onNewIntent(intent)
|
||||
showPairingDialog(intent)
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
currentDialog?.dismiss()
|
||||
currentDialog = null
|
||||
super.onDestroy()
|
||||
}
|
||||
|
||||
private fun showPairingDialog(intent: Intent) {
|
||||
val address = intent.getStringExtra(BluetoothPairingConstants.DEVICE_ADDRESS) ?: return finish()
|
||||
val deviceName = intent.getStringExtra(BluetoothPairingConstants.DEVICE_NAME) ?: address
|
||||
val token = intent.getStringExtra(BluetoothPairingConstants.DEVICE_TOKEN)
|
||||
val isMismatch = intent.getBooleanExtra(BluetoothPairingConstants.IS_MISMATCH, false)
|
||||
|
||||
val titleRes = if (isMismatch) {
|
||||
R.string.wear_bt_pairing_mismatch_title
|
||||
} else {
|
||||
R.string.wear_bt_pairing_title
|
||||
}
|
||||
val messageRes = if (isMismatch) {
|
||||
R.string.wear_bt_pairing_mismatch_message
|
||||
} else {
|
||||
R.string.wear_bt_pairing_message
|
||||
}
|
||||
|
||||
currentDialog?.dismiss()
|
||||
currentDialog = MaterialAlertDialogBuilder(this)
|
||||
.setTitle(getString(titleRes, deviceName))
|
||||
.setMessage(getString(messageRes, deviceName))
|
||||
.setPositiveButton(R.string.wear_bt_pairing_allow) { _, _ ->
|
||||
WearBluetoothSecurity.trustDevice(this, address, token)
|
||||
BluetoothPairingNotificationManager.updateResultNotification(this, address, deviceName, true)
|
||||
BluetoothPairingNotificationManager.notifyDevicesChanged(this)
|
||||
finish()
|
||||
}
|
||||
.setNegativeButton(R.string.wear_bt_pairing_block) { _, _ ->
|
||||
WearBluetoothSecurity.blockDevice(this, address)
|
||||
BluetoothPairingNotificationManager.updateResultNotification(this, address, deviceName, false)
|
||||
BluetoothPairingNotificationManager.notifyDevicesChanged(this)
|
||||
finish()
|
||||
}
|
||||
.setOnCancelListener { finish() }
|
||||
.setCancelable(true)
|
||||
.show()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
package protect.card_locker.wearos
|
||||
|
||||
object BluetoothPairingConstants {
|
||||
const val DEVICE_ADDRESS = "device_address"
|
||||
const val DEVICE_NAME = "device_name"
|
||||
const val DEVICE_TOKEN = "device_token"
|
||||
const val IS_MISMATCH = "is_mismatch"
|
||||
}
|
||||
@@ -0,0 +1,122 @@
|
||||
package protect.card_locker.wearos
|
||||
|
||||
import android.app.NotificationChannel
|
||||
import android.app.NotificationManager
|
||||
import android.app.PendingIntent
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.os.Build
|
||||
import android.widget.Toast
|
||||
import androidx.core.app.NotificationCompat
|
||||
import protect.card_locker.NotificationInfo
|
||||
import protect.card_locker.R
|
||||
|
||||
object BluetoothPairingNotificationManager {
|
||||
|
||||
const val ACTION_DEVICES_CHANGED = "protect.card_locker.wearos.ACTION_DEVICES_CHANGED"
|
||||
|
||||
fun notifyDevicesChanged(context: Context) {
|
||||
context.sendBroadcast(Intent(ACTION_DEVICES_CHANGED).apply { setPackage(context.packageName) })
|
||||
}
|
||||
|
||||
fun showAuthorizationNotification(
|
||||
context: Context,
|
||||
deviceName: String,
|
||||
address: String,
|
||||
token: String,
|
||||
isMismatch: Boolean = false
|
||||
) {
|
||||
val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
|
||||
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
val channel = NotificationChannel(
|
||||
NotificationInfo.WearBluetooth.PAIRING_CHANNEL_ID,
|
||||
context.getString(R.string.wear_bt_pairing_channel_name),
|
||||
NotificationManager.IMPORTANCE_HIGH
|
||||
)
|
||||
notificationManager.createNotificationChannel(channel)
|
||||
}
|
||||
|
||||
val titleRes = if (isMismatch) {
|
||||
R.string.wear_bt_pairing_mismatch_title
|
||||
} else {
|
||||
R.string.wear_bt_pairing_title
|
||||
}
|
||||
val messageRes = if (isMismatch) {
|
||||
R.string.wear_bt_pairing_mismatch_message
|
||||
} else {
|
||||
R.string.wear_bt_pairing_message
|
||||
}
|
||||
|
||||
val allowIntent = Intent(context, BluetoothPairingReceiver::class.java).apply {
|
||||
action = BluetoothPairingReceiver.ACTION_ALLOW
|
||||
putExtra(BluetoothPairingConstants.DEVICE_ADDRESS, address)
|
||||
putExtra(BluetoothPairingConstants.DEVICE_NAME, deviceName)
|
||||
putExtra(BluetoothPairingConstants.DEVICE_TOKEN, token)
|
||||
}
|
||||
val blockIntent = Intent(context, BluetoothPairingReceiver::class.java).apply {
|
||||
action = BluetoothPairingReceiver.ACTION_BLOCK
|
||||
putExtra(BluetoothPairingConstants.DEVICE_ADDRESS, address)
|
||||
putExtra(BluetoothPairingConstants.DEVICE_NAME, deviceName)
|
||||
putExtra(BluetoothPairingConstants.IS_MISMATCH, isMismatch)
|
||||
}
|
||||
|
||||
val allowPendingIntent = PendingIntent.getBroadcast(
|
||||
context,
|
||||
address.hashCode(),
|
||||
allowIntent,
|
||||
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
|
||||
)
|
||||
val blockPendingIntent = PendingIntent.getBroadcast(
|
||||
context,
|
||||
address.hashCode() + 1,
|
||||
blockIntent,
|
||||
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
|
||||
)
|
||||
|
||||
val contentIntent = PendingIntent.getActivity(
|
||||
context,
|
||||
address.hashCode() + 2,
|
||||
Intent(context, BluetoothPairingActivity::class.java).apply {
|
||||
putExtra(BluetoothPairingConstants.DEVICE_ADDRESS, address)
|
||||
putExtra(BluetoothPairingConstants.DEVICE_NAME, deviceName)
|
||||
putExtra(BluetoothPairingConstants.DEVICE_TOKEN, token)
|
||||
putExtra(BluetoothPairingConstants.IS_MISMATCH, isMismatch)
|
||||
},
|
||||
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
|
||||
)
|
||||
|
||||
val notification = NotificationCompat.Builder(context, NotificationInfo.WearBluetooth.PAIRING_CHANNEL_ID)
|
||||
.setSmallIcon(R.drawable.ic_notification_catima)
|
||||
.setContentTitle(context.getString(titleRes, deviceName))
|
||||
.setContentText(context.getString(messageRes, deviceName))
|
||||
.setStyle(NotificationCompat.BigTextStyle().bigText(context.getString(messageRes, deviceName)))
|
||||
.addAction(0, context.getString(R.string.wear_bt_pairing_allow), allowPendingIntent)
|
||||
.addAction(0, context.getString(R.string.wear_bt_pairing_block), blockPendingIntent)
|
||||
.setContentIntent(contentIntent)
|
||||
.setAutoCancel(false)
|
||||
.setPriority(NotificationCompat.PRIORITY_HIGH)
|
||||
.setCategory(NotificationCompat.CATEGORY_STATUS)
|
||||
.build()
|
||||
|
||||
notificationManager.notify(notificationId(address), notification)
|
||||
}
|
||||
|
||||
fun cancel(context: Context, address: String) {
|
||||
val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
|
||||
notificationManager.cancel(notificationId(address))
|
||||
}
|
||||
|
||||
fun updateResultNotification(context: Context, address: String, deviceName: String, allowed: Boolean) {
|
||||
cancel(context, address)
|
||||
val message = if (allowed) {
|
||||
context.getString(R.string.wear_bt_pairing_allowed, deviceName)
|
||||
} else {
|
||||
context.getString(R.string.wear_bt_pairing_blocked, deviceName)
|
||||
}
|
||||
|
||||
Toast.makeText(context, message, Toast.LENGTH_SHORT).show()
|
||||
}
|
||||
|
||||
fun notificationId(address: String): Int = address.hashCode()
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
package protect.card_locker.wearos
|
||||
|
||||
import android.content.BroadcastReceiver
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import protect.card_locker.shared.WearBluetoothSecurity
|
||||
|
||||
class BluetoothPairingReceiver : BroadcastReceiver() {
|
||||
|
||||
override fun onReceive(context: Context, intent: Intent) {
|
||||
val address = intent.getStringExtra(BluetoothPairingConstants.DEVICE_ADDRESS) ?: return
|
||||
val deviceName = intent.getStringExtra(BluetoothPairingConstants.DEVICE_NAME) ?: address
|
||||
val token = intent.getStringExtra(BluetoothPairingConstants.DEVICE_TOKEN)
|
||||
|
||||
when (intent.action) {
|
||||
ACTION_ALLOW -> {
|
||||
WearBluetoothSecurity.trustDevice(context, address, token)
|
||||
BluetoothPairingNotificationManager.updateResultNotification(context, address, deviceName, true)
|
||||
BluetoothPairingNotificationManager.notifyDevicesChanged(context)
|
||||
}
|
||||
ACTION_BLOCK -> {
|
||||
WearBluetoothSecurity.blockDevice(context, address)
|
||||
BluetoothPairingNotificationManager.updateResultNotification(context, address, deviceName, false)
|
||||
BluetoothPairingNotificationManager.notifyDevicesChanged(context)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val ACTION_ALLOW = "protect.card_locker.wearos.action.ALLOW_DEVICE"
|
||||
const val ACTION_BLOCK = "protect.card_locker.wearos.action.BLOCK_DEVICE"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,310 @@
|
||||
package protect.card_locker.wearos
|
||||
|
||||
import android.app.NotificationChannel
|
||||
import android.app.NotificationManager
|
||||
import android.app.Service
|
||||
import android.bluetooth.BluetoothAdapter
|
||||
import android.bluetooth.BluetoothManager
|
||||
import android.bluetooth.BluetoothServerSocket
|
||||
import android.bluetooth.BluetoothSocket
|
||||
import android.content.Intent
|
||||
import android.os.Build
|
||||
import android.os.IBinder
|
||||
import android.util.Log
|
||||
import androidx.core.app.NotificationCompat
|
||||
import org.json.JSONArray
|
||||
import org.json.JSONObject
|
||||
import protect.card_locker.DBHelper
|
||||
import protect.card_locker.NotificationInfo
|
||||
import protect.card_locker.R
|
||||
import protect.card_locker.Utils
|
||||
import protect.card_locker.shared.BluetoothPermissionHelper
|
||||
import protect.card_locker.shared.WearBluetoothProtocol
|
||||
import protect.card_locker.shared.WearBluetoothSecurity
|
||||
import java.io.BufferedReader
|
||||
import java.io.IOException
|
||||
import java.io.InputStreamReader
|
||||
import java.io.OutputStreamWriter
|
||||
import java.io.PrintWriter
|
||||
|
||||
class BluetoothServerService : Service() {
|
||||
|
||||
companion object {
|
||||
private const val TAG = "CatimaBtServer"
|
||||
private const val NOTIFICATION_ID = NotificationInfo.WearBluetooth.NOTIFICATION_ID
|
||||
private const val CHANNEL_ID = NotificationInfo.WearBluetooth.CHANNEL_ID
|
||||
}
|
||||
|
||||
private var serverThread: AcceptThread? = null
|
||||
|
||||
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
|
||||
if (!BluetoothPermissionHelper.isBluetoothConnectGranted(this)) {
|
||||
Log.w(TAG, "BLUETOOTH_CONNECT permission not granted, stopping")
|
||||
stopSelf()
|
||||
return START_NOT_STICKY
|
||||
}
|
||||
val adapter = (getSystemService(BLUETOOTH_SERVICE) as? BluetoothManager)?.adapter
|
||||
if (adapter == null || !adapter.isEnabled) {
|
||||
Log.w(TAG, "Bluetooth not available or disabled")
|
||||
stopSelf()
|
||||
return START_NOT_STICKY
|
||||
}
|
||||
|
||||
// Avoid tearing down a working accept socket every time Settings is resumed.
|
||||
if (serverThread?.isAlive == true) {
|
||||
Log.d(TAG, "Bluetooth server already listening")
|
||||
return START_STICKY
|
||||
}
|
||||
|
||||
startForegroundWithNotification()
|
||||
serverThread?.cancel()
|
||||
serverThread = AcceptThread(adapter).also { it.start() }
|
||||
Log.d(TAG, "Bluetooth server started")
|
||||
return START_STICKY
|
||||
}
|
||||
|
||||
private fun startForegroundWithNotification() {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
val channel = NotificationChannel(
|
||||
CHANNEL_ID,
|
||||
getString(R.string.wear_bt_channel_name),
|
||||
NotificationManager.IMPORTANCE_MIN
|
||||
).apply { setShowBadge(false) }
|
||||
getSystemService(NotificationManager::class.java).createNotificationChannel(channel)
|
||||
}
|
||||
val notification = NotificationCompat.Builder(this, CHANNEL_ID)
|
||||
.setContentTitle(getString(R.string.wear_bt_notification_title))
|
||||
.setSmallIcon(R.drawable.ic_notification_sync)
|
||||
.setPriority(NotificationCompat.PRIORITY_MIN)
|
||||
.setSilent(true)
|
||||
.build()
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
|
||||
startForeground(NOTIFICATION_ID, notification,
|
||||
android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE)
|
||||
} else {
|
||||
startForeground(NOTIFICATION_ID, notification)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
serverThread?.cancel()
|
||||
serverThread = null
|
||||
super.onDestroy()
|
||||
}
|
||||
|
||||
override fun onBind(intent: Intent?): IBinder? = null
|
||||
|
||||
private inner class AcceptThread(adapter: BluetoothAdapter) : Thread() {
|
||||
private var serverSocket: BluetoothServerSocket? = null
|
||||
@Volatile private var running = true
|
||||
|
||||
init {
|
||||
try {
|
||||
if (BluetoothPermissionHelper.isBluetoothConnectGranted(this@BluetoothServerService)) {
|
||||
serverSocket = adapter.listenUsingRfcommWithServiceRecord(
|
||||
WearBluetoothProtocol.BT_SERVICE_NAME,
|
||||
WearBluetoothProtocol.BT_SERVICE_UUID
|
||||
)
|
||||
} else {
|
||||
Log.w(TAG, "BLUETOOTH_CONNECT permission missing, cannot open server socket")
|
||||
running = false
|
||||
}
|
||||
} catch (e: SecurityException) {
|
||||
Log.e(TAG, "BLUETOOTH_CONNECT permission missing, cannot create server socket", e)
|
||||
running = false
|
||||
} catch (e: Exception) {
|
||||
Log.e(TAG, "Failed to create server socket", e)
|
||||
running = false
|
||||
}
|
||||
}
|
||||
|
||||
override fun run() {
|
||||
Log.d(TAG, "Listening for Bluetooth connections")
|
||||
while (running) {
|
||||
val socket: BluetoothSocket = try {
|
||||
serverSocket?.accept() ?: break
|
||||
} catch (e: Exception) {
|
||||
if (running) Log.e(TAG, "Accept failed", e)
|
||||
break
|
||||
}
|
||||
// Handle each client on its own thread so a slow/stuck client
|
||||
// cannot block the accept loop.
|
||||
Thread { handleConnection(socket) }.start()
|
||||
}
|
||||
Log.d(TAG, "Accept loop ended")
|
||||
if (running) {
|
||||
Log.w(TAG, "Accept loop exited unexpectedly, restarting service")
|
||||
stopSelf()
|
||||
}
|
||||
}
|
||||
|
||||
private fun handleConnection(socket: BluetoothSocket) {
|
||||
val address = try { socket.remoteDevice.address } catch (_: SecurityException) { null } ?: return
|
||||
val deviceName = try { socket.remoteDevice.name } catch (_: SecurityException) { address }
|
||||
Log.d(TAG, "Connected to $deviceName ($address)")
|
||||
try {
|
||||
val reader = BufferedReader(InputStreamReader(socket.inputStream, "UTF-8"))
|
||||
val writer = PrintWriter(OutputStreamWriter(socket.outputStream, "UTF-8"), false)
|
||||
val firstLine = reader.readLine()?.trim() ?: return
|
||||
|
||||
if (firstLine == WearBluetoothProtocol.BT_CMD_VERSIONS) {
|
||||
val versions = JSONArray().put("${WearBluetoothProtocol.PROTOCOL_VERSION}.${WearBluetoothProtocol.PROTOCOL_MINOR_VERSION}").toString()
|
||||
writer.println(versions)
|
||||
writer.flush()
|
||||
Log.d(TAG, "Sent supported versions to $deviceName: $versions")
|
||||
return
|
||||
}
|
||||
|
||||
var commandLine: String? = firstLine
|
||||
while (commandLine != null) {
|
||||
val command = commandLine
|
||||
Log.d(TAG, "Received command: $command from $deviceName")
|
||||
|
||||
if (!command.startsWith(WearBluetoothProtocol.BT_CMD_VERSION_PREFIX)) {
|
||||
notAuthorized(writer)
|
||||
Log.w(TAG, "Unsupported command from $deviceName: $command")
|
||||
break
|
||||
}
|
||||
|
||||
val tokenLine = reader.readLine()?.trim()
|
||||
if (tokenLine == null || !tokenLine.startsWith(WearBluetoothProtocol.BT_CMD_TOKEN_PREFIX)) {
|
||||
notAuthorized(writer)
|
||||
Log.w(TAG, "Malformed token line from $deviceName: $tokenLine")
|
||||
break
|
||||
}
|
||||
val token = tokenLine.removePrefix(WearBluetoothProtocol.BT_CMD_TOKEN_PREFIX)
|
||||
|
||||
val isTrusted = WearBluetoothSecurity.isDeviceTrusted(this@BluetoothServerService, address)
|
||||
val storedToken = WearBluetoothSecurity.getDeviceToken(this@BluetoothServerService, address)
|
||||
val tokenMatches = storedToken != null && storedToken == token
|
||||
|
||||
when {
|
||||
WearBluetoothSecurity.isDeviceBlocked(this@BluetoothServerService, address) -> {
|
||||
notAuthorized(writer)
|
||||
Log.w(TAG, "Rejected blocked device $deviceName")
|
||||
break
|
||||
}
|
||||
isTrusted && tokenMatches -> {
|
||||
if (!serveCommand(writer, deviceName, command)) {
|
||||
break
|
||||
}
|
||||
}
|
||||
isTrusted && !tokenMatches -> {
|
||||
BluetoothPairingNotificationManager.showAuthorizationNotification(
|
||||
this@BluetoothServerService,
|
||||
deviceName,
|
||||
address,
|
||||
token,
|
||||
isMismatch = true
|
||||
)
|
||||
notAuthorized(writer)
|
||||
Log.w(TAG, "Token mismatch for $deviceName")
|
||||
break
|
||||
}
|
||||
else -> {
|
||||
BluetoothPairingNotificationManager.showAuthorizationNotification(
|
||||
this@BluetoothServerService,
|
||||
deviceName,
|
||||
address,
|
||||
token,
|
||||
isMismatch = false
|
||||
)
|
||||
notAuthorized(writer)
|
||||
Log.d(TAG, "Requested authorization for $deviceName")
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
commandLine = reader.readLine()?.trim()
|
||||
}
|
||||
} catch (_: IOException) {
|
||||
// Client closed the socket; this is a normal end-of-stream after
|
||||
// the watch has received the pages it needs.
|
||||
Log.d(TAG, "Connection closed by $deviceName")
|
||||
} catch (e: Exception) {
|
||||
Log.e(TAG, "Error handling connection from $deviceName", e)
|
||||
} finally {
|
||||
try { socket.close() } catch (_: Exception) { }
|
||||
}
|
||||
}
|
||||
|
||||
private fun notAuthorized(writer: PrintWriter) {
|
||||
writer.println(WearBluetoothProtocol.BT_RESPONSE_NOT_AUTHORIZED)
|
||||
writer.flush()
|
||||
}
|
||||
|
||||
private fun serveCommand(
|
||||
writer: PrintWriter,
|
||||
deviceName: String,
|
||||
command: String
|
||||
): Boolean {
|
||||
when {
|
||||
command.startsWith(WearBluetoothProtocol.BT_CMD_CARDS_PAGE_PREFIX) -> {
|
||||
val pageIndex = command.removePrefix(WearBluetoothProtocol.BT_CMD_CARDS_PAGE_PREFIX).toIntOrNull()
|
||||
if (pageIndex == null || pageIndex < 0) {
|
||||
Log.w(TAG, "Invalid page index from $deviceName: $command")
|
||||
notAuthorized(writer)
|
||||
return false
|
||||
}
|
||||
val json = buildCardsPageJson(pageIndex)
|
||||
writer.println(json)
|
||||
writer.flush()
|
||||
Log.d(TAG, "Sent page $pageIndex to $deviceName")
|
||||
return true
|
||||
}
|
||||
else -> {
|
||||
Log.w(TAG, "Unsupported command from $deviceName: $command")
|
||||
notAuthorized(writer)
|
||||
return false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun buildCardsPageJson(pageIndex: Int): String {
|
||||
val dbHelper = DBHelper(this@BluetoothServerService)
|
||||
val db = dbHelper.readableDatabase
|
||||
val order = Utils.getLoyaltyCardOrder(this@BluetoothServerService)
|
||||
val orderDirection = Utils.getLoyaltyCardOrderDirection(this@BluetoothServerService)
|
||||
val cursor = DBHelper.getLoyaltyCardCursor(
|
||||
db, "", null, order, orderDirection,
|
||||
DBHelper.LoyaltyCardArchiveFilter.Unarchived
|
||||
)
|
||||
val totalCards = cursor.count
|
||||
val totalPages = if (totalCards == 0) 1 else (totalCards + WearBluetoothProtocol.PAGE_SIZE - 1) / WearBluetoothProtocol.PAGE_SIZE
|
||||
val offset = pageIndex * WearBluetoothProtocol.PAGE_SIZE
|
||||
val array = JSONArray()
|
||||
cursor.use {
|
||||
if (it.move(offset + 1)) {
|
||||
val idIdx = it.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.ID)
|
||||
val storeIdx = it.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.STORE)
|
||||
val cardIdIdx = it.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.CARD_ID)
|
||||
val barcodeIdIdx = it.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.BARCODE_ID)
|
||||
val barcodeTypeIdx = it.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.BARCODE_TYPE)
|
||||
val headerColorIdx = it.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.HEADER_COLOR)
|
||||
var count = 0
|
||||
do {
|
||||
array.put(JSONObject().apply {
|
||||
put("id", it.getInt(idIdx))
|
||||
put("store", it.getString(storeIdx) ?: "")
|
||||
put("cardId", it.getString(cardIdIdx) ?: "")
|
||||
put("barcodeId", if (it.isNull(barcodeIdIdx)) JSONObject.NULL else it.getString(barcodeIdIdx))
|
||||
put("barcodeType", if (it.isNull(barcodeTypeIdx)) JSONObject.NULL else it.getString(barcodeTypeIdx))
|
||||
put("headerColor", if (it.isNull(headerColorIdx)) JSONObject.NULL else it.getInt(headerColorIdx))
|
||||
})
|
||||
count++
|
||||
} while (count < WearBluetoothProtocol.PAGE_SIZE && it.moveToNext())
|
||||
}
|
||||
}
|
||||
return JSONObject().apply {
|
||||
put("page", pageIndex)
|
||||
put("totalPages", totalPages)
|
||||
put("cards", array)
|
||||
}.toString()
|
||||
}
|
||||
|
||||
fun cancel() {
|
||||
running = false
|
||||
try { serverSocket?.close() } catch (_: Exception) { }
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,167 @@
|
||||
package protect.card_locker.wearos
|
||||
|
||||
import android.Manifest
|
||||
import android.app.ForegroundServiceStartNotAllowedException
|
||||
import android.app.NotificationChannel
|
||||
import android.app.NotificationManager
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.content.pm.PackageManager
|
||||
import android.os.Build
|
||||
import android.util.Log
|
||||
import androidx.activity.result.ActivityResultCaller
|
||||
import androidx.activity.result.contract.ActivityResultContracts
|
||||
import androidx.core.app.ActivityCompat
|
||||
import androidx.core.app.NotificationCompat
|
||||
import androidx.core.app.NotificationManagerCompat
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.core.content.edit
|
||||
import androidx.preference.PreferenceManager
|
||||
import protect.card_locker.NotificationInfo
|
||||
import protect.card_locker.R
|
||||
import protect.card_locker.preferences.Settings
|
||||
import protect.card_locker.shared.BluetoothPermissionHelper
|
||||
|
||||
class WearSyncPermissionRequester(
|
||||
caller: ActivityResultCaller,
|
||||
context: Context
|
||||
) {
|
||||
private val context = context.applicationContext
|
||||
private var pendingResultCallback: ((Boolean) -> Unit)? = null
|
||||
|
||||
private val permissionLauncher = caller.registerForActivityResult(
|
||||
ActivityResultContracts.RequestMultiplePermissions()
|
||||
) { results ->
|
||||
val allGranted = results.all { it.value }
|
||||
pendingResultCallback?.invoke(allGranted)
|
||||
WearSyncServiceManager.onPermissionResult(this.context, allGranted)
|
||||
pendingResultCallback = null
|
||||
}
|
||||
|
||||
fun synchronize() {
|
||||
WearSyncServiceManager.synchronize(context) {
|
||||
permissionLauncher.launch(getRequiredPermissions())
|
||||
}
|
||||
}
|
||||
|
||||
fun onWearSyncChanged(enabled: Boolean, onPermissionResult: ((Boolean) -> Unit)? = null) {
|
||||
val applied = WearSyncServiceManager.onWearSyncChanged(context, enabled) {
|
||||
pendingResultCallback = onPermissionResult
|
||||
permissionLauncher.launch(getRequiredPermissions())
|
||||
}
|
||||
if (applied) {
|
||||
onPermissionResult?.invoke(true)
|
||||
}
|
||||
}
|
||||
|
||||
private fun getRequiredPermissions(): Array<String> = buildList {
|
||||
if (BluetoothPermissionHelper.isBluetoothConnectRequired()) {
|
||||
add(Manifest.permission.BLUETOOTH_CONNECT)
|
||||
}
|
||||
if (BluetoothPermissionHelper.isPostNotificationsRequired()) {
|
||||
add(Manifest.permission.POST_NOTIFICATIONS)
|
||||
}
|
||||
}.toTypedArray()
|
||||
}
|
||||
|
||||
object WearSyncServiceManager {
|
||||
private const val TAG = "CatimaWearSyncServiceManager"
|
||||
|
||||
fun synchronize(context: Context, requestPermission: (() -> Unit)? = null) {
|
||||
if (!Settings(context).wearSyncEnabled) {
|
||||
stop(context)
|
||||
} else if (arePermissionsGranted(context)) {
|
||||
start(context)
|
||||
} else if (requestPermission != null) {
|
||||
requestPermission()
|
||||
} else {
|
||||
stop(context)
|
||||
}
|
||||
}
|
||||
|
||||
fun onWearSyncChanged(
|
||||
context: Context,
|
||||
enabled: Boolean,
|
||||
requestPermission: () -> Unit
|
||||
): Boolean {
|
||||
return if (enabled) {
|
||||
if (arePermissionsGranted(context)) {
|
||||
start(context)
|
||||
true
|
||||
} else {
|
||||
requestPermission()
|
||||
false
|
||||
}
|
||||
} else {
|
||||
stop(context)
|
||||
true
|
||||
}
|
||||
}
|
||||
|
||||
private fun arePermissionsGranted(context: Context): Boolean {
|
||||
return BluetoothPermissionHelper.isBluetoothConnectGranted(context) &&
|
||||
BluetoothPermissionHelper.isPostNotificationsGranted(context)
|
||||
}
|
||||
|
||||
fun onPermissionResult(context: Context, granted: Boolean) {
|
||||
if (granted && Settings(context).wearSyncEnabled) {
|
||||
start(context)
|
||||
} else {
|
||||
stop(context)
|
||||
if (!granted) {
|
||||
PreferenceManager.getDefaultSharedPreferences(context).edit {
|
||||
putBoolean(context.getString(R.string.settings_key_wear_sync), false)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun start(context: Context) {
|
||||
// Exception can only throw on API level 31 and up
|
||||
if (Build.VERSION.SDK_INT >= 31) {
|
||||
try {
|
||||
ContextCompat.startForegroundService(
|
||||
context,
|
||||
Intent(context, BluetoothServerService::class.java)
|
||||
)
|
||||
} catch (e: ForegroundServiceStartNotAllowedException) {
|
||||
// We naively assume we have enough permissions to show a notification as the service should never try to start
|
||||
// before the user gave notification access anyway
|
||||
Log.d(TAG, "Foreground service failed to launch: $e")
|
||||
val channel = NotificationChannel(
|
||||
NotificationInfo.WearBluetooth.CRITICAL_ERROR_CHANNEL_ID,
|
||||
context.getString(R.string.wear_bt_critical_error_channel_name),
|
||||
NotificationManager.IMPORTANCE_HIGH
|
||||
).apply { setShowBadge(false) }
|
||||
context.getSystemService(NotificationManager::class.java).createNotificationChannel(channel)
|
||||
val notification = NotificationCompat.Builder(context, NotificationInfo.WearBluetooth.CRITICAL_ERROR_CHANNEL_ID)
|
||||
.setSmallIcon(R.drawable.ic_notification_error)
|
||||
.setContentTitle(context.getString(R.string.wear_bt_failed_foreground_notification_title))
|
||||
.setContentText(e.message)
|
||||
.build()
|
||||
with(NotificationManagerCompat.from(context)) {
|
||||
if (ActivityCompat.checkSelfPermission(
|
||||
context,
|
||||
Manifest.permission.POST_NOTIFICATIONS
|
||||
) != PackageManager.PERMISSION_GRANTED
|
||||
) {
|
||||
return@with
|
||||
}
|
||||
notify(
|
||||
NotificationInfo.WearBluetooth.CRITICAL_ERROR_NOTIFICATION_ID,
|
||||
notification
|
||||
)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
ContextCompat.startForegroundService(
|
||||
context,
|
||||
Intent(context, BluetoothServerService::class.java)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
private fun stop(context: Context) {
|
||||
context.stopService(Intent(context, BluetoothServerService::class.java))
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
<!--
|
||||
~ Copyright (C) 2026 The Android Open Source Project
|
||||
~
|
||||
~ Licensed under the Apache License, Version 2.0 (the "License");
|
||||
~ you may not use this file except in compliance with the License.
|
||||
~ You may obtain a copy of the License at
|
||||
~
|
||||
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||
~
|
||||
~ Unless required by applicable law or agreed to in writing, software
|
||||
~ distributed under the License is distributed on an "AS IS" BASIS,
|
||||
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
~ See the License for the specific language governing permissions and
|
||||
~ limitations under the License.
|
||||
-->
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="960"
|
||||
android:viewportHeight="960"
|
||||
android:tint="#FFFFFF">
|
||||
<group android:scaleX="1.104"
|
||||
android:scaleY="1.104"
|
||||
android:translateX="-49.92"
|
||||
android:translateY="-49.92">
|
||||
<path
|
||||
android:fillColor="@android:color/white"
|
||||
android:pathData="M508.5,668.5Q520,657 520,640Q520,623 508.5,611.5Q497,600 480,600Q463,600 451.5,611.5Q440,623 440,640Q440,657 451.5,668.5Q463,680 480,680Q497,680 508.5,668.5ZM440,520L520,520L520,280L440,280L440,520ZM480,880Q397,880 324,848.5Q251,817 197,763Q143,709 111.5,636Q80,563 80,480Q80,397 111.5,324Q143,251 197,197Q251,143 324,111.5Q397,80 480,80Q563,80 636,111.5Q709,143 763,197Q817,251 848.5,324Q880,397 880,480Q880,563 848.5,636Q817,709 763,763Q709,817 636,848.5Q563,880 480,880ZM480,800Q614,800 707,707Q800,614 800,480Q800,346 707,253Q614,160 480,160Q346,160 253,253Q160,346 160,480Q160,614 253,707Q346,800 480,800ZM480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Z"/>
|
||||
</group>
|
||||
</vector>
|
||||
@@ -0,0 +1,30 @@
|
||||
<!--
|
||||
~ Copyright (C) 2026 The Android Open Source Project
|
||||
~
|
||||
~ Licensed under the Apache License, Version 2.0 (the "License");
|
||||
~ you may not use this file except in compliance with the License.
|
||||
~ You may obtain a copy of the License at
|
||||
~
|
||||
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||
~
|
||||
~ Unless required by applicable law or agreed to in writing, software
|
||||
~ distributed under the License is distributed on an "AS IS" BASIS,
|
||||
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
~ See the License for the specific language governing permissions and
|
||||
~ limitations under the License.
|
||||
-->
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="960"
|
||||
android:viewportHeight="960"
|
||||
android:tint="#FFFFFF">
|
||||
<group android:scaleX="0.92"
|
||||
android:scaleY="0.92"
|
||||
android:translateX="38.4"
|
||||
android:translateY="38.4">
|
||||
<path
|
||||
android:fillColor="@android:color/white"
|
||||
android:pathData="M160,800L160,720L270,720L254,706Q202,660 181,601Q160,542 160,482Q160,371 226.5,284.5Q293,198 400,170L400,254Q328,280 284,342.5Q240,405 240,482Q240,527 257,569.5Q274,612 310,648L320,658L320,560L400,560L400,800L160,800ZM560,790L560,706Q632,680 676,617.5Q720,555 720,478Q720,433 703,390.5Q686,348 650,312L640,302L640,400L560,400L560,160L800,160L800,240L690,240L706,254Q755,303 777.5,360.5Q800,418 800,478Q800,589 733.5,675.5Q667,762 560,790Z"/>
|
||||
</group>
|
||||
</vector>
|
||||
|
After Width: | Height: | Size: 790 B |
|
After Width: | Height: | Size: 752 B |
|
After Width: | Height: | Size: 499 B |
|
After Width: | Height: | Size: 509 B |
|
After Width: | Height: | Size: 478 B |
|
After Width: | Height: | Size: 346 B |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 919 B |
|
After Width: | Height: | Size: 656 B |
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 918 B |
@@ -0,0 +1,10 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24"
|
||||
android:tint="?attr/colorControlNormal">
|
||||
<path
|
||||
android:fillColor="@android:color/white"
|
||||
android:pathData="M2,6h2v12L2,18L2,6zM5,6h1v12L5,18L5,6zM7,6h3v12L7,18L7,6zM11,6h1v12h-1L11,6zM13,6h2v12h-2L13,6zM16,6h2v12h-2L16,6zM19,6h1v12h-1L19,6zM21,6h1v12h-1L21,6z"/>
|
||||
</vector>
|
||||
@@ -158,10 +158,31 @@
|
||||
android:visibility="gone"
|
||||
tools:visibility="visible"
|
||||
app:layout_constraintTop_toBottomOf="@+id/note"
|
||||
app:layout_constraintBottom_toTopOf="@+id/balance"
|
||||
app:layout_constraintBottom_toTopOf="@+id/cardId"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/cardId"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_vertical"
|
||||
android:layout_marginStart="8dp"
|
||||
android:layout_marginEnd="8dp"
|
||||
android:layout_marginBottom="4dp"
|
||||
android:textAppearance="?attr/textAppearanceBody2"
|
||||
app:drawableLeftCompat="@drawable/ic_card_id_24dp"
|
||||
android:drawablePadding="4dp"
|
||||
android:maxLines="1"
|
||||
android:ellipsize="end"
|
||||
android:visibility="gone"
|
||||
app:layout_constraintTop_toBottomOf="@+id/info_divider"
|
||||
app:layout_constraintBottom_toTopOf="@+id/balance"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
tools:visibility="visible"
|
||||
tools:text="1234567890"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/balance"
|
||||
android:layout_width="match_parent"
|
||||
@@ -174,7 +195,7 @@
|
||||
app:drawableLeftCompat="@drawable/ic_baseline_payments_24"
|
||||
android:drawablePadding="4dp"
|
||||
android:visibility="gone"
|
||||
app:layout_constraintTop_toBottomOf="@+id/info_divider"
|
||||
app:layout_constraintTop_toBottomOf="@+id/cardId"
|
||||
app:layout_constraintBottom_toTopOf="@+id/validFrom"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:clipToPadding="false">
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/wear_sync_device_list_container"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/wear_sync_device_list_message"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingStart="?attr/dialogPreferredPadding"
|
||||
android:paddingEnd="?attr/dialogPreferredPadding"
|
||||
style="?attr/materialAlertDialogBodyTextStyle" />
|
||||
|
||||
</LinearLayout>
|
||||
</androidx.core.widget.NestedScrollView>
|
||||
@@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:minHeight="?attr/listPreferredItemHeightSmall"
|
||||
android:gravity="center_vertical"
|
||||
android:paddingStart="?attr/listPreferredItemPaddingLeft"
|
||||
android:paddingEnd="?attr/listPreferredItemPaddingRight"
|
||||
android:background="?attr/selectableItemBackground"
|
||||
android:ellipsize="marquee"
|
||||
android:focusable="true"
|
||||
android:clickable="true"
|
||||
style="?attr/materialAlertDialogBodyTextStyle" />
|
||||
@@ -1,85 +1,90 @@
|
||||
Sylvia van Os
|
||||
Branden Archer
|
||||
J. Lavoie
|
||||
solokot
|
||||
J. Lavoie
|
||||
Allan Nordhøy
|
||||
Heimen Stoffels
|
||||
Oğuz Ersen
|
||||
B o d o
|
||||
Heimen Stoffels
|
||||
FC (Fay) Stegerman
|
||||
大王叫我来巡山
|
||||
B o d o
|
||||
StoyanDimitrov
|
||||
SlavekB
|
||||
Katharine Chui / Katie
|
||||
Silvério Santos
|
||||
mondstern
|
||||
IllusiveMan196
|
||||
Silvério Santos
|
||||
Максим Горпиніч
|
||||
Fjuro
|
||||
Edgars Andersons
|
||||
Liner Seven
|
||||
Altonss
|
||||
Fjuro
|
||||
Joel A
|
||||
Максим Горпиніч
|
||||
GitSpoon
|
||||
Michael Moroni
|
||||
Priit Jõerüüt
|
||||
Joel A
|
||||
Altonss
|
||||
Michael Moroni
|
||||
Eric
|
||||
GM
|
||||
laralem
|
||||
Petr Novák
|
||||
laralem
|
||||
Vasilis
|
||||
Taco
|
||||
Milo Ivir
|
||||
nadiafekihahmed
|
||||
pfaffenrodt
|
||||
Vasilis
|
||||
josé m
|
||||
Scrambled777
|
||||
Aayush Gupta
|
||||
Giovanni Donisi
|
||||
Nyatsuki
|
||||
ikanakova
|
||||
damjang
|
||||
Scrambled777
|
||||
josé m
|
||||
Kachelkaiser
|
||||
ikanakova
|
||||
Nyatsuki
|
||||
Jiri Grönroos
|
||||
Giovanni Donisi
|
||||
109247019824
|
||||
HudobniVolk
|
||||
Warder
|
||||
109247019824
|
||||
Traductor
|
||||
Samantaz Fox
|
||||
Balázs Meskó
|
||||
mdvhimself
|
||||
Traductor
|
||||
AMIR-G98
|
||||
Feike
|
||||
Arno-github
|
||||
Samantaz Fox
|
||||
mdvhimself
|
||||
NooB9496
|
||||
Cliff Heraldo
|
||||
Sergio Paredes
|
||||
Ankit Tiwari
|
||||
Arno-github
|
||||
Feike
|
||||
Jose Delvani
|
||||
Robin
|
||||
Milan Šalka
|
||||
damjang
|
||||
Gideon
|
||||
Govindgopalyadav
|
||||
Skrripy
|
||||
huuhaa
|
||||
Robin
|
||||
தமிழ்நேரம்
|
||||
huuhaa
|
||||
Watchman89
|
||||
Skrripy
|
||||
Hosted Weblate user 54392
|
||||
Govindgopalyadav
|
||||
Gideon
|
||||
waffshappen
|
||||
Marnick L'Eau
|
||||
JungHee Lee
|
||||
pacavarn
|
||||
ngocanhtve
|
||||
josé m.
|
||||
aradxxx
|
||||
StellarSand
|
||||
Quentin PAGÈS
|
||||
Projjal Moitra
|
||||
Aliaksandr Trush
|
||||
e-michalak
|
||||
தமிழ் நேரம்
|
||||
hajertabbane
|
||||
inavleb
|
||||
Denis Shilin
|
||||
Renko
|
||||
Ricky Tigg
|
||||
Robin Liu
|
||||
Ziad OUALHADJ
|
||||
inavleb
|
||||
しいたけ
|
||||
Alexander Ivanov
|
||||
Miha Frangež
|
||||
@@ -87,19 +92,22 @@ stavpup
|
||||
mrestivill
|
||||
ezn24
|
||||
ehrt74
|
||||
dukezas
|
||||
Virginie
|
||||
Tim Trek
|
||||
Thu-Trang Pham
|
||||
Alì Mortacci
|
||||
Andre Costa
|
||||
Arif Budiman
|
||||
arshbeerSingh
|
||||
Augustin LAVILLE
|
||||
Freddo espresso
|
||||
Govind S Nair
|
||||
Kim Seohyun
|
||||
Libre
|
||||
echo r"0xX4H" | rev
|
||||
rudy3
|
||||
Michael Gangolf
|
||||
PRATHAMESH BHAGAT
|
||||
Peter Dave Hello
|
||||
Thomas Bertels
|
||||
Patrik
|
||||
@@ -2,21 +2,21 @@
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
|
||||
<string name="action_search">بحث</string>
|
||||
<string name="action_add">إضافة</string>
|
||||
<string name="noGiftCards">اضغط على زر + لإضافة بطاقة، أو استورد من خلال قائمة ⋮</string>
|
||||
<string name="noGiftCards">انقر على زر ”+“ لإضافة بطاقة، أو استوردها من قائمة ”⋮“</string>
|
||||
<string name="noMatchingGiftCards">لا توجد نتائج. حاول تغيير بحثك.</string>
|
||||
<string name="storeName">اسم</string>
|
||||
<string name="storeName">الاسم</string>
|
||||
<string name="note">ملاحظة</string>
|
||||
<string name="cardId">معرّف البطاقة</string>
|
||||
<string name="barcodeType">نوع الباركود</string>
|
||||
<string name="noBarcode">لا يوجد باركود</string>
|
||||
<string name="star">إضافة إلى المفضّلة</string>
|
||||
<string name="unstar">حذف من المفضّلة</string>
|
||||
<string name="star">إضافة إلى المفضلة</string>
|
||||
<string name="unstar">إزالة من المفضلة</string>
|
||||
<string name="cancel">إلغاء</string>
|
||||
<string name="save">حفظ</string>
|
||||
<string name="edit">تعديل</string>
|
||||
<string name="delete">حذف</string>
|
||||
<string name="confirm">تأكيد</string>
|
||||
<string name="deleteConfirmation">حذف هذه البطاقة نهائيًا؟</string>
|
||||
<string name="deleteConfirmation">هل ترغب في حذف هذه البطاقة نهائيًّا؟</string>
|
||||
<string name="ok">حسنًا</string>
|
||||
<string name="share">مشاركة</string>
|
||||
<string name="sendLabel">إرسال…</string>
|
||||
@@ -122,15 +122,15 @@
|
||||
<string name="archived">تمت أرشفة البطاقة</string>
|
||||
<string name="unarchived">البطاقة غير مؤرشفة</string>
|
||||
<string name="failedLaunchingPhotoPicker">تعذر العثور على تطبيق معرض مدعوم</string>
|
||||
<string name="noGiftCardsGroup">أنشئ بعض البطاقات، ثم عيّنهم لهذه المجموعة</string>
|
||||
<string name="noGiftCardsGroup">أنشئ بعض البطاقات، ثم عيّنها للمجموعة هنا</string>
|
||||
<string name="deleteTitle">حذف البطاقة</string>
|
||||
<plurals name="selectedCardCount">
|
||||
<item quantity="zero"><xliff:g>%d</xliff:g> محدد</item>
|
||||
<item quantity="zero"><xliff:g>%d</xliff:g> محددة</item>
|
||||
<item quantity="one"><xliff:g>%d</xliff:g> محددة</item>
|
||||
<item quantity="two"><xliff:g>%d</xliff:g> محدد</item>
|
||||
<item quantity="few"><xliff:g>%d</xliff:g> محدد</item>
|
||||
<item quantity="many"><xliff:g>%d</xliff:g> محدد</item>
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> محدد</item>
|
||||
<item quantity="two"><xliff:g>%d</xliff:g> محددتين</item>
|
||||
<item quantity="few"><xliff:g>%d</xliff:g> محددة</item>
|
||||
<item quantity="many"><xliff:g>%d</xliff:g> محددة</item>
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> محددة</item>
|
||||
</plurals>
|
||||
<string name="importing">جارٍ الاستيراد…</string>
|
||||
<string name="exportName">تصدير</string>
|
||||
@@ -161,9 +161,9 @@
|
||||
<item quantity="zero">حذف هذه <xliff:g>%d</xliff:g> البطاقة نهائيًا؟</item>
|
||||
<item quantity="one">حذف هذه <xliff:g>%d</xliff:g> البطاقة نهائيًا؟</item>
|
||||
<item quantity="two">حذف هذه <xliff:g>%d</xliff:g> البطاقتين نهائيًا؟</item>
|
||||
<item quantity="few">حذف هذه <xliff:g>%d</xliff:g> البطاقات نهائيًا؟</item>
|
||||
<item quantity="many">حذف هذه <xliff:g>%d</xliff:g> البطاقات نهائيًا؟</item>
|
||||
<item quantity="other">حذف هذه <xliff:g>%d</xliff:g> البطاقات نهائيًا؟</item>
|
||||
<item quantity="few">هل ترغب في حذف هذه البطاقات الـ <xliff:g>%d</xliff:g> نهائيًّا؟</item>
|
||||
<item quantity="many">هل ترغب في حذف هذه البطاقات الـ <xliff:g>%d</xliff:g> نهائيًّا؟</item>
|
||||
<item quantity="other">هل ترغب في حذف هذه البطاقات الـ <xliff:g>%d</xliff:g> نهائيًا؟</item>
|
||||
</plurals>
|
||||
<string name="importOptionFilesystemTitle">الاستيراد من نظام الملفات</string>
|
||||
<string name="importOptionFilesystemExplanation">اختر ملفًا محددًا من نظام الملفات</string>
|
||||
@@ -220,7 +220,6 @@
|
||||
<string name="previousCard">السابق</string>
|
||||
<string name="nextCard">التالي</string>
|
||||
<string name="failedToRetrieveImageFile">فشل في استخراج ملف الصورة</string>
|
||||
<string name="barcodeLongPressMessage">يمكن فتح صور فقط في تطبيق معرض الصور</string>
|
||||
<string name="failedToOpenUrl">ثبت متصفح ويب أولاً</string>
|
||||
<string name="welcome">مرحبًا بك في كاتيما</string>
|
||||
<string name="updateBalanceTitle">كم أنفقت أو استلمت؟</string>
|
||||
@@ -243,7 +242,6 @@
|
||||
<string name="permissionReadCardsLabel">اقرأ بطاقات كاتيما</string>
|
||||
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">حقوق النشر © 2019–<xliff:g>%d</xliff:g> Sylvia van Os والمساهمون</string>
|
||||
<string name="app_copyright_short">حقوق النشر © Sylvia van Os والمساهمون</string>
|
||||
<string name="openFrontImageInGalleryApp">افتح الصورة الأمامية في تطبيق المعرض</string>
|
||||
<string name="show_name_below_image_thumbnail">إظهار الاسم أسفل الصورة المصغرة</string>
|
||||
<string name="show_validity">إظهار الصلاحية</string>
|
||||
<string name="view_online">مشاهدة حية</string>
|
||||
@@ -257,10 +255,9 @@
|
||||
<string name="show_note">إظهار الملاحظة</string>
|
||||
<string name="switchToBackImage">التبديل إلى الصورة الخلفية</string>
|
||||
<string name="switchToFrontImage">التبديل إلى الصورة الأمامية</string>
|
||||
<string name="settings_allow_content_provider_read_summary">سيظل يتعين على التطبيقات طلب الإذن لمنحها حق الوصول</string>
|
||||
<string name="settings_allow_content_provider_read_summary">يسمح لتطبيق Gadgetbridge بمزامنة بطاقاتك مع الساعات المدعومة</string>
|
||||
<string name="setBarcodeHeight">ضبط ارتفاع الباركود</string>
|
||||
<string name="openBackImageInGalleryApp">فتح الصورة الخلفية في تطبيق المعرض</string>
|
||||
<string name="settings_allow_content_provider_read_title">السماح للتطبيقات الأخرى بالوصول إلى بياناتي</string>
|
||||
<string name="settings_allow_content_provider_read_title">المزامنة مع Gadgetbridge</string>
|
||||
<string name="donate">تبرّع</string>
|
||||
<string name="show_archived_cards">عرض البطاقات المؤرشفة</string>
|
||||
<string name="settings_category_title_privacy">خصوصية</string>
|
||||
@@ -327,4 +324,50 @@
|
||||
<string name="pref_enable_acra_summary">عند التفعيل, سيتم سؤالك للابلاغ بالاعطال عندما تحدث. لا ولن يتم الابلاغ بالاعطال تلفائيا.</string>
|
||||
<string name="settings_disable_nfc_while_viewing_card">وقف NFC</string>
|
||||
<string name="settings_disable_nfc_while_viewing_card_summary">وقف NFC لمنع NFC من العمل أثناء عرض بطاقة</string>
|
||||
<string name="nfc_blocked_while_viewing_card">NFC موقوف</string>
|
||||
<string name="change_settings">تغير الاعدادات</string>
|
||||
<string name="nfc_block_system_error">فشل في ايقاف NFC</string>
|
||||
<string name="sort_by_most_recently_added">تمت إضافته مؤخرًا</string>
|
||||
<string name="zoomFrontImage">تكبير الصورة الأمامية</string>
|
||||
<string name="zoomBackImage">تكبير الصورة للخلف</string>
|
||||
<string name="show_card_id">عرض رقم ID للبطاقة</string>
|
||||
<string name="settings_wear_sync">المزامنة مع Wear OS</string>
|
||||
<string name="settings_wear_sync_summary">يسمح التطبيق لـ Wear OS بقراءة بطاقاتك عبر البلوتوث</string>
|
||||
<string name="wear_sync_permission_required">كاتيما تحتاج الأذونات التي رفضتها للمزامنة مع ساعة Wear OS الذكية الخاصة بك</string>
|
||||
<string name="settings_wear_sync_devices">أجهزة Wear OS المسموح بها</string>
|
||||
<string name="settings_wear_sync_devices_summary">إدارة الأجهزة المسموح لها بالمزامنة عبر البلوتوث</string>
|
||||
<string name="settings_wear_sync_no_devices">لا توجد أجهزة مسموحة</string>
|
||||
<plurals name="settings_wear_sync_devices_summary_count">
|
||||
<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="settings_wear_sync_blocked_devices">أجهزة Wear OS المحجوبة</string>
|
||||
<string name="settings_wear_sync_blocked_devices_summary">إدارة أجهزة Wear OS المحجوبة</string>
|
||||
<string name="settings_wear_sync_no_blocked_devices">لا توجد أجهزة محجوبة</string>
|
||||
<string name="open_in_gallery">افتح في معرض الصور</string>
|
||||
<string name="settings_wear_sync_unpair_title">هل تريد إزالة الجهاز؟</string>
|
||||
<string name="settings_wear_sync_unpair_message">هل تريد إزالة <xliff:g>%1$s</xliff:g> من كاتيما؟ لن تكون قادرًا بعد الآن على مزامنة بطاقاتك.</string>
|
||||
<string name="settings_wear_sync_unblock_message">هل تريد إزالة <xliff:g>%1$s</xliff:g> من القائمة المحظورة؟ سيتمكن من طلب الوصول مرة أخرى.</string>
|
||||
<string name="settings_wear_sync_unpair">إزالة</string>
|
||||
<string name="settings_wear_sync_device_name"><xliff:g>%1$s</xliff:g> (<xliff:g>%2$s</xliff:g>)</string>
|
||||
<string name="settings_wear_sync_tap_to_remove">اضغط على جهاز لإزالته.</string>
|
||||
<string name="wear_bt_pairing_channel_name">إقران جهاز Wear OS</string>
|
||||
<string name="wear_bt_pairing_title">جهاز Wear OS يريد المزامنة</string>
|
||||
<string name="wear_bt_pairing_message">هل تريد السماح لـ <xliff:g>%1$s</xliff:g> بالوصول إلى بطاقاتك؟</string>
|
||||
<string name="wear_bt_pairing_allow">سماح</string>
|
||||
<string name="wear_bt_pairing_block">حظر</string>
|
||||
<string name="wear_bt_pairing_allowed"><xliff:g>%1$s</xliff:g> مسموح له بالمزامنة.</string>
|
||||
<string name="wear_bt_pairing_blocked"><xliff:g>%1$s</xliff:g> تم حظره.</string>
|
||||
<string name="wear_bt_pairing_mismatch_title">طلب تفويض جديد من <xliff:g>%1$s</xliff:g></string>
|
||||
<string name="wear_bt_pairing_mismatch_message">تمت الموافقة على هذا الجهاز سابقًا، لكنه يعرض الآن رمز هوية مختلف. يحدث هذا عندما يتم إعادة تثبيت تطبيق Wear OS أو مسح بياناته. كما يمكن أن يشير إلى محاولة انتحال عنوان MAC عبر البلوتوث.\n\nاقبل فقط إذا قمت مؤخرًا بإعادة تثبيت تطبيق كاتيما Wear OS على هذه الساعة.</string>
|
||||
<string name="open_settings">فتح الإعدادات</string>
|
||||
<string name="wear_bt_channel_name">رفيق Wear OS</string>
|
||||
<string name="wear_bt_notification_title">مزامنة كاتيما لـ Wear OS نشطة</string>
|
||||
<string name="settings_category_title_smartwatch">الساعة الذكية مدعومة</string>
|
||||
<string name="wear_bt_failed_foreground_notification_title">فشل في بدء خدمة مزامنة Wear OS</string>
|
||||
<string name="wear_bt_critical_error_channel_name">خطأ كبير في مزامنة Wear OS</string>
|
||||
</resources>
|
||||
@@ -163,7 +163,6 @@
|
||||
<string name="showMoreInfo">Паказаць інфармацыю</string>
|
||||
<string name="updateBalance">Абнавіць баланс</string>
|
||||
<string name="failedToRetrieveImageFile">Не ўдалося атрымаць файл відарысу</string>
|
||||
<string name="barcodeLongPressMessage">У галерэі можна адкрываць толькі відарысы</string>
|
||||
<string name="sort_by_name">Назва</string>
|
||||
<string name="sort_by_most_recently_used">Частата выкарыстання</string>
|
||||
<string name="sort_by_valid_from">Дзейнічае ад</string>
|
||||
@@ -203,7 +202,6 @@
|
||||
<string name="validFromSentence">Дзейнічае з: <xliff:g>%s</xliff:g></string>
|
||||
<string name="height">Вышыня</string>
|
||||
<string name="switchToFrontImage">Пераключыцца на пярэдні відарыс</string>
|
||||
<string name="openBackImageInGalleryApp">Адкрыць задні відарыс у галерэі</string>
|
||||
<string name="setBarcodeHeight">Задаць вышыню штрыхкода</string>
|
||||
<string name="donate">Ахвяраваць</string>
|
||||
<string name="icon_header_click_text">Доўгі націск для рэдагавання мініяцюры</string>
|
||||
@@ -288,7 +286,6 @@
|
||||
<string name="report_error">Паведаміць пра памылку</string>
|
||||
<string name="failedLaunchingPhotoPicker">Не атрымалася знайсці праграму для галерэі, якая падтрымліваецца</string>
|
||||
<string name="unsupportedFile">Гэты файл не падтрымліваецца</string>
|
||||
<string name="openFrontImageInGalleryApp">Адкрыць пярэдні відарыс у галерэі</string>
|
||||
<string name="field_must_not_be_empty">Поле не павінна быць пустым</string>
|
||||
<string name="add_manually_warning_title">Рэкамендуецца сканаванне</string>
|
||||
<string name="errorReadingFile">Не атрымалася прачытаць файл</string>
|
||||
|
||||
@@ -198,7 +198,6 @@
|
||||
<string name="nextCard">Следваща</string>
|
||||
<string name="failedToOpenUrl">Първо инсталирайте уеб браузър</string>
|
||||
<string name="welcome">Добре дошли при Катима</string>
|
||||
<string name="barcodeLongPressMessage">В приложението галерия могат да бъдат отваряни само изображения</string>
|
||||
<string name="failedToRetrieveImageFile">Не е възможно извличане на изображение</string>
|
||||
<string name="noCameraPermissionDirectToSystemSetting">За да сканирате щрихкодове с Catima е необходим достъп до камерата. За да промените разрешението докоснете тук.</string>
|
||||
<string name="updateBalanceTitle">Колко е похарчено или получено?</string>
|
||||
@@ -218,8 +217,6 @@
|
||||
<string name="switchToFrontImage">Показване на предната страна</string>
|
||||
<string name="switchToBackImage">Показване на задната страна</string>
|
||||
<string name="switchToBarcode">Показване на щрихкода</string>
|
||||
<string name="openFrontImageInGalleryApp">Отваряне на изображението на предната страна в приложение за преглед за изображения</string>
|
||||
<string name="openBackImageInGalleryApp">Отваряне на изображението на задната страна в приложение за преглед за изображения</string>
|
||||
<string name="setBarcodeHeight">Задаване на височина на щрихкода</string>
|
||||
<string name="donate">Даряване</string>
|
||||
<string name="icon_header_click_text">Задръжте, за да промените миниатюрата</string>
|
||||
@@ -229,10 +226,10 @@
|
||||
<string name="show_name_below_image_thumbnail">Наименование</string>
|
||||
<string name="permissionReadCardsLabel">Четене на карти на Catima</string>
|
||||
<string name="permissionReadCardsDescription">четене на картите на Catima с всички подробности, включително бележки и изображения</string>
|
||||
<string name="settings_allow_content_provider_read_title">Разрешаване на достъп на други приложения до данните</string>
|
||||
<string name="settings_allow_content_provider_read_title">Синхронизиране чрез Gadgetbridge</string>
|
||||
<string name="settings_display_barcode_max_brightness_summary">Необходимо за работата на някои скенери</string>
|
||||
<string name="settings_disable_lockscreen_while_viewing_card_summary">Без заключване на екрана при преглед на карта</string>
|
||||
<string name="settings_allow_content_provider_read_summary">Приложенията ще искат разрешение, за да получат достъп</string>
|
||||
<string name="settings_allow_content_provider_read_summary">Разрешава на приложението Gadgetbridge да синхронизира картите с поддържаните часовници</string>
|
||||
<string name="settings_oled_dark_summary">Намалява разхода на батерия от OLED дисплеи</string>
|
||||
<string name="settings_category_title_cards">Преглед на карта</string>
|
||||
<string name="settings_category_title_general">Общи</string>
|
||||
@@ -305,4 +302,12 @@
|
||||
<string name="settings_disable_nfc_while_viewing_card_summary">Спира NFC, за да бъдат предотвратени безконтактни плащания при преглед на карта</string>
|
||||
<string name="nfc_blocked_while_viewing_card">NFC е на пауза</string>
|
||||
<string name="change_settings">Настройки</string>
|
||||
<string name="nfc_block_system_error">Грешка при спиране на NFC</string>
|
||||
<string name="sort_by_most_recently_added">Поредност на добавяне</string>
|
||||
<string name="zoomFrontImage">Увеличаване на предното изображение</string>
|
||||
<string name="zoomBackImage">Увеличаване на задното изображение</string>
|
||||
<string name="show_card_id">Показване номера на картата</string>
|
||||
<string name="open_in_gallery">Отваряне в галерията</string>
|
||||
<string name="settings_wear_sync">Синхронизиране с Wear OS</string>
|
||||
<string name="settings_wear_sync_summary">Разрешава на приложението за Wear OS да чете картите чрез Bluetooth</string>
|
||||
</resources>
|
||||
@@ -3,13 +3,13 @@
|
||||
<string name="save">সংরক্ষণ</string>
|
||||
<string name="cancel">বাতিল</string>
|
||||
<string name="unstar">তারা মুক্ত</string>
|
||||
<string name="star">তারা</string>
|
||||
<string name="barcodeType">বারকোড ধরন</string>
|
||||
<string name="note">বিঃদ্রঃ</string>
|
||||
<string name="storeName">দোকানের নাম</string>
|
||||
<string name="star">পছন্দের তালিকায় যোগ করুন</string>
|
||||
<string name="barcodeType">বারকোডের ধরন</string>
|
||||
<string name="note">উল্লেখ্য</string>
|
||||
<string name="storeName">নাম</string>
|
||||
<string name="noMatchingGiftCards">কোনো ফলাফল পাওয়া যায়নি। অনুসন্ধানের বাক্যটি বদলে দেখুন।</string>
|
||||
<string name="noGiftCards">প্লাস বোতামটি টিপে একটি কার্ড যোগ করুন বা ⋮ মেনু থেকে কিছু নিয়ে আসুন।</string>
|
||||
<string name="action_add">কর্ম যোগ</string>
|
||||
<string name="action_add">যোগ করুন</string>
|
||||
<string name="all">সব</string>
|
||||
<string name="noGroupCards">এই গ্রুপটি খালি</string>
|
||||
<string name="noGroups">+ যোগ বোতামটি টিপে গ্রুপ যোগ করুন যাতে তাদের শ্রেণীকরণ করা যায়।</string>
|
||||
@@ -193,7 +193,6 @@
|
||||
<string name="settings_oled_dark">অন্ধকার থিমের জন্য খাঁটি কালো পটভূমি</string>
|
||||
<string name="setIcon">আইকন সেট করুন</string>
|
||||
<string name="updateBalance">ব্যালেন্স আপডেট করুন</string>
|
||||
<string name="barcodeLongPressMessage">গ্যালারি অ্যাপে শুধুমাত্র ছবি খোলা যাবে</string>
|
||||
<string name="translate_platform">Weblate-এ</string>
|
||||
<string name="on_google_play">Google Play-তে</string>
|
||||
<string name="shortcutSelectCard">একটি কার্ড নির্বাচন করুন</string>
|
||||
@@ -225,8 +224,6 @@
|
||||
<string name="switchToBackImage">পিছনের ছবিটিতে সুইচ করুন</string>
|
||||
<string name="switchToFrontImage">সামনের ছবিটিতে সুইচ করুন</string>
|
||||
<string name="switchToBarcode">বারকোডে সুইচ করুন</string>
|
||||
<string name="openFrontImageInGalleryApp">সামনের ছবিটি গ্যালারি অ্যাপে খুলুন</string>
|
||||
<string name="openBackImageInGalleryApp">পিছনের ছবিটি গ্যালারি অ্যাপে খুলুন</string>
|
||||
<string name="setBarcodeHeight">বারকোডের উচ্চতা সেট করুন</string>
|
||||
<string name="icon_header_click_text">দীর্ঘক্ষন টাচ করে থাম্বনেইল এডিট করবেন</string>
|
||||
<string name="show_balance">ব্যালান্স দেখান</string>
|
||||
|
||||
@@ -174,7 +174,6 @@
|
||||
<string name="importLoyaltyCardKeychainMessage">Odaberite svoj izvoz iz Privjeska za ključeve s karticom vjernosti za uvoz.\nKreirajte ga iz menija Uvoz/Izvoz u Privjesku za ključeve s karticom vjernosti pritiskom na Izvoz.</string>
|
||||
<string name="importVoucherVaultMessage">Odaberite izvoz iz Voucher Vaulta za uvoz. \nKreirajte ga pritiskom na Izvoz u Voucher Vaultu.</string>
|
||||
<string name="switchToBarcode">Prebaci na barkod</string>
|
||||
<string name="openFrontImageInGalleryApp">Otvorite prednju sliku u aplikaciji za pregled slika</string>
|
||||
<string name="switchToBackImage">Prebaci na sliku iz pozadine</string>
|
||||
<string name="switchToFrontImage">Prebaci na prednju sliku</string>
|
||||
<string name="height">Visina</string>
|
||||
@@ -213,7 +212,6 @@
|
||||
<string name="credits">Zasluge</string>
|
||||
<string name="version_history">Historija verzija</string>
|
||||
<string name="sort_by_valid_from">Vrijedi od</string>
|
||||
<string name="barcodeLongPressMessage">U aplikaciji galerija mogu se otvoriti samo slike</string>
|
||||
<string name="failedToRetrieveImageFile">Neuspjevam preuzimanje slikovne datoteke</string>
|
||||
<string name="updateBalance">Ažuriraj stanje</string>
|
||||
<string name="showMoreInfo">Prikaži informacije</string>
|
||||
@@ -241,7 +239,6 @@
|
||||
<string name="group_name_is_empty">Naziv grupe ne smije biti prazan</string>
|
||||
<string name="group_updated">Grupa ažurirana</string>
|
||||
<string name="deleteConfirmationGroup">Izbrisati grupu?</string>
|
||||
<string name="openBackImageInGalleryApp">Otvori sliku pozadi u aplikaciji za pregled slika</string>
|
||||
<string name="setBarcodeHeight">Postavi visinu barkoda</string>
|
||||
<string name="donate">Donirajte</string>
|
||||
<string name="icon_header_click_text">Dugo pritisnite za uređivanje sličice</string>
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
<string name="action_search">Cerca</string>
|
||||
<string name="deleteTitle">Elimina la targeta</string>
|
||||
<string name="welcome">Benvingut a Catima</string>
|
||||
<string name="noGiftCards">Fes clic al botó + per afegir una targeta, o importa des del menú ⋮</string>
|
||||
<string name="noGiftCards">Fes clic al botó mes + per afegir una targeta, o importa des del menú ⋮</string>
|
||||
<string name="photos">Fotos</string>
|
||||
<string name="app_name">Catima</string>
|
||||
<string name="moveDown">Baixar abaix</string>
|
||||
@@ -72,7 +72,6 @@
|
||||
<string name="no">No</string>
|
||||
<string name="sort">Ordenar</string>
|
||||
<string name="failedToRetrieveImageFile">Ha fallat l\'obtenció del fitxer d\'imatge</string>
|
||||
<string name="barcodeLongPressMessage">Les imatges només es poden obrir desde la app galeria</string>
|
||||
<string name="settings_category_title_privacy">Privacitat</string>
|
||||
<plurals name="deleteCardsTitle">
|
||||
<item quantity="one">Eliminar <xliff:g>%d</xliff:g> targeta</item>
|
||||
@@ -92,7 +91,7 @@
|
||||
<string name="importCancelled">Importació anulada</string>
|
||||
<string name="exportCancelled">Exportació cancelada</string>
|
||||
<string name="noGiftCardsGroup">Crea algunes targetes i després asigna-les en al grup aquí</string>
|
||||
<string name="noMatchingGiftCards">No hi ha resultats; prova de modificar la cerca.</string>
|
||||
<string name="noMatchingGiftCards">No hi ha resultats. Prova de modificar la cerca.</string>
|
||||
<string name="storeName">Nom</string>
|
||||
<string name="note">Nota</string>
|
||||
<string name="cardId">Id. de la Targeta</string>
|
||||
@@ -154,7 +153,7 @@
|
||||
<string name="enter_card_id">Introdueixi el nombre ID o text de la seva targeta</string>
|
||||
<string name="card_id_must_not_be_empty">ID de la Targeta no pot estar buit</string>
|
||||
<string name="add_a_card_in_a_different_way">Afegeix una targeta de forma diferent</string>
|
||||
<string name="unstar">Treure entre les preferides</string>
|
||||
<string name="unstar">Treure de les preferides</string>
|
||||
<string name="star">Afegir a les preferides</string>
|
||||
<string name="cancel">Cancel•la</string>
|
||||
<string name="deleteConfirmation">Vols eliminar de forma permanent aquesta targeta?</string>
|
||||
@@ -167,7 +166,6 @@
|
||||
<string name="noCardsMessage">Afegeix primer una targeta</string>
|
||||
<string name="noCardExistsError">No s\'ha pogut trobar aquesta targeta</string>
|
||||
<string name="failedParsingImportUriError">No s\'ha pogut analitzar l\'URI d\'importació</string>
|
||||
<string name="openFrontImageInGalleryApp">Obrir la imatge frontal a l\'app de galeria</string>
|
||||
<string name="settings_use_volume_keys_navigation_summary">Utilitza els botons de volum per canviar la targeta que es mostra</string>
|
||||
<string name="updateBarcodeQuestionText">Ha canviat el valor ID. Vol actualitzar també el codi de barres per uter utilitzar el mateix valor?</string>
|
||||
<string name="starred">Preferides</string>
|
||||
@@ -183,7 +181,6 @@
|
||||
<string name="on_github">al Github</string>
|
||||
<string name="include_if_asking_support">Si vol demanar suport tècnic, inclogui la següent informació:</string>
|
||||
<string name="newBalanceSentence">Nou balanç: <xliff:g>%s</xliff:g></string>
|
||||
<string name="openBackImageInGalleryApp">Obrir la imatge posterior a l\'app de la galeria</string>
|
||||
<string name="generic_error_please_retry">Perdoni, alguna cosa ha anat malament, siusplau torni-ho a provar...</string>
|
||||
<string name="settings_column_count_6">6</string>
|
||||
<string name="useBackImage">Utilitzar la imatge posterior</string>
|
||||
|
||||
@@ -203,7 +203,6 @@
|
||||
<string name="nextCard">Následující</string>
|
||||
<string name="failedToOpenUrl">Nejprve nainstalujte webový prohlížeč</string>
|
||||
<string name="welcome">Vítejte v Catima</string>
|
||||
<string name="barcodeLongPressMessage">V aplikaci pro galerii mohou být otevírány pouze obrázky</string>
|
||||
<string name="failedToRetrieveImageFile">Nepodařilo se získat soubor obrázku</string>
|
||||
<string name="cameraPermissionDeniedTitle">Nepodařilo se získat přístup k fotoaparátu</string>
|
||||
<string name="importCards">Importovat karty</string>
|
||||
@@ -223,8 +222,6 @@
|
||||
<string name="switchToFrontImage">Přepnout na přední obrázek</string>
|
||||
<string name="switchToBackImage">Přepnout na zadní obrázek</string>
|
||||
<string name="switchToBarcode">Přepnout na čárový kód</string>
|
||||
<string name="openFrontImageInGalleryApp">Otevřít přední obrázek v aplikaci prohlížeče obrázků</string>
|
||||
<string name="openBackImageInGalleryApp">Otevřít zadní obrázek v aplikaci prohlížeče obrázků</string>
|
||||
<string name="setBarcodeHeight">Nastavit výšku čárového kódu</string>
|
||||
<string name="donate">Přispět</string>
|
||||
<string name="icon_header_click_text">Dlouhým stisknutím miniaturu upravíte</string>
|
||||
@@ -233,9 +230,9 @@
|
||||
<string name="show_validity">Zobrazit platnost</string>
|
||||
<string name="show_balance">Zobrazit zůstatek</string>
|
||||
<string name="permissionReadCardsDescription">číst vaše karty Catima a všechny jejich podrobnosti, včetně poznámek a obrázků</string>
|
||||
<string name="settings_allow_content_provider_read_summary">Aplikace budou i tak muset požádat o povolení k poskytnutí přístupu</string>
|
||||
<string name="settings_allow_content_provider_read_summary">Umožňuje aplikaci Gadgetbridge synchronizovat vaše karty do podporovaných chytrých hodinek</string>
|
||||
<string name="permissionReadCardsLabel">Číst karty Catima</string>
|
||||
<string name="settings_allow_content_provider_read_title">Umožnit ostatním aplikacím přístup k mým datům</string>
|
||||
<string name="settings_allow_content_provider_read_title">Synchronizace s Gadgetbridge</string>
|
||||
<string name="settings_keep_screen_on_summary">Při prohlížení karty vypnout časovač zhasnutí obrazovky</string>
|
||||
<string name="settings_oled_dark_summary">Snižuje používání baterie na displejích OLED</string>
|
||||
<string name="settings_category_title_privacy">Soukromí</string>
|
||||
@@ -311,4 +308,52 @@
|
||||
<string name="settings_disable_nfc_while_viewing_card_summary">Pozastaví NFC pro zabránění spuštění NFC plateb při zobrazování karty</string>
|
||||
<string name="nfc_blocked_while_viewing_card">NFC je pozastaveno</string>
|
||||
<string name="change_settings">Změnit nastavení</string>
|
||||
<string name="nfc_block_system_error">Nepodařilo se pozastavit NFC</string>
|
||||
<string name="sort_by_most_recently_added">Nedávno přidáno</string>
|
||||
<string name="zoomFrontImage">Přiblížit přední obrázek</string>
|
||||
<string name="zoomBackImage">Přiblížit zadní obrázek</string>
|
||||
<string name="show_card_id">Zobrazit ID karty</string>
|
||||
<string name="open_in_gallery">Otevřít v galerii</string>
|
||||
<string name="settings_wear_sync">Synchronizovat s Wear OS</string>
|
||||
<string name="settings_wear_sync_summary">Umožňuje doprovodné aplikaci Wear OS číst vaše karty skrze Bluetooth</string>
|
||||
<string name="wear_sync_permission_required">Catima potřebuje oprávnění, které jste zamítli, k synchronizaci s vašimi chytrými hodinkami Wear OS</string>
|
||||
<string name="settings_wear_sync_devices">Povolená zařízení Wear OS</string>
|
||||
<string name="settings_wear_sync_devices_summary">Správa zařízení, u kterých je povolena synchronizace skrze Bluetooth</string>
|
||||
<string name="settings_wear_sync_no_devices">Žádná povolená zařízení</string>
|
||||
<plurals name="settings_wear_sync_devices_summary_count">
|
||||
<item quantity="one"><xliff:g>%d</xliff:g> povolené zařízení</item>
|
||||
<item quantity="few"><xliff:g>%d</xliff:g> povolená zařízení</item>
|
||||
<item quantity="many"><xliff:g>%d</xliff:g> povolených zařízení</item>
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> povolených zařízení</item>
|
||||
</plurals>
|
||||
<string name="settings_wear_sync_blocked_devices">Zablokovaná zařízení Wear OS</string>
|
||||
<string name="settings_wear_sync_blocked_devices_summary">Spravovat zablokovaná zařízení Wear OS</string>
|
||||
<string name="settings_wear_sync_no_blocked_devices">Žádná zablokovaná zařízení</string>
|
||||
<plurals name="settings_wear_sync_blocked_devices_summary_count">
|
||||
<item quantity="one"><xliff:g>%d</xliff:g> zablokované zařízení</item>
|
||||
<item quantity="few"><xliff:g>%d</xliff:g> zablokovaná zařízení</item>
|
||||
<item quantity="many"><xliff:g>%d</xliff:g> zablokovaných zařízení</item>
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> zablokovaných zařízení</item>
|
||||
</plurals>
|
||||
<string name="settings_wear_sync_unpair_title">Odstranit zařízení?</string>
|
||||
<string name="settings_wear_sync_unpair_message">Odstranit zařízení <xliff:g>%1$s</xliff:g> z aplikace Catima? Již nebude moci synchronizovat vaše karty.</string>
|
||||
<string name="settings_wear_sync_unblock_message">Odstranit zařízení <xliff:g>%1$s</xliff:g> ze seznamu zablokovaných? Bude moci znovu žádat o přístup.</string>
|
||||
<string name="settings_wear_sync_unpair">Odstranit</string>
|
||||
<string name="settings_wear_sync_device_name"><xliff:g>%1$s</xliff:g> (<xliff:g>%2$s</xliff:g>)</string>
|
||||
<string name="settings_wear_sync_tap_to_remove">Klepněte na zařízení pro jeho odstranění.</string>
|
||||
<string name="wear_bt_pairing_channel_name">Párování zařízení s Wear OS</string>
|
||||
<string name="wear_bt_pairing_title">Zařízení s Wear OS požaduje synchronizaci</string>
|
||||
<string name="wear_bt_pairing_message">Povolit zařízení <xliff:g>%1$s</xliff:g> přístup k vašim kartám?</string>
|
||||
<string name="wear_bt_pairing_allow">Povolit</string>
|
||||
<string name="wear_bt_pairing_block">Zablokovat</string>
|
||||
<string name="wear_bt_pairing_allowed">Zařízení <xliff:g>%1$s</xliff:g> má nyní povolenou synchronizaci.</string>
|
||||
<string name="wear_bt_pairing_blocked">Zařízení <xliff:g>%1$s</xliff:g> bylo zablokováno.</string>
|
||||
<string name="wear_bt_pairing_mismatch_title">Nový požadavek na autorizaci ze zařízení <xliff:g>%1$s</xliff:g></string>
|
||||
<string name="wear_bt_pairing_mismatch_message">Toto zařízení bylo v minulosti autorizováno, nyní se ale prezentuje jiným tokenem identity. K této situaci může dojít při reinstalaci aplikace Wear OS nebo vymazání jejích dat. Může to ale také značit pokus o maskování adresy Bluetooth MAC.\n\nPřijměte pouze, pokud jste na těchto hodinkách nedávno přeinstalovali aplikaci Catima pro Wear OS.</string>
|
||||
<string name="open_settings">Otevřít nastavení</string>
|
||||
<string name="wear_bt_channel_name">Doprovoná aplikace na Wear OS</string>
|
||||
<string name="wear_bt_notification_title">Synchronizace s Catima Wear OS je aktivní</string>
|
||||
<string name="settings_category_title_smartwatch">Podpora chytrých hodinek</string>
|
||||
<string name="wear_bt_failed_foreground_notification_title">Nepodařilo se spustit synchronizační službu Wear OS</string>
|
||||
<string name="wear_bt_critical_error_channel_name">Kritická chyba synchronizace s Wear OS</string>
|
||||
</resources>
|
||||
@@ -197,7 +197,6 @@
|
||||
<string name="nextCard">Nächste</string>
|
||||
<string name="failedToOpenUrl">Bitte installiere zuerst einen Webbrowser</string>
|
||||
<string name="welcome">Willkommen bei Catima</string>
|
||||
<string name="barcodeLongPressMessage">In der Galerie können nur Bilder geöffnet werden</string>
|
||||
<string name="failedToRetrieveImageFile">Bilddatei konnte nicht abgerufen werden</string>
|
||||
<string name="updateBalanceTitle">Wie viel hast du ausgegeben oder erhalten?</string>
|
||||
<string name="cameraPermissionDeniedTitle">Kein Zugriff auf die Kamera</string>
|
||||
@@ -215,8 +214,6 @@
|
||||
<string name="anyDate">Beliebiges Datum</string>
|
||||
<string name="icon_header_click_text">Zum Bearbeiten des Vorschaubildes lang drücken</string>
|
||||
<string name="switchToBarcode">Zum Barcode wechseln</string>
|
||||
<string name="openFrontImageInGalleryApp">Vorderseite in Bildbetrachter öffnen</string>
|
||||
<string name="openBackImageInGalleryApp">Rückseite in Bildbetrachter öffnen</string>
|
||||
<string name="height">Höhe</string>
|
||||
<string name="switchToFrontImage">Zur Vorderseite wechseln</string>
|
||||
<string name="switchToBackImage">Zur Rückseite wechseln</string>
|
||||
@@ -226,10 +223,10 @@
|
||||
<string name="show_balance">Betrag anzeigen</string>
|
||||
<string name="show_validity">Gültigkeitsdauer anzeigen</string>
|
||||
<string name="show_name_below_image_thumbnail">Namen unter dem Vorschaubild anzeigen</string>
|
||||
<string name="settings_allow_content_provider_read_title">Anderen Apps den Zugriff auf meine Daten gestatten</string>
|
||||
<string name="settings_allow_content_provider_read_title">Synchronisation mit Gadgetbrigde</string>
|
||||
<string name="permissionReadCardsLabel">Catima-Karten lesen</string>
|
||||
<string name="permissionReadCardsDescription">Lesen deiner Catima Karten mit allen Details, einschließlich Notizen und Bildern</string>
|
||||
<string name="settings_allow_content_provider_read_summary">Apps müssen weiterhin eine Genehmigung beantragen, um Zugriff zu erhalten</string>
|
||||
<string name="settings_allow_content_provider_read_summary">Ermöglicht der Gadgetbridge-App, deine Karten mit unterstützten Uhren zu synchronisieren</string>
|
||||
<string name="settings_display_barcode_max_brightness_summary">Erforderlich für das Funktionieren einiger Scanner</string>
|
||||
<string name="settings_keep_screen_on_summary">Deaktiviert die Bildschirmzeitüberschreitung beim Anzeigen einer Karte</string>
|
||||
<string name="settings_disable_lockscreen_while_viewing_card_summary">Deaktiviert die Bildschirmsperre während der Anzeige einer Karte</string>
|
||||
@@ -305,4 +302,48 @@
|
||||
<string name="nfc_blocked_while_viewing_card">NFC ist vorübergehend deaktiviert</string>
|
||||
<string name="settings_disable_nfc_while_viewing_card_summary">Deaktiviert vorübergehend NFC, sodass keine NFC-Zahlungen ausgelöst werden können, während eine Karte angezeigt wird</string>
|
||||
<string name="settings_disable_nfc_while_viewing_card">NFC vorübergehend deaktivieren</string>
|
||||
<string name="nfc_block_system_error">Pausieren von NFC ist fehlgeschlagen</string>
|
||||
<string name="show_card_id">Karten-ID anzeigen</string>
|
||||
<string name="zoomBackImage">Rückseite vergrößern</string>
|
||||
<string name="zoomFrontImage">Vorderseite vergrößern</string>
|
||||
<string name="sort_by_most_recently_added">Zuletzt hinzugefügt</string>
|
||||
<string name="open_in_gallery">In Bildergalerie öffnen</string>
|
||||
<string name="wear_bt_critical_error_channel_name">Kritischer Wear OS Synchronisierungsfehler</string>
|
||||
<string name="wear_bt_failed_foreground_notification_title">Synchronisierungsdienst zu Wear OS konnte nicht gestartet werden</string>
|
||||
<string name="settings_category_title_smartwatch">Smartwatch Unterstützung</string>
|
||||
<string name="wear_bt_notification_title">Catima Wear OS Synchronisierung ist aktiv</string>
|
||||
<string name="wear_bt_channel_name">Wear OS Begleit-App</string>
|
||||
<string name="open_settings">Einstellungen öffnen</string>
|
||||
<string name="wear_bt_pairing_mismatch_message">Dieses Gerät wurde zuvor autorisiert, besitzt nun aber einen anderen Identitäts-Token. Dies kann vorkommen, wenn die Daten der Wear OS App gelöscht wurden oder die App erneut installiert wurde. Es kann ebenso auf den Versuch einer Bluetooth MAC Manipulation hindeuten.\n\nAkzeptiere die Autorisierung nur, wenn die Catima Wear OS App kürzlich neu auf dieser Uhr installiert wurde.</string>
|
||||
<string name="wear_bt_pairing_mismatch_title">Neue Anfrage zur Autorisation von <xliff:g>%1$s</xliff:g></string>
|
||||
<string name="wear_bt_pairing_blocked"><xliff:g>%1$s</xliff:g> wurde blockiert.</string>
|
||||
<string name="wear_bt_pairing_allowed"><xliff:g>%1$s</xliff:g> darf jetzt synchronisieren.</string>
|
||||
<string name="wear_bt_pairing_block">Blockiert</string>
|
||||
<string name="wear_bt_pairing_allow">Zugelassen</string>
|
||||
<string name="wear_bt_pairing_message">Erlaube <xliff:g>%1$s</xliff:g> den Zugang zu deinen Karten?</string>
|
||||
<string name="wear_bt_pairing_title">Wear OS Gerät möchte synchronisieren</string>
|
||||
<string name="wear_bt_pairing_channel_name">Wear OS Gerät koppeln</string>
|
||||
<string name="settings_wear_sync_tap_to_remove">Tippe auf ein Gerät, um es zu entfernen.</string>
|
||||
<string name="settings_wear_sync_device_name"><xliff:g>%1$s</xliff:g> (<xliff:g>%2$s</xliff:g>)</string>
|
||||
<string name="settings_wear_sync_unpair">Entfernen</string>
|
||||
<string name="settings_wear_sync_unblock_message">Entferne <xliff:g>%1$s</xliff:g> von der Blockierungsliste? Eine erneute Anfrage zum Zugriff ist dann möglich.</string>
|
||||
<string name="settings_wear_sync_unpair_message">Entferne <xliff:g>%1$s</xliff:g> von Catima? Es wird dann nicht mehr möglich sein Karten zu synchronisieren.</string>
|
||||
<string name="settings_wear_sync_unpair_title">Entferne Gerät?</string>
|
||||
<plurals name="settings_wear_sync_blocked_devices_summary_count">
|
||||
<item quantity="one"><xliff:g>%d</xliff:g> Gerät blockiert</item>
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> Geräte blockiert</item>
|
||||
</plurals>
|
||||
<string name="settings_wear_sync_no_blocked_devices">Keine blockierten Geräte</string>
|
||||
<string name="settings_wear_sync_blocked_devices_summary">Blockierte Wear OS Geräte verwalten</string>
|
||||
<string name="settings_wear_sync_blocked_devices">Blockierte Wear OS Geräte</string>
|
||||
<plurals name="settings_wear_sync_devices_summary_count">
|
||||
<item quantity="one"><xliff:g>%d</xliff:g> Gerät zugelassen</item>
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> Geräte zugelassen</item>
|
||||
</plurals>
|
||||
<string name="settings_wear_sync_no_devices">Keine zugelassenen Geräte</string>
|
||||
<string name="settings_wear_sync_devices_summary">Verwalte die Geräte, die per Bluetooth synchronisieren dürfen</string>
|
||||
<string name="settings_wear_sync_devices">Zugelassene Wear OS Geräte</string>
|
||||
<string name="wear_sync_permission_required">Catima benötigt die von dir verweigerte Erlaubnis, um mit deiner Wear OS Smartwatch zu synchronisieren</string>
|
||||
<string name="settings_wear_sync_summary">Erlaube der Wear OS Begleit-App die Karten per Bluetooth auszulesen</string>
|
||||
<string name="settings_wear_sync">Synchronisiere mit Wear OS</string>
|
||||
</resources>
|
||||
@@ -200,7 +200,6 @@
|
||||
<string name="previousCard">Προηγούμενη</string>
|
||||
<string name="nextCard">Επόμενη</string>
|
||||
<string name="updateBalance">Ενημέρωση υπολοίπου</string>
|
||||
<string name="barcodeLongPressMessage">Μόνο εικόνες μπορούν να ανοιχτούν στην εφαρμογή φωτογραφιών</string>
|
||||
<string name="noCameraPermissionDirectToSystemSetting">Για να σκανάρετε γραμμωτούς κώδικες, θα χρειαστεί πρόσβαση στην κάμερα από το Catima. Πατήστε εδώ για να δώσετε πρόσβαση.</string>
|
||||
<string name="importCards">Εισαγωγή καρτών</string>
|
||||
<string name="updateBalanceHint">Εισάγετε ποσό</string>
|
||||
@@ -211,7 +210,7 @@
|
||||
<string name="settings_disable_lockscreen_while_viewing_card_summary">Απενεργοποιεί το κλείδωμα οθόνης κατά την προβολή μιας κάρτας</string>
|
||||
<string name="settings_display_barcode_max_brightness_summary">Απαραίτητο για να δουλέψει σε κάποιους σαρωτές</string>
|
||||
<string name="cameraPermissionRequired">Δικαίωμα πρόσβασης στην κάμερα απαραίτητο γι\' αυτή την ενέργεια…</string>
|
||||
<string name="settings_allow_content_provider_read_title">Να επιτρέπεται σε άλλες εφαρμογές να έχουν πρόσβαση στα δεδομένα μου</string>
|
||||
<string name="settings_allow_content_provider_read_title">Συγχρονισμός με Gadgetbridge</string>
|
||||
<string name="app_copyright_short">Πνευματικά δικαιώματα © Sylvia van Os και συνεργάτες</string>
|
||||
<string name="height">Ύψος</string>
|
||||
<string name="switchToFrontImage">Μετάβαση στην εμπρόσθια εικόνα</string>
|
||||
@@ -219,11 +218,9 @@
|
||||
<string name="switchToBarcode">Μετάβαση σε γραμμωτό κώδικα</string>
|
||||
<string name="validFromSentence">Ισχύει από: <xliff:g>%s</xliff:g></string>
|
||||
<string name="permissionReadCardsLabel">Διαβάστε τις κάρτες Catima</string>
|
||||
<string name="openBackImageInGalleryApp">Ανοίξτε την οπίσθια εικόνα στη συλλογή εικόνων</string>
|
||||
<string name="permissionReadCardsDescription">Διάβασε τις Κάρτες σου Catima και όλες τους τις λεπτομέρειες, συμπεριλαμβανομένων των σημειώσεων και των εικόνων</string>
|
||||
<string name="donate">Δωρεά</string>
|
||||
<string name="icon_header_click_text">Πατήστε παρατεταμένα για επεξεργασία του εικονιδίου</string>
|
||||
<string name="openFrontImageInGalleryApp">Ανοίξτε την εμπρόσθια εικόνα στη συλλογή εικόνων</string>
|
||||
<string name="storageReadPermissionRequired">Δικαίωμα ανάγνωσης του χώρου αποθήκευσης απαραίτητο για αυτήν την ενέργεια…</string>
|
||||
<string name="validFromDate">Ισχύει από</string>
|
||||
<string name="anyDate">Οποιαδήποτε ημερομηνία</string>
|
||||
@@ -258,7 +255,7 @@
|
||||
<string name="show_validity">Εμφάνιση εγκυρότητας</string>
|
||||
<string name="add_a_card_in_a_different_way">Προσθέστε μια κάρτα με διαφορετικό τρόπο</string>
|
||||
<string name="card_id_must_not_be_empty">Ο κωδικός αριθμός της κάρτας δεν πρέπει να είναι κενός</string>
|
||||
<string name="settings_allow_content_provider_read_summary">Οι εφαρμογές θα πρέπει ωστόσο να ζητήσουν άδεια για να τους δοθεί πρόσβαση</string>
|
||||
<string name="settings_allow_content_provider_read_summary">Επιτρέπει στην εφαρμογή Gadgetbridge να συγχρονίζει τις κάρτες σας με τα υποστηριζόμενα ρολόγια</string>
|
||||
<string name="field_must_not_be_empty">Το πεδίο δεν πρέπει να είναι κενό</string>
|
||||
<string name="manually_enter_barcode_instructions">Εισάγετε τον κωδικό αριθμό ή το κείμενο στην κάρτα σας και πατήστε τον γραμμωτό κώδικα που μοιάζει με αυτόν της κάρτας σας.</string>
|
||||
<string name="add_manually_warning_title">Συνιστάται η σάρωση</string>
|
||||
@@ -305,4 +302,48 @@
|
||||
<string name="settings_disable_nfc_while_viewing_card_summary">Παύση του NFC για την αποτροπή ενεργοποίησης πληρωμών NFC κατά την προβολή μιας κάρτας</string>
|
||||
<string name="nfc_blocked_while_viewing_card">Το NFC είναι σε παύση</string>
|
||||
<string name="change_settings">Αλλαγή ρυθμίσεων</string>
|
||||
<string name="nfc_block_system_error">Αποτυχία παύσης NFC</string>
|
||||
<string name="sort_by_most_recently_added">Πρόσφατα προστεθέντα</string>
|
||||
<string name="zoomFrontImage">Μεγέθυνση μπροστινής εικόνας</string>
|
||||
<string name="zoomBackImage">Μεγέθυνση πίσω εικόνας</string>
|
||||
<string name="show_card_id">Εμφάνιση ταυτότητας κάρτας</string>
|
||||
<string name="open_in_gallery">Άνοιγμα στη συλλογή εικόνων</string>
|
||||
<string name="settings_wear_sync">Συγχρονισμός με Wear OS</string>
|
||||
<string name="settings_wear_sync_summary">Επιτρέπει στην συνοδευτική εφαρμογή Wear OS να διαβάζει τις κάρτες σας μέσω Bluetooth</string>
|
||||
<string name="wear_sync_permission_required">Η Catima χρειάζεται τα δικαιώματα που απορρίψατε για να συγχρονιστεί με το Wear OS smartwatch σας</string>
|
||||
<string name="settings_wear_sync_devices">Επιτρεπόμενες συσκευές Wear OS</string>
|
||||
<string name="settings_wear_sync_devices_summary">Διαχείριση συσκευών που επιτρέπεται να συγχρονίζονται μέσω Bluetooth</string>
|
||||
<string name="settings_wear_sync_no_devices">Δεν επιτρέπονται συσκευές</string>
|
||||
<plurals name="settings_wear_sync_devices_summary_count">
|
||||
<item quantity="one"><xliff:g>%d</xliff:g> συσκευή επιτρέπεται</item>
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> συσκευές επιτρέπονται</item>
|
||||
</plurals>
|
||||
<string name="settings_wear_sync_blocked_devices">Αποκλεισμένες συσκευές Wear OS</string>
|
||||
<string name="settings_wear_sync_blocked_devices_summary">Διαχείριση αποκλεισμένων συσκευών Wear OS</string>
|
||||
<string name="settings_wear_sync_no_blocked_devices">Δεν υπάρχουν αποκλεισμένες συσκευές</string>
|
||||
<plurals name="settings_wear_sync_blocked_devices_summary_count">
|
||||
<item quantity="one"><xliff:g>%d</xliff:g> συσκευή αποκλεισμένη</item>
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> συσκευές αποκλεισμένες</item>
|
||||
</plurals>
|
||||
<string name="settings_wear_sync_unpair_title">Αφαίρεση συσκευής;</string>
|
||||
<string name="settings_wear_sync_unpair_message">Να καταργηθεί η <xliff:g>%1$s</xliff:g> από το Catima; Δεν θα είναι πλέον δυνατός ο συγχρονισμός των καρτών σας.</string>
|
||||
<string name="settings_wear_sync_unblock_message">Να καταργηθεί η <xliff:g>%1$s</xliff:g> από τη λίστα αποκλεισμένων; Θα μπορεί να ζητήσει ξανά πρόσβαση.</string>
|
||||
<string name="settings_wear_sync_unpair">Αφαίρεση</string>
|
||||
<string name="settings_wear_sync_device_name"><xliff:g>%1$s</xliff:g> (<xliff:g>%2$s</xliff:g>)</string>
|
||||
<string name="settings_wear_sync_tap_to_remove">Αγγίξτε μια συσκευή για να την καταργήσετε.</string>
|
||||
<string name="wear_bt_pairing_channel_name">Σύζευξη συσκευών Wear OS</string>
|
||||
<string name="wear_bt_pairing_title">Η συσκευή Wear OS θέλει συγχρονισμό</string>
|
||||
<string name="wear_bt_pairing_message">Να επιτραπεί στη <xliff:g>%1$s</xliff:g> η πρόσβαση στις κάρτες σας;</string>
|
||||
<string name="wear_bt_pairing_allow">Να επιτραπεί</string>
|
||||
<string name="wear_bt_pairing_block">Φραγή</string>
|
||||
<string name="wear_bt_pairing_allowed">Η <xliff:g>%1$s</xliff:g> έχει πλέον δικαίωμα συγχρονισμού.</string>
|
||||
<string name="wear_bt_pairing_blocked">Η <xliff:g>%1$s</xliff:g> έχει αποκλειστεί.</string>
|
||||
<string name="wear_bt_pairing_mismatch_title">Νέο αίτημα εξουσιοδότησης από <xliff:g>%1$s</xliff:g></string>
|
||||
<string name="wear_bt_pairing_mismatch_message">Αυτή η συσκευή είχε προηγουμένως εξουσιοδοτηθεί, αλλά τώρα παρουσιάζει διαφορετικό διακριτικό ταυτότητας. Αυτό συμβαίνει όταν η εφαρμογή Wear OS επανεγκαθίσταται ή τα δεδομένα της διαγράφονται. Μπορεί επίσης να υποδεικνύει μια προσπάθεια πλαστογράφησης MAC Bluetooth.\n\nΑποδεχθείτε μόνο εάν επανεγκαταστήσατε πρόσφατα την εφαρμογή Catima Wear OS σε αυτό το ρολόι.</string>
|
||||
<string name="open_settings">Άνοιγμα ρυθμίσεων</string>
|
||||
<string name="wear_bt_channel_name">Συνοδευτική εφαρμογή Wear OS</string>
|
||||
<string name="wear_bt_notification_title">Ο συγχρονισμός Wear OS του Catima είναι ενεργός</string>
|
||||
<string name="settings_category_title_smartwatch">Συγχρονισμός smartwatch</string>
|
||||
<string name="wear_bt_failed_foreground_notification_title">Αποτυχία εκκίνησης της υπηρεσίας συγχρονισμού Wear OS</string>
|
||||
<string name="wear_bt_critical_error_channel_name">Σοβαρό σφάλμα συγχρονισμού Wear OS</string>
|
||||
</resources>
|
||||
@@ -165,7 +165,6 @@
|
||||
<string name="chooseImportType">Importi datumojn de</string>
|
||||
<string name="importCatima">Importi el Catima</string>
|
||||
<string name="updateBalance">Ĝisdatigi saldon</string>
|
||||
<string name="barcodeLongPressMessage">Nur bildoj povas esti malfermitaj en la galeria apo</string>
|
||||
<string name="sort_by_name">Nomo</string>
|
||||
<string name="sort_by_most_recently_used">Plej laste uzitaj</string>
|
||||
<string name="sort_by_expiry">Dato de eksvalidiĝo</string>
|
||||
@@ -180,8 +179,6 @@
|
||||
<string name="newBalanceSentence">Nova saldo: <xliff:g>%s</xliff:g></string>
|
||||
<string name="anyDate">Iam ajn</string>
|
||||
<string name="switchToFrontImage">Ŝanĝi al antaŭa bildo</string>
|
||||
<string name="openFrontImageInGalleryApp">Malfermi la antaŭan bildon en galeria apo</string>
|
||||
<string name="openBackImageInGalleryApp">Malfermi la malantaŭan bildon en galeria apo</string>
|
||||
<string name="show_name_below_image_thumbnail">Montri nomon sub la bildeto</string>
|
||||
<string name="show_note">Montri noton</string>
|
||||
<string name="settings_category_title_cards">Kartoj</string>
|
||||
|
||||
@@ -182,7 +182,6 @@
|
||||
<string name="selectColor">Seleccionar color</string>
|
||||
<string name="sort">Ordenar</string>
|
||||
<string name="app_contributors">Hecho posible por: <xliff:g id="app_contributors">%s</xliff:g></string>
|
||||
<string name="barcodeLongPressMessage">Solo se puede abrir imágenes en la aplicación de galería</string>
|
||||
<string name="yes">Si</string>
|
||||
<string name="no">No</string>
|
||||
<string name="passwordRequired">Ingresa la contraseña</string>
|
||||
@@ -236,8 +235,6 @@
|
||||
<string name="switchToFrontImage">Cambiar a imagen frontal</string>
|
||||
<string name="switchToBackImage">Cambiar a imagen trasera</string>
|
||||
<string name="switchToBarcode">Cambiar a código de barras</string>
|
||||
<string name="openFrontImageInGalleryApp">Abrir imagen frontal en aplicación para ver imágenes</string>
|
||||
<string name="openBackImageInGalleryApp">Abrir imagen trasera en galería de fotos</string>
|
||||
<string name="setBarcodeHeight">Definir altura de código de barras</string>
|
||||
<string name="show_name_below_image_thumbnail">Mostrar nombre de la imagen bajo su miniatura</string>
|
||||
<string name="show_balance">Mostrar saldo</string>
|
||||
@@ -263,4 +260,5 @@
|
||||
<string name="show_archived_cards">Mostrar tarjetas archivadas</string>
|
||||
<string name="view_online">Ver Online</string>
|
||||
<string name="action_more_options">Más Opciones</string>
|
||||
<string name="settings_disable_nfc_while_viewing_card">Pause NFC</string>
|
||||
</resources>
|
||||
@@ -16,7 +16,7 @@
|
||||
<string name="addCardTitle">Añadir tarjeta</string>
|
||||
<string name="scanCardBarcode">Escanear código de barras</string>
|
||||
<string name="cardShortcut">Atajo de tarjeta</string>
|
||||
<string name="noCardsMessage">Añada una tarjeta primero</string>
|
||||
<string name="noCardsMessage">Añada una primera tarjeta</string>
|
||||
<string name="noCardExistsError">No se ha podido encontrar esa tarjeta</string>
|
||||
<string name="importExport">Importar/Exportar</string>
|
||||
<string name="exportName">Exportar</string>
|
||||
@@ -25,7 +25,7 @@
|
||||
<string name="importFailedTitle">Falló la importación</string>
|
||||
<string name="importFailed">No se ha podido realizar la importación</string>
|
||||
<string name="exportSuccessfulTitle">Exportado</string>
|
||||
<string name="exportFailedTitle">Falló la exportación</string>
|
||||
<string name="exportFailedTitle">Exportación incorrecta</string>
|
||||
<string name="exportFailed">No se han podido exportar</string>
|
||||
<string name="importing">Importando…</string>
|
||||
<string name="exporting">Exportando…</string>
|
||||
@@ -47,7 +47,7 @@
|
||||
<string name="settings_theme">Tema</string>
|
||||
<string name="app_copyright_old">Basado en Loyalty Card Keychain
|
||||
\nderechos de autor © 2016-2020 de Branden Archer</string>
|
||||
<string name="exportOptionExplanation">Los datos se guardarán en la ubicación que elija</string>
|
||||
<string name="exportOptionExplanation">Los datos serán escritos en el lugar que elija</string>
|
||||
<string name="failedParsingImportUriError">No se pudo procesar el URI de importación</string>
|
||||
<string name="share">Compartir</string>
|
||||
<string name="barcodeType">Tipo de código de barras</string>
|
||||
@@ -205,13 +205,12 @@
|
||||
</plurals>
|
||||
<string name="starred">Estrellado</string>
|
||||
<string name="failedToRetrieveImageFile">No se pudo recuperar el archivo de imagen</string>
|
||||
<string name="barcodeLongPressMessage">Solo se pueden abrir imágenes en la aplicación de galería</string>
|
||||
<string name="updateBalanceTitle">¿Cuánto has gastado o recibido?</string>
|
||||
<string name="currentBalanceSentence">Saldo actual: <xliff:g>%s</xliff:g></string>
|
||||
<string name="noCameraPermissionDirectToSystemSetting">Para escanear códigos de barras, Catima necesitará acceso a su cámara. Toque aquí para cambiar la configuración de sus permisos.</string>
|
||||
<string name="noCameraPermissionDirectToSystemSetting">Para escanear códigos de barras, Catima necesitará acceso a su cámara. Toque aquí para cambiar los ajustes de su permiso.</string>
|
||||
<string name="updateBalanceHint">Introduzca el importe</string>
|
||||
<string name="newBalanceSentence">Nuevo balance: <xliff:g>%s</xliff:g></string>
|
||||
<string name="cameraPermissionDeniedTitle">No se pudo acceder a la cámara</string>
|
||||
<string name="cameraPermissionDeniedTitle">No pudo acceder a la cámara</string>
|
||||
<string name="updateBalance">Actualizar el balance</string>
|
||||
<string name="importCards">Importar tarjetas</string>
|
||||
<string name="storageReadPermissionRequired">Se necesita permiso para leer el almacenamiento para esta acción…</string>
|
||||
@@ -222,8 +221,6 @@
|
||||
<string name="validFromSentence">Válido desde: <xliff:g>%s</xliff:g></string>
|
||||
<string name="height">Alto</string>
|
||||
<string name="switchToFrontImage">Cambiar a imagen frontal</string>
|
||||
<string name="openFrontImageInGalleryApp">Abrir imagen frontal en la aplicación de la galería</string>
|
||||
<string name="openBackImageInGalleryApp">Abrir imagen trasera en la aplicación de visor de imagen</string>
|
||||
<string name="setBarcodeHeight">Ajustar la altura del código de barras</string>
|
||||
<string name="donate">Donar</string>
|
||||
<string name="switchToBarcode">Cambiar a código de barras</string>
|
||||
@@ -234,11 +231,11 @@
|
||||
<string name="show_validity">Mostrar la validez</string>
|
||||
<string name="show_balance">Mostrar el saldo</string>
|
||||
<string name="permissionReadCardsLabel">Leer Tarjetas Catima</string>
|
||||
<string name="permissionReadCardsDescription">leer tus tarjetas Catima y todos sus detalles, incluidas notas e imágenes</string>
|
||||
<string name="settings_allow_content_provider_read_title">Permite a otras aplicaciones acceder a mis datos</string>
|
||||
<string name="permissionReadCardsDescription">lea sus tarjetas Catima y todos sus detalles, incluyendo notas e imágenes</string>
|
||||
<string name="settings_allow_content_provider_read_title">Sincronizar con Gadgetbridge</string>
|
||||
<string name="settings_display_barcode_max_brightness_summary">Necesario para que funcione en algunos escáneres</string>
|
||||
<string name="settings_keep_screen_on_summary">Deshabilita el tiempo de espera de la pantalla mientras se ve una tarjeta</string>
|
||||
<string name="settings_allow_content_provider_read_summary">Las aplicaciones todavía tendrán que solicitar permiso para conseguir acceso</string>
|
||||
<string name="settings_allow_content_provider_read_summary">Permite a la app Gadgetbridge sincronizar tus tarjetas con los relojes soportados</string>
|
||||
<string name="settings_oled_dark_summary">Reduce el uso de batería en pantallas OLED</string>
|
||||
<string name="settings_category_title_cards">Vista de tarjeta</string>
|
||||
<string name="settings_category_title_general">General</string>
|
||||
@@ -311,4 +308,50 @@
|
||||
<string name="settings_disable_nfc_while_viewing_card_summary">Pausa NFC para prevenir abonaciones NFC desde disparador mientras vea una tarjeta</string>
|
||||
<string name="nfc_blocked_while_viewing_card">NFC está pausado</string>
|
||||
<string name="change_settings">Cambiar ajustes</string>
|
||||
<string name="nfc_block_system_error">Incorrecto al pausar NFC</string>
|
||||
<string name="sort_by_most_recently_added">Más recientemente añadido</string>
|
||||
<string name="zoomFrontImage">Imagen frontal de zoom</string>
|
||||
<string name="zoomBackImage">Imagen trasera de zoom</string>
|
||||
<string name="show_card_id">Mostrar ID de tarjeta</string>
|
||||
<string name="settings_wear_sync">Sincronizar con Wear OS</string>
|
||||
<string name="settings_wear_sync_summary">Permite a la app de acompañamiento de Wear OS leer tus tarjetas a través de Bluetooth</string>
|
||||
<string name="wear_sync_permission_required">Catima necesita los permisos que has denegado para sincronizarse con tu reloj inteligente Wear OS</string>
|
||||
<string name="settings_wear_sync_devices">Dispositivos Wear OS permitidos</string>
|
||||
<string name="settings_wear_sync_devices_summary">Gestiona los dispositivos con permiso para sincronizarse por Bluetooth</string>
|
||||
<string name="settings_wear_sync_no_devices">No hay dispositivos permitidos</string>
|
||||
<plurals name="settings_wear_sync_devices_summary_count">
|
||||
<item quantity="one"><xliff:g>%d</xliff:g> dispositivo permitido</item>
|
||||
<item quantity="many"><xliff:g>%d</xliff:g> dispositivos permitidos</item>
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> dispositivos permitidos</item>
|
||||
</plurals>
|
||||
<string name="settings_wear_sync_blocked_devices">Dispositivos Wear OS bloqueados</string>
|
||||
<string name="settings_wear_sync_blocked_devices_summary">Gestiona los dispositivos Wear OS bloqueados</string>
|
||||
<string name="settings_wear_sync_no_blocked_devices">No hay dispositivos bloqueados</string>
|
||||
<plurals name="settings_wear_sync_blocked_devices_summary_count">
|
||||
<item quantity="one"><xliff:g>%d</xliff:g> dispositivo bloqueado</item>
|
||||
<item quantity="many"><xliff:g>%d</xliff:g> dispositivos bloqueados</item>
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> dispositivos bloqueados</item>
|
||||
</plurals>
|
||||
<string name="settings_wear_sync_unpair_title">¿Eliminar dispositivo?</string>
|
||||
<string name="settings_wear_sync_unpair_message">¿Eliminar <xliff:g>%1$s</xliff:g> de Catima? No podrá seguir sincronizándose con tus tarjetas.</string>
|
||||
<string name="settings_wear_sync_unblock_message">¿Eliminar <xliff:g>%1$s</xliff:g> de la lista de bloqueos? Podrá volver a solicitar acceso de nuevo.</string>
|
||||
<string name="settings_wear_sync_unpair">Eliminar</string>
|
||||
<string name="settings_wear_sync_device_name"><xliff:g>%1$s</xliff:g> (<xliff:g>%2$s</xliff:g>)</string>
|
||||
<string name="settings_wear_sync_tap_to_remove">Toca un dispositivo para eliminarlo.</string>
|
||||
<string name="wear_bt_pairing_channel_name">Emparejamiento de dispositivos Wear OS</string>
|
||||
<string name="wear_bt_pairing_title">Un dispositivo Wear OS solicita sincronización</string>
|
||||
<string name="wear_bt_pairing_message">¿Conceder a <xliff:g>%1$s</xliff:g> acceso a tus tarjetas?</string>
|
||||
<string name="wear_bt_pairing_allow">Permitir</string>
|
||||
<string name="wear_bt_pairing_block">Bloquear</string>
|
||||
<string name="wear_bt_pairing_allowed">Ahora <xliff:g>%1$s</xliff:g> tiene permitido sincronizarse.</string>
|
||||
<string name="wear_bt_pairing_blocked"><xliff:g>%1$s</xliff:g> ha sido bloqueado.</string>
|
||||
<string name="wear_bt_pairing_mismatch_title">Nueva petición de autorización desde <xliff:g>%1$s</xliff:g></string>
|
||||
<string name="wear_bt_pairing_mismatch_message">Este dispositivo había sido autorizado previamente pero ahora emite un identificador diferente. Esto ocurre cuando la app de Wear OS se reinstala o se borran sus datos. También puede indicar un intento de suplantación MAC por Bluetooth.\n\nAcepta solo si has reinstalado recientemente la app de Catima para Wear OS en este reloj.</string>
|
||||
<string name="open_settings">Abrir ajustes</string>
|
||||
<string name="open_in_gallery">Abrir en galería de imágenes</string>
|
||||
<string name="wear_bt_channel_name">Aplicación de acompañamiento de Wear OS</string>
|
||||
<string name="wear_bt_notification_title">Sincronización activa con Catima Wear OS</string>
|
||||
<string name="settings_category_title_smartwatch">Soporte para reloj inteligente</string>
|
||||
<string name="wear_bt_failed_foreground_notification_title">Fallo al iniciar el servicio de sincronización de Wear OS</string>
|
||||
<string name="wear_bt_critical_error_channel_name">Error crítico de sincronización con Wear OS</string>
|
||||
</resources>
|
||||
@@ -86,7 +86,7 @@
|
||||
<string name="settings_system_theme">Süsteemi kujundus</string>
|
||||
<string name="settings_display_barcode_max_brightness_summary">See on vajalik mõnede skännerite toimimiseks</string>
|
||||
<string name="expiryStateSentenceExpired">Aegus: <xliff:g>%s</xliff:g></string>
|
||||
<string name="settings_allow_content_provider_read_summary">Selle valiku sisselülitamisel peavad muud rakendused lisaks küsima õigust vaadata kaartide andmeid</string>
|
||||
<string name="settings_allow_content_provider_read_summary">Selle valiku sisselülitamisel lubad Gadgetbridge\'i abil sünkroonida kaarte toetatud nutikelladesse</string>
|
||||
<string name="noGroups">Kui soovid sarnaseid kaarte omavahel liigitada, siis + pluss nupuga lisa kaardigruppe</string>
|
||||
<string name="group_name_is_empty">Kaardigrupi nimi ei saa jääda tühjaks</string>
|
||||
<string name="groupsList">Grupid: <xliff:g>%s</xliff:g></string>
|
||||
@@ -118,7 +118,6 @@
|
||||
<string name="updateBarcodeQuestionTitle">Kas uuendame triipkoodi väärtust?</string>
|
||||
<string name="yes">Jah</string>
|
||||
<string name="no">Ei</string>
|
||||
<string name="barcodeLongPressMessage">Galeriirakenduses saad avada vaid pilte</string>
|
||||
<string name="sort_by_most_recently_used">Viimati kasutatud</string>
|
||||
<string name="sort_by_expiry">Aegumine</string>
|
||||
<string name="reverse">…tagurpidi järjekorras</string>
|
||||
@@ -140,7 +139,7 @@
|
||||
<string name="settings_keep_screen_on_summary">Lülitab kaardi vaatamise ajaks välja ekraani energiahalduse</string>
|
||||
<string name="settings_disable_lockscreen_while_viewing_card">Keela ekraanilukustus</string>
|
||||
<string name="settings_disable_lockscreen_while_viewing_card_summary">Lülitab kaardi vaatamise ajaks välja ekraani lukustamise</string>
|
||||
<string name="settings_allow_content_provider_read_title">Luba teistel rakendustel minu andmeid lugeda</string>
|
||||
<string name="settings_allow_content_provider_read_title">Sünkrooni Gadgetbridge\'iga</string>
|
||||
<string name="importSuccessful">Andmed on imporditud</string>
|
||||
<string name="exportSuccessful">Andmed on eksporditud</string>
|
||||
<string name="enter_group_name">Sisesta kaardigrupi nimi</string>
|
||||
@@ -230,8 +229,6 @@
|
||||
<string name="switchToFrontImage">Vaata esikülje pilti</string>
|
||||
<string name="switchToBackImage">Vaata tagakülje pilti</string>
|
||||
<string name="switchToBarcode">Vaata triipkoodi</string>
|
||||
<string name="openFrontImageInGalleryApp">Ava esikülje pilt pildivalijas</string>
|
||||
<string name="openBackImageInGalleryApp">Ava tagakülje pilt pildivalijas</string>
|
||||
<string name="setBarcodeHeight">Määra triipkoodi kõrgus</string>
|
||||
<string name="donate">Toeta rahaliselt</string>
|
||||
<string name="icon_header_click_text">Pisipildi muutmiseks vajuta pikalt</string>
|
||||
@@ -305,4 +302,48 @@
|
||||
<string name="nfc_blocked_while_viewing_card">Lähiväljaside (NFC) on peatatud</string>
|
||||
<string name="change_settings">Muuda seadistusi</string>
|
||||
<string name="settings_disable_nfc_while_viewing_card_summary">Vältimaks, et lähiväljaside (NFC) abil toimiv makseliides käivitub, lülitatakse kaardi vaatamisel lähiväljaside (NFC) välja</string>
|
||||
<string name="nfc_block_system_error">Lähiväljaside (NFC) peatamine ei õnnestunud</string>
|
||||
<string name="sort_by_most_recently_added">Viimasena lisatud</string>
|
||||
<string name="zoomFrontImage">Suumi esikaane pilti</string>
|
||||
<string name="zoomBackImage">Suumi tagakaane pilti</string>
|
||||
<string name="show_card_id">Näita kaardi tunnust</string>
|
||||
<string name="open_in_gallery">Ava pildigaleriis</string>
|
||||
<string name="settings_wear_sync">Sünkrooni Wear OS-iga</string>
|
||||
<string name="settings_wear_sync_devices">Lubatud Wear OS-i seadmed</string>
|
||||
<string name="settings_wear_sync_devices_summary">Halda seadmeid, mis võivad Bluetoothi abil kaarte sünkroonida</string>
|
||||
<string name="settings_wear_sync_summary">Võimaldab Wear OS-i kaasrakendusel lugeda sinu kaarte Bluetoothi abil</string>
|
||||
<string name="wear_sync_permission_required">Catima sinu Wear OS-i põhise nutikellaga sünkroonimiseks sinu luba</string>
|
||||
<string name="settings_wear_sync_no_devices">Ühtegi lubatud seadet pole</string>
|
||||
<plurals name="settings_wear_sync_devices_summary_count">
|
||||
<item quantity="one"><xliff:g>%d</xliff:g> lubatud seade</item>
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> lubatud seadet</item>
|
||||
</plurals>
|
||||
<string name="settings_wear_sync_blocked_devices">Blokeeritud Wear OS-i seadmed</string>
|
||||
<string name="settings_wear_sync_blocked_devices_summary">Halda blokeeritud Wear OS-i seadmeid</string>
|
||||
<string name="settings_wear_sync_no_blocked_devices">Ühtegi blokeeritud seadet pole</string>
|
||||
<plurals name="settings_wear_sync_blocked_devices_summary_count">
|
||||
<item quantity="one"><xliff:g>%d</xliff:g> blokeeritud seade</item>
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> blokeeritud seadet</item>
|
||||
</plurals>
|
||||
<string name="settings_wear_sync_unpair_title">Kas eemaldad seadme?</string>
|
||||
<string name="settings_wear_sync_unpair_message">Kas eemaldad <xliff:g>%1$s</xliff:g> seadme Catimast? Peale seda pole enam sinu kaarte võimalik sinna sünkroonida.</string>
|
||||
<string name="settings_wear_sync_unblock_message">Kas eemaldad <xliff:g>%1$s</xliff:g> seadme blokeeritud seadmete loendist? Peale seda saab ta uuesti küsida ligipääsuõigusi.</string>
|
||||
<string name="settings_wear_sync_unpair">Eemalda</string>
|
||||
<string name="settings_wear_sync_tap_to_remove">Seadme eemaldamiseks klõpsa temal.</string>
|
||||
<string name="wear_bt_pairing_channel_name">Paardumine Wear OS-i seadmega</string>
|
||||
<string name="wear_bt_pairing_title">Wear OS-i seade soovib sünkroonida</string>
|
||||
<string name="wear_bt_pairing_message">Kas lubad <xliff:g>%1$s</xliff:g> seadmele ligipääsu sinu kaartidele?</string>
|
||||
<string name="wear_bt_pairing_allow">Luba</string>
|
||||
<string name="wear_bt_pairing_block">Blokeeri</string>
|
||||
<string name="wear_bt_pairing_allowed"><xliff:g>%1$s</xliff:g> võib nüüd sünkroonida.</string>
|
||||
<string name="wear_bt_pairing_blocked"><xliff:g>%1$s</xliff:g> on nüüd blokeeritud.</string>
|
||||
<string name="wear_bt_pairing_mismatch_title">Uus autentimispäring <xliff:g>%1$s</xliff:g> seadmest</string>
|
||||
<string name="open_settings">Ava seadistused</string>
|
||||
<string name="wear_bt_channel_name">Wear OS-i kaaslasrakendus</string>
|
||||
<string name="wear_bt_notification_title">Catima Wear OS-i sünkroonimine on aktiivne</string>
|
||||
<string name="settings_category_title_smartwatch">Nutikellade tugi</string>
|
||||
<string name="wear_bt_failed_foreground_notification_title">Wear OS-i sünkroonimisteenuse käivitamine ei õnnestunud</string>
|
||||
<string name="wear_bt_critical_error_channel_name">Kriitiline viga Wear OS-iga sünkroonimisel</string>
|
||||
<string name="wear_bt_pairing_mismatch_message">See seade oli varem autoriseeritud, kuid esitab nüüd päringutele teise tunnusloa. See juhtub siis, kui Wear OS-i rakendus on uuesti paigaldatud või selle andmed on kustutatud. See võib viidata ka Bluetoothi MAC-aadressi võltsimise katsele.\n\nNõustu sellega ainult juhul, kui oled hiljuti sellele kellale Catima Wear OS-i rakenduse uuesti paigaldanud.</string>
|
||||
<string name="settings_wear_sync_device_name"><xliff:g>%1$s</xliff:g> (<xliff:g>%2$s</xliff:g>)</string>
|
||||
</resources>
|
||||
@@ -139,7 +139,7 @@
|
||||
<string name="group_updated">گروه به روز شد</string>
|
||||
<string name="all">همه</string>
|
||||
<string name="deleteConfirmationGroup">حذف گروه؟</string>
|
||||
<string name="failedOpeningFileManager">ابتدا یک مدیریت فایل نصب کنید.</string>
|
||||
<string name="failedOpeningFileManager">نمی توان مدیر پرونده را باز کرد</string>
|
||||
<string name="moveUp">به بالا حرکت کن</string>
|
||||
<string name="moveDown">به پایین حرکت کن</string>
|
||||
<string name="leaveWithoutSaveConfirmation">بدون ذخیره ترک میکنید؟</string>
|
||||
@@ -179,7 +179,7 @@
|
||||
<string name="importCards">واردات کارت ها</string>
|
||||
<string name="height">ارتفاع</string>
|
||||
<string name="add_manually_warning_message">برای برخی از فروشگاهها، مقدار بارکد با عدد نوشته شده روی کارت متفاوت است. به همین دلیل، وارد کردن دستی بارکد ممکن است همیشه کار نکند. اکیداً توصیه میشود که به جای آن، بارکد را با دوربین خود اسکن کنید. آیا هنوز میخواهید ادامه دهید؟</string>
|
||||
<string name="generic_error_please_retry">ببخشید، مشکلی پیش آمده، لطفا دوباره امتحان کنید...</string>
|
||||
<string name="generic_error_please_retry">مشکلی پیش آمده</string>
|
||||
<string name="welcome">یه کتیما خوش آمدید</string>
|
||||
<string name="chooseValidFromDate">مقداری درست از تاریخ برگزینید</string>
|
||||
<string name="intent_import_card_from_url_share_multiple_text">میخواهم چند کارت به شما بدهم</string>
|
||||
@@ -191,7 +191,7 @@
|
||||
<string name="no">نه</string>
|
||||
<string name="updateBarcodeQuestionTitle">مقدار بارکد را بهروز میکنید؟</string>
|
||||
<string name="updateBarcodeQuestionText">شما شناسه را تغییر دادید. میخواهید بارکد را هم بهروز کنید تا همین مقدار را بهکار ببرید؟</string>
|
||||
<string name="failedGeneratingShareURL">نتوانستم آدرس همرسانیپذیر بسازم. لطفن این را گزارش کنید.</string>
|
||||
<string name="failedGeneratingShareURL">نتوانستم نشانی همرسانیپذیر بسازم.</string>
|
||||
<string name="turn_flashlight_on">چراغقوه را روشن کنید</string>
|
||||
<string name="settings_locale">زبان</string>
|
||||
<string name="settings_oled_dark">پسزمینهی یکدست سیاه برای حالت تاریک</string>
|
||||
@@ -209,11 +209,10 @@
|
||||
<string name="wrongValueForBarcodeType">مقدار برای نوع بارکد برگزیده درست نیست</string>
|
||||
<string name="setBackImage">عکس پشتِسر را بگذارید</string>
|
||||
<string name="removeImage">عکس را برچینید</string>
|
||||
<string name="passwordRequired">لطفا گذرواژه را وارد کنید</string>
|
||||
<string name="passwordRequired">گذرواژه را وارد کنید</string>
|
||||
<string name="previousCard">پیشین</string>
|
||||
<string name="turn_flashlight_off">چراغقوه را خاموش کنید</string>
|
||||
<string name="updateBalance">بهروزرسانی موجودی</string>
|
||||
<string name="barcodeLongPressMessage">تنها عکس میتواند در گالری برنامه باز شود</string>
|
||||
<string name="sort_by_name">نام</string>
|
||||
<string name="sort_by_most_recently_used">بهتازگی استفادهشده</string>
|
||||
<string name="sort_by_expiry">انقضا</string>
|
||||
@@ -221,7 +220,6 @@
|
||||
<string name="include_if_asking_support">اگر میخواهید پشتیبانی درخواست کنید، اطلاعات زیر را پر کنید:</string>
|
||||
<string name="unarchive">برچیدن بایگانی</string>
|
||||
<string name="switchToBackImage">به عکس پشتِسر جابهجا کنید</string>
|
||||
<string name="openBackImageInGalleryApp">عکس پشتِسر را در برنامهی گالری باز کنید</string>
|
||||
<string name="setBarcodeHeight">ارتفاع بارگد را بگمارید</string>
|
||||
<string name="donate">کمک مالی کنید</string>
|
||||
<string name="icon_header_click_text">برای ویرایش قاب پیشنمایه فشار داده و نگهدارید</string>
|
||||
@@ -235,7 +233,7 @@
|
||||
<string name="settings_column_count_4">۴</string>
|
||||
<string name="settings_column_count_5">۵</string>
|
||||
<string name="settings_column_count_6">۶</string>
|
||||
<string name="failedLaunchingPhotoPicker">نتوانستم یک برنامهی گالری پشتیبانیشده بیابم</string>
|
||||
<string name="failedLaunchingPhotoPicker">نتوانستم یک برنامهی انتخاب تصویر پشتیبانیشده بیابم</string>
|
||||
<string name="show_balance">موجودی را نشان دهید</string>
|
||||
<string name="settings_column_count_landscape">ستونها در حالت لنداسکیپ</string>
|
||||
<string name="settings_column_count_1">۱</string>
|
||||
@@ -265,7 +263,6 @@
|
||||
<string name="failedToOpenUrl">نخست یک مرورگر وب نصب کنید</string>
|
||||
<string name="updateBalanceTitle">چقدر خرج یا دریافت کردید؟</string>
|
||||
<string name="switchToBarcode">به بارکد جابهجا کنید</string>
|
||||
<string name="openFrontImageInGalleryApp">عکس روبهرو را در برنامهی گالری باز کنید</string>
|
||||
<string name="add_a_card_in_a_different_way">یک کارت به روشی متفاوت بیافزایید</string>
|
||||
<string name="takePhoto">عکس بگیرید</string>
|
||||
<string name="settings_column_count_7">۷</string>
|
||||
@@ -286,4 +283,13 @@
|
||||
<string name="addFromPkpass">یک فایل دفترچه حساب (.pkpass) انتخاب کنید</string>
|
||||
<string name="noCameraFoundGuideText">به نظر نمیرسد دستگاه شما دوربین داشته باشد. اگر دارد، دستگاه را مجدداً راهاندازی کنید. در غیر این صورت، از دکمه گزینههای بیشتر در زیر برای افزودن بارکد به روش دیگری استفاده کنید.</string>
|
||||
<string name="card_list_widget_empty">بعد از اینکه چند کارت وفاداری در کاتیما اضافه کردید، آنها اینجا ظاهر میشوند. اگر کارت دارید، مطمئن شوید که همه آنها بایگانی نشدهاند.</string>
|
||||
<string name="card_list_widget_name">فهرست کارت</string>
|
||||
<string name="cardWithNumber">کارت <xliff:g>%d</xliff:g></string>
|
||||
<string name="cardWithNumberAndLocale">کارت <xliff:g>%d</xliff:g> (<xliff:g>%s</xliff:g>)</string>
|
||||
<string name="pleaseDoNotRotateTheDevice">لطفا دستگاهتان را نچرخوانید، زیرا کار در حال انجام را لغو میکند</string>
|
||||
<string name="settings_disable_nfc_while_viewing_card">توقف NFC</string>
|
||||
<string name="settings_disable_nfc_while_viewing_card_summary">NFC را متوقف میکند تا هنگام مشاهده کارت، پرداختهای NFC فعال نشوند.</string>
|
||||
<string name="settings_wear_sync_blocked_devices">دستگاههای Wear OS مسدودشده</string>
|
||||
<string name="settings_wear_sync_blocked_devices_summary">مدیریت دستگاههای Wear OS مسدودشده</string>
|
||||
<string name="settings_wear_sync_no_blocked_devices">هیچ دستگاه مسدودشدهای وجود ندارد</string>
|
||||
</resources>
|
||||
@@ -200,7 +200,6 @@
|
||||
<string name="welcome">Tervetuloa Catimaan</string>
|
||||
<string name="updateBalanceTitle">Kuinka paljon kulutit tai tienasit?</string>
|
||||
<string name="updateBalanceHint">Syötä summa</string>
|
||||
<string name="barcodeLongPressMessage">Vain kuvia on mahdollista avata galleriasovelluksessa</string>
|
||||
<string name="archive">Arkistoi</string>
|
||||
<string name="importCards">Tuo kortteja</string>
|
||||
<string name="failedToRetrieveImageFile">Kuvatiedoston noutaminen epäonnistui</string>
|
||||
@@ -223,14 +222,12 @@
|
||||
<string name="height">Korkeus</string>
|
||||
<string name="switchToFrontImage">Vaihda etukuvaan</string>
|
||||
<string name="switchToBarcode">Vaihda viivakoodiin</string>
|
||||
<string name="openFrontImageInGalleryApp">Avaa etukuva kuvankatselusovelluksessa</string>
|
||||
<string name="settings_display_barcode_max_brightness_summary">Välttämätön, jotta jotkin skannerit toimivat</string>
|
||||
<string name="settings_keep_screen_on_summary">Poistaa näytön aikakatkaisun korttia katsellessa</string>
|
||||
<string name="settings_disable_lockscreen_while_viewing_card_summary">Poistaa näyttölukituksen käytöstä korttia katsellessa</string>
|
||||
<string name="settings_allow_content_provider_read_title">Salli muiden sovellusten käyttää omaa dataa</string>
|
||||
<string name="settings_oled_dark_summary">Vähentää akun käyttöä OLED-näytöillä</string>
|
||||
<string name="switchToBackImage">Vaihda takakuvaan</string>
|
||||
<string name="openBackImageInGalleryApp">Avaa takakuva kuvankatselusovelluksessa</string>
|
||||
<string name="setBarcodeHeight">Aseta viivakoodin korkeus</string>
|
||||
<string name="icon_header_click_text">Pitkä painallus pikkukuvan muokkaamiseksi</string>
|
||||
<string name="show_name_below_image_thumbnail">Näytä nimi pikkukuvan alapuolella</string>
|
||||
@@ -302,4 +299,14 @@
|
||||
<string name="back">Takaisin</string>
|
||||
<string name="acra_explain_crash">Jos mahdollista lisää tietoja toiminnastasi täällä:</string>
|
||||
<string name="acra_crash_email_subject"><xliff:g id="app_name">%s</xliff:g> pysähtymisraportti</string>
|
||||
<string name="settings_disable_nfc_while_viewing_card">Keskeytä NFC</string>
|
||||
<string name="settings_disable_nfc_while_viewing_card_summary">Keskeyttää NFC:n, jotta NFC-maksut eivät aktivoituisi korttia katsoessa</string>
|
||||
<string name="sort_by_most_recently_added">Viimeksi lisätty</string>
|
||||
<string name="zoomFrontImage">Suurenna etukuvaa</string>
|
||||
<string name="zoomBackImage">Suurenna takakuvaa</string>
|
||||
<string name="show_card_id">Näytä kortin tunniste</string>
|
||||
<string name="nfc_blocked_while_viewing_card">NFC on keskeytetty</string>
|
||||
<string name="change_settings">Muuta asetuksia</string>
|
||||
<string name="nfc_block_system_error">NFC:n keskeyttäminen epäonnistui</string>
|
||||
<string name="open_in_gallery">Avaa kuvagalleriassa</string>
|
||||
</resources>
|
||||
@@ -168,7 +168,7 @@
|
||||
<string name="version_history">Historique des versions</string>
|
||||
<string name="exportPassword">Définissez un mot de passe pour protéger vos exportations (facultatif)</string>
|
||||
<string name="exportPasswordHint">Entrez le mot de passe</string>
|
||||
<string name="editGroup">Modification du groupe : <xliff:g> %s </xliff:g></string>
|
||||
<string name="editGroup">Modification du groupe : <xliff:g>%s</xliff:g></string>
|
||||
<string name="noGiftCardsGroup">Créez des cartes, puis affectez-les au groupe ici</string>
|
||||
<string name="group_edit">Modifier le groupe</string>
|
||||
<string name="group_name_already_in_use">Nom de groupe déjà utilisé</string>
|
||||
@@ -203,7 +203,6 @@
|
||||
<string name="previousCard">Précédent</string>
|
||||
<string name="failedToOpenUrl">Installez d\'abord un navigateur web</string>
|
||||
<string name="welcome">Bienvenue dans Catima</string>
|
||||
<string name="barcodeLongPressMessage">Seules les images peuvent être ouvertes dans 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>
|
||||
@@ -223,8 +222,6 @@
|
||||
<string name="switchToFrontImage">Passer à l\'image avant</string>
|
||||
<string name="switchToBackImage">Passer à l\'image arrière</string>
|
||||
<string name="switchToBarcode">Passer au code barre</string>
|
||||
<string name="openFrontImageInGalleryApp">Ouvrir l\'image du recto dans l\'application de visualisation des images</string>
|
||||
<string name="openBackImageInGalleryApp">Ouvrir l\'image du verso dans l\'application de visualisation des images</string>
|
||||
<string name="setBarcodeHeight">Définir la hauteur du code-barres</string>
|
||||
<string name="donate">Faire un don</string>
|
||||
<string name="icon_header_click_text">Appuyez longuement pour modifier la vignette</string>
|
||||
@@ -234,8 +231,8 @@
|
||||
<string name="show_balance">Afficher le solde</string>
|
||||
<string name="permissionReadCardsLabel">Lire les cartes Catima</string>
|
||||
<string name="permissionReadCardsDescription">lisez vos cartes Catima et tous leurs détails, y compris les notes et les images</string>
|
||||
<string name="settings_allow_content_provider_read_title">Autoriser d\'autres applications à accéder à mes données</string>
|
||||
<string name="settings_allow_content_provider_read_summary">Les applications devront toujours demander une autorisation pour obtenir l\'accès</string>
|
||||
<string name="settings_allow_content_provider_read_title">Synchroniser avec Gadgetbridge</string>
|
||||
<string name="settings_allow_content_provider_read_summary">Permet à l\'appli Gadgetbridge de synchroniser vos cartes vers des montres prises en charge</string>
|
||||
<string name="settings_display_barcode_max_brightness_summary">Nécessaire au fonctionnement de certains scanneurs</string>
|
||||
<string name="settings_keep_screen_on_summary">Désactive la temporisation de l\'écran lors de la visualisation d\'une carte</string>
|
||||
<string name="settings_oled_dark_summary">Réduit l\'utilisation de la batterie sur les écrans OLED</string>
|
||||
@@ -311,4 +308,50 @@
|
||||
<string name="settings_disable_nfc_while_viewing_card_summary">Mettre en pause le NFC pour éviter le déclenchement de paiements NFC lors de la consultation d\'une carte</string>
|
||||
<string name="nfc_blocked_while_viewing_card">Le NFC est en pause</string>
|
||||
<string name="change_settings">Modifier les paramètres</string>
|
||||
<string name="nfc_block_system_error">Erreur lors de la mise en pause du NFC</string>
|
||||
<string name="sort_by_most_recently_added">Récemment ajoutés</string>
|
||||
<string name="zoomFrontImage">Grossir l\'image avant</string>
|
||||
<string name="zoomBackImage">Grossir l\'image arrière</string>
|
||||
<string name="show_card_id">Afficher l\'ID de carte</string>
|
||||
<string name="open_in_gallery">Ouvrir dans la galerie d\'images</string>
|
||||
<string name="settings_wear_sync">Synchroniser avec Wear OS</string>
|
||||
<string name="settings_wear_sync_summary">Permet à l\'appli compagnon Wear OS de lire vos cartes par Bluetooth</string>
|
||||
<string name="wear_sync_permission_required">Catima a besoin de l\'autorisation que vous avez refusée pour se synchroniser avec votre montre connectée Wear OS</string>
|
||||
<string name="settings_wear_sync_devices">Appareils Wear OS autorisés</string>
|
||||
<string name="settings_wear_sync_devices_summary">Gérer les appareils autorisés à se synchroniser par Bluetooth</string>
|
||||
<string name="settings_wear_sync_no_devices">Aucun appareil autorisé</string>
|
||||
<plurals name="settings_wear_sync_devices_summary_count">
|
||||
<item quantity="one"><xliff:g>%d</xliff:g> appareil autorisé</item>
|
||||
<item quantity="many"><xliff:g>%d</xliff:g> appareils autorisés</item>
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> appareils autorisés</item>
|
||||
</plurals>
|
||||
<string name="settings_wear_sync_blocked_devices">Appareils Wear OS bloqués</string>
|
||||
<string name="settings_wear_sync_blocked_devices_summary">Gérer les appareils Wear OS bloqués</string>
|
||||
<string name="settings_wear_sync_no_blocked_devices">Aucun appareil bloqué</string>
|
||||
<plurals name="settings_wear_sync_blocked_devices_summary_count">
|
||||
<item quantity="one"><xliff:g>%d</xliff:g> appareil bloqué</item>
|
||||
<item quantity="many"><xliff:g>%d</xliff:g> appareils bloqués</item>
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> appareils bloqués</item>
|
||||
</plurals>
|
||||
<string name="settings_wear_sync_unpair_title">Supprimer l\'appareil ?</string>
|
||||
<string name="settings_wear_sync_unpair_message">Retirer <xliff:g>%1$s</xliff:g> de Catima ? Il ne pourra plus synchroniser de cartes.</string>
|
||||
<string name="settings_wear_sync_unblock_message">Retirer <xliff:g>%1$s</xliff:g> de la liste des appareils bloqués ? Il pourra demander l\'accès à nouveau.</string>
|
||||
<string name="settings_wear_sync_unpair">Retirer</string>
|
||||
<string name="settings_wear_sync_device_name"><xliff:g>%1$s</xliff:g> (<xliff:g>%2$s</xliff:g>)</string>
|
||||
<string name="settings_wear_sync_tap_to_remove">Appuyer sur un appareil pour le supprimer.</string>
|
||||
<string name="wear_bt_pairing_channel_name">Appairage d\'appareil Wear OS</string>
|
||||
<string name="wear_bt_pairing_title">L\'appareil Wear OS souhaite se synchroniser</string>
|
||||
<string name="wear_bt_pairing_message">Autoriser <xliff:g>%1$s</xliff:g> à accéder à vos cartes ?</string>
|
||||
<string name="wear_bt_pairing_allow">Autoriser</string>
|
||||
<string name="wear_bt_pairing_block">Bloquer</string>
|
||||
<string name="wear_bt_pairing_allowed"><xliff:g>%1$s</xliff:g> est maintenant autorisé à se synchroniser.</string>
|
||||
<string name="wear_bt_pairing_blocked"><xliff:g>%1$s</xliff:g> a été bloqué.</string>
|
||||
<string name="wear_bt_pairing_mismatch_title">Nouvelle demande d\'autorisation de <xliff:g>%1$s</xliff:g></string>
|
||||
<string name="open_settings">Ouvrir les paramètres</string>
|
||||
<string name="wear_bt_channel_name">Compagnon Wear OS</string>
|
||||
<string name="wear_bt_notification_title">Synchronisation Catima Wear OS active</string>
|
||||
<string name="settings_category_title_smartwatch">Prise en charge des montres connectées</string>
|
||||
<string name="wear_bt_failed_foreground_notification_title">Erreur au démarrage du service de synchronisation Wear OS</string>
|
||||
<string name="wear_bt_critical_error_channel_name">Erreur critique de synchronisation Wear OS</string>
|
||||
<string name="wear_bt_pairing_mismatch_message">Cet appareil était autorisé précédemment mais affiche maintenant un jeton d\'identité différent. Cela arrive lorsque l\'appli Wear OS est réinstallée ou ses données sont supprimées. Cela peut aussi indiquer une tentative d\'usurpation d\'adresse MAC du Bluetooth.\n\nAcceptez uniquement si vous avez récemment réinstallée l\'appli Catima Wear OS sur cette montre.</string>
|
||||
</resources>
|
||||
@@ -64,8 +64,8 @@
|
||||
<string name="settings_keep_screen_on_summary">Evita que se apague a pantalla cando se ve unha tarxeta</string>
|
||||
<string name="settings_disable_lockscreen_while_viewing_card">Evitar bloqueo da pantalla</string>
|
||||
<string name="settings_disable_lockscreen_while_viewing_card_summary">Desactiva o bloqueo da pantalla cando se ve unha tarxeta</string>
|
||||
<string name="settings_allow_content_provider_read_title">Permitir a outras apps acceder aos meus datos</string>
|
||||
<string name="settings_allow_content_provider_read_summary">As app terán que solicitar igualmente o permiso para acceder aos datos</string>
|
||||
<string name="settings_allow_content_provider_read_title">Sincronizar con Gadgetbridge</string>
|
||||
<string name="settings_allow_content_provider_read_summary">Permite á app Gadgetbridge sincronizar as túas tarxetas cos reloxos compatibles</string>
|
||||
<string name="settings_use_volume_keys_navigation">Cambiar de tarxeta cos botóns de volume</string>
|
||||
<string name="settings_use_volume_keys_navigation_summary">Usar os botóns de volume para cambiar a tarxeta que se mostra</string>
|
||||
<string name="intent_import_card_from_url_share_text">Quero compartir unha tarxeta contigo</string>
|
||||
@@ -150,7 +150,6 @@
|
||||
<string name="showMoreInfo">Ver info</string>
|
||||
<string name="updateBalance">Actualizar saldo</string>
|
||||
<string name="failedToRetrieveImageFile">Fallou a obtención do ficheiro de imaxe</string>
|
||||
<string name="barcodeLongPressMessage">Só imaxes que se abren na app de galería</string>
|
||||
<string name="sort_by_name">Nome</string>
|
||||
<string name="sort_by_most_recently_used">Usadas recentemente</string>
|
||||
<string name="sort_by_expiry">Caducidade</string>
|
||||
@@ -194,8 +193,6 @@
|
||||
<string name="height">Altura</string>
|
||||
<string name="switchToFrontImage">Cambiar á imaxe frontal</string>
|
||||
<string name="switchToBackImage">Cambiar á imaxe posterior</string>
|
||||
<string name="openFrontImageInGalleryApp">Abrir imaxe frontal no visor de imaxes</string>
|
||||
<string name="openBackImageInGalleryApp">Abrir imaxe posterior no visor de imaxes</string>
|
||||
<string name="setBarcodeHeight">Establecer altura do código de barras</string>
|
||||
<string name="icon_header_click_text">Pulsación longa para editar a miniatura</string>
|
||||
<string name="show_name_below_image_thumbnail">Mostrar nome debaixo da miniatura</string>
|
||||
@@ -304,4 +301,48 @@
|
||||
<string name="settings_disable_nfc_while_viewing_card_summary">Detén o NFC para evitar a activación de pago con NFC cando se mira unha tarxeta</string>
|
||||
<string name="nfc_blocked_while_viewing_card">NFC está en pausa</string>
|
||||
<string name="change_settings">Cambiar axustes</string>
|
||||
<string name="nfc_block_system_error">Non se detivo NFC</string>
|
||||
<string name="sort_by_most_recently_added">Máis recentes</string>
|
||||
<string name="zoomFrontImage">Zoom na imaxe frontal</string>
|
||||
<string name="zoomBackImage">Zoom na imaxe posterior</string>
|
||||
<string name="show_card_id">Mostrar ID da tarxeta</string>
|
||||
<string name="open_in_gallery">Abrir na galería de imaxes</string>
|
||||
<string name="settings_wear_sync">Sincronizar con Wear OS</string>
|
||||
<string name="settings_wear_sync_summary">Permite que a app asocidada de Wear OS lea as túas tarxetas utilizando Bluetooth</string>
|
||||
<string name="wear_sync_permission_required">Catima precisa os permisos que non concedeches para sincronizar co teu reloxo Wear OS</string>
|
||||
<string name="settings_wear_sync_devices">Dispositivos Wear OS permitidos</string>
|
||||
<string name="settings_wear_sync_devices_summary">Xestiona os dispositivos con permiso para sincronizar usando Bluetooth</string>
|
||||
<string name="settings_wear_sync_no_devices">Sen dispositivos permitidos</string>
|
||||
<plurals name="settings_wear_sync_devices_summary_count">
|
||||
<item quantity="one"><xliff:g>%d</xliff:g> dispositivo permitido</item>
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> dispositivos permitidos</item>
|
||||
</plurals>
|
||||
<string name="settings_wear_sync_blocked_devices">Dispositivos Wear OS bloqueados</string>
|
||||
<string name="settings_wear_sync_blocked_devices_summary">Xestiona os dispositivos Wear OS bloquedos</string>
|
||||
<string name="settings_wear_sync_no_blocked_devices">Sen dispositivos bloqueados</string>
|
||||
<plurals name="settings_wear_sync_blocked_devices_summary_count">
|
||||
<item quantity="one"><xliff:g>%d</xliff:g> dispositivo bloqueado</item>
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> dispositivos bloqueados</item>
|
||||
</plurals>
|
||||
<string name="settings_wear_sync_unpair_title">Retirar dispositivo?</string>
|
||||
<string name="settings_wear_sync_unpair_message">Retirar <xliff:g>%1$s</xliff:g> de Catima? Non poderá seguir sincronizándose coas túas tarxetas.</string>
|
||||
<string name="settings_wear_sync_unblock_message">Retirar <xliff:g>%1$s</xliff:g> da lista de bloqueados? Poderá volver a solicitar o acceso.</string>
|
||||
<string name="settings_wear_sync_unpair">Retirar</string>
|
||||
<string name="settings_wear_sync_device_name"><xliff:g>%1$s</xliff:g> (<xliff:g>%2$s</xliff:g>)</string>
|
||||
<string name="settings_wear_sync_tap_to_remove">Toca nun dispositivo para retiralo.</string>
|
||||
<string name="wear_bt_pairing_channel_name">Emparellando dispositivo Wear OS</string>
|
||||
<string name="wear_bt_pairing_title">O dispositivo Wear OS quere sincronizar</string>
|
||||
<string name="wear_bt_pairing_message">Permitirlle a <xliff:g>%1$s</xliff:g> que acceda ás tarxetas?</string>
|
||||
<string name="wear_bt_pairing_allow">Permitir</string>
|
||||
<string name="wear_bt_pairing_block">Bloquear</string>
|
||||
<string name="wear_bt_pairing_allowed">Agora <xliff:g>%1$s</xliff:g> ten permiso para sincronizar.</string>
|
||||
<string name="wear_bt_pairing_blocked">Bloqueaches a <xliff:g>%1$s</xliff:g>.</string>
|
||||
<string name="wear_bt_pairing_mismatch_title">Nova solicitude de autorización desde <xliff:g>%1$s</xliff:g></string>
|
||||
<string name="wear_bt_pairing_mismatch_message">O dispositivo tiña permiso anteriormente pero agora presenta un token de identidade diferente. Isto acontece cando se reinstala a app Wear OS ou se limparon os datos. Tamén pode indicar un intento de suplantación utilizando a MAC de Bluetooth.\n\nSó acepta se reinstalaches recentemente a app Catima Wear OS neste reloxo.</string>
|
||||
<string name="open_settings">Abrir os axustes</string>
|
||||
<string name="wear_bt_channel_name">Aplicación Wear OS</string>
|
||||
<string name="wear_bt_notification_title">Sincronización activa Wear OS para Catima</string>
|
||||
<string name="settings_category_title_smartwatch">Compatibilidade con reloxos</string>
|
||||
<string name="wear_bt_failed_foreground_notification_title">Fallou o inicio do servizo de sincronización con Wear OS</string>
|
||||
<string name="wear_bt_critical_error_channel_name">Erro crítico ao sincronizar con Wear OS</string>
|
||||
</resources>
|
||||
@@ -212,7 +212,6 @@
|
||||
<string name="version_history">वर्जन तिहास</string>
|
||||
<string name="archive">पुरालेख/संग्रहित (Archive)</string>
|
||||
<string name="archived">कार्ड संग्रहीत (Archived)</string>
|
||||
<string name="barcodeLongPressMessage">गैलरी ऐप में केवल छवियां ही खोली जा सकती हैं</string>
|
||||
<string name="license">अनुज्ञप्ति (लाइसेंस)</string>
|
||||
<string name="source_repository">स्रोत रिपोजिटरी</string>
|
||||
<string name="include_if_asking_support">यदि आप सहायता का अनुरोध करना चाहते हैं, तो निम्नलिखित जानकारी शामिल करें:</string>
|
||||
@@ -245,8 +244,6 @@
|
||||
<string name="switchToFrontImage">सामने वाली छवि पर स्विच करें</string>
|
||||
<string name="switchToBackImage">पिछली छवि पर स्विच करें</string>
|
||||
<string name="switchToBarcode">बारकोड पर स्विच करें</string>
|
||||
<string name="openFrontImageInGalleryApp">इमेज दर्शक सामने वाली इमेज खोलें</string>
|
||||
<string name="openBackImageInGalleryApp">पिछली इमेज खोलें</string>
|
||||
<string name="setBarcodeHeight">बारकोड ऊंचाई सेट करें</string>
|
||||
<string name="icon_header_click_text">छोटी छवि (थंबनेल) संपादित करने के लिए देर तक दबाएँ</string>
|
||||
<string name="enter_card_id">अपने कार्ड पर आईडी नंबर या टेक्स्ट दर्ज करें</string>
|
||||
|
||||
@@ -128,8 +128,6 @@
|
||||
<string name="switchToFrontImage">Prebaci na prednju sliku</string>
|
||||
<string name="switchToBackImage">Prebaci na stražnju sliku</string>
|
||||
<string name="switchToBarcode">Prebaci na crtični kod</string>
|
||||
<string name="openFrontImageInGalleryApp">Otvori prednju sliku u aplikaciji prikazivača slika</string>
|
||||
<string name="openBackImageInGalleryApp">Otvori stražnju sliku u aplikaciji prikazivača slika</string>
|
||||
<string name="setBarcodeHeight">Postavi visinu crtičnog koda</string>
|
||||
<plurals name="selectedCardCount">
|
||||
<item quantity="one"><xliff:g>%d</xliff:g> odabrana</item>
|
||||
@@ -159,7 +157,6 @@
|
||||
<string name="importVoucherVaultMessage">Odaberi tvoj izvoz iz Voucher Vault za uvoz. \nStvori ga u aplikaciji Voucher Vault pritiskom na „Izvoz”.</string>
|
||||
<string name="failedToRetrieveImageFile">Neuspjelo dohvaćanje slikovne datoteke</string>
|
||||
<string name="license">Licenca</string>
|
||||
<string name="barcodeLongPressMessage">U aplikaciji galerije se mogu otvoriiti samo slike</string>
|
||||
<string name="source_repository">Izvorni repozitorij</string>
|
||||
<string name="on_github">na GitHubu</string>
|
||||
<string name="on_google_play">na stranici Google Play</string>
|
||||
|
||||
@@ -33,9 +33,9 @@
|
||||
<string name="editCardTitle">Kártya szerkesztése</string>
|
||||
<string name="addCardTitle">Kártya hozzáadása</string>
|
||||
<string name="scanCardBarcode">Vonalkód beolvasása</string>
|
||||
<string name="cardShortcut">Kártya parancsikon</string>
|
||||
<string name="cardShortcut">Kártya indítóikon</string>
|
||||
<string name="failedParsingImportUriError">Az importálási URI nem értelmezhető</string>
|
||||
<string name="importExport">Importálás/Exportálás</string>
|
||||
<string name="importExport">Importálás/exportálás</string>
|
||||
<string name="exportName">Exportálás</string>
|
||||
<string name="importExportHelp">Az adatok mentése lehetővé teszi, hogy egy másik eszközre helyezze át</string>
|
||||
<string name="importSuccessfulTitle">Importálva</string>
|
||||
@@ -49,9 +49,9 @@
|
||||
</plurals>
|
||||
<string name="deleteTitle">Kártya törlése</string>
|
||||
<string name="barcodeImageDescriptionWithType">A(z) <xliff:g>%s</xliff:g> vonalkód képe</string>
|
||||
<string name="noCardExistsError">Kártya nem található</string>
|
||||
<string name="noCardExistsError">Ez a kártya nem található</string>
|
||||
<string name="importVoucherVault">Importálás a Voucher Vaultból</string>
|
||||
<string name="wrongValueForBarcodeType">Ez az érték meg megfelelő a kiválasztott vonalkódtípushoz</string>
|
||||
<string name="wrongValueForBarcodeType">Ez az érték nem felel meg a kiválasztott vonalkódtípushoz</string>
|
||||
<string name="setBackImage">Hátlapi kép beállítása</string>
|
||||
<string name="no">Nem</string>
|
||||
<string name="passwordRequired">Adja meg a jelszót</string>
|
||||
@@ -74,7 +74,7 @@
|
||||
<string name="app_license">Copyleft licencű szabad szoftver, GPLv3+ alatt közzétéve</string>
|
||||
<string name="about_title_fmt">A <xliff:g id="app_name">%s</xliff:g> névjegye</string>
|
||||
<string name="debug_version_fmt">Verzió: <xliff:g id="version">%s</xliff:g></string>
|
||||
<string name="app_resources">Szabad külső erőforrások: <xliff:g id="app_resources_list">%s</xliff:g></string>
|
||||
<string name="app_resources">Külső erőforrások: <xliff:g id="app_resources_list">%s</xliff:g></string>
|
||||
<string name="selectBarcodeTitle">Vonalkód kiválasztása</string>
|
||||
<string name="starImage">Kedvencek csillag</string>
|
||||
<string name="settings">Beállítások</string>
|
||||
@@ -91,14 +91,14 @@
|
||||
<string name="groups">Csoportok</string>
|
||||
<string name="group_edit">Csoport szerkesztése</string>
|
||||
<string name="group_name_is_empty">A csoportnév nem lehet üres</string>
|
||||
<string name="failedOpeningFileManager">Fájl böngésző nem elérhető</string>
|
||||
<string name="failedOpeningFileManager">Nem sikerült a fájlkezelő megnyitása</string>
|
||||
<string name="moveUp">Mozgatás felfelé</string>
|
||||
<string name="moveDown">Mozgatás lefelé</string>
|
||||
<string name="leaveWithoutSaveTitle">Kilépés</string>
|
||||
<string name="leaveWithoutSaveConfirmation">Kilépés mentés nélkül\?</string>
|
||||
<string name="addManually">A vonalkód kézi beírása</string>
|
||||
<string name="addFromImage">Kép kiválasztása a galériából</string>
|
||||
<string name="editGroup">Csoportok szerkesztése: <xliff:g>%s</xliff:g></string>
|
||||
<string name="editGroup">Csoport szerkesztése: <xliff:g>%s</xliff:g></string>
|
||||
<string name="expiryStateSentence">Lejárat: <xliff:g>%s</xliff:g></string>
|
||||
<string name="balanceSentence">Egyenleg: <xliff:g>%s</xliff:g></string>
|
||||
<string name="card">Kártya</string>
|
||||
@@ -108,7 +108,7 @@
|
||||
<string name="chooseExpiryDate">Lejárati dátum kiválasztása</string>
|
||||
<string name="moveBarcodeToTopOfScreen">Vonalkód feltolása a képernyő tetejére</string>
|
||||
<string name="noBarcodeFound">Nem található vonalkód</string>
|
||||
<string name="errorReadingImage">Kép nem olvasható</string>
|
||||
<string name="errorReadingImage">A kép nem olvasható</string>
|
||||
<string name="balance">Egyenleg</string>
|
||||
<string name="currency">Pénznem</string>
|
||||
<string name="points">Pontok</string>
|
||||
@@ -118,8 +118,8 @@
|
||||
<string name="importCatima">Importálás a Catimából</string>
|
||||
<string name="importFidme">Importálás a FidMeből</string>
|
||||
<string name="importLoyaltyCardKeychain">Importálás a Loyalty Card Keychainből</string>
|
||||
<string name="importLoyaltyCardKeychainMessage">Jelölje ki az importálandó Loyalty Card Keychain exportot. \nLétre tudja hozni a Loyalty Card Keychain Importálás/Exportálás menün belül az Exportálásra koppintva.</string>
|
||||
<string name="importVoucherVaultMessage">Jelölje ki az importálandó Voucher Vault exportot. \nLétre tudja hozni a Voucher Vault-on belüli Exportálás menüben.</string>
|
||||
<string name="importLoyaltyCardKeychainMessage">Jelölje ki az importálandó Loyalty Card Keychain exportot. \nA Loyalty Card Keychain Importálás/Exportálás menüjéből hozhatja létre, az Exportálásra koppintva.</string>
|
||||
<string name="importVoucherVaultMessage">Jelölje ki az importálandó Voucher Vault exportot. \nA Voucher Vault-on belül az Exportálás gombra koppintva hozhatja létre.</string>
|
||||
<string name="barcodeId">Vonalkód értéke</string>
|
||||
<string name="sameAsCardId">Ugyanaz, mint az azonosító</string>
|
||||
<string name="setBarcodeId">Vonalkód értékének beállítása</string>
|
||||
@@ -169,7 +169,7 @@
|
||||
<string name="about">Névjegy</string>
|
||||
<string name="app_copyright_old">Készült a Loyalty Card Keychain alapján
|
||||
\nCopyright © 2016–2020 Branden Archer</string>
|
||||
<string name="app_libraries">Szabad külső programkönyvtárak: <xliff:g id="app_libraries_list">%s</xliff:g></string>
|
||||
<string name="app_libraries">Külső programkönyvtárak: <xliff:g id="app_libraries_list">%s</xliff:g></string>
|
||||
<string name="settings_dark_theme">Sötét</string>
|
||||
<string name="deleteConfirmationGroup">Csoport törlése\?</string>
|
||||
<string name="noGroups">Koppintson a + gombra a csoportok kategorizálásához</string>
|
||||
@@ -179,8 +179,8 @@
|
||||
<string name="group_updated">Csoport frissítve</string>
|
||||
<string name="expiryStateSentenceExpired">Lejárt: <xliff:g>%s</xliff:g></string>
|
||||
<string name="groupsList">Csoportok: <xliff:g>%s</xliff:g></string>
|
||||
<string name="importCatimaMessage">Válassza ki a megfelelő exportált Catima elemet importálásra. \nA menüben található Importálás/Exportálásból importálhat egy korábbi Catima exportot.</string>
|
||||
<string name="importFidmeMessage">Jelölje ki az importálandó FidMe exportot, ezt követően adja meg kézileg a vonalkód típust. \nLétre tudja hozni a FidMe profiljából az Adatvédelmen belül a Adatom kinyerése opcióval.</string>
|
||||
<string name="importCatimaMessage">Válassza ki a megfelelő exportált Catima elemet importálásra. \nAz Importálás/exportálás menüelemmel importálhat egy korábbi Catima exportot.</string>
|
||||
<string name="importFidmeMessage">Jelölje ki az importálandó FidMe exportot, ezt követően adja meg kézileg a vonalkód típusát. \nA FidMe profiljából tudja létrehozni, az Adatvédelem, majd a Saját adatok kinyerése lehetőséggel.</string>
|
||||
<plurals name="groupCardCountWithArchived">
|
||||
<item quantity="one"><xliff:g>%1$d</xliff:g> kártya (<xliff:g id="archivedCount">%2$d</xliff:g> archiválva)</item>
|
||||
<item quantity="other"><xliff:g>%1$d</xliff:g> kártya (<xliff:g id="archivedCount">%2$d</xliff:g> archiválva)</item>
|
||||
@@ -202,7 +202,6 @@
|
||||
<string name="newBalanceSentence">Új egyenleg: <xliff:g>%s</xliff:g></string>
|
||||
<string name="cameraPermissionDeniedTitle">Nem sikerült hozzáférni a kamerához</string>
|
||||
<string name="failedToRetrieveImageFile">Nem sikerült lekérni a képfájlt</string>
|
||||
<string name="barcodeLongPressMessage">Csak képek nyithatók meg a galéria alkalmazásban</string>
|
||||
<string name="unarchived">Kártya archiválása megszüntetve</string>
|
||||
<string name="welcome">Üdvözöljük a Catimában</string>
|
||||
<string name="updateBalance">Egyenleg frissítése</string>
|
||||
@@ -218,8 +217,6 @@
|
||||
<string name="switchToBackImage">Hátulnézeti képre váltás</string>
|
||||
<string name="switchToBarcode">Vonalkódra váltás</string>
|
||||
<string name="donate">Adományozás</string>
|
||||
<string name="openBackImageInGalleryApp">Hátulnézeti kép megnyitása a galéria alkalmazásban</string>
|
||||
<string name="openFrontImageInGalleryApp">Elölnézeti kép megnyitása a galéria alkalmazásban</string>
|
||||
<string name="setBarcodeHeight">Vonalkód magasságának megadása</string>
|
||||
<string name="icon_header_click_text">Hosszan nyomja meg a miniatűr szerkesztéséhez</string>
|
||||
<string name="show_note">Megjegyzés megjelenítése</string>
|
||||
@@ -253,7 +250,7 @@
|
||||
<string name="app_name">Catima</string>
|
||||
<string name="amountParsingFailed">Hibás érték</string>
|
||||
<string name="add_manually_warning_title">Szkennelés ajánlott</string>
|
||||
<string name="add_manually_warning_message">Egyes kártyákon levő számsor különbözik a vonalkód számától. Emiatt a manuális szám beírás nem minden esetben működni. Ajánlott tehát a vonalkód beolvasása kamerával. Biztosan folytatja?</string>
|
||||
<string name="add_manually_warning_message">Az egyes kártyákon levő számsor különbözik a vonalkód számától. Emiatt a kézi számbeírás nem minden esetben fog működni. Ajánlott tehát a vonalkód kamerával történő beolvasása. Biztos, hogy folytatja?</string>
|
||||
<string name="continue_">Tovább</string>
|
||||
<string name="spend">Költött</string>
|
||||
<string name="receive">Megkapott</string>
|
||||
@@ -285,24 +282,25 @@
|
||||
<string name="settings_column_count_7">7</string>
|
||||
<string name="sort_by_valid_from">Érvényesség kezdete</string>
|
||||
<string name="width">Szélesség</string>
|
||||
<string name="setBarcodeWidth">Vonalkód szélesség beállítása</string>
|
||||
<string name="settings_disable_nfc_while_viewing_card">NFC leállítása</string>
|
||||
<string name="settings_disable_nfc_while_viewing_card_summary">Az NFC leállítása a kártya megtekintés erejéig, hogy ne indítsa be az NFC fizetést</string>
|
||||
<string name="card_list_widget_name">Kártya lista</string>
|
||||
<string name="card_list_widget_empty">Miután hozzáadja a kártyákat a Catima-hoz, itt fognak megjelenni. Ha vannak kártyái, győződjön meg, hogy nincsenek e archiválva.</string>
|
||||
<string name="setBarcodeWidth">Vonalkódszélesség beállítása</string>
|
||||
<string name="settings_disable_nfc_while_viewing_card">NFC szüneteltetése</string>
|
||||
<string name="settings_disable_nfc_while_viewing_card_summary">Az NFC szüneteltetése a kártya megtekintése idejére, hogy ne indítsa be az NFC-s fizetést</string>
|
||||
<string name="card_list_widget_name">Kártyalista</string>
|
||||
<string name="card_list_widget_empty">Miután hozzáadja a kártyákat a Catimához, itt fognak megjelenni. Ha vannak kártyái, győződjön meg arról, hogy nincsenek-e archiválva.</string>
|
||||
<string name="cardWithNumber"><xliff:g>%d</xliff:g> kártya</string>
|
||||
<string name="cardWithNumberAndLocale"><xliff:g>%d</xliff:g> (<xliff:g>%s</xliff:g>) kártya</string>
|
||||
<string name="pleaseDoNotRotateTheDevice">Kérem ne forgassa el az eszközt, mert az megszakítja a műveletet</string>
|
||||
<string name="acra_catima_has_crashed">Sajnos a <xliff:g id="app_name">%s</xliff:g> összeomlott. Segítsen ezt a hibát megoldani, azzal, hogy elküldi a jelentést számunkra.</string>
|
||||
<string name="acra_explain_crash">Ha lehetséges adja meg, hogy éppen milyen műveletet végzett:</string>
|
||||
<string name="pleaseDoNotRotateTheDevice">Ne forgassa el az eszközt, mert az megszakítja a műveletet</string>
|
||||
<string name="acra_catima_has_crashed">Sajnos a <xliff:g id="app_name">%s</xliff:g> összeomlott. Segítsen a hiba megoldásában azzal, hogy küld nekünk egy jelentést.</string>
|
||||
<string name="acra_explain_crash">Ha lehetséges, adja meg, hogy éppen milyen műveletet végzett:</string>
|
||||
<string name="acra_crash_email_subject"><xliff:g id="app_name">%s</xliff:g> összeomlási jelentés</string>
|
||||
<string name="pref_enable_acra">Kérje az összeomlási jelentéseket</string>
|
||||
<string name="pref_enable_acra_summary">Bekapcsolása esetén mindig kéri az összeomlási jelentés küldését. A jelentések sosem kerülnek küldésre automatikusan.</string>
|
||||
<string name="pref_enable_acra">Rákérdezés az összeomlási jelentések elküldésére</string>
|
||||
<string name="pref_enable_acra_summary">Ha be van kapcsolva, akkor mindig rákérdez az összeomlási jelentés elküldésére. A jelentések sosem kerülnek küldésre automatikusan.</string>
|
||||
<string name="copy_value">Érték másolása</string>
|
||||
<string name="copied_to_clipboard">Vágólapra másolva</string>
|
||||
<string name="nothing_to_copy">Nem található érték</string>
|
||||
<string name="barcodeEncoding">Vonalkód kódolás</string>
|
||||
<string name="barcodeEncoding">Vonalkód kódolása</string>
|
||||
<string name="back">Vissza</string>
|
||||
<string name="nfc_blocked_while_viewing_card">NFC leállítva</string>
|
||||
<string name="nfc_blocked_while_viewing_card">NFC szüneteltetve</string>
|
||||
<string name="change_settings">Beállítások változtatása</string>
|
||||
<string name="nfc_block_system_error">Nem sikerült szüneteltetni az NFC-t</string>
|
||||
</resources>
|
||||
@@ -189,7 +189,6 @@
|
||||
<string name="archive">Arsip</string>
|
||||
<string name="archived">Kartu diarsipkan</string>
|
||||
<string name="failedToRetrieveImageFile">Gagal mengambil file gambar</string>
|
||||
<string name="barcodeLongPressMessage">Hanya gambar yang dapat dibuka di aplikasi galeri</string>
|
||||
<string name="unarchive">Ekstrak</string>
|
||||
<string name="unarchived">Kartu tidak diarsipkan</string>
|
||||
<string name="options">Opsi</string>
|
||||
@@ -212,8 +211,6 @@
|
||||
<string name="switchToFrontImage">Ubah ke depan gambar</string>
|
||||
<string name="switchToBackImage">Ubah ke belakang gambar</string>
|
||||
<string name="switchToBarcode">Ubah ke kode batang</string>
|
||||
<string name="openFrontImageInGalleryApp">Buka gambar depan di aplikasi penampil gambar</string>
|
||||
<string name="openBackImageInGalleryApp">Buka gambar di aplikasi penampil gambar</string>
|
||||
<string name="setBarcodeHeight">Atur tinggi kode batang</string>
|
||||
<string name="donate">Donasi</string>
|
||||
<string name="show_validity">Tunjukkan validitas</string>
|
||||
@@ -223,8 +220,8 @@
|
||||
<string name="show_note">Tampilkan catatan</string>
|
||||
<string name="permissionReadCardsLabel">Bacalah kartu Catima</string>
|
||||
<string name="permissionReadCardsDescription">baca kartu Anda dan semua detailnya, termasuk catatan dan gambar</string>
|
||||
<string name="settings_allow_content_provider_read_title">Izinkan aplikasi lain mengakses data saya</string>
|
||||
<string name="settings_allow_content_provider_read_summary">Aplikasi masih harus meminta izin untuk diberikan akses</string>
|
||||
<string name="settings_allow_content_provider_read_title">Sinkronkan dengan Gadgetbridge</string>
|
||||
<string name="settings_allow_content_provider_read_summary">Memungkinkan aplikasi Gadgetbridge menyinkronkan kartu Anda ke jam tangan yang didukung</string>
|
||||
<string name="settings_keep_screen_on_summary">Menonaktifkan batas waktu layar saat melihat kartu</string>
|
||||
<string name="settings_oled_dark_summary">Mengurangi penggunaan baterai pada layar OLED</string>
|
||||
<string name="settings_category_title_general">Umum</string>
|
||||
@@ -295,4 +292,50 @@
|
||||
<string name="nothing_to_copy">Tidak ditemukan nilai</string>
|
||||
<string name="barcodeEncoding">Pengkodean barcode</string>
|
||||
<string name="back">Kembali</string>
|
||||
<string name="settings_disable_nfc_while_viewing_card">Jeda NFC</string>
|
||||
<string name="settings_disable_nfc_while_viewing_card_summary">Menjeda NFC untuk mencegah pembayaran NFC terpicu saat melihat kartu</string>
|
||||
<string name="nfc_blocked_while_viewing_card">NFC dijeda</string>
|
||||
<string name="change_settings">Ubah pengaturan</string>
|
||||
<string name="nfc_block_system_error">Gagal menjeda NFC</string>
|
||||
<string name="show_card_id">Tampilkan ID Kartu</string>
|
||||
<string name="sort_by_most_recently_added">Terakhir ditambahkan</string>
|
||||
<string name="zoomFrontImage">Perbesar gambar depan</string>
|
||||
<string name="zoomBackImage">Perbesar gambar belakang</string>
|
||||
<string name="settings_wear_sync">Sinkronkan dengan Wear OS</string>
|
||||
<string name="settings_wear_sync_summary">Memungkinkan aplikasi pendamping Wear OS membaca kartu Anda melalui Bluetooth</string>
|
||||
<string name="wear_sync_permission_required">Catima memerlukan izin yang Anda tolak untuk menyinkronkan dengan smartwatch Wear OS Anda</string>
|
||||
<string name="settings_wear_sync_devices">Perangkat Wear OS yang diizinkan</string>
|
||||
<string name="settings_wear_sync_devices_summary">Kelola perangkat yang diizinkan untuk sinkronisasi melalui Bluetooth</string>
|
||||
<string name="settings_wear_sync_no_devices">Tidak ada perangkat yang diizinkan</string>
|
||||
<plurals name="settings_wear_sync_devices_summary_count">
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> perangkat diizinkan</item>
|
||||
</plurals>
|
||||
<string name="settings_wear_sync_blocked_devices">Perangkat Wear OS yang diblokir</string>
|
||||
<string name="settings_wear_sync_blocked_devices_summary">Kelola perangkat Wear OS yang diblokir</string>
|
||||
<string name="settings_wear_sync_no_blocked_devices">Tidak ada perangkat yang diblokir</string>
|
||||
<plurals name="settings_wear_sync_blocked_devices_summary_count">
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> perangkat diblokir</item>
|
||||
</plurals>
|
||||
<string name="settings_wear_sync_unpair_title">Hapus perangkat?</string>
|
||||
<string name="settings_wear_sync_unpair_message">Hapus <xliff:g>%1$s</xliff:g> dari Catima? Perangkat ini tidak akan dapat menyinkronkan kartu Anda lagi.</string>
|
||||
<string name="settings_wear_sync_unblock_message">Hapus <xliff:g>%1$s</xliff:g> dari daftar yang diblokir? Perangkat ini akan dapat meminta akses lagi.</string>
|
||||
<string name="settings_wear_sync_unpair">Hapus</string>
|
||||
<string name="settings_wear_sync_device_name"><xliff:g>%1$s</xliff:g> (<xliff:g>%2$s</xliff:g>)</string>
|
||||
<string name="settings_wear_sync_tap_to_remove">Ketuk perangkat untuk menghapusnya.</string>
|
||||
<string name="wear_bt_pairing_channel_name">Pemasangan perangkat Wear OS</string>
|
||||
<string name="wear_bt_pairing_title">Perangkat Wear OS ingin menyinkronkan</string>
|
||||
<string name="wear_bt_pairing_message">Izinkan <xliff:g>%1$s</xliff:g> mengakses kartu Anda?</string>
|
||||
<string name="wear_bt_pairing_allow">Izinkan</string>
|
||||
<string name="wear_bt_pairing_block">Blokir</string>
|
||||
<string name="wear_bt_pairing_allowed"><xliff:g>%1$s</xliff:g> kini diizinkan untuk menyinkronkan.</string>
|
||||
<string name="wear_bt_pairing_blocked"><xliff:g>%1$s</xliff:g> telah diblokir.</string>
|
||||
<string name="wear_bt_pairing_mismatch_title">Permintaan otorisasi baru dari <xliff:g>%1$s</xliff:g></string>
|
||||
<string name="wear_bt_pairing_mismatch_message">Perangkat ini sebelumnya diotorisasi tetapi kini menampilkan token identitas yang berbeda. Hal ini terjadi ketika aplikasi Wear OS diinstal ulang atau datanya dihapus. Hal ini juga dapat mengindikasikan upaya spoofing MAC Bluetooth.\n\nTerima hanya jika Anda baru-baru ini menginstal ulang aplikasi Catima Wear OS di jam tangan ini.</string>
|
||||
<string name="open_settings">Buka pengaturan</string>
|
||||
<string name="open_in_gallery">Buka di galeri gambar</string>
|
||||
<string name="wear_bt_channel_name">Pendamping Wear OS</string>
|
||||
<string name="wear_bt_notification_title">Sinkronisasi Catima Wear OS aktif</string>
|
||||
<string name="settings_category_title_smartwatch">Dukungan smartwatch</string>
|
||||
<string name="wear_bt_failed_foreground_notification_title">Gagal memulai layanan sinkronisasi Wear OS</string>
|
||||
<string name="wear_bt_critical_error_channel_name">Kesalahan kritis sinkronisasi Wear OS</string>
|
||||
</resources>
|
||||
@@ -86,7 +86,6 @@
|
||||
<string name="barcodeImageDescriptionWithType">Mynd <xliff:g>%s</xliff:g> strikamerki</string>
|
||||
<string name="importExport">Flytja inn/út</string>
|
||||
<string name="importFailed">Gat ekki flutt inn</string>
|
||||
<string name="app_name">Catima</string>
|
||||
<plurals name="deleteCardsTitle">
|
||||
<item quantity="one">Eyða <xliff:g>%d</xliff:g> korti</item>
|
||||
<item quantity="other">Eyða <xliff:g>%d</xliff:g> kortum</item>
|
||||
@@ -103,4 +102,5 @@
|
||||
<string name="failedToOpenUrl">Settu inn vef-vafra fyrst</string>
|
||||
<string name="welcome">Velkomin að Catima</string>
|
||||
<string name="importCards">Flytja inn kort</string>
|
||||
<string name="app_name">Catima</string>
|
||||
</resources>
|
||||
@@ -110,8 +110,8 @@
|
||||
<string name="addFromImage">Seleziona un\'immagine dalla galleria</string>
|
||||
<string name="unsupportedBarcodeType">Questo tipo di codice a barre non può ancora essere visualizzato. Potrebbe essere supportato in una versione successiva dell\'applicazione.</string>
|
||||
<string name="wrongValueForBarcodeType">Il valore non è valido per il tipo di codice a barre selezionato</string>
|
||||
<string name="app_resources">Risorse di terze parti: <xliff:g id="app_resources_list"> %s </xliff:g></string>
|
||||
<string name="app_libraries">Librerie di terze parti: <xliff:g id="app_libraries_list"> %s </xliff:g></string>
|
||||
<string name="app_resources">Risorse di terze parti: <xliff:g id="app_resources_list">%s</xliff:g></string>
|
||||
<string name="app_libraries">Librerie di terze parti: <xliff:g id="app_libraries_list">%s</xliff:g></string>
|
||||
<string name="intent_import_card_from_url_share_multiple_text">Voglio condividere alcune carte con te</string>
|
||||
<string name="no">No</string>
|
||||
<string name="yes">Sì</string>
|
||||
@@ -204,7 +204,6 @@
|
||||
<string name="welcome">Benvenuti su Catima</string>
|
||||
<string name="failedToOpenUrl">Installa prima un browser web</string>
|
||||
<string name="failedToRetrieveImageFile">Impossibile ottenere il file dell\'immagine</string>
|
||||
<string name="barcodeLongPressMessage">Si possono aprire solo immagini dell\'app della galleria</string>
|
||||
<string name="cameraPermissionDeniedTitle">Impossibile accedere alla fotocamera</string>
|
||||
<string name="noCameraPermissionDirectToSystemSetting">Per poter scansionare i codici a barre, Catima ha bisogno di accedere alla tua fotocamera. Premi qui per poter cambiare le impostazioni dei permessi.</string>
|
||||
<string name="updateBalance">Aggiorna bilancio</string>
|
||||
@@ -223,9 +222,7 @@
|
||||
<string name="switchToFrontImage">Passa all\'immagine frontale</string>
|
||||
<string name="switchToBackImage">Passa all\'immagine dietro</string>
|
||||
<string name="switchToBarcode">Passa al codice a barre</string>
|
||||
<string name="openFrontImageInGalleryApp">Apri immagine frontale nell\'app per la visualizzazione di immagini</string>
|
||||
<string name="donate">Dona</string>
|
||||
<string name="openBackImageInGalleryApp">Apri l\'immagine retro nell\'app per la visualizzazione di immagini</string>
|
||||
<string name="setBarcodeHeight">Imposta l\'altezza del codice a barre</string>
|
||||
<string name="icon_header_click_text">Premi a lungo per modificare l\'immagine</string>
|
||||
<string name="show_note">Mostra nota</string>
|
||||
@@ -311,4 +308,11 @@
|
||||
<string name="settings_disable_nfc_while_viewing_card_summary">Sospende la funzione NFC per impedire che i pagamenti NFC vengano attivati durante la visualizzazione di una carta</string>
|
||||
<string name="nfc_blocked_while_viewing_card">La funzione NFC è disattivata</string>
|
||||
<string name="change_settings">Modifica impostazioni</string>
|
||||
<string name="nfc_block_system_error">Impossibile mettere in pausa l\'NFC</string>
|
||||
<string name="sort_by_most_recently_added">Aggiunte più di recente</string>
|
||||
<string name="show_card_id">Mostra ID carta</string>
|
||||
<string name="zoomFrontImage">Zoom immagine fronte</string>
|
||||
<string name="zoomBackImage">Zoom immagine retro</string>
|
||||
<string name="open_in_gallery">Apri nella galleria immagini</string>
|
||||
<string name="open_settings">Apri le impostazioni</string>
|
||||
</resources>
|
||||
@@ -217,14 +217,14 @@
|
||||
<string name="settings_column_count_4">4</string>
|
||||
<string name="settings_category_title_privacy">プライバシー</string>
|
||||
<string name="exportCancelled">輸出がキャンセルされた</string>
|
||||
<string name="settings_allow_content_provider_read_title">他のアプリが自分のデータにアクセスすることを許可する</string>
|
||||
<string name="settings_allow_content_provider_read_title">Gadgetbridgeと同期</string>
|
||||
<string name="permissionReadCardsDescription">Catimaカードと、ノートや画像を含むすべての詳細を読み取る</string>
|
||||
<string name="settings_use_volume_keys_navigation_summary">ボリュームボタンを使ってどのカードを表示するかを変更する</string>
|
||||
<string name="unsupportedFile">このファイルはサポートされていません</string>
|
||||
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">著作権 © 2019–<xliff:g>%d</xliff:g> Sylvia van Os と貢献者一同</string>
|
||||
<string name="app_copyright_short">著作権 © Sylvia van Os と貢献者一同</string>
|
||||
<string name="app_copyright_old">Loyalty Card Keychain が基になりました\n著作権 © 2016–2020 Branden Archer</string>
|
||||
<string name="settings_allow_content_provider_read_summary">アプリは継続したアクセス許可を要求します</string>
|
||||
<string name="settings_allow_content_provider_read_summary">Gadgetbridge アプリによる対応スマートウォッチとカードの同期を許可する</string>
|
||||
<string name="settings_use_volume_keys_navigation">音量ボタンでカードを切り替え</string>
|
||||
<plurals name="balancePoints">
|
||||
<item quantity="other"><xliff:g>%s</xliff:g> ポイント</item>
|
||||
@@ -233,7 +233,6 @@
|
||||
<string name="showMoreInfo">情報を確認</string>
|
||||
<string name="updateBalance">残高を更新</string>
|
||||
<string name="failedToRetrieveImageFile">画像ファイルを取得できませんでした</string>
|
||||
<string name="barcodeLongPressMessage">ギャラリーアプリは画像のみ開けます</string>
|
||||
<string name="sort_by_valid_from">有効期限</string>
|
||||
<string name="starred">スター付き</string>
|
||||
<string name="include_if_asking_support">サポートを依頼する場合、以下の情報を含めて下さい:</string>
|
||||
@@ -250,8 +249,6 @@
|
||||
<string name="switchToFrontImage">前面画像へ切り替え</string>
|
||||
<string name="switchToBackImage">背面画像へ切り替え</string>
|
||||
<string name="switchToBarcode">バーコードへ切り替え</string>
|
||||
<string name="openFrontImageInGalleryApp">前面画像を画像ビューワーアプリで開く</string>
|
||||
<string name="openBackImageInGalleryApp">背面画像を画像ビューワーアプリで開く</string>
|
||||
<string name="setBarcodeHeight">バーコードの高さを設定</string>
|
||||
<string name="icon_header_click_text">サムネイルを長押しして編集</string>
|
||||
<string name="settings_category_title_cards_overview">カードの概要</string>
|
||||
@@ -298,4 +295,46 @@
|
||||
<string name="settings_disable_nfc_while_viewing_card_summary">カードの表示中にNFC決済が誤って実行されないようにNFCを一時停止します</string>
|
||||
<string name="nfc_blocked_while_viewing_card">NFCは停止中です</string>
|
||||
<string name="change_settings">設定を変更する</string>
|
||||
<string name="nfc_block_system_error">NFCの一時停止に失敗</string>
|
||||
<string name="sort_by_most_recently_added">最近追加されたもの</string>
|
||||
<string name="zoomFrontImage">券面を拡大</string>
|
||||
<string name="zoomBackImage">背面を拡大</string>
|
||||
<string name="show_card_id">カードIDを表示</string>
|
||||
<string name="open_in_gallery">ギャラリーを開く</string>
|
||||
<string name="settings_wear_sync">Wear OS と同期</string>
|
||||
<string name="settings_wear_sync_summary">Wear OS コンパニオンアプリによる Bluetooth 経由のカード読取を許可する</string>
|
||||
<string name="wear_sync_permission_required">貴方が拒否した権限は Catima が Wear OS スマートウォッチと同期するのに必要です</string>
|
||||
<string name="settings_wear_sync_devices">対応している Wear OS デバイス</string>
|
||||
<string name="settings_wear_sync_devices_summary">Bluetooth 経由での同期が許可されたデバイスの管理</string>
|
||||
<string name="settings_wear_sync_no_devices">デバイスが許可されていません</string>
|
||||
<plurals name="settings_wear_sync_devices_summary_count">
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> 台のデバイスが許可されています</item>
|
||||
</plurals>
|
||||
<string name="settings_wear_sync_blocked_devices">ブロックされた Wear OS デバイス</string>
|
||||
<string name="settings_wear_sync_blocked_devices_summary">ブロックされた Wear OS デバイスの管理</string>
|
||||
<string name="settings_wear_sync_no_blocked_devices">ブロックされているデバイスはありません</string>
|
||||
<plurals name="settings_wear_sync_blocked_devices_summary_count">
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> 台のデバイスがブロックされています</item>
|
||||
</plurals>
|
||||
<string name="settings_wear_sync_unpair_title">デバイスを削除しますか?</string>
|
||||
<string name="settings_wear_sync_unpair_message">Catima から <xliff:g>%1$s</xliff:g> を削除しますか? 削除するとカードの同期は出来なくなります。</string>
|
||||
<string name="settings_wear_sync_unblock_message">ブロックの一覧から <xliff:g>%1$s</xliff:g> を削除しますか? 削除すればアクセスを再要求できるようになります。</string>
|
||||
<string name="settings_wear_sync_unpair">削除</string>
|
||||
<string name="settings_wear_sync_device_name"><xliff:g>%1$s</xliff:g> (<xliff:g>%2$s</xliff:g>)</string>
|
||||
<string name="settings_wear_sync_tap_to_remove">タップしてデバイスを削除します。</string>
|
||||
<string name="wear_bt_pairing_channel_name">Wear OS デバイスを接続しました</string>
|
||||
<string name="wear_bt_pairing_title">Wear OS デバイスとの同期を要求</string>
|
||||
<string name="wear_bt_pairing_message"><xliff:g>%1$s</xliff:g> にカードへのアクセスを許可しますか?</string>
|
||||
<string name="wear_bt_pairing_allow">許可</string>
|
||||
<string name="wear_bt_pairing_block">ブロック</string>
|
||||
<string name="wear_bt_pairing_allowed"><xliff:g>%1$s</xliff:g> への同期が許可されました。</string>
|
||||
<string name="wear_bt_pairing_blocked"><xliff:g>%1$s</xliff:g> はブロックされました。</string>
|
||||
<string name="wear_bt_pairing_mismatch_title"><xliff:g>%1$s</xliff:g>からの新たな認証要求</string>
|
||||
<string name="wear_bt_pairing_mismatch_message">当該デバイスは以前に認証済みでしたが異なる識別トークンを現段階で提示しています。これは Wear OS アプリを再インストールした場合もしくはそのデータが消去された場合に発生します。Bluetooth MACアドレスのなりすまし攻撃の試行の可能性もあります。\n\n当該スマートウォッチで最近 Catima Wear OS アプリを再インストールした場合のみ承認して下さい。</string>
|
||||
<string name="open_settings">設定を開く</string>
|
||||
<string name="wear_bt_channel_name">Wear OS コンパニオン</string>
|
||||
<string name="wear_bt_notification_title">Catima は Wear OS と同期中です</string>
|
||||
<string name="settings_category_title_smartwatch">対応するスマートウォッチです</string>
|
||||
<string name="wear_bt_failed_foreground_notification_title">Wear OSとの同期サービスの開始が失敗しました</string>
|
||||
<string name="wear_bt_critical_error_channel_name">Wear OS 同期の深刻なエラー</string>
|
||||
</resources>
|
||||
@@ -37,7 +37,6 @@
|
||||
<string name="donate">ದಾನ ಮಾಡಿ</string>
|
||||
<string name="action_more_options">ಹೆಚ್ಚಿನ ಆಯ್ಕೆಗಳು</string>
|
||||
<string name="add_a_card_in_a_different_way">ಬೇರೆ ರೀತಿಯಲ್ಲಿ ಕಾರ್ಡ್ ಸೇರಿಸಿ</string>
|
||||
<string name="barcodeLongPressMessage">ಗ್ಯಾಲರಿ ಅಪ್ಲಿಕೇಶನ್ನಲ್ಲಿ ಚಿತ್ರಗಳನ್ನು ಮಾತ್ರ ತೆರೆಯಬಹುದು</string>
|
||||
<string name="all">ಎಲ್ಲವೂ</string>
|
||||
<string name="chooseValidFromDate">ದಿನಾಂಕದಿಂದ ಮಾನ್ಯವಾಗಿ ಆಯ್ಕೆಮಾಡಿ</string>
|
||||
<string name="delete">ಅಳಿಸಿ</string>
|
||||
|
||||
@@ -82,7 +82,7 @@
|
||||
<string name="takePhoto">사진 찍기</string>
|
||||
<string name="yes">예</string>
|
||||
<string name="no">아니오</string>
|
||||
<string name="failedGeneratingShareURL">공유 가능한 URL을 생성할 수 없습니다. 이를 개발자에게 알려 주십시오.</string>
|
||||
<string name="failedGeneratingShareURL">공유 가능한 URL을 생성할 수 없습니다</string>
|
||||
<string name="turn_flashlight_off">손전등 끄기</string>
|
||||
<string name="settings_locale">언어</string>
|
||||
<string name="settings_system_locale">시스템</string>
|
||||
@@ -91,7 +91,6 @@
|
||||
<string name="showMoreInfo">정보 보기</string>
|
||||
<string name="updateBalance">잔액 업데이트</string>
|
||||
<string name="failedToRetrieveImageFile">이미지 파일을 검색하지 못했습니다</string>
|
||||
<string name="barcodeLongPressMessage">갤러리 앱에서는 이미지만 열 수 있습니다</string>
|
||||
<string name="sort_by_name">이름</string>
|
||||
<string name="reverse">... 역순으로</string>
|
||||
<string name="sort_by">정렬 기준</string>
|
||||
@@ -138,8 +137,6 @@
|
||||
<string name="group_updated">그룹 업데이트됨</string>
|
||||
<string name="moveBarcodeToTopOfScreen">바코드를 화면 상단으로 이동</string>
|
||||
<string name="height">키</string>
|
||||
<string name="openFrontImageInGalleryApp">갤러리 앱에서 전면 이미지 열기</string>
|
||||
<string name="openBackImageInGalleryApp">갤러리 앱에서 다시 이미지 열기</string>
|
||||
<string name="setBarcodeHeight">바코드 높이 설정</string>
|
||||
<string name="setFrontImage">전면 이미지 설정</string>
|
||||
<plurals name="selectedCardCount">
|
||||
@@ -149,12 +146,12 @@
|
||||
<string name="noCameraPermissionDirectToSystemSetting">바코드를 스캔하려면 Catima가 카메라에 접근해야 합니다. 권한 설정을 변경하려면 여기를 탭하세요.</string>
|
||||
<string name="exportOptionExplanation">데이터는 선택한 위치에 기록됩니다</string>
|
||||
<string name="app_license">GPL v3+로 라이선스된 카피레프트 자유 소프트웨어</string>
|
||||
<string name="failedOpeningFileManager">먼저 파일 관리자를 설치하십시오.</string>
|
||||
<string name="failedOpeningFileManager">파일 관리자를 열 수 없습니다</string>
|
||||
<string name="importSuccessful">데이터 들여옴</string>
|
||||
<string name="group_name_is_empty">그룹 이름은 필수임</string>
|
||||
<string name="chooseExpiryDate">만료일 선택</string>
|
||||
<string name="settings_oled_dark">어두운 테마를 위한 검정색 배경</string>
|
||||
<string name="noGroups">+ 더하기 버튼을 클릭하여 분류할 그룹을 추가합니다.</string>
|
||||
<string name="noGroups">+ 더하기 버튼을 눌러 카테고리 그룹 추가</string>
|
||||
<string name="deleteConfirmationGroup">그룹을 삭제하시겠습니까\?</string>
|
||||
<string name="errorReadingImage">이미지를 읽을 수 없습니다</string>
|
||||
<string name="expiryStateSentence">만료: <xliff:g>%s</xliff:g></string>
|
||||
@@ -225,8 +222,8 @@
|
||||
<string name="permissionReadCardsDescription">당신의 Catima 카드와 그에 대한 모든 세부 정보, 메모 및 이미지를 읽으세요</string>
|
||||
<string name="settings_oled_dark_summary">OLED 화면에서의 배터리 사용량 줄임</string>
|
||||
<string name="app_copyright_short">저작권 © Sylvia van Os 및 기여자</string>
|
||||
<string name="settings_allow_content_provider_read_summary">접근을 위해서는 해당 앱에서 별도로 권한 요청을 해야 합니다</string>
|
||||
<string name="settings_allow_content_provider_read_title">다른 앱의 내 정보 접근 허용</string>
|
||||
<string name="settings_allow_content_provider_read_summary">Gadgetbridge 앱이 카드를 지원하는 시계와 동기화하도록 허용</string>
|
||||
<string name="settings_allow_content_provider_read_title">Gadgetbridge와 동기화</string>
|
||||
<string name="permissionReadCardsLabel">Catima 카드 읽기</string>
|
||||
<string name="settings_keep_screen_on_summary">카드가 보일 때 화면 꺼짐 방지</string>
|
||||
<string name="view_online">온라인에서 보기</string>
|
||||
@@ -262,7 +259,7 @@
|
||||
<string name="useFrontImage">전면 이미지 사용</string>
|
||||
<string name="useBackImage">후면 이미지 사용</string>
|
||||
<string name="addFromPkpass">Passbook 파일 선택하기 (.pkpass)</string>
|
||||
<string name="generic_error_please_retry">죄송합니다, 문제가 발생했습니다. 다시 시도해 주세요...</string>
|
||||
<string name="generic_error_please_retry">오류가 발생했습니다</string>
|
||||
<string name="settings_use_volume_keys_navigation">볼륨 버튼을 사용하여 카드 전환하기</string>
|
||||
<string name="unsupportedFile">이 파일은 지원되지 않습니다</string>
|
||||
<string name="settings_use_volume_keys_navigation_summary">볼륨 버튼을 사용하여 표시되는 카드를 변경합니다</string>
|
||||
@@ -281,4 +278,64 @@
|
||||
<string name="width">너비</string>
|
||||
<string name="setBarcodeWidth">바코드 너비를 설정하세요</string>
|
||||
<string name="card_list_widget_name">카드 목록</string>
|
||||
<string name="settings_disable_nfc_while_viewing_card">NFC 일시 중지</string>
|
||||
<string name="card_list_widget_empty">Catima에 멤버십 카드를 추가하면 여기에 표시됩니다. 카드가 있는데도 보이지 않는다면 모두 보관 처리되어 있지 않은지 확인해 보세요.</string>
|
||||
<string name="pleaseDoNotRotateTheDevice">기기를 회전하지 마세요. 진행 중인 작업이 취소될 수 있습니다</string>
|
||||
<string name="acra_catima_has_crashed">죄송합니다. <xliff:g id="app_name">%s</xliff:g> 앱이 종료되었습니다. 문제 해결을 위해 오류 리포트를 보내주세요.</string>
|
||||
<string name="acra_crash_email_subject"><xliff:g id="app_name">%s</xliff:g> 크래시 리포트</string>
|
||||
<string name="pref_enable_acra">오류 리포트 전송 요청</string>
|
||||
<string name="pref_enable_acra_summary">이 기능을 켜면 오류가 발생했을 때 보고서 전송 여부를 확인합니다. 오류 리포트는 절대 자동으로 전송되지 않습니다.</string>
|
||||
<string name="copy_value">값 복사</string>
|
||||
<string name="copied_to_clipboard">클립보드에 복사됨</string>
|
||||
<string name="nothing_to_copy">데이터를 찾을 수 없습니다</string>
|
||||
<string name="back">돌아가기</string>
|
||||
<string name="nfc_blocked_while_viewing_card">NFC 일시 중지됨</string>
|
||||
<string name="change_settings">설정 변경</string>
|
||||
<string name="nfc_block_system_error">NFC 일시 중지에 실패</string>
|
||||
<string name="settings_disable_nfc_while_viewing_card_summary">카드를 보는 동안 NFC 결제가 실행되는 것을 방지하기 위해 NFC 기능을 일시 중지합니다</string>
|
||||
<string name="cardWithNumber"><xliff:g>%d</xliff:g>번 카드</string>
|
||||
<string name="cardWithNumberAndLocale"><xliff:g>%d</xliff:g> 번 카드 (<xliff:g>%s</xliff:g>)</string>
|
||||
<string name="acra_explain_crash">가능하다면, 오류가 발생했을 때 어떤 작업을 하고 계셨는지 자세히 적어주세요:</string>
|
||||
<string name="barcodeEncoding">바코드 인코딩</string>
|
||||
<string name="settings_wear_sync_devices">허용한 Wear OS 기기</string>
|
||||
<string name="settings_wear_sync_devices_summary">블루투스 동기화를 허용한 기기 관리</string>
|
||||
<string name="settings_wear_sync_no_devices">허용한 기기 없음</string>
|
||||
<plurals name="settings_wear_sync_devices_summary_count">
|
||||
<item quantity="other">기기 <xliff:g>%d</xliff:g>개 허용함</item>
|
||||
</plurals>
|
||||
<string name="settings_wear_sync_blocked_devices">차단한 Wear OS 기기</string>
|
||||
<string name="settings_wear_sync_blocked_devices_summary">차단한 Wear OS 기기 관리</string>
|
||||
<string name="settings_wear_sync_no_blocked_devices">차단한 기기 없음</string>
|
||||
<plurals name="settings_wear_sync_blocked_devices_summary_count">
|
||||
<item quantity="other">기기 <xliff:g>%d</xliff:g>개 차단함</item>
|
||||
</plurals>
|
||||
<string name="settings_wear_sync_unpair_title">기기를 제거하시겠습니까?</string>
|
||||
<string name="settings_wear_sync_unpair_message">Catima에서 <xliff:g>%1$s</xliff:g> 기기를 제거하시겠습니까? 더 이상 카드를 동기화하지 못하게 됩니다.</string>
|
||||
<string name="settings_wear_sync_unblock_message">차단한 목록에서 <xliff:g>%1$s</xliff:g> 기기를 제거하시겠습니까? 접근 요청을 다시 할 수 있게 됩니다.</string>
|
||||
<string name="settings_wear_sync_unpair">제거</string>
|
||||
<string name="settings_wear_sync_device_name"><xliff:g>%1$s</xliff:g> (<xliff:g>%2$s</xliff:g>)</string>
|
||||
<string name="settings_wear_sync_tap_to_remove">기기를 눌러 제거하십시오.</string>
|
||||
<string name="wear_bt_pairing_channel_name">Wear OS 기기 페어링</string>
|
||||
<string name="wear_bt_pairing_title">Wear OS 기기가 동기화하려 함</string>
|
||||
<string name="wear_bt_pairing_message"><xliff:g>%1$s</xliff:g> 기기가 카드에 접근하도록 허용합니까?</string>
|
||||
<string name="wear_bt_pairing_allow">허용</string>
|
||||
<string name="wear_bt_pairing_block">차단</string>
|
||||
<string name="wear_bt_pairing_allowed"><xliff:g>%1$s</xliff:g>의 동기화를 허용했습니다.</string>
|
||||
<string name="wear_bt_pairing_blocked"><xliff:g>%1$s</xliff:g> 기기를 차단했습니다.</string>
|
||||
<string name="wear_bt_pairing_mismatch_title"><xliff:g>%1$s</xliff:g>의 새 인증 요청</string>
|
||||
<string name="wear_bt_pairing_mismatch_message">이 기기는 이전에 인증되었지만 지금은 다른 식별 토큰을 제시하고 있습니다. Wear OS 앱을 재설치하거나 데이터를 지웠을 때 이런 현상이 발생할 수 있습니다. 또한 블루투스 MAC 스푸핑 시도일 수도 있습니다.\n\n최근 이 시계에 Catima Wear OS 앱을 재설치한 경우에만 수락하십시오.</string>
|
||||
<string name="open_settings">설정 열기</string>
|
||||
<string name="open_in_gallery">사진 갤러리에서 열기</string>
|
||||
<string name="settings_category_title_smartwatch">스마트워치 지원</string>
|
||||
<string name="wear_bt_failed_foreground_notification_title">Wear OS 동기화 서비스 시작 실패</string>
|
||||
<string name="wear_bt_critical_error_channel_name">Wear OS 동기화 치명적 오류</string>
|
||||
<string name="wear_bt_channel_name">Wear OS 컴패니언</string>
|
||||
<string name="wear_bt_notification_title">Catima Wear OS 동기화 활성화됨</string>
|
||||
<string name="sort_by_most_recently_added">가장 최근에 추가함</string>
|
||||
<string name="show_card_id">카드 ID 표시</string>
|
||||
<string name="settings_wear_sync">Wear OS와 동기화</string>
|
||||
<string name="settings_wear_sync_summary">Wear OS 연동 앱이 블루투스로 카드를 읽을 수 있도록 허용</string>
|
||||
<string name="wear_sync_permission_required">Catima에서 Wear OS 스마트워치와 동기화하려면 거절하셨던 권한이 필요합니다</string>
|
||||
<string name="zoomFrontImage">전면 사진 확대</string>
|
||||
<string name="zoomBackImage">후면 사진 확대</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">Pridėti</string>
|
||||
<string name="noGiftCards">Norėdami pridėti kortelę, spustelėkite mygtuką + arba importuokite kortelę iš ⋮ meniu.</string>
|
||||
<string name="noGiftCards">Norėdami pridėti kortelę, spustelėkite mygtuką + arba importuokite iš ⋮ meniu</string>
|
||||
<string name="storeName">Pavadinimas</string>
|
||||
<string name="note">Užrašas</string>
|
||||
<string name="cardId">Kortelės ID</string>
|
||||
@@ -11,10 +11,10 @@
|
||||
<string name="delete">Ištrinti</string>
|
||||
<string name="confirm">Patvirtinti</string>
|
||||
<string name="ok">Gerai</string>
|
||||
<string name="editCardTitle">Redaguoti lojalumo kortelę</string>
|
||||
<string name="addCardTitle">Pridėti lojalumo kortelę</string>
|
||||
<string name="editCardTitle">Redaguoti kortelę</string>
|
||||
<string name="addCardTitle">Pridėti kortelę</string>
|
||||
<string name="scanCardBarcode">Nuskaityti brūkšninį kodą</string>
|
||||
<string name="importExport">Importuoti/Exportuoti</string>
|
||||
<string name="importExport">Importas/Exportas</string>
|
||||
<string name="exportName">Exportuoti</string>
|
||||
<string name="importFailed">Nepavyko importuoti</string>
|
||||
<string name="exportFailed">Nepavyko eksportuoti</string>
|
||||
@@ -43,10 +43,10 @@
|
||||
<string name="app_loyalty_card_keychain">Lojalumo kortelės</string>
|
||||
<string name="moveBarcodeToTopOfScreen">Perkelti brūkšninį kodą į ekrano viršų</string>
|
||||
<string name="settings_display_barcode_max_brightness">Šviesinti ekraną</string>
|
||||
<string name="failedParsingImportUriError">Nepavyko iššifruoti importo URI</string>
|
||||
<string name="failedParsingImportUriError">Nepavyko nuskaityti importo URI</string>
|
||||
<string name="turn_flashlight_off">Išjunkti žibintuvėlį</string>
|
||||
<string name="turn_flashlight_on">Įjunkti žibintuvėlį</string>
|
||||
<string name="failedGeneratingShareURL">Nepavyko sugeneruoti bendrinamo URL. Praneškite apie tai.</string>
|
||||
<string name="failedGeneratingShareURL">Nepavyko sugeneruoti bendrinamo URL</string>
|
||||
<string name="passwordRequired">Įveskite slaptažodį</string>
|
||||
<string name="no">Ne</string>
|
||||
<string name="yes">Taip</string>
|
||||
@@ -65,11 +65,9 @@
|
||||
<string name="setBarcodeId">Nustatyti brūkšninio kodo reikšmę</string>
|
||||
<string name="sameAsCardId">Tokia pat kaip ID</string>
|
||||
<string name="barcodeId">Brūkšninio kodo reikšmė</string>
|
||||
<string name="importFidmeMessage">Pasirinkite <i>fidme-export-request-xxxxxx.zip</i> eksportą iš FidMe, kurį norite importuoti, ir po to brūkšninių kodų tipus pasirinkite rankiniu būdu.
|
||||
\nSukurkite jį iš savo FidMe profilio, pasirinkę Duomenų apsauga ir pirmiausia paspaudę Išgauti mano duomenis.</string>
|
||||
<string name="importFidmeMessage">Importavimui pasirinkite eksportą iš FidMe ir po to brūkšninių kodų tipus pasirinkite rankiniu būdu. \nSukurkite jį iš savo FidMe profilio pasirinkę \"Duomenų apsauga\" ir po to paspausdami \"Išgauti mano duomenis\".</string>
|
||||
<string name="importFidme">Importuoti iš FidMe</string>
|
||||
<string name="importCatimaMessage">Norėdami importuoti, pasirinkite savo <i> catima.zip </i> eksportavimą iš Catima.
|
||||
\nSukurkite ją iš kitos Catima programos importavimo / eksportavimo meniu, pirmiausia ten paspausdami Eksportuoti.</string>
|
||||
<string name="importCatimaMessage">Norėdami importuoti, pasirinkite savo <i> catima.zip </i> eksportavimą iš Catima. \nSukurkite ją iš kitos Catima programos importavimo/eksportavimo meniu paspausdami \"Eksportuoti\".</string>
|
||||
<string name="importCatima">Importuoti iš Catima</string>
|
||||
<string name="accept">Priimti</string>
|
||||
<string name="privacy_policy">Privatumo politika</string>
|
||||
@@ -87,14 +85,14 @@
|
||||
<string name="balanceSentence">Balansas: <xliff:g>%s</xliff:g></string>
|
||||
<string name="expiryStateSentenceExpired">Galiojimas baigėsi: <xliff:g>%s</xliff:g></string>
|
||||
<string name="expiryStateSentence">Nustoja galioti: <xliff:g>%s</xliff:g></string>
|
||||
<string name="groupsList">Grupės: <xliff:g> %s </xliff:g></string>
|
||||
<string name="groupsList">Grupės: <xliff:g>%s</xliff:g></string>
|
||||
<string name="addFromImage">Pasirinkti vaizdą iš galerijos</string>
|
||||
<string name="addManually">Rankiniu būdu įvesti ID</string>
|
||||
<string name="addManually">Įvesti barcodą rankiniu būdu</string>
|
||||
<string name="leaveWithoutSaveConfirmation">Išeiti neišsaugojus\?</string>
|
||||
<string name="leaveWithoutSaveTitle">Išeiti</string>
|
||||
<string name="moveDown">Judėti žemyn</string>
|
||||
<string name="moveUp">Judėti aukštyn</string>
|
||||
<string name="failedOpeningFileManager">Pirmiausia įdiekite failų tvarkyklę.</string>
|
||||
<string name="failedOpeningFileManager">Nepavyko atidaryti failų tvarkyklės</string>
|
||||
<string name="deleteConfirmationGroup">Ištrinti grupę\?</string>
|
||||
<string name="all">Visos</string>
|
||||
<plurals name="groupCardCount">
|
||||
@@ -102,7 +100,7 @@
|
||||
<item quantity="few"><xliff:g>%d</xliff:g> kortelės</item>
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> kortelių</item>
|
||||
</plurals>
|
||||
<string name="noGroups">Spustelėkite mygtuką +, kad pridėtumėte grupes kategorizavimui.</string>
|
||||
<string name="noGroups">Spustelėkite mygtuką +, kad pridėtumėte grupes kategorizavimui</string>
|
||||
<string name="groups">Grupės</string>
|
||||
<string name="enter_group_name">Įvesti grupės pavadinimą</string>
|
||||
<string name="exportSuccessful">Duomenys eksportuoti</string>
|
||||
@@ -117,20 +115,20 @@
|
||||
<string name="settings">Nustatymai</string>
|
||||
<string name="starImage">Mėgstamiausia žvaigždė</string>
|
||||
<string name="thumbnailDescription">Miniatiūra</string>
|
||||
<string name="app_resources">Laisvosios trečiųjų šalių ištekliai: <xliff:g id="app_resources_list">%s</xliff:g></string>
|
||||
<string name="app_libraries">Laisvosios trečiųjų šalių bibliotekos: <xliff:g id="app_libraries_list">%s</xliff:g></string>
|
||||
<string name="app_resources">Trečiųjų šalių ištekliai: <xliff:g id="app_resources_list">%s</xliff:g></string>
|
||||
<string name="app_libraries">Trečiųjų šalių bibliotekos: <xliff:g id="app_libraries_list">%s</xliff:g></string>
|
||||
<string name="app_copyright_old">Paremta Loyalty Card Keychain
|
||||
\nautorinės teisės © 2016–2020 Branden Archer</string>
|
||||
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Autorinės teisės © 2019–<xliff:g>%d</xliff:g> Sylvia van Os</string>
|
||||
<string name="importOptionFilesystemButton">Iš failų sistemos</string>
|
||||
<string name="importOptionFilesystemExplanation">Pasirinkite konkretų failą iš failų sistemos.</string>
|
||||
<string name="importOptionFilesystemExplanation">Pasirinkite konkretų failą iš failų sistemos</string>
|
||||
<string name="importOptionFilesystemTitle">Importuoti iš failų sistemos</string>
|
||||
<string name="exportOptionExplanation">Duomenys bus įrašyti į jūsų pasirinktą vietą.</string>
|
||||
<string name="exportOptionExplanation">Duomenys bus įrašyti į jūsų pasirinktą vietą</string>
|
||||
<string name="exportFailedTitle">Eksportuoti nepavyko</string>
|
||||
<string name="exportSuccessfulTitle">Eksportuota</string>
|
||||
<string name="importFailedTitle">Importuoti nepavyko</string>
|
||||
<string name="importSuccessfulTitle">Importuota</string>
|
||||
<string name="importExportHelp">Duomenų atsarginių kopijų darymas leidžia perkelti juos į kitą įrenginį.</string>
|
||||
<string name="importExportHelp">Duomenų atsarginių kopijų darymas leidžia perkelti juos į kitą įrenginį</string>
|
||||
<string name="noCardExistsError">Nepavyko rasti šios kortelės</string>
|
||||
<string name="share">Dalintis</string>
|
||||
<plurals name="selectedCardCount">
|
||||
@@ -178,7 +176,7 @@
|
||||
<string name="editGroup">Redaguojama grupė: <xliff:g>%s</xliff:g></string>
|
||||
<string name="group_updated">Grupė atnaujinta</string>
|
||||
<string name="group_edit">Redaguoti grupę</string>
|
||||
<string name="noGiftCardsGroup">Sukurkite keletą kortelių ir priskirkite jas grupei čia.</string>
|
||||
<string name="noGiftCardsGroup">Sukurkite keletą kortelių ir priskirkite jas grupei čia</string>
|
||||
<string name="setIcon">Nustatyti piktogramą</string>
|
||||
<string name="selectColor">Pasirinkti spalvą</string>
|
||||
<string name="failedLaunchingPhotoPicker">Nepavyko rasti palaikomos galerijos programėlės</string>
|
||||
@@ -191,7 +189,6 @@
|
||||
</plurals>
|
||||
<string name="updateBalance">Atnaujinti balansą</string>
|
||||
<string name="failedToRetrieveImageFile">Nepavyko gauti vaizdo failo</string>
|
||||
<string name="barcodeLongPressMessage">Galerijos programėlėje galima atidaryti tik vaizdus</string>
|
||||
<string name="translate_platform">Weblate svetainėje</string>
|
||||
<string name="shortcutSelectCard">Pasirinkti kortelę</string>
|
||||
<string name="options">Parinktys</string>
|
||||
@@ -220,7 +217,6 @@
|
||||
<string name="importCards">Importuoti korteles</string>
|
||||
<string name="storageReadPermissionRequired">Šio veiksmo atlikimui reikalinga prieiga prie saugyklos…</string>
|
||||
<string name="cameraPermissionRequired">Šio veiksmo atlikimui reikalinga prieiga prie kameros…</string>
|
||||
<string name="openBackImageInGalleryApp">Atidarykite galinį vaizdą galerijos programėlėje</string>
|
||||
<string name="setBarcodeHeight">Nustatyti brūkšninio kodo aukštį</string>
|
||||
<string name="validFromDate">Galioja nuo</string>
|
||||
<string name="anyDate">Bet kuri data</string>
|
||||
@@ -230,7 +226,6 @@
|
||||
<string name="switchToBarcode">Perjungti į brūkšninį kodą</string>
|
||||
<string name="height">Aukštis</string>
|
||||
<string name="switchToFrontImage">Perjungti į priekinį vaizdą</string>
|
||||
<string name="openFrontImageInGalleryApp">Atidarykite priekinį vaizdą galerijos programėlėje</string>
|
||||
<string name="donate">Aukoti</string>
|
||||
<string name="settings_keep_screen_on_summary">Išjungti ekrano užmigdymą kol peržiūrite kortelę</string>
|
||||
<string name="manually_enter_barcode_instructions">Įveskite ID numerį arba tekstą ant jūsų kortelės ir paspauskite brūkšninį kodą, kuris atrodo kaip ant jūsų kortelės.</string>
|
||||
@@ -251,7 +246,7 @@
|
||||
<string name="add_manually_warning_title">Rekomenduojama skenuoti</string>
|
||||
<string name="continue_">Tęsti</string>
|
||||
<string name="add_manually_warning_message">Kai kuriuose parduotuvėse brūkšninio kodo vertė gali skirtis nuo kortelėje nurodyto numerio. Dėlto įvedus brūkšninį kodą rankiniu būdu gali nepavykti. Vietoj to, labai rekomenduojama nuskaityti brūkšninį kodą naudojant kamerą. Ar vis tiek norite tęsti?</string>
|
||||
<string name="permissionReadCardsLabel">Skenuoti Catima Korteles</string>
|
||||
<string name="permissionReadCardsLabel">Skaityti Catima korteles</string>
|
||||
<string name="settings_category_title_cards">Kortelių peržiūra</string>
|
||||
<string name="settings_category_title_general">Bendri</string>
|
||||
<string name="settings_category_title_privacy">Privatumąi</string>
|
||||
@@ -284,4 +279,6 @@
|
||||
<string name="settings_column_count_portrait">Stulpeliai vertikaliame režime</string>
|
||||
<string name="settings_column_count_landscape">Stulpeliai horizontaliame režime</string>
|
||||
<string name="settings_automatic_column_count">Automatiškai</string>
|
||||
<string name="settings_disable_nfc_while_viewing_card">NFC pauzė</string>
|
||||
<string name="settings_disable_nfc_while_viewing_card_summary">Pristabdo NFC, kad peržiūrint kortelę nebūtų suaktyvinti NFC mokėjimai</string>
|
||||
</resources>
|
||||
@@ -80,7 +80,6 @@
|
||||
<string name="never">Nekad</string>
|
||||
<string name="chooseExpiryDate">Izvēlēties beigu datumu</string>
|
||||
<string name="failedToRetrieveImageFile">Neizdevās iegūt attēla datni</string>
|
||||
<string name="barcodeLongPressMessage">Galerijas lietotnē var atvērt tikai attēlus</string>
|
||||
<string name="sort_by_expiry">Derīgums</string>
|
||||
<string name="reverse">...apgrieztā secībā</string>
|
||||
<string name="credits">Pateicības</string>
|
||||
@@ -215,16 +214,14 @@
|
||||
<string name="icon_header_click_text">Ilgi piespiest, lai labotu sīktēlu</string>
|
||||
<string name="anyDate">Jebkurš datums</string>
|
||||
<string name="height">Augstums</string>
|
||||
<string name="openBackImageInGalleryApp">Atvērt aizmugures attēlu attēlu skatītāja lietotnē</string>
|
||||
<string name="donate">Ziedot</string>
|
||||
<string name="field_must_not_be_empty">Lauks nedrīkst būt tukšs</string>
|
||||
<string name="card_id_must_not_be_empty">Kartes identifikators nedrīkst būt tukšs</string>
|
||||
<string name="add_a_card_in_a_different_way">Pievienot karti citā veidā</string>
|
||||
<string name="add_manually_warning_message">Dažām kartēm svītrkoda vērtība atšķiras no numura, kas ir rakstīts uz tās. Šī iemesla dēļ pašrocīgi ievadīts svītrkods ne vienmēr var darboties. Ir ieteicams nolasīt svītrkodu ar kameru. Vai joprojām turpināt?</string>
|
||||
<string name="noCameraFoundGuideText">Šķiet, ka ierīcei nav kameras. Ja tā tomēr ir, jāmēģina pārsāknēt ierīci. Pretējā gadījumā jāizmanto zemāk esošā poga \"Vairāk iespēju\", lai pievienot svītrkodu citā veidā.</string>
|
||||
<string name="settings_allow_content_provider_read_title">Ļaut citām lietotnēm piekļūt maniem datiem</string>
|
||||
<string name="settings_allow_content_provider_read_summary">Lietotnēm joprojām būs jāpieprasa atļauja, lai nodrošinātu piekļuvi</string>
|
||||
<string name="openFrontImageInGalleryApp">Atvērt priekšpuses attēlu attēlu skatītāja lietotnē</string>
|
||||
<string name="settings_allow_content_provider_read_title">Vienādot ar Gadgetbridge</string>
|
||||
<string name="settings_allow_content_provider_read_summary">Atļauj Gadgetbridge lietotnei vienādot kartes ar atbalstītajiem pulksteņiem</string>
|
||||
<string name="show_note">Rādīt piezīmi</string>
|
||||
<string name="show_balance">Rādīt atlikumu</string>
|
||||
<string name="settings_category_title_privacy">Privātums</string>
|
||||
@@ -307,4 +304,54 @@
|
||||
<string name="nothing_to_copy">Nav atrasta vērtība</string>
|
||||
<string name="barcodeEncoding">Svītrkoda šifrēšana</string>
|
||||
<string name="back">Atpakaļ</string>
|
||||
<string name="nfc_block_system_error">Neizdevās apturēt NFC</string>
|
||||
<string name="settings_disable_nfc_while_viewing_card">Apturēt NFC</string>
|
||||
<string name="settings_disable_nfc_while_viewing_card_summary">Aptur NFC, lai novērstu NFC maksājumu izsaukšanu kartes apskatīšanas laikā</string>
|
||||
<string name="nfc_blocked_while_viewing_card">NFC ir apturēts</string>
|
||||
<string name="change_settings">Mainīt iestatījumus</string>
|
||||
<string name="open_in_gallery">Atvērt attēlu galerijā</string>
|
||||
<string name="sort_by_most_recently_added">Visnesenāk pievienotās</string>
|
||||
<string name="zoomFrontImage">Pietuvināt priekšpuses attēlu</string>
|
||||
<string name="zoomBackImage">Pietuvināt aizmugures attēlu</string>
|
||||
<string name="show_card_id">Rādīt kartes Id</string>
|
||||
<string name="settings_wear_sync">Vienādot ar Wear OS</string>
|
||||
<string name="settings_wear_sync_summary">Ļauj Wear OS palīglietotnei lasīt kartes ar Bluetooth starpniecību</string>
|
||||
<string name="wear_sync_permission_required">Catima ir nepieciešamas iepriekš noraidītās atļaujas, lai vienādotu ar Wear OS viedpulksteni</string>
|
||||
<string name="settings_wear_sync_devices">Atļautās Wear OS ierīces</string>
|
||||
<string name="wear_bt_critical_error_channel_name">Būtiska Wear OS vienādošanas kļūda</string>
|
||||
<string name="wear_bt_failed_foreground_notification_title">Neizdevās palaist Wear OS vienādošanas pakalpojumu</string>
|
||||
<string name="settings_category_title_smartwatch">Viedpulksteņu atbalsts</string>
|
||||
<string name="wear_bt_notification_title">Catima Wear OS vienādošana darbojas</string>
|
||||
<string name="wear_bt_channel_name">Wear OS palīgs</string>
|
||||
<string name="open_settings">Atvērt iestatījumus</string>
|
||||
<string name="wear_bt_pairing_mismatch_message">Šī ierīce iepriekš bija pilnvarota, bet tagad norāda citu identitātes pilnvaru. Tas notiek, kad Wear OS lietotne ir uzstādīta no jauna vai ir notīrīti tās dati. Tas var norādīt arī uz Bluetooth MAC atdarināšanas mēģinājumu.\n\nPieņemt tikai tad, ja šajā pulkstenī Catima Wear OS lietotne tika uzstādīta no jauna.</string>
|
||||
<string name="wear_bt_pairing_mismatch_title">Jauns pilnvarošanas pieprasījums no <xliff:g>%1$s</xliff:g></string>
|
||||
<string name="wear_bt_pairing_blocked"><xliff:g>%1$s</xliff:g> tika liegts.</string>
|
||||
<string name="wear_bt_pairing_allowed"><xliff:g>%1$s</xliff:g> tagad ir atļauta vienādošana.</string>
|
||||
<string name="wear_bt_pairing_block">Liegt</string>
|
||||
<string name="wear_bt_pairing_allow">Atļaut</string>
|
||||
<string name="wear_bt_pairing_message">Atļaut <xliff:g>%1$s</xliff:g> piekļūt kartēm?</string>
|
||||
<string name="wear_bt_pairing_title">Wear OS ierīce vēlas vienādot</string>
|
||||
<string name="wear_bt_pairing_channel_name">Wear OS ierīces pārošana</string>
|
||||
<string name="settings_wear_sync_tap_to_remove">Piesist ierīces nosaukumam, lai to noņemtu.</string>
|
||||
<string name="settings_wear_sync_device_name"><xliff:g>%1$s</xliff:g> (<xliff:g>%2$s</xliff:g>)</string>
|
||||
<string name="settings_wear_sync_unpair">Noņemt</string>
|
||||
<string name="settings_wear_sync_unblock_message">Noņemt <xliff:g>%1$s</xliff:g> no liegumu saraksta? Tā atkal varēs pieprasīt piekļuvi.</string>
|
||||
<string name="settings_wear_sync_unpair_message">Noņemt <xliff:g>%1$s</xliff:g> no Catima? Tā vairs nevarēs vienādot kartes.</string>
|
||||
<string name="settings_wear_sync_unpair_title">Noņemt ierīci?</string>
|
||||
<plurals name="settings_wear_sync_blocked_devices_summary_count">
|
||||
<item quantity="zero">Liegtas <xliff:g>%d</xliff:g> ierīces</item>
|
||||
<item quantity="one">Liegta <xliff:g>%d</xliff:g> ierīce</item>
|
||||
<item quantity="other">Liegtas <xliff:g>%d</xliff:g> ierīces</item>
|
||||
</plurals>
|
||||
<string name="settings_wear_sync_no_blocked_devices">Nav liegtu ierīču</string>
|
||||
<string name="settings_wear_sync_blocked_devices_summary">Liegto Wear OS ierīču pārvaldīšana</string>
|
||||
<string name="settings_wear_sync_blocked_devices">Liegtās Wear OS ierīces</string>
|
||||
<plurals name="settings_wear_sync_devices_summary_count">
|
||||
<item quantity="zero">Atļautas <xliff:g>%d</xliff:g> ierīces</item>
|
||||
<item quantity="one">Atļauta <xliff:g>%d</xliff:g> ierīce</item>
|
||||
<item quantity="other">Atļautas <xliff:g>%d</xliff:g> ierīces</item>
|
||||
</plurals>
|
||||
<string name="settings_wear_sync_no_devices">Nav atļautu ierīču</string>
|
||||
<string name="settings_wear_sync_devices_summary">Ierīču, kurām ir atļauts vienādot ar Bluetooth starpniecību, pārvaldīšana</string>
|
||||
</resources>
|
||||
@@ -203,7 +203,6 @@
|
||||
<string name="failedToOpenUrl">Installer en nettleser først</string>
|
||||
<string name="welcome">Velkommen til Catima</string>
|
||||
<string name="failedToRetrieveImageFile">Kunne ikke hente bildefil</string>
|
||||
<string name="barcodeLongPressMessage">Kun bilder kan åpnes i galleriprogrammet</string>
|
||||
<string name="cameraPermissionDeniedTitle">Fikk ikke tilgang til kameraet</string>
|
||||
<string name="noCameraPermissionDirectToSystemSetting">Catima trenger kameratilgang for å skanne strekkoder. Trykk her for å endre tilgangsinnstillingene.</string>
|
||||
<string name="importCards">Importer kort</string>
|
||||
@@ -227,8 +226,6 @@
|
||||
<string name="show_balance">Vis saldo</string>
|
||||
<string name="show_note">Vis notat</string>
|
||||
<string name="show_validity">Vis gyldighet</string>
|
||||
<string name="openFrontImageInGalleryApp">Åpne frontbilde i galleriprogrammet</string>
|
||||
<string name="openBackImageInGalleryApp">Åpne baksidebilde i galleriprogram</string>
|
||||
<string name="setBarcodeHeight">Sett strekkodehøyde</string>
|
||||
<string name="donate">Doner</string>
|
||||
<string name="permissionReadCardsLabel">Les Catima-kort</string>
|
||||
|
||||
@@ -32,10 +32,10 @@
|
||||
<string name="exportSuccessfulTitle">Exporteren voltooid</string>
|
||||
<string name="exportFailedTitle">Exporteren mislukt</string>
|
||||
<string name="exportFailed">Het exporteren is mislukt</string>
|
||||
<string name="importing">Bezig met importeren…</string>
|
||||
<string name="importing">Importeren…</string>
|
||||
<string name="exporting">Bezig met exporteren…</string>
|
||||
<string name="exportOptionExplanation">De gegevens worden weggeschreven op een locatie naar keuze</string>
|
||||
<string name="importOptionFilesystemTitle">Importeren uit bestandssysteem</string>
|
||||
<string name="importOptionFilesystemTitle">Importeren</string>
|
||||
<string name="importOptionFilesystemExplanation">Kies een specifiek bestand van het bestandssysteem</string>
|
||||
<string name="importOptionFilesystemButton">Van bestandssysteem</string>
|
||||
<string name="about">Over</string>
|
||||
@@ -52,7 +52,7 @@
|
||||
<string name="settings_display_barcode_max_brightness">Scherm oplichten bij tonen van barcode</string>
|
||||
<string name="intent_import_card_from_url_share_text">Ik wil een klantenkaart met je delen</string>
|
||||
<string name="all">Alles</string>
|
||||
<string name="importSuccessful">De gegevens zijn geïmporteerd</string>
|
||||
<string name="importSuccessful">Gegevens geïmporteerd</string>
|
||||
<string name="deleteConfirmationGroup">Groep verwijderen\?</string>
|
||||
<string name="noGroups">Druk op de plusknop (‘+’) om een groep toe te voegen</string>
|
||||
<string name="exportSuccessful">De gegevens zijn geëxporteerd</string>
|
||||
@@ -95,8 +95,8 @@
|
||||
<string name="accept">Accepteren</string>
|
||||
<string name="importVoucherVaultMessage">Kies het te importeren exportbestand. \nGa naar het exportmenu van Voucher Vault om een exportbestand samen te stellen.</string>
|
||||
<string name="importVoucherVault">Importeren uit Voucher Vault</string>
|
||||
<string name="importLoyaltyCardKeychainMessage">Kies het te importeren exportbestand. \nGa naar het import-/exportmenu van Klantenkaartkluis om een exportbestand samen te stellen.</string>
|
||||
<string name="importLoyaltyCardKeychain">Importeren uit Klantenkaartkluis</string>
|
||||
<string name="importLoyaltyCardKeychainMessage">Kies het te importeren exportbestand. \nGa naar het import-/exportmenu van Loyalty Card Keychain om een exportbestand samen te stellen.</string>
|
||||
<string name="importLoyaltyCardKeychain">Importeren uit Loyalty Card Keychain</string>
|
||||
<string name="importFidmeMessage">Kies het te importeren exportbestand en kies nadien de juiste barcodes. \nGa naar je FidMe-profiel en druk op ‘Gegevensbescherming’ om een exportbestand samen te stellen.</string>
|
||||
<string name="importCatimaMessage">Kies het te importeren exportbestand. \nGa naar het import-/exportmenu van Catima op een ander apparaat om een exportbestand samen te stellen.</string>
|
||||
<string name="importFidme">Importeren uit FidMe</string>
|
||||
@@ -199,7 +199,6 @@
|
||||
<string name="welcome">Welkom bij Catima</string>
|
||||
<string name="failedToOpenUrl">Installeer een webbrowser</string>
|
||||
<string name="failedToRetrieveImageFile">De afbeelding kan niet worden opgehaald</string>
|
||||
<string name="barcodeLongPressMessage">Alleen afbeeldingen kunnen worden geopend in de galerij-app</string>
|
||||
<string name="cameraPermissionDeniedTitle">Geen cameratoegang</string>
|
||||
<string name="updateBalanceTitle">Hoeveel heb je uitgegeven of ontvangen?</string>
|
||||
<string name="noCameraPermissionDirectToSystemSetting">Catima heeft toegang tot je camera nodig om barcodes te kunnen scannen. Druk hier om toegang te verlenen.</string>
|
||||
@@ -219,8 +218,6 @@
|
||||
<string name="switchToFrontImage">Voorzijde tonen</string>
|
||||
<string name="switchToBackImage">Achterzijde tonen</string>
|
||||
<string name="switchToBarcode">Barcode tonen</string>
|
||||
<string name="openFrontImageInGalleryApp">Voorzijde openen in afbeeldingsweergave-app</string>
|
||||
<string name="openBackImageInGalleryApp">Achterzijde openen in afbeeldingsweergave-app</string>
|
||||
<string name="donate">Doneren</string>
|
||||
<string name="icon_header_click_text">Houd lang ingedrukt om miniatuur te bewerken</string>
|
||||
<string name="show_balance">Saldo tonen</string>
|
||||
@@ -228,9 +225,9 @@
|
||||
<string name="show_note">Aantekening tonen</string>
|
||||
<string name="show_validity">Geldigheid tonen</string>
|
||||
<string name="permissionReadCardsLabel">Catimakaarten uitlezen</string>
|
||||
<string name="settings_allow_content_provider_read_summary">Let op: apps moeten nog steeds om toestemming vragen</string>
|
||||
<string name="settings_allow_content_provider_read_summary">Hiermee kan de Gadgetbridge-app jouw kaarten synchroniseren met ondersteunde horloges</string>
|
||||
<string name="permissionReadCardsDescription">Lees alle Catima-kaarten uit, inclusief alle details, aantekeningen en afbeeldingen</string>
|
||||
<string name="settings_allow_content_provider_read_title">Andere apps toegang geven tot gegevens</string>
|
||||
<string name="settings_allow_content_provider_read_title">Synchroniseren met Gadgetbridge</string>
|
||||
<string name="settings_keep_screen_on_summary">Laat het scherm niet op zwart gaan tijdens het bekijken van een kaart</string>
|
||||
<string name="settings_category_title_privacy">Privacy</string>
|
||||
<string name="settings_display_barcode_max_brightness_summary">Benodigd voor de werking van sommige scanners</string>
|
||||
@@ -252,7 +249,7 @@
|
||||
<string name="field_must_not_be_empty">Dit veld is vereist</string>
|
||||
<string name="app_name">Catima</string>
|
||||
<string name="add_manually_warning_title">Scannen wordt aangeraden</string>
|
||||
<string name="add_manually_warning_message">Bij sommige kaarten wijkt de barcodewaarde af van het nummer op de kaart. Hierdoor werkt het handmatig invoeren van een barcode niet altijd. Het wordt aangeraden om in plaats daarvan de barcode met je camera te scannen. Wilt u nog steeds doorgaan?</string>
|
||||
<string name="add_manually_warning_message">Bij sommige kaarten wijkt de barcodewaarde af van het nummer op de kaart. Hierdoor werkt het handmatig invoeren van een barcode niet altijd. Het wordt aangeraden om in plaats daarvan de barcode met je camera te scannen. Wil je nog steeds doorgaan?</string>
|
||||
<string name="continue_">Ga door</string>
|
||||
<string name="spend">Geef uit</string>
|
||||
<string name="receive">Ontvang</string>
|
||||
@@ -262,7 +259,7 @@
|
||||
<string name="failedLaunchingFileManager">Geen ondersteunde bestandsbeheerder aangetroffen</string>
|
||||
<string name="multipleBarcodesFoundPleaseChooseOne">Welke van de gevonden barcodes wil je gebruiken?</string>
|
||||
<string name="pageWithNumber">Pagina <xliff:g>%d</xliff:g></string>
|
||||
<string name="noCameraFoundGuideText">Uw apparaat lijkt niet over een camera te beschikken. Als het dat wel doet, probeer uw apparaat dan opnieuw op te starten. Anders gebruikt u de knop \"Meer opties\" beneden om handmatig een streepjescode in te voeren.</string>
|
||||
<string name="noCameraFoundGuideText">Jouw apparaat lijkt niet over een camera te beschikken. Als het dat wel doet, probeer het apparaat dan opnieuw op te starten. Gebruik anders de knop \"Meer opties\" beneden om handmatig een streepjescode in te voeren.</string>
|
||||
<string name="importCancelled">Importeren geannuleerd</string>
|
||||
<string name="exportCancelled">Exporteren geannuleerd</string>
|
||||
<string name="useFrontImage">Gebruik voorzijde van kaart</string>
|
||||
@@ -302,7 +299,51 @@
|
||||
<string name="back">Terug</string>
|
||||
<string name="barcodeEncoding">Barcodecodering</string>
|
||||
<string name="change_settings">Verander instellingen</string>
|
||||
<string name="settings_disable_nfc_while_viewing_card">Pauzeer NFC</string>
|
||||
<string name="settings_disable_nfc_while_viewing_card">NFC pauzeren</string>
|
||||
<string name="settings_disable_nfc_while_viewing_card_summary">Pauzeert NFC om te voorkomen dat NFC-betalingen activeren tijdens het bekijken van een kaart</string>
|
||||
<string name="nfc_blocked_while_viewing_card">NFC is gepauzeerd</string>
|
||||
<string name="nfc_block_system_error">NFC pauzeren is mislukt</string>
|
||||
<string name="sort_by_most_recently_added">Op onlangs toegevoegd</string>
|
||||
<string name="show_card_id">Kaart ID tonen</string>
|
||||
<string name="zoomFrontImage">Voorzijde inzoomen</string>
|
||||
<string name="zoomBackImage">Achterzijde inzoomen</string>
|
||||
<string name="open_in_gallery">Open in afbeeldingsgalerij</string>
|
||||
<string name="settings_wear_sync">Synchroniseren met Wear OS</string>
|
||||
<string name="wear_sync_permission_required">Catima heeft toestemming nodig om te synchroniseren met je Wear OS smartwatch</string>
|
||||
<string name="settings_wear_sync_devices">Toegestane Wear OS-apparaten</string>
|
||||
<string name="settings_wear_sync_devices_summary">Apparaten beheren die via Bluetooth kunnen worden gesynchroniseerd</string>
|
||||
<string name="settings_wear_sync_no_devices">Geen toegestane apparaten</string>
|
||||
<plurals name="settings_wear_sync_devices_summary_count">
|
||||
<item quantity="one"><xliff:g>%d</xliff:g> apparaat toegestaan</item>
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> apparaten toegestaan</item>
|
||||
</plurals>
|
||||
<string name="settings_wear_sync_blocked_devices">Geblokkeerde Wear OS-apparaten</string>
|
||||
<string name="settings_wear_sync_blocked_devices_summary">Geblokkeerde Wear OS-apparaten beheren</string>
|
||||
<string name="settings_wear_sync_no_blocked_devices">Geen geblokkeerde apparaten</string>
|
||||
<plurals name="settings_wear_sync_blocked_devices_summary_count">
|
||||
<item quantity="one"><xliff:g>%d</xliff:g> apparaat geblokkeerd</item>
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> apparaten geblokkeerd</item>
|
||||
</plurals>
|
||||
<string name="settings_wear_sync_unpair_title">Apparaat verwijderen?</string>
|
||||
<string name="settings_wear_sync_unpair_message"><xliff:g>%1$s</xliff:g> van Catima verwijderen? Het zal je kaarten niet meer kunnen synchroniseren.</string>
|
||||
<string name="wear_bt_pairing_message"><xliff:g>%1$s</xliff:g> toestaan om toegang te krijgen tot jouw kaarten?</string>
|
||||
<string name="settings_wear_sync_summary">Stelt de Wear OS companion app in staat om jouw kaarten via Bluetooth te lezen</string>
|
||||
<string name="wear_bt_channel_name">Wear OS companion</string>
|
||||
<string name="settings_wear_sync_unblock_message"><xliff:g>%1$s</xliff:g> van de blokkeringslijst verwijderen? Het zal opnieuw toegang kunnen aanvragen.</string>
|
||||
<string name="settings_wear_sync_unpair">Verwijderen</string>
|
||||
<string name="settings_wear_sync_device_name"><xliff:g>%1$s</xliff:g> (<xliff:g>%2$s</xliff:g>)</string>
|
||||
<string name="settings_wear_sync_tap_to_remove">Tik op een apparaat om het te verwijderen.</string>
|
||||
<string name="wear_bt_pairing_channel_name">Wear OS-apparaat koppelen</string>
|
||||
<string name="wear_bt_pairing_title">Wear OS-apparaat wil synchroniseren</string>
|
||||
<string name="wear_bt_pairing_allow">Toestaan</string>
|
||||
<string name="wear_bt_pairing_block">Blokkeren</string>
|
||||
<string name="wear_bt_pairing_allowed"><xliff:g>%1$s</xliff:g> mag niet synchroniseren.</string>
|
||||
<string name="wear_bt_pairing_blocked"><xliff:g>%1$s</xliff:g> is geblokkeerd.</string>
|
||||
<string name="wear_bt_pairing_mismatch_title">Nieuw autorisatieverzoek van <xliff:g>%1$s</xliff:g></string>
|
||||
<string name="wear_bt_pairing_mismatch_message">Dit apparaat was eerder geautoriseerd, maar presenteert nu een ander identiteitstoken. Dit gebeurt wanneer de Wear OS-app opnieuw wordt geïnstalleerd of de gegevens ervan worden gewist. Het kan ook duiden op een Bluetooth MAC-spoofingpoging.\n\nAccepteer alleen als je onlangs de Catima Wear OS-app opnieuw op dit horloge hebt geïnstalleerd.</string>
|
||||
<string name="open_settings">Instellingen openen</string>
|
||||
<string name="wear_bt_notification_title">Catima Wear OS synchronisatie is geactiveerd</string>
|
||||
<string name="settings_category_title_smartwatch">Smartwatch-ondersteuning</string>
|
||||
<string name="wear_bt_failed_foreground_notification_title">Starten van Wear OS-synchronisatieservice is mislukt</string>
|
||||
<string name="wear_bt_critical_error_channel_name">Kritische fout met Wear OS-synchronisatie</string>
|
||||
</resources>
|
||||
@@ -179,7 +179,6 @@
|
||||
<string name="showMoreInfo">دیدن اطلاعات</string>
|
||||
<string name="updateBalance">بهروزرسانی موجودی</string>
|
||||
<string name="failedToRetrieveImageFile">فایل تصویر بازیابی نشد</string>
|
||||
<string name="barcodeLongPressMessage">فقط عکس میتونه تو گالری برنامه باز بشه</string>
|
||||
<string name="sort_by_name">اسم</string>
|
||||
<string name="sort_by_most_recently_used">جدیدا استفاده شده</string>
|
||||
<string name="sort_by_valid_from">معتبر از</string>
|
||||
@@ -228,8 +227,6 @@
|
||||
<string name="switchToFrontImage">تغییر به عکس جلو</string>
|
||||
<string name="switchToBackImage">تغییر به عکس عقب</string>
|
||||
<string name="switchToBarcode">به بارکد تغییر بده</string>
|
||||
<string name="openFrontImageInGalleryApp">عکس جلویی رو تو image viewer app باز کن</string>
|
||||
<string name="openBackImageInGalleryApp">باز کردن عکس تو image viewer app</string>
|
||||
<string name="setBarcodeHeight">تنظیم ارتفاع بارکد</string>
|
||||
<string name="donate">کمک مالی کن</string>
|
||||
<string name="icon_header_click_text">برای ویرایش عکس کوچیک، فشار طولانی بده</string>
|
||||
|
||||
@@ -209,7 +209,6 @@
|
||||
<item quantity="other"><xliff:g>%1$d</xliff:g> kart (<xliff:g id="archivedCount">%2$d</xliff:g> zarchwizowanych)</item>
|
||||
</plurals>
|
||||
<string name="failedToRetrieveImageFile">Nie udało się pobrać pliku obrazu</string>
|
||||
<string name="barcodeLongPressMessage">W galerii możesz otworzyć tylko obrazy</string>
|
||||
<string name="failedToOpenUrl">Najpierw zainstaluj przeglądarkę</string>
|
||||
<string name="welcome">Witaj w Catima</string>
|
||||
<string name="currentBalanceSentence">Bieżące saldo: <xliff:g>%s</xliff:g></string>
|
||||
@@ -230,10 +229,8 @@
|
||||
<string name="switchToFrontImage">Przełącz na obraz z przodu</string>
|
||||
<string name="switchToBackImage">Przełącz na obraz z tyłu</string>
|
||||
<string name="switchToBarcode">Przełącz na kod kreskowy</string>
|
||||
<string name="openFrontImageInGalleryApp">Otwórz obraz z przodu w galerii</string>
|
||||
<string name="setBarcodeHeight">Ustaw wysokość kodu kreskowego</string>
|
||||
<string name="donate">Darowizna</string>
|
||||
<string name="openBackImageInGalleryApp">Otwórz obraz z powrotem w galerii</string>
|
||||
<string name="icon_header_click_text">Przytrzymaj, aby edytować miniaturę</string>
|
||||
<string name="show_name_below_image_thumbnail">Pokaż nazwę pod miniaturką zdjęcia</string>
|
||||
<string name="show_balance">Pokaż balans</string>
|
||||
@@ -241,11 +238,11 @@
|
||||
<string name="show_note">Pokaż notatkę</string>
|
||||
<string name="permissionReadCardsLabel">Odczytaj karty Catima</string>
|
||||
<string name="permissionReadCardsDescription">odczytywanie swoich kart Catima i ich szczegółów, włącznie z notatkami i obrazkami</string>
|
||||
<string name="settings_allow_content_provider_read_title">Pozwól innym aplikacjom na dostęp do moich danych</string>
|
||||
<string name="settings_allow_content_provider_read_title">Synchronizacja z Gadgetbridge</string>
|
||||
<string name="settings_display_barcode_max_brightness_summary">Potrzebne aby niektóre skanery działały</string>
|
||||
<string name="settings_keep_screen_on_summary">Wyłącza wygaszanie ekranu kiedy wyświetlana jest karta</string>
|
||||
<string name="settings_disable_lockscreen_while_viewing_card_summary">Wyłącza blokadę ekranu kiedy wyświetlana jest karta</string>
|
||||
<string name="settings_allow_content_provider_read_summary">Aplikacje będą wymagały pozwolenia aby otrzymać dostęp do danych</string>
|
||||
<string name="settings_allow_content_provider_read_summary">Umożliwia aplikacji Gadgetbridge synchronizację kart z obsługiwanymi zegarkami</string>
|
||||
<string name="settings_oled_dark_summary">Zmniejsza zużycie baterii na wyświetlaczach OLED</string>
|
||||
<string name="settings_category_title_cards">Widok karty</string>
|
||||
<string name="settings_category_title_general">Ogólne</string>
|
||||
@@ -313,4 +310,56 @@
|
||||
<string name="nothing_to_copy">Nie znaleziono wartości</string>
|
||||
<string name="back">Wstecz</string>
|
||||
<string name="barcodeEncoding">Kodowanie kodów kreskowych</string>
|
||||
<string name="settings_disable_nfc_while_viewing_card">Zatrzymaj NFC</string>
|
||||
<string name="settings_disable_nfc_while_viewing_card_summary">Wstrzymuje działanie funkcji NFC, aby zapobiec uruchomieniu płatności NFC podczas przeglądania karty</string>
|
||||
<string name="nfc_blocked_while_viewing_card">NFC zostało zatrzymane</string>
|
||||
<string name="change_settings">Zmień ustawienia</string>
|
||||
<string name="nfc_block_system_error">Błąd podczas zatrzymania NFC</string>
|
||||
<string name="sort_by_most_recently_added">Najnowsze dodane</string>
|
||||
<string name="zoomFrontImage">Powiększ zdjęcie z przodu</string>
|
||||
<string name="zoomBackImage">Powiększ zdjęcie z tyłu</string>
|
||||
<string name="show_card_id">Pokaż ID karty</string>
|
||||
<string name="open_in_gallery">Otwórz zdjęcie w galerii</string>
|
||||
<string name="settings_wear_sync">Synchronizacja z systemem Wear OS</string>
|
||||
<string name="settings_wear_sync_summary">Umożliwia aplikacji towarzyszącej Wear OS odczytywanie kart za pośrednictwem Bluetooth</string>
|
||||
<string name="wear_sync_permission_required">Aplikacja Catima potrzebuje uprawnień, których nie przyznałeś, aby zsynchronizować się z Twoim smartwatchem z systemem Wear OS</string>
|
||||
<string name="settings_wear_sync_devices">Obsługiwane urządzenia z systemem Wear OS</string>
|
||||
<string name="settings_wear_sync_devices_summary">Zarządzaj urządzeniami, które mogą synchronizować się przez Bluetooth</string>
|
||||
<string name="settings_wear_sync_no_devices">Żadne urządzenia nie są dozwolone</string>
|
||||
<plurals name="settings_wear_sync_devices_summary_count">
|
||||
<item quantity="one"><xliff:g>%d</xliff:g> urządzenie dozwolone</item>
|
||||
<item quantity="few"><xliff:g>%d</xliff:g> urządzenia dozwolone</item>
|
||||
<item quantity="many"><xliff:g>%d</xliff:g> urządzeń dozwolonych</item>
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> urządzeń dozwolonych</item>
|
||||
</plurals>
|
||||
<string name="settings_wear_sync_blocked_devices">Zablokowane urządzenia z systemem Wear OS</string>
|
||||
<string name="settings_wear_sync_blocked_devices_summary">Zarządzanie zablokowanymi urządzeniami z systemem Wear OS</string>
|
||||
<string name="settings_wear_sync_no_blocked_devices">Brak zablokowanych urządzeń</string>
|
||||
<plurals name="settings_wear_sync_blocked_devices_summary_count">
|
||||
<item quantity="one"><xliff:g>%d</xliff:g> urządzenie zablokowane</item>
|
||||
<item quantity="few"><xliff:g>%d</xliff:g> urządzenia zablokowane</item>
|
||||
<item quantity="many"><xliff:g>%d</xliff:g> urządzeń zablokowanych</item>
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> urządzeń zablokowanych</item>
|
||||
</plurals>
|
||||
<string name="settings_wear_sync_unpair_title">Usunąć urządzenie?</string>
|
||||
<string name="settings_wear_sync_unpair_message">Czy chcesz usunąć <xliff:g>%1$s</xliff:g> z aplikacji Catima? W takim przypadku aplikacja nie będzie już mogła synchronizować Twoich kart.</string>
|
||||
<string name="settings_wear_sync_unblock_message">Czy chcesz usunąć <xliff:g>%1$s</xliff:g> z listy zablokowanych? Wówczas będzie mogło ponownie poprosić o dostęp.</string>
|
||||
<string name="settings_wear_sync_unpair">Usuń</string>
|
||||
<string name="settings_wear_sync_device_name"><xliff:g>%1$s</xliff:g> (<xliff:g>%2$s</xliff:g>)</string>
|
||||
<string name="settings_wear_sync_tap_to_remove">Dotknij urządzenia, aby je usunąć.</string>
|
||||
<string name="wear_bt_pairing_channel_name">Parowanie urządzeń z systemem Wear OS</string>
|
||||
<string name="wear_bt_pairing_title">Urządzenie z systemem Wear OS próbuje się zsynchronizować</string>
|
||||
<string name="wear_bt_pairing_message">Czy zezwolić <xliff:g>%1$s</xliff:g> na dostęp do Twoich kart?</string>
|
||||
<string name="wear_bt_pairing_allow">Zezwól</string>
|
||||
<string name="wear_bt_pairing_block">Zablokuj</string>
|
||||
<string name="wear_bt_pairing_allowed"><xliff:g>%1$s</xliff:g> może teraz zostać zsynchronizowane.</string>
|
||||
<string name="wear_bt_pairing_blocked"><xliff:g>%1$s</xliff:g> zostało zablokowane.</string>
|
||||
<string name="wear_bt_pairing_mismatch_title">Nowy wniosek o autoryzację od <xliff:g>%1$s</xliff:g></string>
|
||||
<string name="wear_bt_pairing_mismatch_message">To urządzenie zostało wcześniej autoryzowane, ale obecnie przedstawia inny token tożsamości. Sytuacja ta ma miejsce po ponownej instalacji aplikacji Wear OS lub wyczyszczeniu jej danych. Może to również wskazywać na próbę sfałszowania adresu MAC przez Bluetooth.\n\nZatwierdź tylko wtedy, gdy niedawno ponownie zainstalowałeś aplikację Catima Wear OS na tym zegarku.</string>
|
||||
<string name="open_settings">Otwórz ustawienia</string>
|
||||
<string name="wear_bt_channel_name">Aplikacja towarzysząca dla Wear OS</string>
|
||||
<string name="wear_bt_notification_title">Synchronizacja Catima Wear OS jest aktywna</string>
|
||||
<string name="settings_category_title_smartwatch">Obsługa smartwatchów</string>
|
||||
<string name="wear_bt_failed_foreground_notification_title">Nie udało się uruchomić usługi synchronizacji Wear OS</string>
|
||||
<string name="wear_bt_critical_error_channel_name">Krytyczny błąd synchronizacji systemu Wear OS</string>
|
||||
</resources>
|
||||
@@ -129,7 +129,6 @@
|
||||
<string name="showMoreInfo">Mostrar informações</string>
|
||||
<string name="updateBalance">Atualizar saldo</string>
|
||||
<string name="failedToRetrieveImageFile">Falha ao recuperar o arquivo de imagem</string>
|
||||
<string name="barcodeLongPressMessage">Apenas imagens podem ser abertas na galeria</string>
|
||||
<string name="sort_by_most_recently_used">Usado mais recentemente</string>
|
||||
<string name="reverse">...em ordem inversa</string>
|
||||
<string name="sort_by">Ordenar por</string>
|
||||
@@ -152,8 +151,6 @@
|
||||
<string name="switchToBarcode">Mudar para código de barras</string>
|
||||
<string name="switchToFrontImage">Mudar para imagem frontal</string>
|
||||
<string name="switchToBackImage">Mudar para imagem traseira</string>
|
||||
<string name="openFrontImageInGalleryApp">Abrir imagem frontal no visualizador de imagens</string>
|
||||
<string name="openBackImageInGalleryApp">Abrir imagem traseira no visualizador de imagens</string>
|
||||
<string name="setBarcodeHeight">Definir altura do código de barras</string>
|
||||
<string name="donate">Doar</string>
|
||||
<string name="icon_header_click_text">Pressione e segure para editar a miniatura</string>
|
||||
@@ -221,8 +218,8 @@
|
||||
<string name="intent_import_card_from_url_share_text">Eu quero compartilhar um cartão com você</string>
|
||||
<string name="settings_keep_screen_on">Manter tela ligada</string>
|
||||
<string name="settings_disable_lockscreen_while_viewing_card">Previnir bloqueio de tela</string>
|
||||
<string name="settings_allow_content_provider_read_title">Permitir que outros aplicativos acessem meus dados</string>
|
||||
<string name="settings_allow_content_provider_read_summary">Aplicativos ainda precisarão pedir permissão para ter acesso concedido</string>
|
||||
<string name="settings_allow_content_provider_read_title">Sincronização com o Gadgetbridge</string>
|
||||
<string name="settings_allow_content_provider_read_summary">Permite que o aplicativo Gadgetbridge sincronize seus cartões com relógios suportados</string>
|
||||
<string name="group_edit">Editar grupo</string>
|
||||
<string name="exportSuccessful">Dados exportados</string>
|
||||
<string name="noGroups">Clique no botão \"+\" para adicionar grupos a serem categorizados</string>
|
||||
@@ -311,4 +308,50 @@
|
||||
<string name="settings_disable_nfc_while_viewing_card_summary">Suspende a tecnologia NFC para impedir que pagamentos NFC sejam acionados enquanto o cartão estiver sendo visualizado</string>
|
||||
<string name="nfc_blocked_while_viewing_card">NFC está pausado</string>
|
||||
<string name="change_settings">Alterar configurações</string>
|
||||
<string name="nfc_block_system_error">Falha ao pausar o NFC</string>
|
||||
<string name="sort_by_most_recently_added">Adicionados mais recentemente</string>
|
||||
<string name="zoomFrontImage">Ampliar imagem frontal</string>
|
||||
<string name="zoomBackImage">Reduzir o zoom da imagem</string>
|
||||
<string name="show_card_id">Mostrar ID do cartão</string>
|
||||
<string name="open_in_gallery">Abrir na galeria de imagens</string>
|
||||
<string name="settings_wear_sync">Sincronizar com o Wear OS</string>
|
||||
<string name="settings_wear_sync_summary">Permite que o aplicativo complementar do Wear OS leia seus cartões via Bluetooth</string>
|
||||
<string name="wear_sync_permission_required">A Catima precisa das permissões que você negou para sincronizar com seu smartwatch Wear OS</string>
|
||||
<string name="settings_wear_sync_devices">Dispositivos permitidos pelo Wear OS</string>
|
||||
<string name="settings_wear_sync_devices_summary">Gerencie dispositivos autorizados a sincronizar via Bluetooth</string>
|
||||
<string name="settings_wear_sync_no_devices">Dispositivos não permitidos</string>
|
||||
<string name="settings_wear_sync_blocked_devices">Dispositivos Wear OS bloqueados</string>
|
||||
<string name="settings_wear_sync_blocked_devices_summary">Gerencie dispositivos bloqueados do Wear OS</string>
|
||||
<string name="settings_wear_sync_no_blocked_devices">Nenhum dispositivo bloqueado</string>
|
||||
<string name="settings_wear_sync_unpair_title">Remover o dispositivo?</string>
|
||||
<string name="settings_wear_sync_unpair">Remover</string>
|
||||
<string name="settings_wear_sync_tap_to_remove">Toque em um dispositivo para removê-lo.</string>
|
||||
<string name="wear_bt_pairing_channel_name">Pareamento de dispositivos Wear OS</string>
|
||||
<string name="wear_bt_pairing_title">Dispositivo Wear OS quer sincronizar</string>
|
||||
<string name="wear_bt_pairing_allow">Permita</string>
|
||||
<string name="wear_bt_pairing_block">Bloquear</string>
|
||||
<string name="wear_bt_pairing_mismatch_message">Este dispositivo já foi autorizado anteriormente, mas agora apresenta um token de identidade diferente. Isso acontece quando o app Wear OS é reinstalado ou seus dados são apagados. Também pode indicar uma tentativa de falsificação de MAC por Bluetooth.\n\nAceite apenas se você reinstalou recentemente o aplicativo Catima Wear OS neste relógio.</string>
|
||||
<string name="open_settings">Abrir configurações</string>
|
||||
<string name="wear_bt_channel_name">Companheiro Wear OS</string>
|
||||
<string name="wear_bt_notification_title">Sincronização do Catima Wear OS ativa</string>
|
||||
<string name="settings_category_title_smartwatch">Suporte a smartwatch</string>
|
||||
<string name="wear_bt_failed_foreground_notification_title">Falhou ao iniciar o serviço de sincronização do Wear OS</string>
|
||||
<string name="wear_bt_critical_error_channel_name">Erro crítico de sincronização do Wear OS</string>
|
||||
<plurals name="settings_wear_sync_devices_summary_count">
|
||||
<item quantity="one"><xliff:g>%d</xliff:g> dispositivo permitido</item>
|
||||
<item quantity="many"><xliff:g>%d</xliff:g> dispositivos permitidos</item>
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> dispositivos permitidos</item>
|
||||
</plurals>
|
||||
<plurals name="settings_wear_sync_blocked_devices_summary_count">
|
||||
<item quantity="one"><xliff:g>%d</xliff:g> dispositivo bloqueado</item>
|
||||
<item quantity="many"><xliff:g>%d</xliff:g> dispositivos bloqueados</item>
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> dispositivos bloqueados</item>
|
||||
</plurals>
|
||||
<string name="settings_wear_sync_unpair_message">Remover <xliff:g>%1$s</xliff:g> do Catima? Ele não poderá mais sincronizar seus cartões.</string>
|
||||
<string name="settings_wear_sync_unblock_message">Remover <xliff:g>%1$s</xliff:g> da lista de bloqueados? O item poderá solicitar acesso novamente.</string>
|
||||
<string name="settings_wear_sync_device_name"><xliff:g>%1$s</xliff:g> (<xliff:g>%2$s</xliff:g>)</string>
|
||||
<string name="wear_bt_pairing_message">Permitir que <xliff:g>%1$s</xliff:g> acesse seus cartões?</string>
|
||||
<string name="wear_bt_pairing_allowed">Agora, a sincronização de <xliff:g>%1$s</xliff:g> é permitida.</string>
|
||||
<string name="wear_bt_pairing_blocked"><xliff:g>%1$s</xliff:g> foi bloqueado.</string>
|
||||
<string name="wear_bt_pairing_mismatch_title">Nova solicitação de autorização de <xliff:g>%1$s</xliff:g></string>
|
||||
</resources>
|
||||
@@ -205,7 +205,6 @@
|
||||
<string name="failedToOpenUrl">Instale primeiro um navegador de Internet</string>
|
||||
<string name="welcome">Bem-vindo ao Catima</string>
|
||||
<string name="failedToRetrieveImageFile">Falha ao recuperar o ficheiro de imagem</string>
|
||||
<string name="barcodeLongPressMessage">Só podem ser abertas imagens na aplicação da galeria</string>
|
||||
<string name="noCameraPermissionDirectToSystemSetting">Para digitalizar códigos de barras, o Catima tem de aceder à câmara. Clique aqui para mudar as configurações de permissão.</string>
|
||||
<string name="cameraPermissionDeniedTitle">Não foi possível aceder à câmara</string>
|
||||
<string name="importCards">Importar cartões</string>
|
||||
@@ -224,8 +223,6 @@
|
||||
<string name="height">Altura</string>
|
||||
<string name="switchToBackImage">Mudar para a imagem de trás</string>
|
||||
<string name="switchToBarcode">Mudar para o código de barras</string>
|
||||
<string name="openFrontImageInGalleryApp">Abrir imagem frontal na app visualizadora de imagens</string>
|
||||
<string name="openBackImageInGalleryApp">Abrir imagem traseira na app visualizadora de imagens</string>
|
||||
<string name="setBarcodeHeight">Definir altura do código de barras</string>
|
||||
<string name="donate">Doar</string>
|
||||
<string name="show_validity">Mostrar validade</string>
|
||||
@@ -311,4 +308,7 @@
|
||||
<string name="settings_disable_nfc_while_viewing_card_summary">Pausa NFC para evitar que pagamentos de NFC sejam acionados enquanto visualiza um cartão</string>
|
||||
<string name="nfc_blocked_while_viewing_card">NFC está pausado</string>
|
||||
<string name="change_settings">Alterar configurações</string>
|
||||
<string name="nfc_block_system_error">Falha ao pausar o NFC</string>
|
||||
<string name="zoomFrontImage">Ampliar imagem frontal</string>
|
||||
<string name="show_card_id">Mostrar ID do cartão</string>
|
||||
</resources>
|
||||
@@ -194,7 +194,6 @@
|
||||
<string name="showMoreInfo">Mostrar informações</string>
|
||||
<string name="updateBalance">Atualizar saldo</string>
|
||||
<string name="failedToRetrieveImageFile">Falha ao recuperar o arquivo de imagem</string>
|
||||
<string name="barcodeLongPressMessage">Apenas imagens podem ser abertas na galeria</string>
|
||||
<string name="sort_by_name">Nome</string>
|
||||
<string name="sort_by_most_recently_used">Usado mais recentemente</string>
|
||||
<string name="sort_by_valid_from">Válido a partir de</string>
|
||||
@@ -244,8 +243,6 @@
|
||||
<string name="switchToFrontImage">Mudar para imagem frontal</string>
|
||||
<string name="switchToBackImage">Mudar para imagem traseira</string>
|
||||
<string name="switchToBarcode">Mudar para código de barras</string>
|
||||
<string name="openFrontImageInGalleryApp">Abrir imagem frontal no visualizador de imagens</string>
|
||||
<string name="openBackImageInGalleryApp">Abrir imagem traseira no visualizador de imagens</string>
|
||||
<string name="setBarcodeHeight">Definir altura do código de barras</string>
|
||||
<string name="donate">Doar</string>
|
||||
<string name="icon_header_click_text">Pressione e segure para editar a miniatura</string>
|
||||
@@ -310,4 +307,8 @@
|
||||
<string name="settings_disable_nfc_while_viewing_card_summary">Pausa NFC para evitar que pagamentos de NFC sejam acionados enquanto visualiza um cartão</string>
|
||||
<string name="nfc_blocked_while_viewing_card">NFC está pausado</string>
|
||||
<string name="change_settings">Alterar configurações</string>
|
||||
<string name="nfc_block_system_error">Erro ao pausar o NFC</string>
|
||||
<string name="zoomFrontImage">Ampliar imagem frontal</string>
|
||||
<string name="show_card_id">Mostrar ID do cartão</string>
|
||||
<string name="sort_by_most_recently_added">Adicionados mais recentemente</string>
|
||||
</resources>
|
||||
@@ -1,11 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
|
||||
<string name="barcodeType">Tip cod de bare</string>
|
||||
<string name="cardId">Identificatorul cardului</string>
|
||||
<string name="note">Notă</string>
|
||||
<string name="cardId">ID-ul cardului</string>
|
||||
<string name="note">Nota</string>
|
||||
<string name="storeName">Numele</string>
|
||||
<string name="noMatchingGiftCards">Nu au fost găsite rezultate. Încercați să schimbați termenii de căutare.</string>
|
||||
<string name="noGiftCards">Faceți clic pe butonul + plus pentru a adăuga o carte sau mai întâi importați una din meniu.</string>
|
||||
<string name="noGiftCards">Faceți clic pe butonul + plus pentru a adăuga un card sau importă din ⋮ meniu</string>
|
||||
<string name="action_add">Adăugați</string>
|
||||
<string name="action_search">Căutare</string>
|
||||
<string name="sendLabel">Trimiteți…</string>
|
||||
@@ -25,17 +25,17 @@
|
||||
<string name="settings_theme">Tema</string>
|
||||
<string name="all">Toate</string>
|
||||
<string name="noCardsMessage">Adăugați mai întâi un card</string>
|
||||
<string name="noCardExistsError">Cardul nu a putut fi găsit</string>
|
||||
<string name="noCardExistsError">N-am găsit cardul respectiv</string>
|
||||
<string name="failedParsingImportUriError">Nu s-a putut analiza URI-ul de import</string>
|
||||
<string name="importExport">Importă/Exportă</string>
|
||||
<string name="importExport">Importă/exportă</string>
|
||||
<string name="exportName">Exportați</string>
|
||||
<string name="importSuccessfulTitle">Importat</string>
|
||||
<string name="importFailedTitle">Importul a eșuat</string>
|
||||
<string name="importFailed">Nu s-a putut efectua importarea</string>
|
||||
<string name="exportFailed">Nu s-a putut efectua exportarea</string>
|
||||
<string name="importing">Importul…</string>
|
||||
<string name="exporting">Exportul…</string>
|
||||
<string name="exportOptionExplanation">Datele vor fi scrise într-o locație aleasă de dumneavoastră.</string>
|
||||
<string name="importing">Importare…</string>
|
||||
<string name="exporting">Exportare…</string>
|
||||
<string name="exportOptionExplanation">Datele vor fi scrise într-o locație aleasă de dumneavoastră</string>
|
||||
<string name="importOptionFilesystemTitle">Import din sistemul de fișiere</string>
|
||||
<string name="starImage">Stea de preferintă</string>
|
||||
<string name="settings">Setări</string>
|
||||
@@ -56,15 +56,15 @@
|
||||
<string name="balance">Balanță</string>
|
||||
<string name="importSuccessful">Date importate</string>
|
||||
<string name="exportSuccessful">Date exportate</string>
|
||||
<string name="noGroups">Faceți clic pe butonul + plus pentru a adăuga grupuri pentru clasificare.</string>
|
||||
<string name="noGroups">Faceți clic pe butonul + plus pentru a adăuga grupuri pentru clasificare</string>
|
||||
<string name="deleteConfirmationGroup">Ștergeți grupul\?</string>
|
||||
<string name="failedOpeningFileManager">Instalați mai întâi un manager de fișiere.</string>
|
||||
<string name="failedOpeningFileManager">Eșec în a deschide managerul de fișiere</string>
|
||||
<string name="leaveWithoutSaveTitle">Ieșire</string>
|
||||
<string name="addManually">Introduceți codul de bare manual</string>
|
||||
<string name="currency">Monedă</string>
|
||||
<string name="editBarcode">Editarea codului de bare</string>
|
||||
<string name="chooseExpiryDate">Alegeți data de expirare</string>
|
||||
<string name="selectBarcodeTitle">Selectare cod de bare</string>
|
||||
<string name="selectBarcodeTitle">Selectează codul de bare</string>
|
||||
<string name="noGroupCards">Acest grup este gol</string>
|
||||
<string name="addFromImage">Selectați o imagine din galerie</string>
|
||||
<string name="never">Niciodată</string>
|
||||
@@ -74,21 +74,21 @@
|
||||
<string name="moveBarcodeToTopOfScreen">Mutați codul de bare în partea de sus a ecranului</string>
|
||||
<string name="errorReadingImage">Nu s-a putut citi imaginea</string>
|
||||
<string name="points">Puncte</string>
|
||||
<string name="cardShortcut">Scurtătură de card</string>
|
||||
<string name="cardShortcut">Comandă rapidă pentru card</string>
|
||||
<string name="scanCardBarcode">Scanați codul de bare</string>
|
||||
<string name="importExportHelp">Copia de rezervă a datelor vă permite să le mutați pe un alt dispozitiv.</string>
|
||||
<string name="importExportHelp">Copia de rezervă a datelor vă permite să le mutați pe un alt dispozitiv</string>
|
||||
<string name="exportSuccessfulTitle">Exportat</string>
|
||||
<string name="exportFailedTitle">Export eșuat</string>
|
||||
<string name="importOptionFilesystemExplanation">Alegeți un anumit fișier din sistemul de fișiere.</string>
|
||||
<string name="importOptionFilesystemExplanation">Alegeți un anumit fișier din sistemul de fișiere</string>
|
||||
<string name="thumbnailDescription">Miniatură</string>
|
||||
<string name="enter_group_name">Introduceți numele grupului</string>
|
||||
<string name="yes">Da</string>
|
||||
<string name="no">Nu</string>
|
||||
<string name="archive">Arhivare</string>
|
||||
<string name="passwordRequired">Vă rugăm, introduceți parola</string>
|
||||
<string name="passwordRequired">Introduceți parola</string>
|
||||
<string name="unsupportedBarcodeType">Acest tip de cod de bare nu poate fi afișat. Este posibil ca acesta să se poată afișa într-o versiune mai nouă a aplicației.</string>
|
||||
<string name="photos">Imagini</string>
|
||||
<string name="noGiftCardsGroup">Creați câteva carduri, iar apoi atribuiți-le grupului de aici.</string>
|
||||
<string name="noGiftCardsGroup">Creați câteva carduri, iar apoi atribuiți-le grupului de aici</string>
|
||||
<string name="importCatima">Importați din Catima</string>
|
||||
<string name="intent_import_card_from_url_share_multiple_text">Aș dori să partajez niște carduri cu tine</string>
|
||||
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Drepturi de autor © 2019–<xliff:g>%d</xliff:g> Sylvia van Os și contribuitorii</string>
|
||||
@@ -99,7 +99,6 @@
|
||||
<string name="exportPasswordHint">Introduceți o parolă</string>
|
||||
<string name="about_title_fmt">Despre <xliff:g id="app_name">%s</xliff:g></string>
|
||||
<string name="barcodeImageDescriptionWithType">Imagine <xliff:g>%s</xliff:g> cod de bare</string>
|
||||
<string name="openFrontImageInGalleryApp">Deschideți imaginea frontală în aplicația galerie</string>
|
||||
<string name="show_name_below_image_thumbnail">Afișați numele sub imaginea miniaturii</string>
|
||||
<string name="removeImage">Ștergeți imaginea</string>
|
||||
<string name="help_translate_this_app">Ajutați la traducerea aplicației</string>
|
||||
@@ -107,7 +106,7 @@
|
||||
<string name="add_a_card_in_a_different_way">Adăugați un card într-o altă modalitate</string>
|
||||
<string name="takePhoto">Faceți o poză</string>
|
||||
<string name="validFromDate">Valid de la data de</string>
|
||||
<string name="cameraPermissionDeniedTitle">Camera nu a putut fi accesată</string>
|
||||
<string name="cameraPermissionDeniedTitle">Camera n-a putut fi accesată</string>
|
||||
<string name="wrongValueForBarcodeType">Valoarea nu este validă pentru tipul de cod de bare selectat</string>
|
||||
<string name="welcome">Bine ați venit la Catima</string>
|
||||
<string name="and_data_usage">și utilizarea datelor</string>
|
||||
@@ -122,7 +121,6 @@
|
||||
<string name="height">Înălțime</string>
|
||||
<string name="expiryStateSentence">Expiră: <xliff:g>%s</xliff:g></string>
|
||||
<string name="setIcon">Setați miniatura</string>
|
||||
<string name="barcodeLongPressMessage">Doar imagini pot fi deschise în aplicația galerie</string>
|
||||
<string name="settings_category_title_general">General</string>
|
||||
<string name="manually_enter_barcode_instructions">Introduceți numărul de identificare sau textul de pe cardul dumneavoastră iar apoi selectați codul de bare ce arată ca și cel de pe cardul dumneavoastră.</string>
|
||||
<string name="balanceSentence">Sold: <xliff:g>%s</xliff:g></string>
|
||||
@@ -132,7 +130,7 @@
|
||||
<string name="action_more_options">Mai multe opțiuni</string>
|
||||
<string name="app_copyright_old">Bazat pe Loyalty Card Keychain
|
||||
\ndrepturi de autor rezervate © 2016-2020 Branden Archer</string>
|
||||
<string name="importVoucherVaultMessage">Selectați exportul dvs. <i>vouchervault.json</i> din Voucher Vault pentru a-l importa.\nCreați întâi fișierul prin apăsarea butonului Export în Voucher Vault.</string>
|
||||
<string name="importVoucherVaultMessage">Selectați exportul dumneavoastră din Voucher Vault pentru import.\nCreați întâi fișierul prin apăsarea butonului Export în Voucher Vault.</string>
|
||||
<string name="chooseImportType">Importați date din</string>
|
||||
<string name="frontImageDescription">Imagine frontală</string>
|
||||
<string name="showMoreInfo">Afișați informații</string>
|
||||
@@ -140,9 +138,9 @@
|
||||
<string name="setBackImage">Setați imaginea din spate</string>
|
||||
<string name="permissionReadCardsDescription">citiți cardurile dumneavoastră Catima și toate detaliile lor, inclusiv notițele și imaginile</string>
|
||||
<string name="anyDate">Orice dată</string>
|
||||
<string name="failedLaunchingPhotoPicker">Nu a putut fi găsită o aplicație galerie suportată</string>
|
||||
<string name="failedLaunchingPhotoPicker">N-a putut fi găsită o aplicație galerie suportată</string>
|
||||
<string name="expiryStateSentenceExpired">Expirat: <xliff:g>%s</xliff:g></string>
|
||||
<string name="source_repository">Repozitor Sursă</string>
|
||||
<string name="source_repository">Depozit sursă</string>
|
||||
<string name="groupsList">Grupuri: <xliff:g>%s</xliff:g></string>
|
||||
<string name="enter_card_id">Introduceți numărul de identificare sau textul de pe cardul dumneavoastră</string>
|
||||
<string name="unarchived">Card dezarhivat</string>
|
||||
@@ -181,19 +179,18 @@
|
||||
<string name="settings_allow_content_provider_read_summary">Aplicațiile vor trebui totuși să solicite permisiunea pentru a primi acces</string>
|
||||
<string name="license">Licență</string>
|
||||
<string name="newBalanceSentence">Balanța nouă: <xliff:g>%s</xliff:g></string>
|
||||
<string name="editGroup">Editarea grupului: <xliff:g>%s</xliff:g></string>
|
||||
<string name="editGroup">Grup de editare: <xliff:g>%s</xliff:g></string>
|
||||
<plurals name="groupCardCountWithArchived">
|
||||
<item quantity="one"><xliff:g>%1$d</xliff:g> card (<xliff:g id="archivedCount">%2$d</xliff:g> arhivat)</item>
|
||||
<item quantity="few"><xliff:g>%1$d</xliff:g> carduri (<xliff:g id="archivedCount">%2$d</xliff:g> arhivate)</item>
|
||||
<item quantity="other"><xliff:g>%1$d</xliff:g> de carduri (<xliff:g id="archivedCount">%2$d</xliff:g> arhivate)</item>
|
||||
</plurals>
|
||||
<string name="sameAsCardId">Acelașil cu identificatorul</string>
|
||||
<string name="sameAsCardId">Același cu identificatorul</string>
|
||||
<string name="options">Opțiuni</string>
|
||||
<string name="failedGeneratingShareURL">Nu s-a putut genera un URL partajabil. Vă rugăm să raportați aceasta eroare.</string>
|
||||
<string name="failedGeneratingShareURL">Nu s-a putut genera o adresă URL care poate fi partajată.</string>
|
||||
<string name="selectColor">Selectați o culoare</string>
|
||||
<string name="setBarcodeHeight">Setați înălțimea codului de bare</string>
|
||||
<string name="privacy_policy">Politica de Confidențialitate</string>
|
||||
<string name="openBackImageInGalleryApp">Deschideți imaginea din spate în aplicația galerie</string>
|
||||
<string name="privacy_policy">Politica de confidențialitate</string>
|
||||
<string name="settings_system_locale">Sistem</string>
|
||||
<string name="updateBalance">Actualizați balanța</string>
|
||||
<string name="sort_by_most_recently_used">Cele mai recent utilizate</string>
|
||||
@@ -202,10 +199,10 @@
|
||||
<string name="settings_locale">Limbă</string>
|
||||
<string name="sort_by_name">Nume</string>
|
||||
<string name="setFrontImage">Setați imaginea din față</string>
|
||||
<string name="cameraPermissionRequired">Pentru această acțiune este necesară permisiunea de acces la camera …</string>
|
||||
<string name="cameraPermissionRequired">Permisiunea de acces la cameră este necesară pentru această acțiune…</string>
|
||||
<string name="settings_allow_content_provider_read_title">Permiteți altor aplicații să acceseze datele mele</string>
|
||||
<string name="updateBarcodeQuestionText">Ați schimbat identificatorul. Doriți să actualizați și codul de bare pentru a utiliza aceeași valoare?</string>
|
||||
<string name="importLoyaltyCardKeychainMessage">Selectați exportul dvs. <i>LoyaltyCardKeychain.csv</i> din Loyalty Card Keychain pentru a-l importa. \nCreați întâi fișierul din meniul Import/Export în Loyalty Card Keychain prin apăsarea butonului Export.</string>
|
||||
<string name="importLoyaltyCardKeychainMessage">Selectați exportul dumneavoastră din Loyalty Card Keychain pentru import.\nCreați întâi fișierul din meniul Import/Export în Loyalty Card Keychain prin apăsarea butonului Export.</string>
|
||||
<string name="currentBalanceSentence">Balanța curentă: <xliff:g>%s</xliff:g></string>
|
||||
<string name="importLoyaltyCardKeychain">Importați din Loyalty Card Keychain</string>
|
||||
<string name="group_updated">Grup actualizat</string>
|
||||
@@ -213,7 +210,7 @@
|
||||
<string name="on_github">pe GitHub</string>
|
||||
<string name="sort">Sortați</string>
|
||||
<string name="permissionReadCardsLabel">Citiți cardurile Catima</string>
|
||||
<string name="storageReadPermissionRequired">Pentru această acțiune este necesară permisiunea de citire a mediului de stocare …</string>
|
||||
<string name="storageReadPermissionRequired">Permisiunea de citire a spațiului de stocare este necesară pentru această acțiune…</string>
|
||||
<plurals name="deleteCardsConfirmation">
|
||||
<item quantity="one">Ștergeți acest <xliff:g>%d</xliff:g> card permanent?</item>
|
||||
<item quantity="few">Ștergeți aceste <xliff:g>%d</xliff:g> carduri permanent?</item>
|
||||
@@ -226,9 +223,9 @@
|
||||
<string name="group_name_already_in_use">Acest nume de grup este deja utilizat</string>
|
||||
<string name="include_if_asking_support">Dacă doriți să cereți ajutor, includeți informațiile următoare:</string>
|
||||
<string name="show_archived_cards">Afișați cardurile arhivate</string>
|
||||
<string name="app_libraries">Listă de biblioteci libere de la terți: <xliff:g id="app_libraries_list">%s</xliff:g></string>
|
||||
<string name="app_libraries">Biblioteci terțe: <xliff:g id="app_libraries_list">%s</xliff:g></string>
|
||||
<string name="updateBalanceTitle">Cât de mult ați cheltuit sau primit?</string>
|
||||
<string name="app_resources">Listă de resurse gratuite de la terți: <xliff:g id="app_resources_list">%s</xliff:g></string>
|
||||
<string name="app_resources">Resurse terțe: <xliff:g id="app_resources_list">%s</xliff:g></string>
|
||||
<string name="app_name">Catima</string>
|
||||
<string name="shortcutSelectCard">Selectați un card</string>
|
||||
<string name="accept">Acceptă</string>
|
||||
@@ -245,26 +242,26 @@
|
||||
<item quantity="few"><xliff:g>%d</xliff:g> selectate</item>
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> selectate</item>
|
||||
</plurals>
|
||||
<string name="version_history">Istoric versiuni</string>
|
||||
<string name="importCatimaMessage">Selectați exportul dvs. <i>catima.zip</i> din Catima pentru a importa. \nCreați întâi fișierul din meniul Import/Export al unei alte aplicații Catima apăsând acolo butonul de Export.</string>
|
||||
<string name="version_history">Istoricul versiunilor</string>
|
||||
<string name="importCatimaMessage">Selectați exportul dumneavoastră din Catima pentru import.\nCreați întâi fișierul din meniul Import/Export al unei alte aplicații Catima apăsând butonul de Export.</string>
|
||||
<plurals name="balancePoints">
|
||||
<item quantity="one"><xliff:g>%s</xliff:g> punct</item>
|
||||
<item quantity="few"><xliff:g>%s</xliff:g> puncte</item>
|
||||
<item quantity="other"><xliff:g>%s</xliff:g> de puncte</item>
|
||||
</plurals>
|
||||
<string name="importFidmeMessage">Selectați exportul dvs. <i>fidme-export-request-xxxxx.zip</i> din FidMe pentru a-l importa, și apoi selectați tipurile de cod de bare manual.\nCreați întâi fișierul din profilul dvs. FidMe prin alegerea Protecție Date și apoi apăsând Extrageți datele mele.</string>
|
||||
<string name="importFidmeMessage">Selectați exportul dumneavoastră din FidMe pentru import si selectați manual tipurile de coduri de bare dupa.\nCreați întâi fișierul din profilul dvs. FidMe prin alegerea Protecție Date și apoi apăsând Extrageți datele mele.</string>
|
||||
<string name="updateBarcodeQuestionTitle">Actualizați valoarea codului de bare?</string>
|
||||
<string name="settings_keep_screen_on_summary">Dezactivează temporizatorul de ecran când vizualizați un card</string>
|
||||
<string name="rate_this_app">Acordați o recenzie acestei aplicații</string>
|
||||
<string name="credits">Contribuitori</string>
|
||||
<string name="continue_">Continua</string>
|
||||
<string name="add_manually_warning_title">Se recomandă scanarea</string>
|
||||
<string name="add_manually_warning_message">Pentru unele magazine, valoarea codului de bare diferă de numărul scris pe card. Din acest motiv, este posibil ca introducerea manuală a unui cod de bare să nu funcționeze întotdeauna. În schimb, este recomandat să scanați codul de bare cu camera dvs. Mai vrei să continui?</string>
|
||||
<string name="add_manually_warning_message">Pentru unele carduri, valoarea codului de bare diferă de numărul scris pe card. Din acest motiv, este posibil ca introducerea manuală a unui cod de bare să nu funcționeze întotdeauna. În schimb, este recomandat să scanați codul de bare cu camera dvs. Mai vrei să continui?</string>
|
||||
<string name="spend">Cheltuie</string>
|
||||
<string name="receive">Primește</string>
|
||||
<string name="amountParsingFailed">Sumă invalidă</string>
|
||||
<string name="addFromPdfFile">Selectați un fișier PDF</string>
|
||||
<string name="errorReadingFile">Nu am putut citi fișierul</string>
|
||||
<string name="errorReadingFile">N-am putut citi fișierul</string>
|
||||
<string name="failedLaunchingFileManager">Nu s-a găsit un manager de fișiere suportat</string>
|
||||
<string name="multipleBarcodesFoundPleaseChooseOne">Care dintre codurile de bare găsite dorești să-l folosești?</string>
|
||||
<string name="pageWithNumber">Pagina <xliff:g>%d</xliff:g></string>
|
||||
@@ -285,12 +282,31 @@
|
||||
<string name="settings_column_count_7">7</string>
|
||||
<string name="settings_column_count_landscape">Coloane in mod orizontal</string>
|
||||
<string name="settings_category_title_cards_overview">Vedere de ansamblu al cardlui</string>
|
||||
<string name="sort_by_valid_from">Forma validă</string>
|
||||
<string name="sort_by_valid_from">Valabil de la</string>
|
||||
<string name="settings_column_count_portrait">Coloane in mod portret</string>
|
||||
<string name="addFromPkpass">Selectează un fișier de tip Passbook (.pkpass)</string>
|
||||
<string name="addFromPkpass">Selectează un fișier de tip Passbook (.pkpass / .pkpasses)</string>
|
||||
<string name="unsupportedFile">Acest fișier nu este suportat</string>
|
||||
<string name="generic_error_please_retry">Scuze, ceva nu a funționat. Încearcă din nou ...</string>
|
||||
<string name="generic_error_please_retry">A apărut o eroare</string>
|
||||
<string name="width">Lățime</string>
|
||||
<string name="setBarcodeWidth">Setează Lățimea Codului de Bare</string>
|
||||
<string name="setBarcodeWidth">Setează lățimea codului de bare</string>
|
||||
<string name="card_list_widget_name">Listă de carduri</string>
|
||||
<string name="settings_disable_nfc_while_viewing_card">Pauză NFC</string>
|
||||
<string name="settings_disable_nfc_while_viewing_card_summary">Pauză NFC pentru a preveni declanșarea plăților NFC în timpul vizualizării unui card</string>
|
||||
<string name="card_list_widget_empty">După ce adăugați carduri de fidelitate în Catima, ele vor apărea aici. Dacă aveți carduri, fi-ți sigur că ele nu sunt arhivate.</string>
|
||||
<string name="cardWithNumber">Card <xliff:g>%d</xliff:g></string>
|
||||
<string name="cardWithNumberAndLocale">Card <xliff:g>%d</xliff:g> (<xliff:g>%s</xliff:g>)</string>
|
||||
<string name="pleaseDoNotRotateTheDevice">Vă rog să nu rotiți dispozitivul, deoarece acest lucru va anula acțiunea</string>
|
||||
<string name="acra_catima_has_crashed">Ne cerem scuze, dar <xliff:g id="app_name">%s</xliff:g> s-a oprit. Vă rog să ne ajutați să rezolvăm problema, trimițându-ne un raport de eroare.</string>
|
||||
<string name="acra_explain_crash">Dacă este posibil, vă rog să adăugați mai multe detalii despre ce ați făcut aici:</string>
|
||||
<string name="acra_crash_email_subject"><xliff:g id="app_name">%s</xliff:g> raport de crash</string>
|
||||
<string name="pref_enable_acra">Cere să trimiți rapoarte de crash</string>
|
||||
<string name="pref_enable_acra_summary">Când este activat, veți fi întrebat să raportați crash-ul când se întâmpla. Raporturile de crash nu sunt niciodata trimise automat.</string>
|
||||
<string name="copy_value">Copiază valoarea</string>
|
||||
<string name="copied_to_clipboard">Copiat în clipboard</string>
|
||||
<string name="nothing_to_copy">Nicio valoare găsită</string>
|
||||
<string name="barcodeEncoding">Codarea codului de bare</string>
|
||||
<string name="back">Înapoi</string>
|
||||
<string name="nfc_blocked_while_viewing_card">NFC este pus pe pauza</string>
|
||||
<string name="change_settings">Schimbă setările</string>
|
||||
<string name="nfc_block_system_error">Nu s-a putut întrerupe NFC-ul</string>
|
||||
</resources>
|
||||
@@ -211,7 +211,6 @@
|
||||
<string name="welcome">Добро пожаловать в Catima</string>
|
||||
<string name="failedToOpenUrl">Сначала необходимо установить браузер</string>
|
||||
<string name="failedToRetrieveImageFile">Невозможно получить файл изображения</string>
|
||||
<string name="barcodeLongPressMessage">В приложении галереи можно открывать только изображения</string>
|
||||
<string name="noCameraPermissionDirectToSystemSetting">Для сканирования штрих-кодов Catima требуется доступ к камере устройства. Нажмите здесь, чтобы изменить настройки разрешений.</string>
|
||||
<string name="updateBalance">Обновить баланс</string>
|
||||
<string name="newBalanceSentence">Новый баланс: <xliff:g>%s</xliff:g></string>
|
||||
@@ -231,8 +230,6 @@
|
||||
<string name="switchToBarcode">Переключить на штрих-код</string>
|
||||
<string name="switchToFrontImage">Переключить на лицевую сторону</string>
|
||||
<string name="switchToBackImage">Переключить на заднюю сторону</string>
|
||||
<string name="openFrontImageInGalleryApp">Открыть лицевое изображение в приложении просмотра изображений</string>
|
||||
<string name="openBackImageInGalleryApp">Открыть заднее изображение в приложении просмотра изображений</string>
|
||||
<string name="donate">Пожертвовать</string>
|
||||
<string name="icon_header_click_text">Долгое нажатие для редактирования</string>
|
||||
<string name="show_note">Показывать примечание</string>
|
||||
@@ -241,8 +238,8 @@
|
||||
<string name="show_balance">Показывать баланс</string>
|
||||
<string name="permissionReadCardsDescription">чтение ваших карт Catima и всех их данных, включая заметки и изображения</string>
|
||||
<string name="permissionReadCardsLabel">Чтение карт Catima</string>
|
||||
<string name="settings_allow_content_provider_read_summary">Приложениям по-прежнему придётся запрашивать разрешение для получения доступа</string>
|
||||
<string name="settings_allow_content_provider_read_title">Разрешать другим приложениям доступ к моим данным</string>
|
||||
<string name="settings_allow_content_provider_read_summary">Разрешить приложению Gadgetbridge синхронизировать ваши карты с поддерживаемыми часами</string>
|
||||
<string name="settings_allow_content_provider_read_title">Синхронизация с Gadgetbridge</string>
|
||||
<string name="settings_category_title_privacy">Конфиденциальность</string>
|
||||
<string name="settings_display_barcode_max_brightness_summary">Необходимо для работы некоторых сканеров</string>
|
||||
<string name="settings_keep_screen_on_summary">Отключение функции автоотключения экрана при отображении карты</string>
|
||||
@@ -317,4 +314,52 @@
|
||||
<string name="settings_disable_nfc_while_viewing_card">Отключать NFC</string>
|
||||
<string name="nfc_blocked_while_viewing_card">NFC приостановлен</string>
|
||||
<string name="change_settings">Изменить настройки</string>
|
||||
<string name="nfc_block_system_error">Приостановка NFC невозможна</string>
|
||||
<string name="sort_by_most_recently_added">Порядок добавления</string>
|
||||
<string name="show_card_id">Показывать номер карты</string>
|
||||
<string name="zoomFrontImage">Масштабирование лицевого изображения</string>
|
||||
<string name="zoomBackImage">Масштабирование заднего изображения</string>
|
||||
<string name="open_in_gallery">Открыть в галерее</string>
|
||||
<string name="settings_wear_sync">Синхронизация с Wear OS</string>
|
||||
<string name="settings_wear_sync_summary">Разрешить приложению-компаньону Wear OS читать ваши карты по Bluetooth</string>
|
||||
<string name="wear_sync_permission_required">Для синхронизации умными часами Wear OS Catima требуются разрешения, в которых ранее было отказано</string>
|
||||
<string name="settings_wear_sync_devices">Доверенные устройства Wear OS</string>
|
||||
<string name="settings_wear_sync_devices_summary">Управление устройствами, которым разрешена синхронизация по Bluetooth</string>
|
||||
<string name="settings_wear_sync_no_devices">Нет доверенных устройств</string>
|
||||
<plurals name="settings_wear_sync_devices_summary_count">
|
||||
<item quantity="one"><xliff:g>%d</xliff:g> доверенное устройство</item>
|
||||
<item quantity="few"><xliff:g>%d</xliff:g> доверенных устройства</item>
|
||||
<item quantity="many"><xliff:g>%d</xliff:g> доверенных устройств</item>
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> доверенных устройств</item>
|
||||
</plurals>
|
||||
<string name="settings_wear_sync_blocked_devices">Заблокированные устройства Wear OS</string>
|
||||
<string name="settings_wear_sync_blocked_devices_summary">Управление заблокированными устройствами Wear OS</string>
|
||||
<string name="settings_wear_sync_no_blocked_devices">Нет заблокированных устройств</string>
|
||||
<plurals name="settings_wear_sync_blocked_devices_summary_count">
|
||||
<item quantity="one"><xliff:g>%d</xliff:g> заблокированное устройство</item>
|
||||
<item quantity="few"><xliff:g>%d</xliff:g> заблокированных устройства</item>
|
||||
<item quantity="many"><xliff:g>%d</xliff:g> заблокированных устройств</item>
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> заблокированных устройств</item>
|
||||
</plurals>
|
||||
<string name="settings_wear_sync_unpair_title">Удалить устройство?</string>
|
||||
<string name="settings_wear_sync_unpair_message">Удалить <xliff:g>%1$s</xliff:g> из Catima? Он больше не сможет синхронизировать ваши карты.</string>
|
||||
<string name="settings_wear_sync_unblock_message">Удалить устройство <xliff:g>%1$s</xliff:g> из списка заблокированных? Оно снова сможет запросить доступ.</string>
|
||||
<string name="settings_wear_sync_unpair">Удалить</string>
|
||||
<string name="settings_wear_sync_device_name"><xliff:g>%1$s</xliff:g> (<xliff:g>%2$s</xliff:g>)</string>
|
||||
<string name="settings_wear_sync_tap_to_remove">Нажмите на устройство, чтобы удалить его.</string>
|
||||
<string name="wear_bt_pairing_channel_name">Сопряжение устройства Wear OS</string>
|
||||
<string name="wear_bt_pairing_title">Устройство Wear OS запрашивает синхронизацию</string>
|
||||
<string name="wear_bt_pairing_message">Разрешить устройству <xliff:g>%1$s</xliff:g> доступ к вашим картам?</string>
|
||||
<string name="wear_bt_pairing_allow">Разрешить</string>
|
||||
<string name="wear_bt_pairing_block">Заблокировать</string>
|
||||
<string name="wear_bt_pairing_allowed">Устройству <xliff:g>%1$s</xliff:g> разрешена синхронизация.</string>
|
||||
<string name="wear_bt_pairing_blocked">Устройство <xliff:g>%1$s</xliff:g> заблокировано.</string>
|
||||
<string name="wear_bt_pairing_mismatch_title">Новый запрос на авторизацию от <xliff:g>%1$s</xliff:g></string>
|
||||
<string name="wear_bt_pairing_mismatch_message">Данное устройство ранее было авторизовано, но теперь предоставляет другой токен идентификации. Это происходит, когда приложение Wear OS переустанавливается или его данные очищаются. Также это может указывать на попытку подделать MAC-адрес Bluetooth.\n\nРазрешайте только в том случае, если вы недавно переустановили приложение Catima Wear OS на этих часах.</string>
|
||||
<string name="open_settings">Открыть настройки</string>
|
||||
<string name="wear_bt_channel_name">Компаньон Wear OS</string>
|
||||
<string name="wear_bt_notification_title">Синхронизация Catima с Wear OS активна</string>
|
||||
<string name="settings_category_title_smartwatch">Поддержка умных часов</string>
|
||||
<string name="wear_bt_failed_foreground_notification_title">Невозможно запустить службу синхронизации Wear OS</string>
|
||||
<string name="wear_bt_critical_error_channel_name">Критическая ошибка синхронизации Wear OS</string>
|
||||
</resources>
|
||||
@@ -210,7 +210,6 @@
|
||||
<item quantity="few"><xliff:g>%1$d</xliff:g> karty (<xliff:g id="archivedCount">%2$d</xliff:g> archivované)</item>
|
||||
<item quantity="other"><xliff:g>%1$d</xliff:g> kariet (<xliff:g id="archivedCount">%2$d</xliff:g> archivovaných)</item>
|
||||
</plurals>
|
||||
<string name="barcodeLongPressMessage">V aplikácii galéria je možné otvoriť iba obrázky</string>
|
||||
<string name="cameraPermissionDeniedTitle">Nepodarilo sa získať prístup k fotoaparátu</string>
|
||||
<string name="storageReadPermissionRequired">Pre túto akciu je potrebné oprávnenie na čítanie úložiska…</string>
|
||||
<string name="importFidmeMessage">Vyberte svoj export zo služby FidMe pre import a potom vyberte typy čiarových kódov ručne.\nVytvorte ho z profilu FidMe tak, že vyberiete položku Ochrana údajov a potom stlačíte tlačidlo Extrahovať moje údaje.</string>
|
||||
@@ -226,8 +225,6 @@
|
||||
<string name="settings_keep_screen_on_summary">Ponechať obrazovku aktívnu počas prezerania karty</string>
|
||||
<string name="settings_display_barcode_max_brightness_summary">Pre zaistenie čitateľnosti pre niektoré skenery</string>
|
||||
<string name="settings_allow_content_provider_read_summary">Aplikácie budú musieť stále žiadať o povolenie, aby im bol udelený prístup</string>
|
||||
<string name="openBackImageInGalleryApp">Otvorenie zadného obrázka v prehliadači obrázkov</string>
|
||||
<string name="openFrontImageInGalleryApp">Otvorenie predného obrázka v prehliadači obrázkov</string>
|
||||
<string name="setBarcodeHeight">Nastavenie výšky čiarového kódu</string>
|
||||
<string name="show_balance">Ukážte zostatok</string>
|
||||
<string name="show_name_below_image_thumbnail">Zobraziť názov pod miniatúrou obrázka</string>
|
||||
|
||||