mirror of
https://github.com/Kunzisoft/KeePassDX.git
synced 2025-12-04 15:49:33 +01:00
Compare commits
598 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
70665f110d | ||
|
|
3b39cafb99 | ||
|
|
2b5ecb2f84 | ||
|
|
e397b92c36 | ||
|
|
e273eb6e03 | ||
|
|
28b624afa3 | ||
|
|
fb1e6cdc3f | ||
|
|
8b6499d040 | ||
|
|
054af507ad | ||
|
|
ac9bb9b666 | ||
|
|
809e1929e5 | ||
|
|
a1b1338d67 | ||
|
|
bd4cacfab1 | ||
|
|
e0343bdc55 | ||
|
|
b743d004e2 | ||
|
|
4b20e035b2 | ||
|
|
afe5fddc50 | ||
|
|
d68ca1b51f | ||
|
|
061b087229 | ||
|
|
bb3a379965 | ||
|
|
593b5c6338 | ||
|
|
56f8a1bf9f | ||
|
|
962b547b36 | ||
|
|
6df8ff4310 | ||
|
|
52f17140b8 | ||
|
|
75c2bb4a87 | ||
|
|
f36f6c3155 | ||
|
|
b88b92c5b0 | ||
|
|
d2c569c4f0 | ||
|
|
cb1316564e | ||
|
|
245d3f7df2 | ||
|
|
3729b3c5a0 | ||
|
|
7ce5eb3c27 | ||
|
|
43defea85e | ||
|
|
8470c4e39b | ||
|
|
a41afb7f1e | ||
|
|
32d9cfbe29 | ||
|
|
7210652567 | ||
|
|
ab15967ad7 | ||
|
|
44df4ec181 | ||
|
|
7afe356082 | ||
|
|
87597553b8 | ||
|
|
27e5f58d5e | ||
|
|
762c946d35 | ||
|
|
21a927e3e9 | ||
|
|
f93bb7436a | ||
|
|
6294fddbba | ||
|
|
c5719dfaf2 | ||
|
|
673fd67f15 | ||
|
|
25524c48e9 | ||
|
|
631b924c33 | ||
|
|
fba12bc278 | ||
|
|
e809109bb2 | ||
|
|
0e31890624 | ||
|
|
0124021ce5 | ||
|
|
74db6bf77f | ||
|
|
efde33182e | ||
|
|
ec68b22330 | ||
|
|
bf7e014f8c | ||
|
|
40e1607698 | ||
|
|
4a132f06fe | ||
|
|
0396dd975d | ||
|
|
80a38c0c54 | ||
|
|
2aa6461094 | ||
|
|
258433b3b8 | ||
|
|
79e723545c | ||
|
|
a6b20455ef | ||
|
|
9659b55bf3 | ||
|
|
ca148ef546 | ||
|
|
322b21d645 | ||
|
|
ed2ba65ecf | ||
|
|
defc8b1c57 | ||
|
|
a90ecc56d8 | ||
|
|
2faa0ac320 | ||
|
|
e391fd59fe | ||
|
|
25df86606c | ||
|
|
811f33eb3f | ||
|
|
ca7e2ed89d | ||
|
|
6f4cd79e2c | ||
|
|
da1caf4b8b | ||
|
|
4a0a8e44ca | ||
|
|
6bc2c3481b | ||
|
|
0aa89ea9ff | ||
|
|
f31a30bf47 | ||
|
|
dc75837ac7 | ||
|
|
9849b0a1da | ||
|
|
2c15a1ddd6 | ||
|
|
98eb9976cf | ||
|
|
0d9a5810b1 | ||
|
|
1adaa137a5 | ||
|
|
44a428d15a | ||
|
|
5416a7942a | ||
|
|
9e0024baf5 | ||
|
|
8d47ce38c2 | ||
|
|
80af43c0ca | ||
|
|
225f8243c2 | ||
|
|
68bc118add | ||
|
|
abbc584402 | ||
|
|
6635594639 | ||
|
|
10db77d402 | ||
|
|
000fd7e520 | ||
|
|
c8ced4ae59 | ||
|
|
9209ca9af7 | ||
|
|
c7bd90c610 | ||
|
|
fceb9c3547 | ||
|
|
030c49b571 | ||
|
|
f2d6a6a536 | ||
|
|
8f61521f05 | ||
|
|
89af7ec5d0 | ||
|
|
362f1aebed | ||
|
|
5226527cec | ||
|
|
b8464cd0e5 | ||
|
|
46e7b04d66 | ||
|
|
73111b770f | ||
|
|
995d485700 | ||
|
|
5ebbbef667 | ||
|
|
c79144400f | ||
|
|
b56556f5a2 | ||
|
|
35d5f01b8e | ||
|
|
501c647236 | ||
|
|
e77c7b84a3 | ||
|
|
d9f4e9b6ab | ||
|
|
1d7f7d2a5b | ||
|
|
df408e862b | ||
|
|
66845926d5 | ||
|
|
0a06acbf1d | ||
|
|
5d3c6798c0 | ||
|
|
b9d2b9ddc9 | ||
|
|
8a6525f45e | ||
|
|
41d89b590d | ||
|
|
8354d08ff5 | ||
|
|
16725b21f3 | ||
|
|
93ba17792f | ||
|
|
940b96cf21 | ||
|
|
157253ce24 | ||
|
|
46b3810f34 | ||
|
|
05c030dbbb | ||
|
|
5b0fd99351 | ||
|
|
2946a6e231 | ||
|
|
47896fcdc9 | ||
|
|
bc51345f0d | ||
|
|
750e1b6c43 | ||
|
|
4a2106837c | ||
|
|
39b9fc350a | ||
|
|
53560dbe29 | ||
|
|
5172dbe114 | ||
|
|
4f0ff67fdf | ||
|
|
bac971ced8 | ||
|
|
64bf5ba165 | ||
|
|
90c4a5e1b8 | ||
|
|
b08a5d9cda | ||
|
|
d5be79948d | ||
|
|
6b64be4925 | ||
|
|
e8e6eb6ca5 | ||
|
|
ee9383dd0b | ||
|
|
aee0b82cff | ||
|
|
ba5913da57 | ||
|
|
3238b9b2ce | ||
|
|
5215181c0f | ||
|
|
d3676a1454 | ||
|
|
792ce6f86e | ||
|
|
ddbd0376fc | ||
|
|
496655093c | ||
|
|
755293eff7 | ||
|
|
b6e51a1f32 | ||
|
|
08f17f3f19 | ||
|
|
14440725fc | ||
|
|
b4f84c5cd6 | ||
|
|
ad6b1cead1 | ||
|
|
e06398ff19 | ||
|
|
919ad5cfd4 | ||
|
|
b3fb721588 | ||
|
|
590497852d | ||
|
|
ebd7a9c7cf | ||
|
|
939fb2fa54 | ||
|
|
2245daffe9 | ||
|
|
784b25ada8 | ||
|
|
146d631794 | ||
|
|
cc062d7f0e | ||
|
|
298dd4af61 | ||
|
|
739ba3b14d | ||
|
|
2864ea9868 | ||
|
|
ed8d3247ca | ||
|
|
ff5de7b327 | ||
|
|
aa77552ff4 | ||
|
|
12456c0ea2 | ||
|
|
a7a93fa2a2 | ||
|
|
ff7cd29b77 | ||
|
|
f7065acc40 | ||
|
|
e4e2e5c43c | ||
|
|
48d240b010 | ||
|
|
9f2deb56b9 | ||
|
|
951257bed8 | ||
|
|
f27ce804fb | ||
|
|
1d896e83b3 | ||
|
|
a2c2925610 | ||
|
|
97e5f90603 | ||
|
|
593b7188dc | ||
|
|
4c4e61a711 | ||
|
|
140f09c77e | ||
|
|
c0fe4faf8a | ||
|
|
066fff7aca | ||
|
|
6dcbdffed4 | ||
|
|
3a07dea6d7 | ||
|
|
72ed07ef17 | ||
|
|
51512b4588 | ||
|
|
aed49e19e8 | ||
|
|
113601d09a | ||
|
|
b7d0b65715 | ||
|
|
3075591885 | ||
|
|
e9596f56db | ||
|
|
3559830738 | ||
|
|
e42beccb22 | ||
|
|
d05b7394e8 | ||
|
|
00b11ea659 | ||
|
|
99f0f096d1 | ||
|
|
416329d50d | ||
|
|
cb0d1b05d7 | ||
|
|
a2845c33f8 | ||
|
|
6d06265d94 | ||
|
|
49d03efe56 | ||
|
|
7f13a3ca76 | ||
|
|
cec9d168e3 | ||
|
|
ecf253451d | ||
|
|
89a6219659 | ||
|
|
9dec308caa | ||
|
|
fb1459de9b | ||
|
|
f3bef64461 | ||
|
|
2509caff6b | ||
|
|
232aafe2c0 | ||
|
|
ed26cb4891 | ||
|
|
0b966a6cd1 | ||
|
|
c84afd2281 | ||
|
|
1711f09547 | ||
|
|
4460a44e99 | ||
|
|
c8f7bcfb52 | ||
|
|
bd2bd842af | ||
|
|
2b0f4fe46b | ||
|
|
55c2f41c71 | ||
|
|
94985422ca | ||
|
|
eaff1aa58f | ||
|
|
c7cb9d0990 | ||
|
|
a9fdf30421 | ||
|
|
d0f45f6dfb | ||
|
|
8cdb6a3c9f | ||
|
|
b369a46431 | ||
|
|
f40ca2d5e0 | ||
|
|
400393c677 | ||
|
|
5710e3be55 | ||
|
|
af1312a92b | ||
|
|
d2a63c48b1 | ||
|
|
8f10ea7ed6 | ||
|
|
7bd701368a | ||
|
|
894e846a62 | ||
|
|
504ef5a7ab | ||
|
|
af6436da77 | ||
|
|
d031420ed3 | ||
|
|
4b6b7478de | ||
|
|
bb1b5eab96 | ||
|
|
9486b50342 | ||
|
|
fc9a5b3545 | ||
|
|
8b4d0e2541 | ||
|
|
0ef07f615c | ||
|
|
836413cff2 | ||
|
|
c71e34fee9 | ||
|
|
b389a4db92 | ||
|
|
0a1a54cb33 | ||
|
|
630228675c | ||
|
|
f7955d00fc | ||
|
|
68b08f9b9a | ||
|
|
612f136ced | ||
|
|
8c313c3d48 | ||
|
|
517a6c0062 | ||
|
|
46c61b10de | ||
|
|
edc8d27577 | ||
|
|
05354777fe | ||
|
|
98d3d2a39b | ||
|
|
f91f75912e | ||
|
|
9f21f67035 | ||
|
|
699e4da112 | ||
|
|
6458285e75 | ||
|
|
e0ddf3711f | ||
|
|
68d415375d | ||
|
|
0e11afdd8b | ||
|
|
ff2c01584f | ||
|
|
a59e20b864 | ||
|
|
d7d898896d | ||
|
|
2dde78d5e7 | ||
|
|
2ca39ff399 | ||
|
|
1f6fdaf9b3 | ||
|
|
edaf58135f | ||
|
|
724698fc51 | ||
|
|
6aabe9e12c | ||
|
|
2b5a1bb893 | ||
|
|
7403305f3c | ||
|
|
e780f8a3f0 | ||
|
|
7f2fda0327 | ||
|
|
ada8f74e2c | ||
|
|
1ddfeaf950 | ||
|
|
2ed2cc1499 | ||
|
|
be0f90f12a | ||
|
|
4b362df23b | ||
|
|
b953a1c2f6 | ||
|
|
4c30fa43d3 | ||
|
|
6866b1a3bb | ||
|
|
328030f152 | ||
|
|
fd195bd926 | ||
|
|
87e07366cd | ||
|
|
8133977e09 | ||
|
|
11199b996c | ||
|
|
eee61db189 | ||
|
|
c7c5130030 | ||
|
|
6de14a3840 | ||
|
|
55206b3dde | ||
|
|
e1a44477af | ||
|
|
23afee453e | ||
|
|
8e05309021 | ||
|
|
26fdf87070 | ||
|
|
1c95a0edc4 | ||
|
|
4723fb39e9 | ||
|
|
13d667d81c | ||
|
|
dce255dc58 | ||
|
|
f72c9704d9 | ||
|
|
e623010e91 | ||
|
|
587bfdc162 | ||
|
|
7c1c299282 | ||
|
|
f2a5c0b04b | ||
|
|
4ba77b76ec | ||
|
|
0bfce44317 | ||
|
|
13b6d6384c | ||
|
|
80838bbef0 | ||
|
|
8a557ff2fb | ||
|
|
16e394087d | ||
|
|
ee1b67b36e | ||
|
|
36b9fa2387 | ||
|
|
378169e939 | ||
|
|
70a01e559d | ||
|
|
c09e8196f3 | ||
|
|
0382c05152 | ||
|
|
75cf6e2a56 | ||
|
|
9fb4754430 | ||
|
|
0312b504a9 | ||
|
|
1d6a9651bf | ||
|
|
e36b18e85e | ||
|
|
4ae4951e0d | ||
|
|
a65f52ffba | ||
|
|
6de25ffa65 | ||
|
|
d8429bdd99 | ||
|
|
26976ae6cf | ||
|
|
53beaca563 | ||
|
|
77628e2fb9 | ||
|
|
40d2f2de96 | ||
|
|
84cdb2483f | ||
|
|
c7866bfbbf | ||
|
|
5de1d6b343 | ||
|
|
7bde363704 | ||
|
|
1f9b2ce7b9 | ||
|
|
ac2e47776a | ||
|
|
e7de5ca263 | ||
|
|
f7f079e653 | ||
|
|
f7cccb33de | ||
|
|
8177c9c34b | ||
|
|
850c46f881 | ||
|
|
ffcfe966d2 | ||
|
|
800badd2a4 | ||
|
|
0a7ffbcc8f | ||
|
|
019ec4de9a | ||
|
|
78d1e4a12a | ||
|
|
6c99fefad0 | ||
|
|
24bc1424b9 | ||
|
|
94a0e17cfc | ||
|
|
2f012d8cf2 | ||
|
|
75b800054f | ||
|
|
d7c7733315 | ||
|
|
99600ad8d8 | ||
|
|
4a4c7b8b6b | ||
|
|
8c3267b345 | ||
|
|
c0240b047b | ||
|
|
c52957ccfe | ||
|
|
fb3f057adf | ||
|
|
e333bd08a4 | ||
|
|
1844a269cb | ||
|
|
859882d24f | ||
|
|
c95543b8b0 | ||
|
|
d874125dc1 | ||
|
|
795cd099f4 | ||
|
|
66ef6fd9d8 | ||
|
|
3b0655354d | ||
|
|
76acec93fd | ||
|
|
3b60068369 | ||
|
|
a0fd0a71a2 | ||
|
|
907accbcc9 | ||
|
|
ee284abf8d | ||
|
|
8239275770 | ||
|
|
029485bace | ||
|
|
cef9f6ae3b | ||
|
|
8d88c94956 | ||
|
|
692e155117 | ||
|
|
9a9410de2b | ||
|
|
a27f1181ea | ||
|
|
ac65cadb1b | ||
|
|
4345e75b20 | ||
|
|
f64d085e7b | ||
|
|
325b878f0a | ||
|
|
330f375a30 | ||
|
|
7d6c211de1 | ||
|
|
af5b36752c | ||
|
|
e0f563befb | ||
|
|
bf1b84dfea | ||
|
|
b3f8ce9c16 | ||
|
|
499152d066 | ||
|
|
c47e7edc9e | ||
|
|
afc034b495 | ||
|
|
e1d19741af | ||
|
|
8d2de40df6 | ||
|
|
f4b7db667f | ||
|
|
4032e52317 | ||
|
|
f9db4325d8 | ||
|
|
815824f76d | ||
|
|
8534672c33 | ||
|
|
b9bb9a166a | ||
|
|
185c886472 | ||
|
|
acc565d021 | ||
|
|
64db137c6c | ||
|
|
4f2bdeb2c9 | ||
|
|
527994084b | ||
|
|
ffaf5c9475 | ||
|
|
d1e24bfcd8 | ||
|
|
aab8612c63 | ||
|
|
79c1e2d21c | ||
|
|
7ff44f4839 | ||
|
|
2de0272e3e | ||
|
|
1d22fe72d0 | ||
|
|
7e9821551c | ||
|
|
8fb3cd71b9 | ||
|
|
b0f6f1f2ba | ||
|
|
df56dc4a4a | ||
|
|
b572ec4901 | ||
|
|
75759171c1 | ||
|
|
322fe185dd | ||
|
|
effe514ecb | ||
|
|
4ff9f69548 | ||
|
|
e1c7cb17da | ||
|
|
e6defd7770 | ||
|
|
bba9f45075 | ||
|
|
de1a2d1557 | ||
|
|
e995d06a26 | ||
|
|
63f54a1318 | ||
|
|
0828c9f901 | ||
|
|
51cd38450a | ||
|
|
0a4a720fea | ||
|
|
7f7ce171e0 | ||
|
|
87622cc6ec | ||
|
|
aaf2e64fdb | ||
|
|
c6f22e7ce5 | ||
|
|
749a2d19aa | ||
|
|
ed3491fbba | ||
|
|
f5e4b7cd6a | ||
|
|
0b614e81ee | ||
|
|
0a93b660cf | ||
|
|
71e104e4bd | ||
|
|
189c5de7ea | ||
|
|
a5e141c361 | ||
|
|
e76d8d4df7 | ||
|
|
d54c093985 | ||
|
|
086709e40f | ||
|
|
9477e32ec8 | ||
|
|
a66a0628ad | ||
|
|
ea018bd4c1 | ||
|
|
8e81ee3b75 | ||
|
|
9c326f9be9 | ||
|
|
7d2a0aa793 | ||
|
|
22d1442033 | ||
|
|
ffa32a5501 | ||
|
|
f50a6a8416 | ||
|
|
7a82b75ee2 | ||
|
|
350c0585b8 | ||
|
|
5c4454d3ed | ||
|
|
dfd1ae7a50 | ||
|
|
d16fdd062f | ||
|
|
d6432698fc | ||
|
|
1a9c1e8bc1 | ||
|
|
2d05c6cb13 | ||
|
|
05f689913f | ||
|
|
9e714c4192 | ||
|
|
e1ad1e31f8 | ||
|
|
b473bf1da8 | ||
|
|
dfdc6eecb6 | ||
|
|
e9145df77a | ||
|
|
4e824990d1 | ||
|
|
5a053378e1 | ||
|
|
e09306b6f3 | ||
|
|
21e577c1d3 | ||
|
|
9d85d0979c | ||
|
|
e4fec7ea1f | ||
|
|
c998e513fc | ||
|
|
855b06c4b2 | ||
|
|
776012f02f | ||
|
|
9bff531618 | ||
|
|
4d64818da1 | ||
|
|
837c8773a8 | ||
|
|
97a199b504 | ||
|
|
9cd37be5b1 | ||
|
|
90895fed52 | ||
|
|
df4b73abbb | ||
|
|
d2bed08ae0 | ||
|
|
fd5e1472e1 | ||
|
|
6a22126006 | ||
|
|
ff5e9049a0 | ||
|
|
7570aa9f49 | ||
|
|
4fcdd3da23 | ||
|
|
f8a65b4d13 | ||
|
|
5bb70a5043 | ||
|
|
c4788159e4 | ||
|
|
403b0aedca | ||
|
|
cae12b84df | ||
|
|
40dbbbf0a0 | ||
|
|
9e0da27484 | ||
|
|
7e6c2463d6 | ||
|
|
69a76db166 | ||
|
|
efd282e326 | ||
|
|
6471fef28c | ||
|
|
5a0691b70c | ||
|
|
27ea357348 | ||
|
|
e12de29cce | ||
|
|
a236be4e38 | ||
|
|
5300643f62 | ||
|
|
469b837daf | ||
|
|
84ca3e8982 | ||
|
|
bfb8be159a | ||
|
|
13d7af9c76 | ||
|
|
66d78497b9 | ||
|
|
32743f7e19 | ||
|
|
c2cc4451ff | ||
|
|
67370bbc3d | ||
|
|
1201ae1956 | ||
|
|
0eb2786ce5 | ||
|
|
bbdeb66f8e | ||
|
|
641698a652 | ||
|
|
15880e995a | ||
|
|
1e849b106b | ||
|
|
31bc405e86 | ||
|
|
6e69eee2a3 | ||
|
|
279b095f30 | ||
|
|
9821499cdb | ||
|
|
b76c39862a | ||
|
|
7948d234f5 | ||
|
|
50fc3aa9fc | ||
|
|
79a7adb05b | ||
|
|
c02770ec2a | ||
|
|
bf24033513 | ||
|
|
d97c87e90c | ||
|
|
6d29fdc448 | ||
|
|
d16f0dd3f6 | ||
|
|
d023c97049 | ||
|
|
73c8d63f0e | ||
|
|
30709de7e2 | ||
|
|
c3e560766e | ||
|
|
7c7889e87e | ||
|
|
6547ccecdd | ||
|
|
d467a591b0 | ||
|
|
42613ff480 | ||
|
|
3a3d4b9e54 | ||
|
|
0b5c0bcf74 | ||
|
|
5937f009e1 | ||
|
|
c7f3d2a64e | ||
|
|
41263307d7 | ||
|
|
f2ff52477e | ||
|
|
6baa5a0730 | ||
|
|
5a5cb8c866 | ||
|
|
a3a78366f7 | ||
|
|
d936292ed9 | ||
|
|
a3ded18f59 | ||
|
|
0969135f7f | ||
|
|
7e1c1a6324 | ||
|
|
aa43dd2a49 | ||
|
|
81fe9b6fc2 | ||
|
|
6807fdc1cc | ||
|
|
ac1590810f | ||
|
|
9dd4d77535 | ||
|
|
c7aa6a9d96 | ||
|
|
fc56db2f83 | ||
|
|
c58e56257d | ||
|
|
b27eb280a8 | ||
|
|
78c7f4078c | ||
|
|
28ccaffcf5 | ||
|
|
78739558d6 | ||
|
|
cd195d30de | ||
|
|
03bf752284 | ||
|
|
238fab3e1d | ||
|
|
fcd9af8f84 | ||
|
|
b44491ebbe | ||
|
|
1f8018fd5b | ||
|
|
1d67656fa0 | ||
|
|
64b8023d1a | ||
|
|
cc1697e7ec | ||
|
|
28943e77e8 | ||
|
|
0474e5b1fe |
55
CHANGELOG
55
CHANGELOG
@@ -1,3 +1,58 @@
|
||||
KeePassDX(4.1.3)
|
||||
* Fix Autofill Registration #2089
|
||||
* Fix Biometric errors #2081
|
||||
* Fixed timestamp in copy file #1981 #1983
|
||||
* Fix Template Email #1986
|
||||
|
||||
KeePassDX(4.1.2)
|
||||
* Fix URL search #1940 #1946 #2003 #2040 #2044
|
||||
* Fix Autofill popup #2054
|
||||
* Fix Group notes #2053
|
||||
* Fix Dialog background #2005 #2004 (Thx @codokie)
|
||||
* Fix OTP configuration #2042 #2065 (Thx @Dev-ClayP)
|
||||
* Fix small UI elements #1987 #2007 (Thx @ymcx)
|
||||
* RTL layout support #2021 (Thx @codokie)
|
||||
* App Metadata to translation #1823
|
||||
|
||||
KeePassDX(4.1.1)
|
||||
* Fix date parser #1933
|
||||
* Fix domain search #1820 #1936
|
||||
|
||||
KeePassDX(4.1.0)
|
||||
* Generate keyfile #1290
|
||||
* Hide template group #1894
|
||||
* Group count sum recursively #421
|
||||
* Fix date fields #1695 #1710
|
||||
* Fix distinct domain names #1105 #1820
|
||||
* Resets the advanced unlock expiration #1600
|
||||
* Password entropy #1490 #1355
|
||||
* Upgrade to API 34 (Android 14) #1730
|
||||
* Small fixes #1711 #1831 #1780 #1821 #1863 #1889 #1289 #1600 #1467 #1870
|
||||
|
||||
KeePassDX(4.0.8)
|
||||
* Fix graphical bug that prevented databases from being opened on some versions of Android #1848 #1850
|
||||
|
||||
KeePassDX(4.0.7)
|
||||
* Prevent 0 Byte file with cache during a save exception #1620 #1594 #1680
|
||||
* Fix inline suggestions in keyboard #1840
|
||||
* Fix broken links by default #1755
|
||||
* Fix UX by allowing validation in entry edition #1770
|
||||
* Fix small bugs #1709
|
||||
|
||||
KeePassDX(4.0.6)
|
||||
* Fix form filled recognition #1508 #1735 #1508 #1790 #1783 #1797 #1801 #1802 #1804 #1665
|
||||
* Fix translations #1707 #1683 #1712
|
||||
* Update APK verifier #1810
|
||||
|
||||
KeePassDX(4.0.5)
|
||||
* Fix form filled recognition #1572 #1508
|
||||
* Rollback password color #1686 #1490
|
||||
|
||||
KeePassDX(4.0.4)
|
||||
* Fix form filled recognition #1572 #1677
|
||||
* Fix device unlock #1682
|
||||
* Fix password color #1490
|
||||
|
||||
KeePassDX(4.0.3)
|
||||
* Fix "Save as" in Read Only mode #1666
|
||||
* Fix username autofill #1665 #530 #1572 #1426 #1523 #1556 #1653 #1658 #1508 #1667
|
||||
|
||||
141
Gemfile.lock
141
Gemfile.lock
@@ -1,29 +1,32 @@
|
||||
GEM
|
||||
remote: https://rubygems.org/
|
||||
specs:
|
||||
CFPropertyList (3.0.6)
|
||||
CFPropertyList (3.0.7)
|
||||
base64
|
||||
nkf
|
||||
rexml
|
||||
addressable (2.8.4)
|
||||
public_suffix (>= 2.0.2, < 6.0)
|
||||
artifactory (3.0.15)
|
||||
addressable (2.8.7)
|
||||
public_suffix (>= 2.0.2, < 7.0)
|
||||
artifactory (3.0.17)
|
||||
atomos (0.1.3)
|
||||
aws-eventstream (1.2.0)
|
||||
aws-partitions (1.794.0)
|
||||
aws-sdk-core (3.180.0)
|
||||
aws-eventstream (~> 1, >= 1.0.2)
|
||||
aws-partitions (~> 1, >= 1.651.0)
|
||||
aws-sigv4 (~> 1.5)
|
||||
aws-eventstream (1.3.0)
|
||||
aws-partitions (1.1009.0)
|
||||
aws-sdk-core (3.213.0)
|
||||
aws-eventstream (~> 1, >= 1.3.0)
|
||||
aws-partitions (~> 1, >= 1.992.0)
|
||||
aws-sigv4 (~> 1.9)
|
||||
jmespath (~> 1, >= 1.6.1)
|
||||
aws-sdk-kms (1.71.0)
|
||||
aws-sdk-core (~> 3, >= 3.177.0)
|
||||
aws-sigv4 (~> 1.1)
|
||||
aws-sdk-s3 (1.132.0)
|
||||
aws-sdk-core (~> 3, >= 3.179.0)
|
||||
aws-sdk-kms (1.95.0)
|
||||
aws-sdk-core (~> 3, >= 3.210.0)
|
||||
aws-sigv4 (~> 1.5)
|
||||
aws-sdk-s3 (1.171.0)
|
||||
aws-sdk-core (~> 3, >= 3.210.0)
|
||||
aws-sdk-kms (~> 1)
|
||||
aws-sigv4 (~> 1.6)
|
||||
aws-sigv4 (1.6.0)
|
||||
aws-sigv4 (~> 1.5)
|
||||
aws-sigv4 (1.10.1)
|
||||
aws-eventstream (~> 1, >= 1.0.2)
|
||||
babosa (1.0.4)
|
||||
base64 (0.2.0)
|
||||
claide (1.1.0)
|
||||
colored (1.2)
|
||||
colored2 (3.1.2)
|
||||
@@ -32,12 +35,11 @@ GEM
|
||||
declarative (0.0.20)
|
||||
digest-crc (0.6.5)
|
||||
rake (>= 12.0.0, < 14.0.0)
|
||||
domain_name (0.5.20190701)
|
||||
unf (>= 0.0.5, < 1.0.0)
|
||||
domain_name (0.6.20240107)
|
||||
dotenv (2.8.1)
|
||||
emoji_regex (3.2.3)
|
||||
excon (0.100.0)
|
||||
faraday (1.10.3)
|
||||
excon (0.112.0)
|
||||
faraday (1.10.4)
|
||||
faraday-em_http (~> 1.0)
|
||||
faraday-em_synchrony (~> 1.0)
|
||||
faraday-excon (~> 1.1)
|
||||
@@ -58,22 +60,22 @@ GEM
|
||||
faraday-httpclient (1.0.1)
|
||||
faraday-multipart (1.0.4)
|
||||
multipart-post (~> 2)
|
||||
faraday-net_http (1.0.1)
|
||||
faraday-net_http (1.0.2)
|
||||
faraday-net_http_persistent (1.2.0)
|
||||
faraday-patron (1.0.0)
|
||||
faraday-rack (1.0.0)
|
||||
faraday-retry (1.0.3)
|
||||
faraday_middleware (1.2.0)
|
||||
faraday_middleware (1.2.1)
|
||||
faraday (~> 1.0)
|
||||
fastimage (2.2.7)
|
||||
fastlane (2.214.0)
|
||||
fastimage (2.3.1)
|
||||
fastlane (2.225.0)
|
||||
CFPropertyList (>= 2.3, < 4.0.0)
|
||||
addressable (>= 2.8, < 3.0.0)
|
||||
artifactory (~> 3.0)
|
||||
aws-sdk-s3 (~> 1.0)
|
||||
babosa (>= 1.0.3, < 2.0.0)
|
||||
bundler (>= 1.12.0, < 3.0.0)
|
||||
colored
|
||||
colored (~> 1.2)
|
||||
commander (~> 4.6)
|
||||
dotenv (>= 2.1.1, < 3.0.0)
|
||||
emoji_regex (>= 0.1, < 4.0)
|
||||
@@ -82,34 +84,39 @@ GEM
|
||||
faraday-cookie_jar (~> 0.0.6)
|
||||
faraday_middleware (~> 1.0)
|
||||
fastimage (>= 2.1.0, < 3.0.0)
|
||||
fastlane-sirp (>= 1.0.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-storage (~> 1.31)
|
||||
highline (~> 2.0)
|
||||
http-cookie (~> 1.0.5)
|
||||
json (< 3.0.0)
|
||||
jwt (>= 2.1.0, < 3)
|
||||
mini_magick (>= 4.9.4, < 5.0.0)
|
||||
multipart-post (>= 2.0.0, < 3.0.0)
|
||||
naturally (~> 2.2)
|
||||
optparse (~> 0.1.1)
|
||||
optparse (>= 0.1.1, < 1.0.0)
|
||||
plist (>= 3.1.0, < 4.0.0)
|
||||
rubyzip (>= 2.0.0, < 3.0.0)
|
||||
security (= 0.1.3)
|
||||
security (= 0.1.5)
|
||||
simctl (~> 1.6.3)
|
||||
terminal-notifier (>= 2.0.0, < 3.0.0)
|
||||
terminal-table (>= 1.4.5, < 2.0.0)
|
||||
terminal-table (~> 3)
|
||||
tty-screen (>= 0.6.3, < 1.0.0)
|
||||
tty-spinner (>= 0.8.0, < 1.0.0)
|
||||
word_wrap (~> 1.0.0)
|
||||
xcodeproj (>= 1.13.0, < 2.0.0)
|
||||
xcpretty (~> 0.3.0)
|
||||
xcpretty-travis-formatter (>= 0.0.3)
|
||||
xcpretty-travis-formatter (>= 0.0.3, < 2.0.0)
|
||||
fastlane-plugin-versioning_android (0.1.1)
|
||||
fastlane-sirp (1.0.0)
|
||||
sysrandom (~> 1.0)
|
||||
gh_inspector (1.1.3)
|
||||
google-apis-androidpublisher_v3 (0.46.0)
|
||||
google-apis-androidpublisher_v3 (0.54.0)
|
||||
google-apis-core (>= 0.11.0, < 2.a)
|
||||
google-apis-core (0.11.1)
|
||||
google-apis-core (0.11.3)
|
||||
addressable (~> 2.5, >= 2.5.1)
|
||||
googleauth (>= 0.16.2, < 2.a)
|
||||
httpclient (>= 2.8.1, < 3.a)
|
||||
@@ -117,64 +124,63 @@ GEM
|
||||
representable (~> 3.0)
|
||||
retriable (>= 2.0, < 4.a)
|
||||
rexml
|
||||
webrick
|
||||
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.19.0)
|
||||
google-apis-core (>= 0.9.0, < 2.a)
|
||||
google-cloud-core (1.6.0)
|
||||
google-cloud-env (~> 1.0)
|
||||
google-apis-storage_v1 (0.31.0)
|
||||
google-apis-core (>= 0.11.0, < 2.a)
|
||||
google-cloud-core (1.7.1)
|
||||
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.3.1)
|
||||
google-cloud-storage (1.44.0)
|
||||
google-cloud-errors (1.4.0)
|
||||
google-cloud-storage (1.47.0)
|
||||
addressable (~> 2.8)
|
||||
digest-crc (~> 0.4)
|
||||
google-apis-iamcredentials_v1 (~> 0.1)
|
||||
google-apis-storage_v1 (~> 0.19.0)
|
||||
google-apis-storage_v1 (~> 0.31.0)
|
||||
google-cloud-core (~> 1.6)
|
||||
googleauth (>= 0.16.2, < 2.a)
|
||||
mini_mime (~> 1.0)
|
||||
googleauth (1.7.0)
|
||||
googleauth (1.8.1)
|
||||
faraday (>= 0.17.3, < 3.a)
|
||||
jwt (>= 1.4, < 3.0)
|
||||
memoist (~> 0.16)
|
||||
multi_json (~> 1.11)
|
||||
os (>= 0.9, < 2.0)
|
||||
signet (>= 0.16, < 2.a)
|
||||
highline (2.0.3)
|
||||
http-cookie (1.0.5)
|
||||
http-cookie (1.0.7)
|
||||
domain_name (~> 0.5)
|
||||
httpclient (2.8.3)
|
||||
jmespath (1.6.2)
|
||||
json (2.6.3)
|
||||
jwt (2.7.1)
|
||||
memoist (0.16.2)
|
||||
mini_magick (4.12.0)
|
||||
mini_mime (1.1.2)
|
||||
json (2.8.2)
|
||||
jwt (2.9.3)
|
||||
base64
|
||||
mini_magick (4.13.2)
|
||||
mini_mime (1.1.5)
|
||||
multi_json (1.15.0)
|
||||
multipart-post (2.3.0)
|
||||
nanaimo (0.3.0)
|
||||
multipart-post (2.4.1)
|
||||
nanaimo (0.4.0)
|
||||
naturally (2.2.1)
|
||||
optparse (0.1.1)
|
||||
nkf (0.2.0)
|
||||
optparse (0.6.0)
|
||||
os (1.1.4)
|
||||
plist (3.7.0)
|
||||
public_suffix (5.0.3)
|
||||
rake (13.0.6)
|
||||
plist (3.7.1)
|
||||
public_suffix (6.0.1)
|
||||
rake (13.2.1)
|
||||
representable (3.2.0)
|
||||
declarative (< 0.1.0)
|
||||
trailblazer-option (>= 0.1.1, < 0.2.0)
|
||||
uber (< 0.2.0)
|
||||
retriable (3.1.2)
|
||||
rexml (3.2.6)
|
||||
rexml (3.3.9)
|
||||
rouge (2.0.7)
|
||||
ruby2_keywords (0.0.5)
|
||||
rubyzip (2.3.2)
|
||||
security (0.1.3)
|
||||
signet (0.17.0)
|
||||
security (0.1.5)
|
||||
signet (0.19.0)
|
||||
addressable (~> 2.8)
|
||||
faraday (>= 0.17.5, < 3.a)
|
||||
jwt (>= 1.5, < 3.0)
|
||||
@@ -182,28 +188,25 @@ GEM
|
||||
simctl (1.6.10)
|
||||
CFPropertyList
|
||||
naturally
|
||||
sysrandom (1.0.5)
|
||||
terminal-notifier (2.0.0)
|
||||
terminal-table (1.8.0)
|
||||
unicode-display_width (~> 1.1, >= 1.1.1)
|
||||
terminal-table (3.0.2)
|
||||
unicode-display_width (>= 1.1.1, < 3)
|
||||
trailblazer-option (0.1.2)
|
||||
tty-cursor (0.7.1)
|
||||
tty-screen (0.8.1)
|
||||
tty-screen (0.8.2)
|
||||
tty-spinner (0.9.3)
|
||||
tty-cursor (~> 0.7)
|
||||
uber (0.1.0)
|
||||
unf (0.1.4)
|
||||
unf_ext
|
||||
unf_ext (0.0.8.2)
|
||||
unicode-display_width (1.8.0)
|
||||
webrick (1.8.1)
|
||||
unicode-display_width (2.6.0)
|
||||
word_wrap (1.0.0)
|
||||
xcodeproj (1.22.0)
|
||||
xcodeproj (1.27.0)
|
||||
CFPropertyList (>= 2.3.3, < 4.0)
|
||||
atomos (~> 0.1.3)
|
||||
claide (>= 1.0.2, < 2.0)
|
||||
colored2 (~> 3.1)
|
||||
nanaimo (~> 0.3.0)
|
||||
rexml (~> 3.2.4)
|
||||
nanaimo (~> 0.4.0)
|
||||
rexml (>= 3.3.6, < 4.0)
|
||||
xcpretty (0.3.0)
|
||||
rouge (~> 2.0.7)
|
||||
xcpretty-travis-formatter (1.0.1)
|
||||
@@ -217,4 +220,4 @@ DEPENDENCIES
|
||||
fastlane-plugin-versioning_android
|
||||
|
||||
BUNDLED WITH
|
||||
2.1.4
|
||||
2.5.10
|
||||
|
||||
50
README.md
50
README.md
@@ -1,8 +1,8 @@
|
||||
# Android KeePassDX
|
||||
|
||||
<img src="https://raw.githubusercontent.com/Kunzisoft/KeePassDX/master/art/icon.png"> **Lightweight password manager for Android**, KeePassDX allows editing encrypted data in a single file in KeePass format and fill in the forms in a secure way.
|
||||
<img alt="KeePassDX Icon" src="https://raw.githubusercontent.com/Kunzisoft/KeePassDX/master/art/icon.png"> **Lightweight password safe and manager for Android**, KeePassDX allows editing encrypted data in a single file in KeePass format and fill in the forms in a secure way.
|
||||
|
||||
<img src="https://raw.githubusercontent.com/Kunzisoft/KeePassDX/master/art/screen.jpg" width="220">
|
||||
<img alt="KeePassDX Screenshot" src="https://raw.githubusercontent.com/Kunzisoft/KeePassDX/master/art/screen.jpg" width="220">
|
||||
|
||||
### Features
|
||||
|
||||
@@ -48,18 +48,40 @@ Optional visual styles are accessible after a contribution (and a congratulatory
|
||||
|
||||
## Download
|
||||
|
||||
*[F-Droid](https://f-droid.org/packages/com.kunzisoft.keepass.libre/) is the recommended way of installing, a libre software project that verifies that all the libraries and app code is libre software.*
|
||||
*[F-Droid](https://f-droid.org/packages/com.kunzisoft.keepass.libre/) is the recommended way of installing, a libre software project that verifies all the libraries and app code is libre software.*
|
||||
|
||||
| Source | Status | [Version](https://github.com/Kunzisoft/KeePassDX/wiki/FAQ#why-a-libre-and-free-version) |
|
||||
|--------|--------|---------|
|
||||
| [Google Play](https://play.google.com/store/apps/details?id=com.kunzisoft.keepass.free) |  | Free + [Pro](https://play.google.com/store/apps/details?id=com.kunzisoft.keepass.pro) |
|
||||
| [F-Droid](https://f-droid.org/en/packages/com.kunzisoft.keepass.libre/) |  | Libre |
|
||||
| [IzzyOnDroid](https://apt.izzysoft.de/fdroid/index/apk/com.kunzisoft.keepass.free) |  | Free & [Libre](https://apt.izzysoft.de/fdroid/index/apk/com.kunzisoft.keepass.libre) |
|
||||
| [GitHub](https://github.com/Kunzisoft/KeePassDX/releases) / [Obtainium](https://github.com/ImranR98/Obtainium) |  | Free & Libre |
|
||||
|
||||
## Package authenticity from GitHub
|
||||
- Download the app from [GitHub releases](https://github.com/Kunzisoft/KeePassDX/releases/latest)
|
||||
- Install [`apksigner`](https://developer.android.com/tools/apksigner) from [Android Studio](https://developer.android.com/studio)
|
||||
- Open the directory where you saved the downloaded file in the Terminal
|
||||
- Make sure that you have `apksigner` installed by running:
|
||||
```shell
|
||||
apksigner --version
|
||||
```
|
||||
- Depending on the APK file you downloaded, run:
|
||||
|
||||
```shell
|
||||
apksigner verify --verbose --print-certs -min-sdk-version 24 KeePassDX-*.apk
|
||||
```
|
||||
|
||||
You should get this output :
|
||||
```shell
|
||||
Verified using v2 scheme (APK Signature Scheme v2): true
|
||||
...
|
||||
Number of signers: 1
|
||||
Signer #1 certificate SHA-256 digest: 7d55b8af210381aabf960f07e17cf7857b6d2a642ca2da6bf0bdf1b200362f04
|
||||
...
|
||||
Signer #1 public key SHA-256 digest: 5d261d3176db1e077b80112824d9390167f3be0561827e42112ed6b71192db81
|
||||
```
|
||||
If it's the case, this means that the APK was well built by the author of KeePassDX.
|
||||
|
||||
[<img src="https://f-droid.org/badge/get-it-on.png"
|
||||
alt="Get it on F-Droid"
|
||||
height="80">](https://f-droid.org/packages/com.kunzisoft.keepass.libre/)
|
||||
[<img src="https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png"
|
||||
alt="Get it on Google Play"
|
||||
height="80">](https://play.google.com/store/apps/details?id=com.kunzisoft.keepass.free)
|
||||
[<img src="https://raw.githubusercontent.com/Kunzisoft/Github-badge/main/get-it-on-github.png"
|
||||
alt="Get it on Github"
|
||||
height="80">](https://github.com/Kunzisoft/KeePassDX/releases)
|
||||
|
||||
## Frequently Asked Questions
|
||||
|
||||
Other questions? You can read the [FAQ](https://github.com/Kunzisoft/KeePassDX/wiki/FAQ)
|
||||
@@ -74,7 +96,7 @@ Other questions? You can read the [FAQ](https://github.com/Kunzisoft/KeePassDX/w
|
||||
|
||||
## License
|
||||
|
||||
Copyright © 2023 Jeremy Jamet / [Kunzisoft](https://www.kunzisoft.com).
|
||||
Copyright © 2025 Jeremy Jamet / [Kunzisoft](https://www.kunzisoft.com).
|
||||
|
||||
This file is part of KeePassDX.
|
||||
|
||||
|
||||
@@ -5,15 +5,14 @@ apply plugin: 'kotlin-kapt'
|
||||
|
||||
android {
|
||||
namespace 'com.kunzisoft.keepass'
|
||||
compileSdkVersion 33
|
||||
buildToolsVersion "33.0.2"
|
||||
compileSdkVersion 34
|
||||
|
||||
defaultConfig {
|
||||
applicationId "com.kunzisoft.keepass"
|
||||
minSdkVersion 15
|
||||
targetSdkVersion 33
|
||||
versionCode = 126
|
||||
versionName = "4.0.3"
|
||||
targetSdkVersion 34
|
||||
versionCode = 135
|
||||
versionName = "4.1.3"
|
||||
multiDexEnabled true
|
||||
|
||||
testApplicationId = "com.kunzisoft.keepass.tests"
|
||||
@@ -36,6 +35,13 @@ android {
|
||||
}
|
||||
}
|
||||
|
||||
dependenciesInfo {
|
||||
// Disables dependency metadata when building APKs.
|
||||
includeInApk = false
|
||||
// Disables dependency metadata when building Android App Bundles.
|
||||
includeInBundle = false
|
||||
}
|
||||
|
||||
flavorDimensions "version"
|
||||
productFlavors {
|
||||
libre {
|
||||
@@ -85,12 +91,15 @@ android {
|
||||
}
|
||||
|
||||
compileOptions {
|
||||
targetCompatibility JavaVersion.VERSION_1_8
|
||||
sourceCompatibility JavaVersion.VERSION_1_8
|
||||
targetCompatibility JavaVersion.VERSION_17
|
||||
sourceCompatibility JavaVersion.VERSION_17
|
||||
}
|
||||
|
||||
kotlinOptions {
|
||||
jvmTarget = "1.8"
|
||||
jvmTarget = "17"
|
||||
}
|
||||
buildFeatures {
|
||||
buildConfig true
|
||||
}
|
||||
}
|
||||
|
||||
@@ -120,7 +129,7 @@ dependencies {
|
||||
// Autofill
|
||||
implementation "androidx.autofill:autofill:1.1.0"
|
||||
// Time
|
||||
implementation 'joda-time:joda-time:2.10.13'
|
||||
implementation 'joda-time:joda-time:2.13.0'
|
||||
// Color
|
||||
implementation 'com.github.Kunzisoft:AndroidClearChroma:2.6'
|
||||
// Education
|
||||
@@ -137,5 +146,4 @@ dependencies {
|
||||
|
||||
// Tests
|
||||
androidTestImplementation "androidx.test:runner:$android_test_version"
|
||||
androidTestImplementation "androidx.test:rules:$android_test_version"
|
||||
}
|
||||
|
||||
@@ -9,6 +9,10 @@
|
||||
android:anyDensity="true" />
|
||||
<uses-permission
|
||||
android:name="android.permission.FOREGROUND_SERVICE" />
|
||||
<uses-permission
|
||||
android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
|
||||
<uses-permission
|
||||
android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE"/>
|
||||
<uses-permission
|
||||
android:name="android.permission.POST_NOTIFICATIONS" />
|
||||
<uses-permission
|
||||
@@ -39,6 +43,7 @@
|
||||
android:backupAgent="com.kunzisoft.keepass.backup.SettingsBackupAgent"
|
||||
android:largeHeap="true"
|
||||
android:resizeableActivity="true"
|
||||
android:supportsRtl="true"
|
||||
android:theme="@style/KeepassDXStyle.Night"
|
||||
tools:targetApi="s">
|
||||
<meta-data
|
||||
@@ -118,7 +123,7 @@
|
||||
android:name="com.kunzisoft.keepass.activities.GroupActivity"
|
||||
android:exported="false"
|
||||
android:configChanges="keyboardHidden"
|
||||
android:windowSoftInputMode="adjustPan">
|
||||
android:windowSoftInputMode="adjustResize">
|
||||
<meta-data
|
||||
android:name="android.app.default_searchable"
|
||||
android:value="com.kunzisoft.keepass.search.SearchResults"
|
||||
@@ -145,7 +150,7 @@
|
||||
android:configChanges="keyboardHidden" />
|
||||
<activity
|
||||
android:name="com.kunzisoft.keepass.activities.EntryEditActivity"
|
||||
android:windowSoftInputMode="adjustPan" />
|
||||
android:windowSoftInputMode="adjustResize" />
|
||||
<!-- About and Settings -->
|
||||
<activity
|
||||
android:name="com.kunzisoft.keepass.activities.AboutActivity"
|
||||
@@ -197,18 +202,27 @@
|
||||
|
||||
<service
|
||||
android:name="com.kunzisoft.keepass.services.DatabaseTaskNotificationService"
|
||||
android:foregroundServiceType="dataSync"
|
||||
android:enabled="true"
|
||||
android:exported="false" />
|
||||
<service
|
||||
android:name="com.kunzisoft.keepass.services.AttachmentFileNotificationService"
|
||||
android:foregroundServiceType="dataSync"
|
||||
android:enabled="true"
|
||||
android:exported="false" />
|
||||
<service
|
||||
android:name="com.kunzisoft.keepass.services.ClipboardEntryNotificationService"
|
||||
android:foregroundServiceType="specialUse"
|
||||
android:enabled="true"
|
||||
android:exported="false" />
|
||||
<service
|
||||
android:name="com.kunzisoft.keepass.services.KeyboardEntryNotificationService"
|
||||
android:foregroundServiceType="specialUse"
|
||||
android:enabled="true"
|
||||
android:exported="false" />
|
||||
<service
|
||||
android:name="com.kunzisoft.keepass.services.AdvancedUnlockNotificationService"
|
||||
android:foregroundServiceType="specialUse"
|
||||
android:enabled="true"
|
||||
android:exported="false" />
|
||||
<!-- Receiver for Autofill -->
|
||||
@@ -235,10 +249,6 @@
|
||||
<action android:name="android.view.InputMethod" />
|
||||
</intent-filter>
|
||||
</service>
|
||||
<service
|
||||
android:name="com.kunzisoft.keepass.services.KeyboardEntryNotificationService"
|
||||
android:enabled="true"
|
||||
android:exported="false" />
|
||||
<receiver
|
||||
android:name="com.kunzisoft.keepass.receivers.DexModeReceiver"
|
||||
android:exported="true">
|
||||
|
||||
@@ -38,7 +38,11 @@ import android.graphics.RectF
|
||||
import android.graphics.drawable.BitmapDrawable
|
||||
import android.os.Build
|
||||
import android.util.TypedValue
|
||||
import android.view.*
|
||||
import android.view.GestureDetector
|
||||
import android.view.MotionEvent
|
||||
import android.view.ScaleGestureDetector
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.view.animation.AccelerateDecelerateInterpolator
|
||||
import android.view.animation.DecelerateInterpolator
|
||||
import android.view.animation.Interpolator
|
||||
@@ -202,7 +206,7 @@ class Loupe(imageView: ImageView, container: ViewGroup) : View.OnTouchListener,
|
||||
override fun onDown(e: MotionEvent): Boolean = true
|
||||
|
||||
override fun onScroll(
|
||||
e1: MotionEvent,
|
||||
e1: MotionEvent?,
|
||||
e2: MotionEvent,
|
||||
distanceX: Float,
|
||||
distanceY: Float
|
||||
@@ -220,7 +224,7 @@ class Loupe(imageView: ImageView, container: ViewGroup) : View.OnTouchListener,
|
||||
}
|
||||
|
||||
override fun onFling(
|
||||
e1: MotionEvent,
|
||||
e1: MotionEvent?,
|
||||
e2: MotionEvent,
|
||||
velocityX: Float,
|
||||
velocityY: Float
|
||||
|
||||
@@ -20,10 +20,12 @@
|
||||
package com.kunzisoft.keepass.activities
|
||||
|
||||
import android.content.pm.PackageManager.NameNotFoundException
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import android.text.method.LinkMovementMethod
|
||||
import android.util.Log
|
||||
import android.view.MenuItem
|
||||
import android.view.View
|
||||
import android.widget.TextView
|
||||
import androidx.appcompat.widget.Toolbar
|
||||
import androidx.core.text.HtmlCompat
|
||||
@@ -76,6 +78,9 @@ class AboutActivity : StylishActivity() {
|
||||
movementMethod = LinkMovementMethod.getInstance()
|
||||
text = HtmlCompat.fromHtml(getString(R.string.html_about_licence, DateTime().year),
|
||||
HtmlCompat.FROM_HTML_MODE_LEGACY)
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
|
||||
textDirection = View.TEXT_DIRECTION_ANY_RTL
|
||||
}
|
||||
}
|
||||
|
||||
findViewById<TextView>(R.id.activity_about_privacy_text).apply {
|
||||
|
||||
@@ -41,11 +41,9 @@ import com.kunzisoft.keepass.database.ContextualDatabase
|
||||
import com.kunzisoft.keepass.database.helper.SearchHelper
|
||||
import com.kunzisoft.keepass.model.RegisterInfo
|
||||
import com.kunzisoft.keepass.model.SearchInfo
|
||||
import com.kunzisoft.keepass.settings.PreferencesUtil
|
||||
import com.kunzisoft.keepass.utils.WebDomain
|
||||
import com.kunzisoft.keepass.utils.getParcelableCompat
|
||||
import com.kunzisoft.keepass.utils.getParcelableExtraCompat
|
||||
import com.kunzisoft.keepass.utils.WebDomain
|
||||
import java.lang.RuntimeException
|
||||
|
||||
@RequiresApi(api = Build.VERSION_CODES.O)
|
||||
class AutofillLauncherActivity : DatabaseModeActivity() {
|
||||
@@ -126,83 +124,85 @@ class AutofillLauncherActivity : DatabaseModeActivity() {
|
||||
if (autofillComponent == null) {
|
||||
setResult(Activity.RESULT_CANCELED)
|
||||
finish()
|
||||
} else if (!KeeAutofillService.autofillAllowedFor(searchInfo.applicationId,
|
||||
PreferencesUtil.applicationIdBlocklist(this))
|
||||
|| !KeeAutofillService.autofillAllowedFor(searchInfo.webDomain,
|
||||
PreferencesUtil.webDomainBlocklist(this))) {
|
||||
} else if (KeeAutofillService.autofillAllowedFor(
|
||||
applicationId = searchInfo.applicationId,
|
||||
webDomain = searchInfo.webDomain,
|
||||
context = this
|
||||
)) {
|
||||
// If database is open
|
||||
SearchHelper.checkAutoSearchInfo(this,
|
||||
database,
|
||||
searchInfo,
|
||||
{ openedDatabase, items ->
|
||||
// Items found
|
||||
AutofillHelper.buildResponseAndSetResult(this, openedDatabase, items)
|
||||
finish()
|
||||
},
|
||||
{ openedDatabase ->
|
||||
// Show the database UI to select the entry
|
||||
GroupActivity.launchForAutofillResult(this,
|
||||
openedDatabase,
|
||||
mAutofillActivityResultLauncher,
|
||||
autofillComponent,
|
||||
searchInfo,
|
||||
false)
|
||||
},
|
||||
{
|
||||
// If database not open
|
||||
FileDatabaseSelectActivity.launchForAutofillResult(this,
|
||||
mAutofillActivityResultLauncher,
|
||||
autofillComponent,
|
||||
searchInfo)
|
||||
}
|
||||
)
|
||||
} else {
|
||||
showBlockRestartMessage()
|
||||
setResult(Activity.RESULT_CANCELED)
|
||||
finish()
|
||||
} else {
|
||||
// If database is open
|
||||
SearchHelper.checkAutoSearchInfo(this,
|
||||
database,
|
||||
searchInfo,
|
||||
{ openedDatabase, items ->
|
||||
// Items found
|
||||
AutofillHelper.buildResponseAndSetResult(this, openedDatabase, items)
|
||||
finish()
|
||||
},
|
||||
{ openedDatabase ->
|
||||
// Show the database UI to select the entry
|
||||
GroupActivity.launchForAutofillResult(this,
|
||||
openedDatabase,
|
||||
mAutofillActivityResultLauncher,
|
||||
autofillComponent,
|
||||
searchInfo,
|
||||
false)
|
||||
},
|
||||
{
|
||||
// If database not open
|
||||
FileDatabaseSelectActivity.launchForAutofillResult(this,
|
||||
mAutofillActivityResultLauncher,
|
||||
autofillComponent,
|
||||
searchInfo)
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
private fun launchRegistration(database: ContextualDatabase?,
|
||||
searchInfo: SearchInfo,
|
||||
registerInfo: RegisterInfo?) {
|
||||
if (!KeeAutofillService.autofillAllowedFor(searchInfo.applicationId,
|
||||
PreferencesUtil.applicationIdBlocklist(this))
|
||||
|| !KeeAutofillService.autofillAllowedFor(searchInfo.webDomain,
|
||||
PreferencesUtil.webDomainBlocklist(this))) {
|
||||
showBlockRestartMessage()
|
||||
setResult(Activity.RESULT_CANCELED)
|
||||
} else {
|
||||
if (KeeAutofillService.autofillAllowedFor(
|
||||
applicationId = searchInfo.applicationId,
|
||||
webDomain = searchInfo.webDomain,
|
||||
context = this
|
||||
)) {
|
||||
val readOnly = database?.isReadOnly != false
|
||||
SearchHelper.checkAutoSearchInfo(this,
|
||||
database,
|
||||
searchInfo,
|
||||
{ openedDatabase, _ ->
|
||||
if (!readOnly) {
|
||||
// Show the database UI to select the entry
|
||||
GroupActivity.launchForRegistration(this,
|
||||
openedDatabase,
|
||||
registerInfo)
|
||||
} else {
|
||||
showReadOnlySaveMessage()
|
||||
}
|
||||
},
|
||||
{ openedDatabase ->
|
||||
if (!readOnly) {
|
||||
// Show the database UI to select the entry
|
||||
GroupActivity.launchForRegistration(this,
|
||||
openedDatabase,
|
||||
registerInfo)
|
||||
} else {
|
||||
showReadOnlySaveMessage()
|
||||
}
|
||||
},
|
||||
{
|
||||
// If database not open
|
||||
FileDatabaseSelectActivity.launchForRegistration(this,
|
||||
registerInfo)
|
||||
database,
|
||||
searchInfo,
|
||||
{ openedDatabase, _ ->
|
||||
if (!readOnly) {
|
||||
// Show the database UI to select the entry
|
||||
GroupActivity.launchForRegistration(this,
|
||||
openedDatabase,
|
||||
registerInfo)
|
||||
} else {
|
||||
showReadOnlySaveMessage()
|
||||
}
|
||||
},
|
||||
{ openedDatabase ->
|
||||
if (!readOnly) {
|
||||
// Show the database UI to select the entry
|
||||
GroupActivity.launchForRegistration(this,
|
||||
openedDatabase,
|
||||
registerInfo)
|
||||
} else {
|
||||
showReadOnlySaveMessage()
|
||||
}
|
||||
},
|
||||
{
|
||||
// If database not open
|
||||
FileDatabaseSelectActivity.launchForRegistration(this,
|
||||
registerInfo)
|
||||
}
|
||||
)
|
||||
} else {
|
||||
showBlockRestartMessage()
|
||||
setResult(Activity.RESULT_CANCELED)
|
||||
}
|
||||
finish()
|
||||
}
|
||||
|
||||
@@ -30,7 +30,6 @@ import android.util.Log
|
||||
import android.view.Menu
|
||||
import android.view.MenuItem
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.AdapterView
|
||||
import android.widget.ProgressBar
|
||||
import android.widget.Spinner
|
||||
@@ -73,6 +72,7 @@ import com.kunzisoft.keepass.database.element.template.Template
|
||||
import com.kunzisoft.keepass.education.EntryEditActivityEducation
|
||||
import com.kunzisoft.keepass.magikeyboard.MagikeyboardService
|
||||
import com.kunzisoft.keepass.model.AttachmentState
|
||||
import com.kunzisoft.keepass.model.DataTime
|
||||
import com.kunzisoft.keepass.model.EntryAttachmentState
|
||||
import com.kunzisoft.keepass.model.RegisterInfo
|
||||
import com.kunzisoft.keepass.model.SearchInfo
|
||||
@@ -87,6 +87,7 @@ import com.kunzisoft.keepass.settings.PreferencesUtil
|
||||
import com.kunzisoft.keepass.tasks.ActionRunnable
|
||||
import com.kunzisoft.keepass.tasks.AttachmentFileBinderManager
|
||||
import com.kunzisoft.keepass.timeout.TimeoutHelper
|
||||
import com.kunzisoft.keepass.utils.TimeUtil.datePickerToDataDate
|
||||
import com.kunzisoft.keepass.utils.UriUtil.getDocumentFile
|
||||
import com.kunzisoft.keepass.utils.getParcelableExtraCompat
|
||||
import com.kunzisoft.keepass.view.ToolbarAction
|
||||
@@ -96,7 +97,7 @@ import com.kunzisoft.keepass.view.asError
|
||||
import com.kunzisoft.keepass.view.hideByFading
|
||||
import com.kunzisoft.keepass.view.setTransparentNavigationBar
|
||||
import com.kunzisoft.keepass.view.showActionErrorIfNeeded
|
||||
import com.kunzisoft.keepass.view.updateLockPaddingLeft
|
||||
import com.kunzisoft.keepass.view.updateLockPaddingStart
|
||||
import com.kunzisoft.keepass.viewmodels.ColorPickerViewModel
|
||||
import com.kunzisoft.keepass.viewmodels.EntryEditViewModel
|
||||
import java.util.UUID
|
||||
@@ -108,8 +109,8 @@ class EntryEditActivity : DatabaseLockActivity(),
|
||||
ReplaceFileDialogFragment.ActionChooseListener {
|
||||
|
||||
// Views
|
||||
private var footer: ViewGroup? = null
|
||||
private var container: ViewGroup? = null
|
||||
private var footer: View? = null
|
||||
private var container: View? = null
|
||||
private var coordinatorLayout: CoordinatorLayout? = null
|
||||
private var scrollView: NestedScrollView? = null
|
||||
private var templateSelectorSpinner: Spinner? = null
|
||||
@@ -179,8 +180,8 @@ class EntryEditActivity : DatabaseLockActivity(),
|
||||
|
||||
// To apply fit window with transparency
|
||||
setTransparentNavigationBar(applyToStatusBar = true) {
|
||||
container?.applyWindowInsets(WindowInsetPosition.TOP)
|
||||
footer?.applyWindowInsets(WindowInsetPosition.BOTTOM)
|
||||
container?.applyWindowInsets(WindowInsetPosition.TOP_BOTTOM_IME)
|
||||
footer?.applyWindowInsets(WindowInsetPosition.BOTTOM_IME)
|
||||
}
|
||||
|
||||
stopService(Intent(this, ClipboardEntryNotificationService::class.java))
|
||||
@@ -301,7 +302,7 @@ class EntryEditActivity : DatabaseLockActivity(),
|
||||
// Launch the time picker
|
||||
MaterialTimePicker.Builder().build().apply {
|
||||
addOnPositiveButtonClickListener {
|
||||
mEntryEditViewModel.selectTime(this.hour, this.minute)
|
||||
mEntryEditViewModel.selectTime(DataTime(this.hour, this.minute))
|
||||
}
|
||||
show(supportFragmentManager, "TimePickerFragment")
|
||||
}
|
||||
@@ -309,7 +310,7 @@ class EntryEditActivity : DatabaseLockActivity(),
|
||||
// Launch the date picker
|
||||
MaterialDatePicker.Builder.datePicker().build().apply {
|
||||
addOnPositiveButtonClickListener {
|
||||
mEntryEditViewModel.selectDate(it)
|
||||
mEntryEditViewModel.selectDate(datePickerToDataDate(it))
|
||||
}
|
||||
show(supportFragmentManager, "DatePickerFragment")
|
||||
}
|
||||
@@ -502,7 +503,7 @@ class EntryEditActivity : DatabaseLockActivity(),
|
||||
}
|
||||
|
||||
// Padding if lock button visible
|
||||
entryEditAddToolBar?.updateLockPaddingLeft()
|
||||
entryEditAddToolBar?.updateLockPaddingStart()
|
||||
|
||||
mAttachmentFileBinderManager?.apply {
|
||||
registerProgressTask()
|
||||
|
||||
@@ -68,11 +68,10 @@ import com.kunzisoft.keepass.tasks.ActionRunnable
|
||||
import com.kunzisoft.keepass.utils.DexUtil
|
||||
import com.kunzisoft.keepass.utils.MagikeyboardUtil
|
||||
import com.kunzisoft.keepass.utils.MenuUtil
|
||||
import com.kunzisoft.keepass.utils.getParcelableCompat
|
||||
import com.kunzisoft.keepass.utils.parseUri
|
||||
import com.kunzisoft.keepass.utils.UriUtil.isContributingUser
|
||||
import com.kunzisoft.keepass.utils.UriUtil.openUrl
|
||||
import com.kunzisoft.keepass.utils.allowCreateDocumentByStorageAccessFramework
|
||||
import com.kunzisoft.keepass.utils.getParcelableCompat
|
||||
import com.kunzisoft.keepass.view.asError
|
||||
import com.kunzisoft.keepass.view.showActionErrorIfNeeded
|
||||
import com.kunzisoft.keepass.viewmodels.DatabaseFilesViewModel
|
||||
@@ -180,17 +179,9 @@ class FileDatabaseSelectActivity : DatabaseModeActivity(),
|
||||
}
|
||||
fileDatabaseHistoryRecyclerView.adapter = mAdapterDatabaseHistory
|
||||
|
||||
// Load default database if not an orientation change
|
||||
if (!(savedInstanceState != null
|
||||
&& savedInstanceState.containsKey(EXTRA_STAY)
|
||||
&& savedInstanceState.getBoolean(EXTRA_STAY, false))) {
|
||||
val databasePath = PreferencesUtil.getDefaultDatabasePath(this)
|
||||
|
||||
databasePath?.parseUri()?.let { databaseFileUri ->
|
||||
launchPasswordActivityWithPath(databaseFileUri)
|
||||
} ?: run {
|
||||
Log.i(TAG, "No default database to prepare")
|
||||
}
|
||||
// Load default database the first time
|
||||
databaseFilesViewModel.doForDefaultDatabase { databaseFileUri ->
|
||||
launchPasswordActivityWithPath(databaseFileUri)
|
||||
}
|
||||
|
||||
// Retrieve the database URI provided by file manager after an orientation change
|
||||
@@ -366,8 +357,6 @@ class FileDatabaseSelectActivity : DatabaseModeActivity(),
|
||||
|
||||
override fun onSaveInstanceState(outState: Bundle) {
|
||||
super.onSaveInstanceState(outState)
|
||||
// only to keep the current activity
|
||||
outState.putBoolean(EXTRA_STAY, true)
|
||||
// to retrieve the URI of a created database after an orientation change
|
||||
outState.putParcelable(EXTRA_DATABASE_URI, mDatabaseFileUri)
|
||||
}
|
||||
@@ -442,7 +431,6 @@ class FileDatabaseSelectActivity : DatabaseModeActivity(),
|
||||
companion object {
|
||||
|
||||
private const val TAG = "FileDbSelectActivity"
|
||||
private const val EXTRA_STAY = "EXTRA_STAY"
|
||||
private const val EXTRA_DATABASE_URI = "EXTRA_DATABASE_URI"
|
||||
|
||||
/*
|
||||
|
||||
@@ -84,6 +84,7 @@ import com.kunzisoft.keepass.database.helper.SearchHelper
|
||||
import com.kunzisoft.keepass.database.search.SearchParameters
|
||||
import com.kunzisoft.keepass.education.GroupActivityEducation
|
||||
import com.kunzisoft.keepass.magikeyboard.MagikeyboardService
|
||||
import com.kunzisoft.keepass.model.DataTime
|
||||
import com.kunzisoft.keepass.model.GroupInfo
|
||||
import com.kunzisoft.keepass.model.RegisterInfo
|
||||
import com.kunzisoft.keepass.model.SearchInfo
|
||||
@@ -96,6 +97,7 @@ import com.kunzisoft.keepass.tasks.ActionRunnable
|
||||
import com.kunzisoft.keepass.timeout.TimeoutHelper
|
||||
import com.kunzisoft.keepass.utils.BACK_PREVIOUS_KEYBOARD_ACTION
|
||||
import com.kunzisoft.keepass.utils.KeyboardUtil.showKeyboard
|
||||
import com.kunzisoft.keepass.utils.TimeUtil.datePickerToDataDate
|
||||
import com.kunzisoft.keepass.utils.UriUtil.openUrl
|
||||
import com.kunzisoft.keepass.utils.getParcelableCompat
|
||||
import com.kunzisoft.keepass.utils.getParcelableExtraCompat
|
||||
@@ -111,9 +113,10 @@ import com.kunzisoft.keepass.view.applyWindowInsets
|
||||
import com.kunzisoft.keepass.view.hideByFading
|
||||
import com.kunzisoft.keepass.view.setTransparentNavigationBar
|
||||
import com.kunzisoft.keepass.view.showActionErrorIfNeeded
|
||||
import com.kunzisoft.keepass.view.updateLockPaddingLeft
|
||||
import com.kunzisoft.keepass.view.updateLockPaddingStart
|
||||
import com.kunzisoft.keepass.viewmodels.GroupEditViewModel
|
||||
import com.kunzisoft.keepass.viewmodels.GroupViewModel
|
||||
import org.joda.time.LocalDateTime
|
||||
|
||||
|
||||
class GroupActivity : DatabaseLockActivity(),
|
||||
@@ -292,10 +295,9 @@ class GroupActivity : DatabaseLockActivity(),
|
||||
loadingView = findViewById(R.id.loading)
|
||||
|
||||
// To apply fit window with transparency
|
||||
setTransparentNavigationBar {
|
||||
header?.applyWindowInsets(WindowInsetPosition.TOP)
|
||||
coordinatorLayout?.applyWindowInsets(WindowInsetPosition.LEGIT_TOP)
|
||||
footer?.applyWindowInsets(WindowInsetPosition.BOTTOM)
|
||||
setTransparentNavigationBar(applyToStatusBar = true) {
|
||||
drawerLayout?.applyWindowInsets(WindowInsetPosition.TOP_BOTTOM_IME)
|
||||
footer?.applyWindowInsets(WindowInsetPosition.BOTTOM_IME)
|
||||
}
|
||||
|
||||
lockView?.setOnClickListener {
|
||||
@@ -340,8 +342,9 @@ class GroupActivity : DatabaseLockActivity(),
|
||||
R.id.menu_save_copy_to -> {
|
||||
mExternalFileHelper?.createDocument(
|
||||
getString(R.string.database_file_name_default) +
|
||||
getString(R.string.database_file_name_copy) +
|
||||
mDatabase?.defaultFileExtension)
|
||||
"_" +
|
||||
LocalDateTime.now().toString() +
|
||||
mDatabase?.defaultFileExtension)
|
||||
}
|
||||
R.id.menu_lock_all -> {
|
||||
lockAndExit()
|
||||
@@ -359,43 +362,6 @@ class GroupActivity : DatabaseLockActivity(),
|
||||
|
||||
searchFiltersView?.closeAdvancedFilters()
|
||||
|
||||
mBreadcrumbAdapter = BreadcrumbAdapter(this).apply {
|
||||
// Open group on breadcrumb click
|
||||
onItemClickListener = { node, _ ->
|
||||
// If last item & not a virtual root group
|
||||
val currentGroup = mMainGroup
|
||||
if (currentGroup != null && node == currentGroup
|
||||
&& (currentGroup != mDatabase?.rootGroup
|
||||
|| mDatabase?.rootGroupIsVirtual == false)
|
||||
) {
|
||||
finishNodeAction()
|
||||
launchDialogToShowGroupInfo(currentGroup)
|
||||
} else {
|
||||
if (mGroupFragment?.nodeActionSelectionMode == true) {
|
||||
finishNodeAction()
|
||||
}
|
||||
mDatabase?.let { database ->
|
||||
onNodeClick(database, node)
|
||||
}
|
||||
}
|
||||
}
|
||||
onLongItemClickListener = { node, position ->
|
||||
val currentGroup = mMainGroup
|
||||
if (currentGroup != null && node == currentGroup
|
||||
&& (currentGroup != mDatabase?.rootGroup
|
||||
|| mDatabase?.rootGroupIsVirtual == false)
|
||||
) {
|
||||
finishNodeAction()
|
||||
launchDialogForGroupUpdate(currentGroup)
|
||||
} else {
|
||||
onItemClickListener?.invoke(node, position)
|
||||
}
|
||||
}
|
||||
}
|
||||
breadcrumbListView?.apply {
|
||||
adapter = mBreadcrumbAdapter
|
||||
}
|
||||
|
||||
// Retrieve group if defined at launch
|
||||
manageIntent(intent)
|
||||
|
||||
@@ -476,7 +442,7 @@ class GroupActivity : DatabaseLockActivity(),
|
||||
// Launch the time picker
|
||||
MaterialTimePicker.Builder().build().apply {
|
||||
addOnPositiveButtonClickListener {
|
||||
mGroupEditViewModel.selectTime(this.hour, this.minute)
|
||||
mGroupEditViewModel.selectTime(DataTime(this.hour, this.minute))
|
||||
}
|
||||
show(supportFragmentManager, "TimePickerFragment")
|
||||
}
|
||||
@@ -484,7 +450,7 @@ class GroupActivity : DatabaseLockActivity(),
|
||||
// Launch the date picker
|
||||
MaterialDatePicker.Builder.datePicker().build().apply {
|
||||
addOnPositiveButtonClickListener {
|
||||
mGroupEditViewModel.selectDate(it)
|
||||
mGroupEditViewModel.selectDate(datePickerToDataDate(it))
|
||||
}
|
||||
show(supportFragmentManager, "DatePickerFragment")
|
||||
}
|
||||
@@ -617,6 +583,43 @@ class GroupActivity : DatabaseLockActivity(),
|
||||
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
|
||||
super.onDatabaseRetrieved(database)
|
||||
|
||||
mBreadcrumbAdapter = BreadcrumbAdapter(this, database).apply {
|
||||
// Open group on breadcrumb click
|
||||
onItemClickListener = { node, _ ->
|
||||
// If last item & not a virtual root group
|
||||
val currentGroup = mMainGroup
|
||||
if (currentGroup != null && node == currentGroup
|
||||
&& (currentGroup != mDatabase?.rootGroup
|
||||
|| mDatabase?.rootGroupIsVirtual == false)
|
||||
) {
|
||||
finishNodeAction()
|
||||
launchDialogToShowGroupInfo(currentGroup)
|
||||
} else {
|
||||
if (mGroupFragment?.nodeActionSelectionMode == true) {
|
||||
finishNodeAction()
|
||||
}
|
||||
mDatabase?.let { database ->
|
||||
onNodeClick(database, node)
|
||||
}
|
||||
}
|
||||
}
|
||||
onLongItemClickListener = { node, position ->
|
||||
val currentGroup = mMainGroup
|
||||
if (currentGroup != null && node == currentGroup
|
||||
&& (currentGroup != mDatabase?.rootGroup
|
||||
|| mDatabase?.rootGroupIsVirtual == false)
|
||||
) {
|
||||
finishNodeAction()
|
||||
launchDialogForGroupUpdate(currentGroup)
|
||||
} else {
|
||||
onItemClickListener?.invoke(node, position)
|
||||
}
|
||||
}
|
||||
}
|
||||
breadcrumbListView?.apply {
|
||||
adapter = mBreadcrumbAdapter
|
||||
}
|
||||
|
||||
mGroupEditViewModel.setGroupNamesNotAllowed(database?.groupNamesNotAllowed)
|
||||
|
||||
mRecyclingBinEnabled = !mDatabaseReadOnly
|
||||
@@ -1127,7 +1130,7 @@ class GroupActivity : DatabaseLockActivity(),
|
||||
View.GONE
|
||||
}
|
||||
// Padding if lock button visible
|
||||
toolbarAction?.updateLockPaddingLeft()
|
||||
toolbarAction?.updateLockPaddingStart()
|
||||
|
||||
loadGroup()
|
||||
}
|
||||
|
||||
@@ -51,7 +51,7 @@ import com.kunzisoft.keepass.utils.getParcelableExtraCompat
|
||||
import com.kunzisoft.keepass.utils.UriUtil.getDocumentFile
|
||||
import com.kunzisoft.keepass.utils.UriUtil.openUrl
|
||||
import com.kunzisoft.keepass.view.asError
|
||||
import com.kunzisoft.keepass.view.updateLockPaddingLeft
|
||||
import com.kunzisoft.keepass.view.updateLockPaddingStart
|
||||
import com.kunzisoft.keepass.viewmodels.IconPickerViewModel
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Deferred
|
||||
@@ -212,7 +212,7 @@ class IconPickerActivity : DatabaseLockActivity() {
|
||||
}
|
||||
|
||||
// Padding if lock button visible
|
||||
toolbar.updateLockPaddingLeft()
|
||||
toolbar.updateLockPaddingStart()
|
||||
}
|
||||
|
||||
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
|
||||
|
||||
@@ -18,7 +18,7 @@ import com.kunzisoft.keepass.R
|
||||
import com.kunzisoft.keepass.activities.fragments.KeyGeneratorFragment
|
||||
import com.kunzisoft.keepass.activities.legacy.DatabaseLockActivity
|
||||
import com.kunzisoft.keepass.settings.PreferencesUtil
|
||||
import com.kunzisoft.keepass.view.updateLockPaddingLeft
|
||||
import com.kunzisoft.keepass.view.updateLockPaddingStart
|
||||
import com.kunzisoft.keepass.viewmodels.KeyGeneratorViewModel
|
||||
|
||||
class KeyGeneratorActivity : DatabaseLockActivity() {
|
||||
@@ -84,7 +84,7 @@ class KeyGeneratorActivity : DatabaseLockActivity() {
|
||||
}
|
||||
|
||||
// Padding if lock button visible
|
||||
toolbar.updateLockPaddingLeft()
|
||||
toolbar.updateLockPaddingStart()
|
||||
}
|
||||
|
||||
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
|
||||
|
||||
@@ -32,7 +32,6 @@ import android.view.MenuItem
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.Button
|
||||
import android.widget.CompoundButton
|
||||
import android.widget.TextView
|
||||
import android.widget.Toast
|
||||
import androidx.activity.result.ActivityResultLauncher
|
||||
@@ -43,6 +42,9 @@ import androidx.appcompat.widget.Toolbar
|
||||
import androidx.biometric.BiometricManager
|
||||
import androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||
import androidx.fragment.app.commit
|
||||
import androidx.lifecycle.Lifecycle
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import androidx.lifecycle.repeatOnLifecycle
|
||||
import com.google.android.material.snackbar.Snackbar
|
||||
import com.kunzisoft.keepass.R
|
||||
import com.kunzisoft.keepass.activities.dialogs.DuplicateUuidDialog
|
||||
@@ -81,10 +83,11 @@ import com.kunzisoft.keepass.view.asError
|
||||
import com.kunzisoft.keepass.view.showActionErrorIfNeeded
|
||||
import com.kunzisoft.keepass.viewmodels.AdvancedUnlockViewModel
|
||||
import com.kunzisoft.keepass.viewmodels.DatabaseFileViewModel
|
||||
import kotlinx.coroutines.launch
|
||||
import java.io.FileNotFoundException
|
||||
|
||||
|
||||
class MainCredentialActivity : DatabaseModeActivity(), AdvancedUnlockFragment.BuilderListener {
|
||||
class MainCredentialActivity : DatabaseModeActivity() {
|
||||
|
||||
// Views
|
||||
private var toolbar: Toolbar? = null
|
||||
@@ -166,21 +169,13 @@ class MainCredentialActivity : DatabaseModeActivity(), AdvancedUnlockFragment.Bu
|
||||
}
|
||||
|
||||
// Listen password checkbox to init advanced unlock and confirmation button
|
||||
mainCredentialView?.onPasswordChecked =
|
||||
CompoundButton.OnCheckedChangeListener { _, _ ->
|
||||
mAdvancedUnlockViewModel.checkUnlockAvailability()
|
||||
enableConfirmationButton()
|
||||
}
|
||||
mainCredentialView?.onKeyFileChecked =
|
||||
CompoundButton.OnCheckedChangeListener { _, _ ->
|
||||
// TODO mAdvancedUnlockViewModel.checkUnlockAvailability()
|
||||
enableConfirmationButton()
|
||||
}
|
||||
mainCredentialView?.onHardwareKeyChecked =
|
||||
CompoundButton.OnCheckedChangeListener { _, _ ->
|
||||
// TODO mAdvancedUnlockViewModel.checkUnlockAvailability()
|
||||
enableConfirmationButton()
|
||||
}
|
||||
mainCredentialView?.onConditionToStoreCredentialChanged = { _, verified ->
|
||||
mAdvancedUnlockViewModel.checkUnlockAvailability(
|
||||
conditionToStoreCredentialVerified = verified
|
||||
)
|
||||
// TODO Async by ViewModel
|
||||
enableConfirmationButton()
|
||||
}
|
||||
|
||||
// Observe if default database
|
||||
mDatabaseFileViewModel.isDefaultDatabase.observe(this) { isDefaultDatabase ->
|
||||
@@ -228,13 +223,34 @@ class MainCredentialActivity : DatabaseModeActivity(), AdvancedUnlockFragment.Bu
|
||||
|
||||
onDatabaseFileLoaded(databaseFile?.databaseUri, keyFileUri, hardwareKey)
|
||||
}
|
||||
|
||||
lifecycleScope.launch {
|
||||
repeatOnLifecycle(Lifecycle.State.STARTED) {
|
||||
mAdvancedUnlockViewModel.uiState.collect { uiState ->
|
||||
// New value received
|
||||
if (uiState.isCredentialRequired) {
|
||||
mAdvancedUnlockViewModel.provideCredentialForEncryption(
|
||||
getCredentialForEncryption()
|
||||
)
|
||||
}
|
||||
uiState.cipherEncryptDatabase?.let { cipherEncryptDatabase ->
|
||||
onCredentialEncrypted(cipherEncryptDatabase)
|
||||
mAdvancedUnlockViewModel.consumeCredentialEncrypted()
|
||||
}
|
||||
uiState.cipherDecryptDatabase?.let { cipherDecryptDatabase ->
|
||||
onCredentialDecrypted(cipherDecryptDatabase)
|
||||
mAdvancedUnlockViewModel.consumeCredentialDecrypted()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
|
||||
// Init Biometric elements only if allowed
|
||||
if (PreferencesUtil.isBiometricUnlockEnable(this)) {
|
||||
if (PreferencesUtil.isAdvancedUnlockEnable(this)) {
|
||||
advancedUnlockFragment = supportFragmentManager
|
||||
.findFragmentByTag(UNLOCK_FRAGMENT_TAG) as? AdvancedUnlockFragment?
|
||||
if (advancedUnlockFragment == null) {
|
||||
@@ -296,9 +312,6 @@ class MainCredentialActivity : DatabaseModeActivity(), AdvancedUnlockFragment.Bu
|
||||
super.onDatabaseActionFinished(database, actionTask, result)
|
||||
when (actionTask) {
|
||||
ACTION_DATABASE_LOAD_TASK -> {
|
||||
// Recheck advanced unlock if error
|
||||
mAdvancedUnlockViewModel.initAdvancedUnlockMode()
|
||||
|
||||
if (result.isSuccess) {
|
||||
launchGroupActivityIfLoaded(database)
|
||||
} else {
|
||||
@@ -400,23 +413,6 @@ class MainCredentialActivity : DatabaseModeActivity(), AdvancedUnlockFragment.Bu
|
||||
}
|
||||
}
|
||||
|
||||
override fun retrieveCredentialForEncryption(): ByteArray {
|
||||
return mainCredentialView?.retrieveCredentialForStorage(credentialStorageListener)
|
||||
?: byteArrayOf()
|
||||
}
|
||||
|
||||
override fun conditionToStoreCredential(): Boolean {
|
||||
return mainCredentialView?.conditionToStoreCredential() == true
|
||||
}
|
||||
|
||||
override fun onCredentialEncrypted(cipherEncryptDatabase: CipherEncryptDatabase) {
|
||||
// Load the database if password is registered with biometric
|
||||
loadDatabase(mDatabaseFileUri,
|
||||
mainCredentialView?.getMainCredential(),
|
||||
cipherEncryptDatabase
|
||||
)
|
||||
}
|
||||
|
||||
private val credentialStorageListener = object: MainCredentialView.CredentialStorageListener {
|
||||
override fun passwordToStore(password: String?): ByteArray? {
|
||||
return password?.toByteArray()
|
||||
@@ -433,7 +429,20 @@ class MainCredentialActivity : DatabaseModeActivity(), AdvancedUnlockFragment.Bu
|
||||
}
|
||||
}
|
||||
|
||||
override fun onCredentialDecrypted(cipherDecryptDatabase: CipherDecryptDatabase) {
|
||||
private fun getCredentialForEncryption(): ByteArray {
|
||||
return mainCredentialView?.retrieveCredentialForStorage(credentialStorageListener)
|
||||
?: byteArrayOf()
|
||||
}
|
||||
|
||||
private fun onCredentialEncrypted(cipherEncryptDatabase: CipherEncryptDatabase) {
|
||||
// Load the database if password is registered with biometric
|
||||
loadDatabase(mDatabaseFileUri,
|
||||
mainCredentialView?.getMainCredential(),
|
||||
cipherEncryptDatabase
|
||||
)
|
||||
}
|
||||
|
||||
private fun onCredentialDecrypted(cipherDecryptDatabase: CipherDecryptDatabase) {
|
||||
// Load the database if password is retrieve from biometric
|
||||
// Retrieve from biometric
|
||||
val mainCredential = mainCredentialView?.getMainCredential() ?: MainCredential()
|
||||
|
||||
@@ -43,6 +43,7 @@ class DatabaseChangedDialogFragment : DatabaseDialogFragment() {
|
||||
|
||||
val oldSnapFileDatabaseInfo: SnapFileDatabaseInfo? = arguments?.getParcelableCompat(OLD_FILE_DATABASE_INFO)
|
||||
val newSnapFileDatabaseInfo: SnapFileDatabaseInfo? = arguments?.getParcelableCompat(NEW_FILE_DATABASE_INFO)
|
||||
val readOnlyDatabase: Boolean = arguments?.getBoolean(READ_ONLY_DATABASE) ?: true
|
||||
|
||||
if (oldSnapFileDatabaseInfo != null && newSnapFileDatabaseInfo != null) {
|
||||
// Use the Builder class for convenient dialog construction
|
||||
@@ -54,7 +55,13 @@ class DatabaseChangedDialogFragment : DatabaseDialogFragment() {
|
||||
stringBuilder.append("\n\n" +oldSnapFileDatabaseInfo.toString(activity)
|
||||
+ "\n→\n" +
|
||||
newSnapFileDatabaseInfo.toString(activity) + "\n\n")
|
||||
stringBuilder.append(getString(R.string.warning_database_info_changed_options))
|
||||
stringBuilder.append(getString(
|
||||
if (readOnlyDatabase) {
|
||||
R.string.warning_database_info_changed_options_read_only
|
||||
} else {
|
||||
R.string.warning_database_info_changed_options
|
||||
}
|
||||
))
|
||||
} else {
|
||||
stringBuilder.append(getString(R.string.warning_database_revoked))
|
||||
}
|
||||
@@ -77,15 +84,18 @@ class DatabaseChangedDialogFragment : DatabaseDialogFragment() {
|
||||
const val DATABASE_CHANGED_DIALOG_TAG = "databaseChangedDialogFragment"
|
||||
private const val OLD_FILE_DATABASE_INFO = "OLD_FILE_DATABASE_INFO"
|
||||
private const val NEW_FILE_DATABASE_INFO = "NEW_FILE_DATABASE_INFO"
|
||||
private const val READ_ONLY_DATABASE = "READ_ONLY_DATABASE"
|
||||
|
||||
fun getInstance(oldSnapFileDatabaseInfo: SnapFileDatabaseInfo,
|
||||
newSnapFileDatabaseInfo: SnapFileDatabaseInfo
|
||||
newSnapFileDatabaseInfo: SnapFileDatabaseInfo,
|
||||
readOnly: Boolean
|
||||
)
|
||||
: DatabaseChangedDialogFragment {
|
||||
val fragment = DatabaseChangedDialogFragment()
|
||||
fragment.arguments = Bundle().apply {
|
||||
putParcelable(OLD_FILE_DATABASE_INFO, oldSnapFileDatabaseInfo)
|
||||
putParcelable(NEW_FILE_DATABASE_INFO, newSnapFileDatabaseInfo)
|
||||
putBoolean(READ_ONLY_DATABASE, readOnly)
|
||||
}
|
||||
return fragment
|
||||
}
|
||||
|
||||
@@ -1,11 +1,14 @@
|
||||
package com.kunzisoft.keepass.activities.dialogs
|
||||
|
||||
import android.os.Bundle
|
||||
import android.view.View
|
||||
import android.view.WindowManager.LayoutParams.FLAG_SECURE
|
||||
import androidx.fragment.app.DialogFragment
|
||||
import androidx.fragment.app.activityViewModels
|
||||
import com.kunzisoft.keepass.activities.legacy.DatabaseRetrieval
|
||||
import com.kunzisoft.keepass.activities.legacy.resetAppTimeoutWhenViewTouchedOrFocused
|
||||
import com.kunzisoft.keepass.database.ContextualDatabase
|
||||
import com.kunzisoft.keepass.settings.PreferencesUtil
|
||||
import com.kunzisoft.keepass.tasks.ActionRunnable
|
||||
import com.kunzisoft.keepass.timeout.TimeoutHelper
|
||||
import com.kunzisoft.keepass.viewmodels.DatabaseViewModel
|
||||
@@ -29,6 +32,18 @@ abstract class DatabaseDialogFragment : DialogFragment(), DatabaseRetrieval {
|
||||
}
|
||||
}
|
||||
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
// Screenshot mode or hide views
|
||||
context?.let {
|
||||
if (PreferencesUtil.isScreenshotModeEnabled(it)) {
|
||||
dialog?.window?.clearFlags(FLAG_SECURE)
|
||||
} else {
|
||||
dialog?.window?.setFlags(FLAG_SECURE, FLAG_SECURE)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Suppress("DEPRECATION")
|
||||
override fun onActivityCreated(savedInstanceState: Bundle?) {
|
||||
super.onActivityCreated(savedInstanceState)
|
||||
|
||||
@@ -45,7 +45,6 @@ import com.kunzisoft.keepass.view.InheritedCompletionView
|
||||
import com.kunzisoft.keepass.view.TagsCompletionView
|
||||
import com.kunzisoft.keepass.viewmodels.GroupEditViewModel
|
||||
import com.tokenautocomplete.FilteredArrayAdapter
|
||||
import org.joda.time.DateTime
|
||||
|
||||
class GroupEditDialogFragment : DatabaseDialogFragment() {
|
||||
|
||||
@@ -90,27 +89,21 @@ class GroupEditDialogFragment : DatabaseDialogFragment() {
|
||||
mPopulateIconMethod?.invoke(iconButtonView, mGroupInfo.icon)
|
||||
}
|
||||
|
||||
mGroupEditViewModel.onDateSelected.observe(this) { dateMilliseconds ->
|
||||
mGroupEditViewModel.onDateSelected.observe(this) { date ->
|
||||
// Save the date
|
||||
mGroupInfo.expiryTime = DateInstant(
|
||||
DateTime(mGroupInfo.expiryTime.date)
|
||||
.withMillis(dateMilliseconds)
|
||||
.toDate())
|
||||
mGroupInfo.expiryTime.setDate(date.year, date.month, date.day)
|
||||
expirationView.dateTime = mGroupInfo.expiryTime
|
||||
if (expirationView.dateTime.type == DateInstant.Type.DATE_TIME) {
|
||||
val instantTime = DateInstant(mGroupInfo.expiryTime.date, DateInstant.Type.TIME)
|
||||
// Trick to recall selection with time
|
||||
mGroupEditViewModel.requestDateTimeSelection(instantTime)
|
||||
mGroupEditViewModel.requestDateTimeSelection(
|
||||
DateInstant(mGroupInfo.expiryTime.instant, DateInstant.Type.TIME)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
mGroupEditViewModel.onTimeSelected.observe(this) { viewModelTime ->
|
||||
// Save the time
|
||||
mGroupInfo.expiryTime = DateInstant(
|
||||
DateTime(mGroupInfo.expiryTime.date)
|
||||
.withHourOfDay(viewModelTime.hours)
|
||||
.withMinuteOfHour(viewModelTime.minutes)
|
||||
.toDate(), mGroupInfo.expiryTime.type)
|
||||
mGroupInfo.expiryTime.setTime(viewModelTime.hour, viewModelTime.minute)
|
||||
expirationView.dateTime = mGroupInfo.expiryTime
|
||||
}
|
||||
|
||||
@@ -255,11 +248,7 @@ class GroupEditDialogFragment : DatabaseDialogFragment() {
|
||||
|
||||
private fun retrieveGroupInfoFromViews() {
|
||||
mGroupInfo.title = nameTextView.text.toString()
|
||||
// Only if there
|
||||
val newNotes = notesTextView.text.toString()
|
||||
if (newNotes.isNotEmpty()) {
|
||||
mGroupInfo.notes = newNotes
|
||||
}
|
||||
mGroupInfo.notes = notesTextView.text?.toString()
|
||||
mGroupInfo.expires = expirationView.activation
|
||||
mGroupInfo.expiryTime = expirationView.dateTime
|
||||
mGroupInfo.searchable = searchableView.getValue()
|
||||
|
||||
@@ -43,8 +43,13 @@ import com.kunzisoft.keepass.utils.UriUtil.getDocumentFile
|
||||
import com.kunzisoft.keepass.utils.UriUtil.openUrl
|
||||
import com.kunzisoft.keepass.view.HardwareKeySelectionView
|
||||
import com.kunzisoft.keepass.view.KeyFileSelectionView
|
||||
import com.kunzisoft.keepass.view.PassKeyView
|
||||
import com.kunzisoft.keepass.view.PasswordEditView
|
||||
import com.kunzisoft.keepass.view.applyFontVisibility
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import java.security.SecureRandom
|
||||
|
||||
|
||||
class SetMainCredentialDialogFragment : DatabaseDialogFragment() {
|
||||
|
||||
@@ -55,11 +60,12 @@ class SetMainCredentialDialogFragment : DatabaseDialogFragment() {
|
||||
private lateinit var rootView: View
|
||||
|
||||
private lateinit var passwordCheckBox: CompoundButton
|
||||
private lateinit var passwordView: PassKeyView
|
||||
private lateinit var passwordEditView: PasswordEditView
|
||||
private lateinit var passwordRepeatTextInputLayout: TextInputLayout
|
||||
private lateinit var passwordRepeatView: TextView
|
||||
|
||||
private lateinit var keyFileCheckBox: CompoundButton
|
||||
private lateinit var keyFileGenerateButton: View
|
||||
private lateinit var keyFileSelectionView: KeyFileSelectionView
|
||||
|
||||
private lateinit var hardwareKeyCheckBox: CompoundButton
|
||||
@@ -141,30 +147,40 @@ class SetMainCredentialDialogFragment : DatabaseDialogFragment() {
|
||||
}
|
||||
|
||||
passwordCheckBox = rootView.findViewById(R.id.password_checkbox)
|
||||
passwordView = rootView.findViewById(R.id.password_view)
|
||||
passwordEditView = rootView.findViewById(R.id.password_view)
|
||||
passwordRepeatTextInputLayout = rootView.findViewById(R.id.password_repeat_input_layout)
|
||||
passwordRepeatView = rootView.findViewById(R.id.password_confirmation)
|
||||
passwordRepeatView.applyFontVisibility()
|
||||
|
||||
keyFileCheckBox = rootView.findViewById(R.id.keyfile_checkbox)
|
||||
keyFileGenerateButton = rootView.findViewById(R.id.keyfile_generate)
|
||||
keyFileSelectionView = rootView.findViewById(R.id.keyfile_selection)
|
||||
|
||||
hardwareKeyCheckBox = rootView.findViewById(R.id.hardware_key_checkbox)
|
||||
hardwareKeySelectionView = rootView.findViewById(R.id.hardware_key_selection)
|
||||
|
||||
mExternalFileHelper = ExternalFileHelper(this)
|
||||
mExternalFileHelper?.buildCreateDocument { createdFileUri ->
|
||||
createdFileUri?.let { uri ->
|
||||
createKeyFile(uri)
|
||||
keyFileSelectionView.error = null
|
||||
keyFileCheckBox.isChecked = true
|
||||
keyFileSelectionView.uri = uri
|
||||
}
|
||||
}
|
||||
mExternalFileHelper?.buildOpenDocument { uri ->
|
||||
uri?.let { pathUri ->
|
||||
pathUri.getDocumentFile(requireContext())?.length()?.let { lengthFile ->
|
||||
keyFileSelectionView.error = null
|
||||
keyFileCheckBox.isChecked = true
|
||||
keyFileSelectionView.uri = pathUri
|
||||
if (lengthFile <= 0L) {
|
||||
showEmptyKeyFileConfirmationDialog()
|
||||
}
|
||||
showLengthKeyFileConfirmationDialog(lengthFile)
|
||||
}
|
||||
}
|
||||
}
|
||||
keyFileGenerateButton.setOnClickListener {
|
||||
mExternalFileHelper?.createDocument(DEFAULT_KEYFILE_NAME)
|
||||
}
|
||||
keyFileSelectionView.setOpenDocumentClickListener(mExternalFileHelper)
|
||||
|
||||
hardwareKeySelectionView.selectionListener = { hardwareKey ->
|
||||
@@ -202,6 +218,16 @@ class SetMainCredentialDialogFragment : DatabaseDialogFragment() {
|
||||
return super.onCreateDialog(savedInstanceState)
|
||||
}
|
||||
|
||||
private fun createKeyFile(uri: Uri) {
|
||||
CoroutineScope(Dispatchers.IO).launch {
|
||||
activity?.contentResolver?.openOutputStream(uri)?.use { outputStream ->
|
||||
val randomBytes = ByteArray(DEFAULT_KEYFILE_SIZE)
|
||||
SecureRandom().nextBytes(randomBytes)
|
||||
outputStream.write(randomBytes)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun approveMainCredential() {
|
||||
val errorPassword = verifyPassword()
|
||||
val errorKeyFile = verifyKeyFile()
|
||||
@@ -250,7 +276,7 @@ class SetMainCredentialDialogFragment : DatabaseDialogFragment() {
|
||||
var error = false
|
||||
passwordRepeatTextInputLayout.error = null
|
||||
if (passwordCheckBox.isChecked) {
|
||||
mMasterPassword = passwordView.passwordString
|
||||
mMasterPassword = passwordEditView.passwordString
|
||||
val confPassword = passwordRepeatView.text.toString()
|
||||
|
||||
// Verify that passwords match
|
||||
@@ -302,13 +328,13 @@ class SetMainCredentialDialogFragment : DatabaseDialogFragment() {
|
||||
super.onResume()
|
||||
|
||||
// To check checkboxes if a text is present
|
||||
passwordView.addTextChangedListener(passwordTextWatcher)
|
||||
passwordEditView.addTextChangedListener(passwordTextWatcher)
|
||||
}
|
||||
|
||||
override fun onPause() {
|
||||
super.onPause()
|
||||
|
||||
passwordView.removeTextChangedListener(passwordTextWatcher)
|
||||
passwordEditView.removeTextChangedListener(passwordTextWatcher)
|
||||
}
|
||||
|
||||
private fun showEmptyPasswordConfirmationDialog() {
|
||||
@@ -339,21 +365,31 @@ class SetMainCredentialDialogFragment : DatabaseDialogFragment() {
|
||||
}
|
||||
}
|
||||
|
||||
private fun showEmptyKeyFileConfirmationDialog() {
|
||||
private fun showLengthKeyFileConfirmationDialog(length: Long) {
|
||||
activity?.let {
|
||||
val builder = AlertDialog.Builder(it)
|
||||
builder.setMessage(SpannableStringBuilder().apply {
|
||||
append(getString(R.string.warning_empty_keyfile))
|
||||
append("\n\n")
|
||||
append(getString(R.string.warning_empty_keyfile_explanation))
|
||||
append("\n\n")
|
||||
append(getString(R.string.warning_sure_add_file))
|
||||
})
|
||||
.setPositiveButton(android.R.string.ok) { _, _ -> }
|
||||
.setNegativeButton(android.R.string.cancel) { _, _ ->
|
||||
keyFileCheckBox.isChecked = false
|
||||
keyFileSelectionView.uri = null
|
||||
}
|
||||
var warning = false
|
||||
if (length <= 0L) {
|
||||
warning = true
|
||||
append("\n\n")
|
||||
append(getString(R.string.warning_empty_keyfile))
|
||||
} else if (length > 10485760L) {
|
||||
warning = true
|
||||
append("\n\n")
|
||||
append(getString(R.string.warning_large_keyfile))
|
||||
}
|
||||
if (warning) {
|
||||
append("\n\n")
|
||||
append(getString(R.string.warning_sure_add_file))
|
||||
}
|
||||
})
|
||||
.setPositiveButton(android.R.string.ok) { _, _ -> }
|
||||
.setNegativeButton(android.R.string.cancel) { _, _ ->
|
||||
keyFileCheckBox.isChecked = false
|
||||
keyFileSelectionView.uri = null
|
||||
}
|
||||
mEmptyKeyFileConfirmationDialog = builder.create()
|
||||
mEmptyKeyFileConfirmationDialog?.show()
|
||||
}
|
||||
@@ -362,6 +398,8 @@ class SetMainCredentialDialogFragment : DatabaseDialogFragment() {
|
||||
companion object {
|
||||
|
||||
private const val ALLOW_NO_MASTER_KEY_ARG = "ALLOW_NO_MASTER_KEY_ARG"
|
||||
private const val DEFAULT_KEYFILE_NAME = "keyfile.bin"
|
||||
private const val DEFAULT_KEYFILE_SIZE = 128
|
||||
|
||||
fun getInstance(allowNoMasterKey: Boolean): SetMainCredentialDialogFragment {
|
||||
val fragment = SetMainCredentialDialogFragment()
|
||||
|
||||
@@ -41,6 +41,7 @@ import com.kunzisoft.keepass.otp.OtpElement.Companion.MAX_TOTP_PERIOD
|
||||
import com.kunzisoft.keepass.otp.OtpElement.Companion.MIN_HOTP_COUNTER
|
||||
import com.kunzisoft.keepass.otp.OtpElement.Companion.MIN_OTP_DIGITS
|
||||
import com.kunzisoft.keepass.otp.OtpElement.Companion.MIN_TOTP_PERIOD
|
||||
import com.kunzisoft.keepass.otp.OtpElement.Companion.MIN_OTP_SECRET
|
||||
import com.kunzisoft.keepass.otp.OtpTokenType
|
||||
import com.kunzisoft.keepass.otp.OtpType
|
||||
import com.kunzisoft.keepass.otp.TokenCalculator
|
||||
@@ -224,6 +225,9 @@ class SetOTPDialogFragment : DatabaseDialogFragment() {
|
||||
}
|
||||
otpAlgorithmSpinner?.adapter = otpAlgorithmAdapter
|
||||
|
||||
// Ensure that the UX does not prevent user from hiding/unhiding text
|
||||
otpSecretContainer?.errorIconDrawable = null
|
||||
|
||||
// Set the default value of OTP element
|
||||
upgradeType()
|
||||
upgradeTokenType()
|
||||
@@ -310,11 +314,16 @@ class SetOTPDialogFragment : DatabaseDialogFragment() {
|
||||
otpSecretTextView?.addTextChangedListener(object: TextWatcher {
|
||||
override fun afterTextChanged(s: Editable?) {
|
||||
s?.toString()?.let { userString ->
|
||||
try {
|
||||
mOtpElement.setBase32Secret(userString.uppercase(Locale.ENGLISH))
|
||||
otpSecretContainer?.error = null
|
||||
} catch (exception: Exception) {
|
||||
otpSecretContainer?.error = getString(R.string.error_otp_secret_key)
|
||||
if (userString.length >= MIN_OTP_SECRET) {
|
||||
try {
|
||||
mOtpElement.setBase32Secret(userString.uppercase(Locale.ENGLISH))
|
||||
otpSecretContainer?.error = null
|
||||
} catch (exception: Exception) {
|
||||
otpSecretContainer?.error = getString(R.string.error_otp_secret_key)
|
||||
}
|
||||
} else {
|
||||
otpSecretContainer?.error = getString(R.string.error_otp_secret_length,
|
||||
MIN_OTP_SECRET)
|
||||
}
|
||||
mSecretWellFormed = otpSecretContainer?.error == null
|
||||
}
|
||||
|
||||
@@ -34,12 +34,12 @@ import com.kunzisoft.keepass.database.ContextualDatabase
|
||||
import com.kunzisoft.keepass.password.PassphraseGenerator
|
||||
import com.kunzisoft.keepass.settings.PreferencesUtil
|
||||
import com.kunzisoft.keepass.timeout.ClipboardHelper
|
||||
import com.kunzisoft.keepass.view.PassKeyView
|
||||
import com.kunzisoft.keepass.view.PasswordEditView
|
||||
import com.kunzisoft.keepass.viewmodels.KeyGeneratorViewModel
|
||||
|
||||
class PassphraseGeneratorFragment : DatabaseFragment() {
|
||||
|
||||
private lateinit var passKeyView: PassKeyView
|
||||
private lateinit var passwordEditView: PasswordEditView
|
||||
|
||||
private lateinit var sliderWordCount: Slider
|
||||
private lateinit var wordCountText: EditText
|
||||
@@ -62,7 +62,7 @@ class PassphraseGeneratorFragment : DatabaseFragment() {
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
|
||||
passKeyView = view.findViewById(R.id.passphrase_view)
|
||||
passwordEditView = view.findViewById(R.id.passphrase_view)
|
||||
val passphraseCopyView: ImageView? = view.findViewById(R.id.passphrase_copy_button)
|
||||
sliderWordCount = view.findViewById(R.id.slider_word_count)
|
||||
wordCountText = view.findViewById(R.id.word_count)
|
||||
@@ -80,7 +80,7 @@ class PassphraseGeneratorFragment : DatabaseFragment() {
|
||||
passphraseCopyView?.setOnClickListener {
|
||||
clipboardHelper.timeoutCopyToClipboard(
|
||||
getString(R.string.passphrase),
|
||||
passKeyView.passwordString,
|
||||
passwordEditView.passwordString,
|
||||
true
|
||||
)
|
||||
}
|
||||
@@ -146,7 +146,7 @@ class PassphraseGeneratorFragment : DatabaseFragment() {
|
||||
generatePassphrase()
|
||||
|
||||
mKeyGeneratorViewModel.passphraseGeneratedValidated.observe(viewLifecycleOwner) {
|
||||
mKeyGeneratorViewModel.setKeyGenerated(passKeyView.passwordString)
|
||||
mKeyGeneratorViewModel.setKeyGenerated(passwordEditView.passwordString)
|
||||
}
|
||||
|
||||
mKeyGeneratorViewModel.requirePassphraseGeneration.observe(viewLifecycleOwner) {
|
||||
@@ -219,7 +219,7 @@ class PassphraseGeneratorFragment : DatabaseFragment() {
|
||||
} catch (e: Exception) {
|
||||
Log.e(TAG, "Unable to generate a passphrase", e)
|
||||
}
|
||||
passKeyView.passwordString = passphrase
|
||||
passwordEditView.passwordString = passphrase
|
||||
charactersCountText.text = getString(R.string.character_count, passphrase.length)
|
||||
}
|
||||
|
||||
|
||||
@@ -36,12 +36,12 @@ import com.kunzisoft.keepass.database.ContextualDatabase
|
||||
import com.kunzisoft.keepass.password.PasswordGenerator
|
||||
import com.kunzisoft.keepass.settings.PreferencesUtil
|
||||
import com.kunzisoft.keepass.timeout.ClipboardHelper
|
||||
import com.kunzisoft.keepass.view.PassKeyView
|
||||
import com.kunzisoft.keepass.view.PasswordEditView
|
||||
import com.kunzisoft.keepass.viewmodels.KeyGeneratorViewModel
|
||||
|
||||
class PasswordGeneratorFragment : DatabaseFragment() {
|
||||
|
||||
private lateinit var passKeyView: PassKeyView
|
||||
private lateinit var passwordEditView: PasswordEditView
|
||||
|
||||
private lateinit var sliderLength: Slider
|
||||
private lateinit var lengthEditView: EditText
|
||||
@@ -74,7 +74,7 @@ class PasswordGeneratorFragment : DatabaseFragment() {
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
|
||||
passKeyView = view.findViewById(R.id.password_view)
|
||||
passwordEditView = view.findViewById(R.id.password_view)
|
||||
val passwordCopyView: ImageView? = view.findViewById(R.id.password_copy_button)
|
||||
|
||||
sliderLength = view.findViewById(R.id.slider_length)
|
||||
@@ -101,7 +101,7 @@ class PasswordGeneratorFragment : DatabaseFragment() {
|
||||
passwordCopyView?.setOnClickListener {
|
||||
clipboardHelper.timeoutCopyToClipboard(
|
||||
getString(R.string.password),
|
||||
passKeyView.passwordString,
|
||||
passwordEditView.passwordString,
|
||||
true
|
||||
)
|
||||
}
|
||||
@@ -195,7 +195,7 @@ class PasswordGeneratorFragment : DatabaseFragment() {
|
||||
generatePassword()
|
||||
|
||||
mKeyGeneratorViewModel.passwordGeneratedValidated.observe(viewLifecycleOwner) {
|
||||
mKeyGeneratorViewModel.setKeyGenerated(passKeyView.passwordString)
|
||||
mKeyGeneratorViewModel.setKeyGenerated(passwordEditView.passwordString)
|
||||
}
|
||||
|
||||
mKeyGeneratorViewModel.requirePasswordGeneration.observe(viewLifecycleOwner) {
|
||||
@@ -310,7 +310,7 @@ class PasswordGeneratorFragment : DatabaseFragment() {
|
||||
} catch (e: Exception) {
|
||||
Log.e(TAG, "Unable to generate a password", e)
|
||||
}
|
||||
passKeyView.passwordString = password
|
||||
passwordEditView.passwordString = password
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
|
||||
@@ -10,6 +10,7 @@ import android.widget.ImageView
|
||||
import android.widget.TextView
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.kunzisoft.keepass.R
|
||||
import com.kunzisoft.keepass.database.element.Database
|
||||
import com.kunzisoft.keepass.database.element.Group
|
||||
import com.kunzisoft.keepass.database.element.node.Node
|
||||
import com.kunzisoft.keepass.database.element.node.Type
|
||||
@@ -17,7 +18,7 @@ import com.kunzisoft.keepass.icons.IconDrawableFactory
|
||||
import com.kunzisoft.keepass.settings.PreferencesUtil
|
||||
import com.kunzisoft.keepass.view.strikeOut
|
||||
|
||||
class BreadcrumbAdapter(val context: Context)
|
||||
class BreadcrumbAdapter(val context: Context, val database: Database?)
|
||||
: RecyclerView.Adapter<BreadcrumbAdapter.BreadcrumbGroupViewHolder>() {
|
||||
|
||||
private val inflater: LayoutInflater = LayoutInflater.from(context)
|
||||
@@ -31,6 +32,8 @@ class BreadcrumbAdapter(val context: Context)
|
||||
var onItemClickListener: ((item: Node, position: Int)->Unit)? = null
|
||||
var onLongItemClickListener: ((item: Node, position: Int)->Unit)? = null
|
||||
|
||||
private var mNodeFilter: NodeFilter = NodeFilter(context, database)
|
||||
|
||||
private var mShowNumberEntries = false
|
||||
private var mShowUUID = false
|
||||
private var mIconColor: Int = 0
|
||||
@@ -112,12 +115,10 @@ class BreadcrumbAdapter(val context: Context)
|
||||
|
||||
holder.groupNumbersView?.apply {
|
||||
if (mShowNumberEntries) {
|
||||
group.refreshNumberOfChildEntries(
|
||||
Group.ChildFilter.getDefaults(
|
||||
PreferencesUtil.showExpiredEntries(context)
|
||||
)
|
||||
)
|
||||
text = group.recursiveNumberOfChildEntries.toString()
|
||||
text = group.getNumberOfChildEntries(
|
||||
mNodeFilter.recursiveNumberOfEntries,
|
||||
mNodeFilter.filter
|
||||
).toString()
|
||||
visibility = View.VISIBLE
|
||||
} else {
|
||||
visibility = View.GONE
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
package com.kunzisoft.keepass.adapters
|
||||
|
||||
import android.content.Context
|
||||
import com.kunzisoft.keepass.database.element.Database
|
||||
import com.kunzisoft.keepass.database.element.Entry
|
||||
import com.kunzisoft.keepass.database.element.Group
|
||||
import com.kunzisoft.keepass.database.element.node.Node
|
||||
import com.kunzisoft.keepass.settings.PreferencesUtil
|
||||
|
||||
class NodeFilter(
|
||||
context: Context,
|
||||
var database: Database? = null
|
||||
) {
|
||||
var recursiveNumberOfEntries = PreferencesUtil.recursiveNumberEntries(context)
|
||||
private set
|
||||
private var showExpired = PreferencesUtil.showExpiredEntries(context)
|
||||
private var showTemplate = PreferencesUtil.showTemplates(context)
|
||||
|
||||
val filter: (Node) -> Boolean = { node ->
|
||||
when (node) {
|
||||
is Entry -> {
|
||||
node.entryKDB?.isMetaStream() != true
|
||||
}
|
||||
is Group -> {
|
||||
showTemplate || database?.templatesGroup != node
|
||||
}
|
||||
else -> true
|
||||
} && (showExpired || !node.isCurrentlyExpires)
|
||||
}
|
||||
}
|
||||
@@ -22,6 +22,7 @@ package com.kunzisoft.keepass.adapters
|
||||
import android.content.Context
|
||||
import android.content.res.ColorStateList
|
||||
import android.graphics.Color
|
||||
import android.os.Build
|
||||
import android.util.Log
|
||||
import android.util.TypedValue
|
||||
import android.view.LayoutInflater
|
||||
@@ -66,6 +67,7 @@ class NodesAdapter (
|
||||
private val mNodeSortedListCallback: NodeSortedListCallback
|
||||
private val mNodeSortedList: SortedList<Node>
|
||||
private val mInflater: LayoutInflater = LayoutInflater.from(context)
|
||||
private val mNodeFilter: NodeFilter = NodeFilter(context, database)
|
||||
|
||||
private var mCalculateViewTypeTextSize = Array(2) { true } // number of view type
|
||||
private var mTextSizeUnit: Int = TypedValue.COMPLEX_UNIT_PX
|
||||
@@ -82,7 +84,7 @@ class NodesAdapter (
|
||||
private var mShowNumberEntries: Boolean = true
|
||||
private var mShowOTP: Boolean = false
|
||||
private var mShowUUID: Boolean = false
|
||||
private var mEntryFilters = arrayOf<Group.ChildFilter>()
|
||||
private var mNodeFilters: NodeFilter? = null
|
||||
private var mOldVirtualGroup = false
|
||||
private var mVirtualGroup = false
|
||||
|
||||
@@ -161,9 +163,7 @@ class NodesAdapter (
|
||||
this.mShowOTP = PreferencesUtil.showOTPToken(context)
|
||||
this.mShowUUID = PreferencesUtil.showUUID(context)
|
||||
|
||||
this.mEntryFilters = Group.ChildFilter.getDefaults(
|
||||
PreferencesUtil.showExpiredEntries(context)
|
||||
)
|
||||
this.mNodeFilters = NodeFilter(context, database)
|
||||
|
||||
// Reinit textSize for all view type
|
||||
mCalculateViewTypeTextSize.forEachIndexed { index, _ -> mCalculateViewTypeTextSize[index] = true }
|
||||
@@ -176,7 +176,7 @@ class NodesAdapter (
|
||||
mOldVirtualGroup = mVirtualGroup
|
||||
mVirtualGroup = group.isVirtual
|
||||
assignPreferences()
|
||||
mNodeSortedList.replaceAll(group.getFilteredChildren(mEntryFilters))
|
||||
mNodeSortedList.replaceAll(group.getChildren(mNodeFilter.filter))
|
||||
}
|
||||
|
||||
private inner class NodeSortedListCallback: SortedListAdapterCallback<Node>(this) {
|
||||
@@ -205,6 +205,11 @@ class NodesAdapter (
|
||||
&& oldItem.type == newItem.type
|
||||
&& oldItem.title == newItem.title
|
||||
&& oldItem.icon == newItem.icon
|
||||
&& oldItem.creationTime == newItem.creationTime
|
||||
&& oldItem.lastModificationTime == newItem.lastModificationTime
|
||||
&& oldItem.lastAccessTime == newItem.lastAccessTime
|
||||
&& oldItem.expiryTime == newItem.expiryTime
|
||||
&& oldItem.expires == newItem.expires
|
||||
&& oldItem.isCurrentlyExpires == newItem.isCurrentlyExpires
|
||||
}
|
||||
|
||||
@@ -473,7 +478,10 @@ class NodesAdapter (
|
||||
if (mShowNumberEntries) {
|
||||
holder.numberChildren?.apply {
|
||||
text = (subNode as Group)
|
||||
.recursiveNumberOfChildEntries
|
||||
.getNumberOfChildEntries(
|
||||
mNodeFilter.recursiveNumberOfEntries,
|
||||
mNodeFilter.filter
|
||||
)
|
||||
.toString()
|
||||
setTextSize(mTextSizeUnit, mNumberChildrenTextDefaultDimension, mPrefSizeMultiplier)
|
||||
visibility = View.VISIBLE
|
||||
@@ -522,6 +530,9 @@ class NodesAdapter (
|
||||
holder?.otpToken?.apply {
|
||||
text = otpElement?.tokenString
|
||||
setTextSize(mTextSizeUnit, mOtpTokenTextDefaultDimension, mPrefSizeMultiplier)
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
|
||||
textDirection = View.TEXT_DIRECTION_LTR
|
||||
}
|
||||
}
|
||||
holder?.otpContainer?.setOnClickListener {
|
||||
otpElement?.token?.let { token ->
|
||||
|
||||
@@ -27,6 +27,7 @@ import android.net.Uri
|
||||
import android.os.IBinder
|
||||
import android.util.Base64
|
||||
import android.util.Log
|
||||
import androidx.core.content.ContextCompat
|
||||
import com.kunzisoft.keepass.database.element.binary.BinaryData.Companion.BASE64_FLAG
|
||||
import com.kunzisoft.keepass.model.CipherEncryptDatabase
|
||||
import com.kunzisoft.keepass.services.AdvancedUnlockNotificationService
|
||||
@@ -69,9 +70,11 @@ class CipherDatabaseAction(context: Context) {
|
||||
|
||||
@Synchronized
|
||||
private fun attachService(performedAction: () -> Unit) {
|
||||
applicationContext.registerReceiver(mAdvancedUnlockBroadcastReceiver, IntentFilter().apply {
|
||||
addAction(AdvancedUnlockNotificationService.REMOVE_ADVANCED_UNLOCK_KEY_ACTION)
|
||||
})
|
||||
ContextCompat.registerReceiver(applicationContext, mAdvancedUnlockBroadcastReceiver,
|
||||
IntentFilter().apply {
|
||||
addAction(AdvancedUnlockNotificationService.REMOVE_ADVANCED_UNLOCK_KEY_ACTION)
|
||||
}, ContextCompat.RECEIVER_EXPORTED
|
||||
)
|
||||
|
||||
mServiceConnection = object : ServiceConnection {
|
||||
override fun onServiceConnected(name: ComponentName?, serviceBinder: IBinder?) {
|
||||
@@ -97,7 +100,7 @@ class CipherDatabaseAction(context: Context) {
|
||||
private fun detachService() {
|
||||
try {
|
||||
applicationContext.unregisterReceiver(mAdvancedUnlockBroadcastReceiver)
|
||||
} catch (e: Exception) {}
|
||||
} catch (_: Exception) {}
|
||||
|
||||
mServiceConnection?.let {
|
||||
AdvancedUnlockNotificationService.unbindService(applicationContext, it)
|
||||
@@ -181,6 +184,14 @@ class CipherDatabaseAction(context: Context) {
|
||||
}
|
||||
}
|
||||
|
||||
fun resetCipherParameters(databaseUri: Uri) {
|
||||
containsCipherDatabase(databaseUri) { contains ->
|
||||
if (contains) {
|
||||
mBinder?.resetTimer()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun addOrUpdateCipherDatabase(cipherEncryptDatabase: CipherEncryptDatabase,
|
||||
cipherDatabaseResultListener: (() -> Unit)? = null) {
|
||||
cipherEncryptDatabase.databaseUri?.let { databaseUri ->
|
||||
|
||||
@@ -60,6 +60,7 @@ import com.kunzisoft.keepass.settings.AutofillSettingsActivity
|
||||
import com.kunzisoft.keepass.settings.PreferencesUtil
|
||||
import com.kunzisoft.keepass.utils.LOCK_ACTION
|
||||
import com.kunzisoft.keepass.utils.getParcelableExtraCompat
|
||||
import kotlin.math.min
|
||||
|
||||
|
||||
@RequiresApi(api = Build.VERSION_CODES.O)
|
||||
@@ -175,8 +176,8 @@ object AutofillHelper {
|
||||
}
|
||||
|
||||
if (entryInfo.expires) {
|
||||
val year = entryInfo.expiryTime.getYearInt()
|
||||
val month = entryInfo.expiryTime.getMonthInt()
|
||||
val year = entryInfo.expiryTime.getYear()
|
||||
val month = entryInfo.expiryTime.getMonth()
|
||||
val monthString = month.toString().padStart(2, '0')
|
||||
val day = entryInfo.expiryTime.getDay()
|
||||
val dayString = day.toString().padStart(2, '0')
|
||||
@@ -191,7 +192,7 @@ object AutofillHelper {
|
||||
} else {
|
||||
datasetBuilder.addValueToDatasetBuilder(
|
||||
it,
|
||||
AutofillValue.forDate(entryInfo.expiryTime.date.time)
|
||||
AutofillValue.forDate(entryInfo.expiryTime.toMilliseconds())
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -321,10 +322,11 @@ object AutofillHelper {
|
||||
val inlinePresentationSpecs = inlineSuggestionsRequest.inlinePresentationSpecs
|
||||
val maxSuggestion = inlineSuggestionsRequest.maxSuggestionCount
|
||||
|
||||
if (positionItem <= maxSuggestion - 1
|
||||
&& inlinePresentationSpecs.size > positionItem
|
||||
) {
|
||||
val inlinePresentationSpec = inlinePresentationSpecs[positionItem]
|
||||
if (positionItem <= maxSuggestion - 1) {
|
||||
|
||||
// If positionItem is larger than the number of specs in the list, then
|
||||
// the last spec is used for the remainder of the suggestions
|
||||
val inlinePresentationSpec = inlinePresentationSpecs[min(positionItem, inlinePresentationSpecs.size - 1)]
|
||||
|
||||
// Make sure that the IME spec claims support for v1 UI template.
|
||||
val imeStyle = inlinePresentationSpec.style
|
||||
|
||||
@@ -21,12 +21,21 @@ package com.kunzisoft.keepass.autofill
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.app.PendingIntent
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.graphics.BlendMode
|
||||
import android.graphics.drawable.Icon
|
||||
import android.os.Build
|
||||
import android.os.CancellationSignal
|
||||
import android.service.autofill.*
|
||||
import android.service.autofill.AutofillService
|
||||
import android.service.autofill.FillCallback
|
||||
import android.service.autofill.FillRequest
|
||||
import android.service.autofill.FillResponse
|
||||
import android.service.autofill.InlinePresentation
|
||||
import android.service.autofill.Presentations
|
||||
import android.service.autofill.SaveCallback
|
||||
import android.service.autofill.SaveInfo
|
||||
import android.service.autofill.SaveRequest
|
||||
import android.util.Log
|
||||
import android.view.autofill.AutofillId
|
||||
import android.widget.RemoteViews
|
||||
@@ -35,6 +44,7 @@ import androidx.autofill.inline.UiVersions
|
||||
import androidx.autofill.inline.v1.InlineSuggestionUi
|
||||
import com.kunzisoft.keepass.R
|
||||
import com.kunzisoft.keepass.activities.AutofillLauncherActivity
|
||||
import com.kunzisoft.keepass.autofill.StructureParser.Companion.APPLICATION_ID_POPUP_WINDOW
|
||||
import com.kunzisoft.keepass.database.ContextualDatabase
|
||||
import com.kunzisoft.keepass.database.DatabaseTaskProvider
|
||||
import com.kunzisoft.keepass.database.helper.SearchHelper
|
||||
@@ -99,8 +109,12 @@ class KeeAutofillService : AutofillService() {
|
||||
StructureParser(latestStructure).parse()?.let { parseResult ->
|
||||
|
||||
// Build search info only if applicationId or webDomain are not blocked
|
||||
if (autofillAllowedFor(parseResult.applicationId, applicationIdBlocklist)
|
||||
&& autofillAllowedFor(parseResult.webDomain, webDomainBlocklist)) {
|
||||
if (autofillAllowedFor(
|
||||
applicationId = parseResult.applicationId,
|
||||
applicationIdBlocklist = applicationIdBlocklist,
|
||||
webDomain = parseResult.webDomain,
|
||||
webDomainBlocklist = webDomainBlocklist)
|
||||
) {
|
||||
val searchInfo = SearchInfo().apply {
|
||||
applicationId = parseResult.applicationId
|
||||
webDomain = parseResult.webDomain
|
||||
@@ -258,7 +272,7 @@ class KeeAutofillService : AutofillService() {
|
||||
val inlinePresentationSpecs =
|
||||
inlineSuggestionsRequest.inlinePresentationSpecs
|
||||
if (inlineSuggestionsRequest.maxSuggestionCount > 0
|
||||
&& inlinePresentationSpecs.size > 0
|
||||
&& inlinePresentationSpecs.isNotEmpty()
|
||||
) {
|
||||
val inlinePresentationSpec = inlinePresentationSpecs[0]
|
||||
|
||||
@@ -274,11 +288,7 @@ class KeeAutofillService : AutofillService() {
|
||||
this,
|
||||
0,
|
||||
Intent(this, AutofillSettingsActivity::class.java),
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||
PendingIntent.FLAG_IMMUTABLE
|
||||
} else {
|
||||
0
|
||||
}
|
||||
PendingIntent.FLAG_IMMUTABLE
|
||||
)
|
||||
).apply {
|
||||
setContentDescription(getString(R.string.autofill_sign_in_prompt))
|
||||
@@ -352,8 +362,12 @@ class KeeAutofillService : AutofillService() {
|
||||
val latestStructure = request.fillContexts.last().structure
|
||||
StructureParser(latestStructure).parse(true)?.let { parseResult ->
|
||||
|
||||
if (autofillAllowedFor(parseResult.applicationId, applicationIdBlocklist)
|
||||
&& autofillAllowedFor(parseResult.webDomain, webDomainBlocklist)) {
|
||||
if (autofillAllowedFor(
|
||||
applicationId = parseResult.applicationId,
|
||||
applicationIdBlocklist = applicationIdBlocklist,
|
||||
webDomain = parseResult.webDomain,
|
||||
webDomainBlocklist = webDomainBlocklist)
|
||||
) {
|
||||
Log.d(TAG, "autofill onSaveRequest password")
|
||||
|
||||
// Build expiration from date or from year and month
|
||||
@@ -414,6 +428,28 @@ class KeeAutofillService : AutofillService() {
|
||||
companion object {
|
||||
private val TAG = KeeAutofillService::class.java.name
|
||||
|
||||
fun autofillAllowedFor(applicationId: String?,
|
||||
webDomain: String?,
|
||||
context: Context
|
||||
): Boolean {
|
||||
return autofillAllowedFor(
|
||||
applicationId = applicationId,
|
||||
applicationIdBlocklist = PreferencesUtil.applicationIdBlocklist(context),
|
||||
webDomain = webDomain,
|
||||
webDomainBlocklist = PreferencesUtil.webDomainBlocklist(context))
|
||||
}
|
||||
|
||||
fun autofillAllowedFor(applicationId: String?,
|
||||
applicationIdBlocklist: Set<String>?,
|
||||
webDomain: String?,
|
||||
webDomainBlocklist: Set<String>?
|
||||
): Boolean {
|
||||
return autofillAllowedFor(applicationId, applicationIdBlocklist)
|
||||
// To prevent unrecognized autofill popup id
|
||||
&& applicationId?.contains(APPLICATION_ID_POPUP_WINDOW) != true
|
||||
&& autofillAllowedFor(webDomain, webDomainBlocklist)
|
||||
}
|
||||
|
||||
fun autofillAllowedFor(element: String?, blockList: Set<String>?): Boolean {
|
||||
element?.let { elementNotNull ->
|
||||
if (blockList?.any { appIdBlocked ->
|
||||
|
||||
@@ -27,8 +27,7 @@ import android.view.autofill.AutofillId
|
||||
import android.view.autofill.AutofillValue
|
||||
import androidx.annotation.RequiresApi
|
||||
import org.joda.time.DateTime
|
||||
import java.util.*
|
||||
import kotlin.collections.ArrayList
|
||||
import java.util.Locale
|
||||
|
||||
|
||||
/**
|
||||
@@ -37,7 +36,6 @@ import kotlin.collections.ArrayList
|
||||
@RequiresApi(api = Build.VERSION_CODES.O)
|
||||
class StructureParser(private val structure: AssistStructure) {
|
||||
private var result: Result? = null
|
||||
private var usernameNeeded = true
|
||||
private var usernameIdCandidate: AutofillId? = null
|
||||
private var usernameValueCandidate: AutofillValue? = null
|
||||
|
||||
@@ -53,7 +51,7 @@ class StructureParser(private val structure: AssistStructure) {
|
||||
applicationId = windowNode.title.toString().split("/")[0]
|
||||
Log.d(TAG, "Autofill applicationId: $applicationId")
|
||||
|
||||
if (applicationId?.contains("PopupWindow:") == false) {
|
||||
if (applicationId?.contains(APPLICATION_ID_POPUP_WINDOW) == false) {
|
||||
if (parseViewNode(windowNode.rootViewNode))
|
||||
break@mainLoop
|
||||
}
|
||||
@@ -134,19 +132,37 @@ class StructureParser(private val structure: AssistStructure) {
|
||||
it.contains(View.AUTOFILL_HINT_USERNAME, true)
|
||||
|| it.contains(View.AUTOFILL_HINT_EMAIL_ADDRESS, true)
|
||||
|| it.contains("email", true)
|
||||
|| it.contains(View.AUTOFILL_HINT_PHONE, true) -> {
|
||||
// Priority to username or add if null
|
||||
if (result?.usernameId == null || it.contains(View.AUTOFILL_HINT_USERNAME, true)) {
|
||||
|| it.contains("login", true) -> {
|
||||
// Replace username until we have a password
|
||||
if (result?.passwordId == null) {
|
||||
result?.usernameId = autofillId
|
||||
result?.usernameValue = node.autofillValue
|
||||
Log.d(TAG, "Autofill username hint")
|
||||
Log.d(TAG, "Autofill username hint if no password")
|
||||
} else {
|
||||
usernameIdCandidate = autofillId
|
||||
usernameValueCandidate = node.autofillValue
|
||||
Log.d(TAG, "Autofill username hint if password")
|
||||
}
|
||||
}
|
||||
it.contains(View.AUTOFILL_HINT_PHONE, true) -> {
|
||||
if (usernameIdCandidate == null) {
|
||||
usernameIdCandidate = autofillId
|
||||
usernameValueCandidate = node.autofillValue
|
||||
Log.d(TAG, "Autofill phone")
|
||||
}
|
||||
}
|
||||
it.contains(View.AUTOFILL_HINT_PASSWORD, true) -> {
|
||||
// Password Id changed if it's the second times we are here,
|
||||
// So the last username candidate is most appropriate
|
||||
if (result?.passwordId != null) {
|
||||
result?.usernameId = usernameIdCandidate
|
||||
result?.usernameValue = usernameValueCandidate
|
||||
}
|
||||
result?.passwordId = autofillId
|
||||
result?.passwordValue = node.autofillValue
|
||||
Log.d(TAG, "Autofill password hint")
|
||||
return true
|
||||
// Comment "return" to check all the tree
|
||||
// return true
|
||||
}
|
||||
it.equals("cc-name", true) -> {
|
||||
Log.d(TAG, "Autofill credit card name hint")
|
||||
@@ -282,9 +298,11 @@ class StructureParser(private val structure: AssistStructure) {
|
||||
"type" -> {
|
||||
when (pairAttribute.second.lowercase(Locale.ENGLISH)) {
|
||||
"tel", "email" -> {
|
||||
result?.usernameId = autofillId
|
||||
result?.usernameValue = node.autofillValue
|
||||
Log.d(TAG, "Autofill username web type: ${node.htmlInfo?.tag} ${node.htmlInfo?.attributes}")
|
||||
if (result?.passwordId == null) {
|
||||
result?.usernameId = autofillId
|
||||
result?.usernameValue = node.autofillValue
|
||||
Log.d(TAG, "Autofill username web type: ${node.htmlInfo?.tag} ${node.htmlInfo?.attributes}")
|
||||
}
|
||||
}
|
||||
"text" -> {
|
||||
// Assume username is before password
|
||||
@@ -321,89 +339,128 @@ class StructureParser(private val structure: AssistStructure) {
|
||||
return "0x${"%08x".format(inputType)}"
|
||||
}
|
||||
|
||||
private fun manageTypeText(
|
||||
node: AssistStructure.ViewNode,
|
||||
autofillId: AutofillId?,
|
||||
inputType: Int
|
||||
): Boolean {
|
||||
when {
|
||||
inputIsVariationType(inputType,
|
||||
InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS,
|
||||
InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS) -> {
|
||||
if (result?.passwordId == null) {
|
||||
result?.usernameId = autofillId
|
||||
result?.usernameValue = node.autofillValue
|
||||
Log.d(TAG, "Autofill username android text type: ${showHexInputType(inputType)}")
|
||||
}
|
||||
}
|
||||
inputIsVariationType(inputType,
|
||||
InputType.TYPE_TEXT_VARIATION_NORMAL,
|
||||
InputType.TYPE_TEXT_VARIATION_PERSON_NAME,
|
||||
InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT) -> {
|
||||
// Assume the username field is before the password field
|
||||
if (result?.passwordId == null) {
|
||||
usernameIdCandidate = autofillId
|
||||
usernameValueCandidate = node.autofillValue
|
||||
}
|
||||
Log.d(TAG, "Autofill username candidate android text type: ${showHexInputType(inputType)}")
|
||||
}
|
||||
inputIsVariationType(inputType,
|
||||
InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD) -> {
|
||||
// Some forms used visible password as username
|
||||
if (result?.passwordId == null &&
|
||||
usernameIdCandidate == null && usernameValueCandidate == null) {
|
||||
usernameIdCandidate = autofillId
|
||||
usernameValueCandidate = node.autofillValue
|
||||
Log.d(TAG, "Autofill visible password android text type (as username): ${showHexInputType(inputType)}")
|
||||
} else if (result?.passwordId == null && result?.passwordValue == null) {
|
||||
result?.passwordId = autofillId
|
||||
result?.passwordValue = node.autofillValue
|
||||
Log.d(TAG, "Autofill visible password android text type (as password): ${showHexInputType(inputType)}")
|
||||
}
|
||||
}
|
||||
inputIsVariationType(inputType,
|
||||
InputType.TYPE_TEXT_VARIATION_PASSWORD,
|
||||
InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD) -> {
|
||||
result?.passwordId = autofillId
|
||||
result?.passwordValue = node.autofillValue
|
||||
Log.d(TAG, "Autofill password android text type: ${showHexInputType(inputType)}")
|
||||
return true
|
||||
}
|
||||
inputIsVariationType(inputType,
|
||||
InputType.TYPE_TEXT_VARIATION_EMAIL_SUBJECT,
|
||||
InputType.TYPE_TEXT_VARIATION_FILTER,
|
||||
InputType.TYPE_TEXT_VARIATION_LONG_MESSAGE,
|
||||
InputType.TYPE_TEXT_VARIATION_PHONETIC,
|
||||
InputType.TYPE_TEXT_VARIATION_POSTAL_ADDRESS,
|
||||
InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE,
|
||||
InputType.TYPE_TEXT_VARIATION_URI) -> {
|
||||
// Type not used
|
||||
Log.d(TAG, "Autofill not used android text type: ${showHexInputType(inputType)}")
|
||||
}
|
||||
else -> {
|
||||
Log.d(TAG, "Autofill unknown android text type: ${showHexInputType(inputType)}")
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
private fun manageTypeNumber(
|
||||
node: AssistStructure.ViewNode,
|
||||
autofillId: AutofillId?,
|
||||
inputType: Int
|
||||
): Boolean {
|
||||
when {
|
||||
inputIsVariationType(inputType,
|
||||
InputType.TYPE_NUMBER_VARIATION_NORMAL) -> {
|
||||
if (usernameIdCandidate == null) {
|
||||
usernameIdCandidate = autofillId
|
||||
usernameValueCandidate = node.autofillValue
|
||||
Log.d(TAG, "Autofill username candidate android number type: ${showHexInputType(inputType)}")
|
||||
}
|
||||
}
|
||||
inputIsVariationType(inputType,
|
||||
InputType.TYPE_NUMBER_VARIATION_PASSWORD) -> {
|
||||
result?.passwordId = autofillId
|
||||
result?.passwordValue = node.autofillValue
|
||||
Log.d(TAG, "Autofill password android number type: ${showHexInputType(inputType)}")
|
||||
return true
|
||||
}
|
||||
else -> {
|
||||
Log.d(TAG, "Autofill unknown android number type: ${showHexInputType(inputType)}")
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
private fun manageTypeNull(
|
||||
node: AssistStructure.ViewNode,
|
||||
autofillId: AutofillId?,
|
||||
inputType: Int
|
||||
): Boolean {
|
||||
if (node.className == "android.widget.EditText") {
|
||||
Log.d(TAG, "Autofill null android input type class: ${showHexInputType(inputType)}" +
|
||||
", get the EditText node class name!")
|
||||
if (result?.passwordId == null) {
|
||||
usernameIdCandidate = autofillId
|
||||
usernameValueCandidate = node.autofillValue
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
private fun parseNodeByAndroidInput(node: AssistStructure.ViewNode): Boolean {
|
||||
val autofillId = node.autofillId
|
||||
val inputType = node.inputType
|
||||
when (inputType and InputType.TYPE_MASK_CLASS) {
|
||||
InputType.TYPE_CLASS_TEXT -> {
|
||||
when {
|
||||
inputIsVariationType(inputType,
|
||||
InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS,
|
||||
InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS) -> {
|
||||
result?.usernameId = autofillId
|
||||
result?.usernameValue = node.autofillValue
|
||||
Log.d(TAG, "Autofill username android text type: ${showHexInputType(inputType)}")
|
||||
}
|
||||
inputIsVariationType(inputType,
|
||||
InputType.TYPE_TEXT_VARIATION_NORMAL,
|
||||
InputType.TYPE_TEXT_VARIATION_PERSON_NAME,
|
||||
InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT) -> {
|
||||
// Assume the username field is before the password field
|
||||
if (result?.passwordId == null) {
|
||||
usernameIdCandidate = autofillId
|
||||
usernameValueCandidate = node.autofillValue
|
||||
}
|
||||
Log.d(TAG, "Autofill username candidate android text type: ${showHexInputType(inputType)}")
|
||||
}
|
||||
inputIsVariationType(inputType,
|
||||
InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD) -> {
|
||||
// Some forms used visible password as username
|
||||
if (result?.passwordId == null &&
|
||||
usernameIdCandidate == null && usernameValueCandidate == null) {
|
||||
usernameIdCandidate = autofillId
|
||||
usernameValueCandidate = node.autofillValue
|
||||
Log.d(TAG, "Autofill visible password android text type (as username): ${showHexInputType(inputType)}")
|
||||
} else if (result?.passwordId == null && result?.passwordValue == null) {
|
||||
result?.passwordId = autofillId
|
||||
result?.passwordValue = node.autofillValue
|
||||
Log.d(TAG, "Autofill visible password android text type (as password): ${showHexInputType(inputType)}")
|
||||
usernameNeeded = false
|
||||
}
|
||||
}
|
||||
inputIsVariationType(inputType,
|
||||
InputType.TYPE_TEXT_VARIATION_PASSWORD,
|
||||
InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD) -> {
|
||||
result?.passwordId = autofillId
|
||||
result?.passwordValue = node.autofillValue
|
||||
Log.d(TAG, "Autofill password android text type: ${showHexInputType(inputType)}")
|
||||
return true
|
||||
}
|
||||
inputIsVariationType(inputType,
|
||||
InputType.TYPE_TEXT_VARIATION_EMAIL_SUBJECT,
|
||||
InputType.TYPE_TEXT_VARIATION_FILTER,
|
||||
InputType.TYPE_TEXT_VARIATION_LONG_MESSAGE,
|
||||
InputType.TYPE_TEXT_VARIATION_PHONETIC,
|
||||
InputType.TYPE_TEXT_VARIATION_POSTAL_ADDRESS,
|
||||
InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE,
|
||||
InputType.TYPE_TEXT_VARIATION_URI) -> {
|
||||
// Type not used
|
||||
}
|
||||
else -> {
|
||||
Log.d(TAG, "Autofill unknown android text type: ${showHexInputType(inputType)}")
|
||||
}
|
||||
}
|
||||
return manageTypeText(node, autofillId, inputType)
|
||||
}
|
||||
InputType.TYPE_CLASS_NUMBER -> {
|
||||
when {
|
||||
inputIsVariationType(inputType,
|
||||
InputType.TYPE_NUMBER_VARIATION_NORMAL) -> {
|
||||
if (usernameIdCandidate == null) {
|
||||
usernameIdCandidate = autofillId
|
||||
usernameValueCandidate = node.autofillValue
|
||||
Log.d(TAG, "Autofill username candidate android number type: ${showHexInputType(inputType)}")
|
||||
}
|
||||
}
|
||||
inputIsVariationType(inputType,
|
||||
InputType.TYPE_NUMBER_VARIATION_PASSWORD) -> {
|
||||
result?.passwordId = autofillId
|
||||
result?.passwordValue = node.autofillValue
|
||||
Log.d(TAG, "Autofill password android number type: ${showHexInputType(inputType)}")
|
||||
return true
|
||||
}
|
||||
else -> {
|
||||
Log.d(TAG, "Autofill unknown android number type: ${showHexInputType(inputType)}")
|
||||
}
|
||||
}
|
||||
return manageTypeNumber(node, autofillId, inputType)
|
||||
}
|
||||
InputType.TYPE_NULL -> {
|
||||
return manageTypeNull(node, autofillId, inputType)
|
||||
}
|
||||
}
|
||||
return false
|
||||
@@ -432,58 +489,14 @@ class StructureParser(private val structure: AssistStructure) {
|
||||
var creditCardExpirationDayOptions: Array<CharSequence>? = null
|
||||
|
||||
var usernameId: AutofillId? = null
|
||||
set(value) {
|
||||
if (field == null)
|
||||
field = value
|
||||
}
|
||||
|
||||
var passwordId: AutofillId? = null
|
||||
set(value) {
|
||||
if (field == null)
|
||||
field = value
|
||||
}
|
||||
|
||||
var creditCardHolderId: AutofillId? = null
|
||||
set(value) {
|
||||
if (field == null)
|
||||
field = value
|
||||
}
|
||||
|
||||
var creditCardNumberId: AutofillId? = null
|
||||
set(value) {
|
||||
if (field == null)
|
||||
field = value
|
||||
}
|
||||
|
||||
var creditCardExpirationDateId: AutofillId? = null
|
||||
set(value) {
|
||||
if (field == null)
|
||||
field = value
|
||||
}
|
||||
|
||||
var creditCardExpirationYearId: AutofillId? = null
|
||||
set(value) {
|
||||
if (field == null)
|
||||
field = value
|
||||
}
|
||||
|
||||
var creditCardExpirationMonthId: AutofillId? = null
|
||||
set(value) {
|
||||
if (field == null)
|
||||
field = value
|
||||
}
|
||||
|
||||
var creditCardExpirationDayId: AutofillId? = null
|
||||
set(value) {
|
||||
if (field == null)
|
||||
field = value
|
||||
}
|
||||
|
||||
var cardVerificationValueId: AutofillId? = null
|
||||
set(value) {
|
||||
if (field == null)
|
||||
field = value
|
||||
}
|
||||
|
||||
fun allAutofillIds(): Array<AutofillId> {
|
||||
val all = ArrayList<AutofillId>()
|
||||
@@ -510,13 +523,13 @@ class StructureParser(private val structure: AssistStructure) {
|
||||
|
||||
var usernameValue: AutofillValue? = null
|
||||
set(value) {
|
||||
if (allowSaveValues && field == null)
|
||||
if (allowSaveValues)
|
||||
field = value
|
||||
}
|
||||
|
||||
var passwordValue: AutofillValue? = null
|
||||
set(value) {
|
||||
if (allowSaveValues && field == null)
|
||||
if (allowSaveValues)
|
||||
field = value
|
||||
}
|
||||
|
||||
@@ -569,5 +582,7 @@ class StructureParser(private val structure: AssistStructure) {
|
||||
|
||||
companion object {
|
||||
private val TAG = StructureParser::class.java.name
|
||||
|
||||
const val APPLICATION_ID_POPUP_WINDOW = "PopupWindow:"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,14 +20,18 @@
|
||||
package com.kunzisoft.keepass.biometric
|
||||
|
||||
import android.app.Activity
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.net.Uri
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import android.provider.Settings
|
||||
import android.util.Log
|
||||
import android.view.*
|
||||
import android.view.LayoutInflater
|
||||
import android.view.Menu
|
||||
import android.view.MenuInflater
|
||||
import android.view.MenuItem
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.activity.result.contract.ActivityResultContracts
|
||||
import androidx.annotation.RequiresApi
|
||||
import androidx.biometric.BiometricManager
|
||||
@@ -35,7 +39,9 @@ import androidx.biometric.BiometricPrompt
|
||||
import androidx.core.view.MenuProvider
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.fragment.app.activityViewModels
|
||||
import androidx.lifecycle.Lifecycle
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import androidx.lifecycle.repeatOnLifecycle
|
||||
import com.kunzisoft.keepass.R
|
||||
import com.kunzisoft.keepass.app.database.CipherDatabaseAction
|
||||
import com.kunzisoft.keepass.database.exception.UnknownDatabaseLocationException
|
||||
@@ -52,8 +58,6 @@ import kotlinx.coroutines.launch
|
||||
|
||||
class AdvancedUnlockFragment: Fragment(), AdvancedUnlockManager.AdvancedUnlockCallback {
|
||||
|
||||
private var mBuilderListener: BuilderListener? = null
|
||||
|
||||
private var mAdvancedUnlockEnabled = false
|
||||
private var mAutoOpenPromptEnabled = false
|
||||
|
||||
@@ -84,6 +88,8 @@ class AdvancedUnlockFragment: Fragment(), AdvancedUnlockManager.AdvancedUnlockCa
|
||||
// Only keep connection when we request a device credential activity
|
||||
private var keepConnection = false
|
||||
|
||||
private var isConditionToStoreCredentialVerified = false
|
||||
|
||||
private var mDeviceCredentialResultLauncher = registerForActivityResult(
|
||||
ActivityResultContracts.StartActivityForResult()
|
||||
) { result ->
|
||||
@@ -115,37 +121,10 @@ class AdvancedUnlockFragment: Fragment(), AdvancedUnlockManager.AdvancedUnlockCa
|
||||
}
|
||||
}
|
||||
|
||||
override fun onAttach(context: Context) {
|
||||
super.onAttach(context)
|
||||
|
||||
mAdvancedUnlockEnabled = PreferencesUtil.isAdvancedUnlockEnable(context)
|
||||
mAutoOpenPromptEnabled = PreferencesUtil.isAdvancedUnlockPromptAutoOpenEnable(context)
|
||||
try {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||
mBuilderListener = context as BuilderListener
|
||||
}
|
||||
} catch (e: ClassCastException) {
|
||||
throw ClassCastException(context.toString()
|
||||
+ " must implement " + BuilderListener::class.java.name)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
|
||||
cipherDatabaseAction = CipherDatabaseAction.getInstance(requireContext().applicationContext)
|
||||
|
||||
mAdvancedUnlockViewModel.onInitAdvancedUnlockModeRequested.observe(this) {
|
||||
initAdvancedUnlockMode()
|
||||
}
|
||||
|
||||
mAdvancedUnlockViewModel.onUnlockAvailabilityCheckRequested.observe(this) {
|
||||
checkUnlockAvailability()
|
||||
}
|
||||
|
||||
mAdvancedUnlockViewModel.onDatabaseFileLoaded.observe(this) {
|
||||
onDatabaseLoaded(it)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
|
||||
@@ -162,6 +141,32 @@ class AdvancedUnlockFragment: Fragment(), AdvancedUnlockManager.AdvancedUnlockCa
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
|
||||
activity?.addMenuProvider(menuProvider, viewLifecycleOwner)
|
||||
|
||||
viewLifecycleOwner.lifecycleScope.launch {
|
||||
viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
|
||||
mAdvancedUnlockViewModel.uiState.collect { uiState ->
|
||||
// Database loaded
|
||||
uiState.databaseFileLoaded?.let { databaseLoaded ->
|
||||
onDatabaseLoaded(databaseLoaded)
|
||||
mAdvancedUnlockViewModel.consumeDatabaseFileLoaded()
|
||||
}
|
||||
// New credential value received
|
||||
uiState.credential?.let {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||
advancedUnlockManager?.encryptData(uiState.credential)
|
||||
}
|
||||
mAdvancedUnlockViewModel.consumeCredentialForEncryption()
|
||||
}
|
||||
// Condition to store credential verified
|
||||
isConditionToStoreCredentialVerified = uiState.isConditionToStoreCredentialVerified
|
||||
// Check unlock availability
|
||||
if (uiState.onUnlockAvailabilityCheckRequested) {
|
||||
checkUnlockAvailability()
|
||||
mAdvancedUnlockViewModel.consumeCheckUnlockAvailability()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
@@ -178,10 +183,9 @@ class AdvancedUnlockFragment: Fragment(), AdvancedUnlockManager.AdvancedUnlockCa
|
||||
// To get device credential unlock result, only if same database uri
|
||||
if (databaseUri != null
|
||||
&& mAdvancedUnlockEnabled) {
|
||||
val deviceCredentialAuthSucceeded = mAdvancedUnlockViewModel.deviceCredentialAuthSucceeded
|
||||
deviceCredentialAuthSucceeded?.let {
|
||||
mAdvancedUnlockViewModel.deviceCredentialAuthSucceeded?.let { authSucceeded ->
|
||||
if (databaseUri == databaseFileUri) {
|
||||
if (deviceCredentialAuthSucceeded == true) {
|
||||
if (authSucceeded) {
|
||||
advancedUnlockManager?.advancedUnlockCallback?.onAuthenticationSucceeded()
|
||||
} else {
|
||||
advancedUnlockManager?.advancedUnlockCallback?.onAuthenticationFailed()
|
||||
@@ -250,7 +254,7 @@ class AdvancedUnlockFragment: Fragment(), AdvancedUnlockManager.AdvancedUnlockCa
|
||||
if (advancedUnlockManager?.isKeyManagerInitialized != true) {
|
||||
toggleMode(Mode.KEY_MANAGER_UNAVAILABLE)
|
||||
} else {
|
||||
if (mBuilderListener?.conditionToStoreCredential() == true) {
|
||||
if (isConditionToStoreCredentialVerified) {
|
||||
// listen for encryption
|
||||
toggleMode(Mode.STORE_CREDENTIAL)
|
||||
} else {
|
||||
@@ -261,8 +265,13 @@ class AdvancedUnlockFragment: Fragment(), AdvancedUnlockManager.AdvancedUnlockCa
|
||||
// listen for decryption
|
||||
Mode.EXTRACT_CREDENTIAL
|
||||
} else {
|
||||
// wait for typing
|
||||
Mode.WAIT_CREDENTIAL
|
||||
if (isConditionToStoreCredentialVerified) {
|
||||
// if condition OK, key manager in error
|
||||
Mode.KEY_MANAGER_UNAVAILABLE
|
||||
} else {
|
||||
// wait for typing
|
||||
Mode.WAIT_CREDENTIAL
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -523,9 +532,7 @@ class AdvancedUnlockFragment: Fragment(), AdvancedUnlockManager.AdvancedUnlockCa
|
||||
}
|
||||
Mode.STORE_CREDENTIAL -> {
|
||||
// newly store the entered password in encrypted way
|
||||
mBuilderListener?.retrieveCredentialForEncryption()?.let { credential ->
|
||||
advancedUnlockManager?.encryptData(credential)
|
||||
}
|
||||
mAdvancedUnlockViewModel.retrieveCredentialForEncryption()
|
||||
}
|
||||
Mode.EXTRACT_CREDENTIAL -> {
|
||||
// retrieve the encrypted value from preferences
|
||||
@@ -545,7 +552,7 @@ class AdvancedUnlockFragment: Fragment(), AdvancedUnlockManager.AdvancedUnlockCa
|
||||
|
||||
override fun handleEncryptedResult(encryptedValue: ByteArray, ivSpec: ByteArray) {
|
||||
databaseFileUri?.let { databaseUri ->
|
||||
mBuilderListener?.onCredentialEncrypted(
|
||||
mAdvancedUnlockViewModel.onCredentialEncrypted(
|
||||
CipherEncryptDatabase().apply {
|
||||
this.databaseUri = databaseUri
|
||||
this.credentialStorage = credentialDatabaseStorage
|
||||
@@ -559,13 +566,14 @@ class AdvancedUnlockFragment: Fragment(), AdvancedUnlockManager.AdvancedUnlockCa
|
||||
override fun handleDecryptedResult(decryptedValue: ByteArray) {
|
||||
// Load database directly with password retrieve
|
||||
databaseFileUri?.let { databaseUri ->
|
||||
mBuilderListener?.onCredentialDecrypted(
|
||||
mAdvancedUnlockViewModel.onCredentialDecrypted(
|
||||
CipherDecryptDatabase().apply {
|
||||
this.databaseUri = databaseUri
|
||||
this.credentialStorage = credentialDatabaseStorage
|
||||
this.decryptedValue = decryptedValue
|
||||
}
|
||||
)
|
||||
cipherDatabaseAction.resetCipherParameters(databaseUri)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -629,13 +637,6 @@ class AdvancedUnlockFragment: Fragment(), AdvancedUnlockManager.AdvancedUnlockCa
|
||||
EXTRACT_CREDENTIAL
|
||||
}
|
||||
|
||||
interface BuilderListener {
|
||||
fun retrieveCredentialForEncryption(): ByteArray
|
||||
fun conditionToStoreCredential(): Boolean
|
||||
fun onCredentialEncrypted(cipherEncryptDatabase: CipherEncryptDatabase)
|
||||
fun onCredentialDecrypted(cipherDecryptDatabase: CipherDecryptDatabase)
|
||||
}
|
||||
|
||||
override fun onPause() {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||
if (!keepConnection) {
|
||||
@@ -644,13 +645,11 @@ class AdvancedUnlockFragment: Fragment(), AdvancedUnlockManager.AdvancedUnlockCa
|
||||
advancedUnlockManager = null
|
||||
}
|
||||
}
|
||||
|
||||
super.onPause()
|
||||
}
|
||||
|
||||
override fun onDestroyView() {
|
||||
mAdvancedUnlockInfoView = null
|
||||
|
||||
super.onDestroyView()
|
||||
}
|
||||
|
||||
@@ -658,20 +657,11 @@ class AdvancedUnlockFragment: Fragment(), AdvancedUnlockManager.AdvancedUnlockCa
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||
disconnect()
|
||||
advancedUnlockManager = null
|
||||
mBuilderListener = null
|
||||
}
|
||||
|
||||
super.onDestroy()
|
||||
}
|
||||
|
||||
override fun onDetach() {
|
||||
mBuilderListener = null
|
||||
|
||||
super.onDetach()
|
||||
}
|
||||
|
||||
companion object {
|
||||
|
||||
private val TAG = AdvancedUnlockFragment::class.java.name
|
||||
}
|
||||
}
|
||||
@@ -40,6 +40,7 @@ import androidx.activity.result.contract.ActivityResultContracts
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import androidx.core.app.ActivityCompat.shouldShowRequestPermissionRationale
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.core.content.ContextCompat.RECEIVER_NOT_EXPORTED
|
||||
import androidx.fragment.app.FragmentActivity
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import com.kunzisoft.keepass.R
|
||||
@@ -182,8 +183,11 @@ class DatabaseTaskProvider(
|
||||
|
||||
private var databaseInfoListener = object:
|
||||
DatabaseTaskNotificationService.DatabaseInfoListener {
|
||||
override fun onDatabaseInfoChanged(previousDatabaseInfo: SnapFileDatabaseInfo,
|
||||
newDatabaseInfo: SnapFileDatabaseInfo) {
|
||||
override fun onDatabaseInfoChanged(
|
||||
previousDatabaseInfo: SnapFileDatabaseInfo,
|
||||
newDatabaseInfo: SnapFileDatabaseInfo,
|
||||
readOnlyDatabase: Boolean
|
||||
) {
|
||||
activity?.let { activity ->
|
||||
activity.lifecycleScope.launch {
|
||||
if (databaseChangedDialogFragment == null) {
|
||||
@@ -195,7 +199,8 @@ class DatabaseTaskProvider(
|
||||
if (progressTaskDialogFragment == null) {
|
||||
databaseChangedDialogFragment = DatabaseChangedDialogFragment.getInstance(
|
||||
previousDatabaseInfo,
|
||||
newDatabaseInfo
|
||||
newDatabaseInfo,
|
||||
readOnlyDatabase
|
||||
)
|
||||
databaseChangedDialogFragment?.actionDatabaseListener =
|
||||
mActionDatabaseListener
|
||||
@@ -326,11 +331,11 @@ class DatabaseTaskProvider(
|
||||
}
|
||||
}
|
||||
}
|
||||
context.registerReceiver(databaseTaskBroadcastReceiver,
|
||||
ContextCompat.registerReceiver(context, databaseTaskBroadcastReceiver,
|
||||
IntentFilter().apply {
|
||||
addAction(DATABASE_START_TASK_ACTION)
|
||||
addAction(DATABASE_STOP_TASK_ACTION)
|
||||
}
|
||||
}, RECEIVER_NOT_EXPORTED
|
||||
)
|
||||
|
||||
// Check if a service is currently running else do nothing
|
||||
|
||||
@@ -51,8 +51,10 @@ open class SaveDatabaseRunnable(
|
||||
// Build temp database file to avoid file corruption if error
|
||||
database.saveData(
|
||||
cacheFile = File(context.cacheDir, databaseCopyUri.hashCode().toString()),
|
||||
databaseOutputStream = contentResolver
|
||||
.getUriOutputStream(databaseCopyUri ?: database.fileUri),
|
||||
databaseOutputStream = {
|
||||
contentResolver
|
||||
.getUriOutputStream(databaseCopyUri ?: database.fileUri)
|
||||
},
|
||||
isNewLocation = databaseCopyUri == null,
|
||||
mainCredential?.toMasterCredential(contentResolver),
|
||||
challengeResponseRetriever)
|
||||
|
||||
@@ -60,6 +60,7 @@ object SearchHelper {
|
||||
// If search provide results
|
||||
database.createVirtualGroupFromSearchInfo(
|
||||
searchInfo.toString(),
|
||||
searchInfo.isASearchByDomain(),
|
||||
MAX_SEARCH_ENTRY
|
||||
)?.let { searchGroup ->
|
||||
if (searchGroup.numberOfChildEntries > 0) {
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
package com.kunzisoft.keepass.model
|
||||
|
||||
data class DataDate(val year: Int, val month: Int, val day: Int)
|
||||
@@ -0,0 +1,3 @@
|
||||
package com.kunzisoft.keepass.model
|
||||
|
||||
data class DataTime(val hour: Int, val minute: Int)
|
||||
@@ -21,6 +21,7 @@ package com.kunzisoft.keepass.password
|
||||
|
||||
import android.content.res.Resources
|
||||
import android.graphics.Color
|
||||
import android.text.Editable
|
||||
import android.text.Spannable
|
||||
import android.text.SpannableString
|
||||
import android.text.SpannableStringBuilder
|
||||
@@ -253,51 +254,62 @@ class PasswordGenerator(private val resources: Resources) {
|
||||
return charSet.toString()
|
||||
}
|
||||
|
||||
fun colorizedPassword(editable: Editable?) {
|
||||
editable.toString().forEachIndexed { index, char ->
|
||||
colorFromChar(char)?.let { color ->
|
||||
editable?.setSpan(
|
||||
ForegroundColorSpan(color),
|
||||
index,
|
||||
index + 1,
|
||||
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun getColorizedPassword(password: String): Spannable {
|
||||
val spannableString = SpannableStringBuilder()
|
||||
if (password.isNotEmpty()) {
|
||||
password.forEach {
|
||||
when {
|
||||
UPPERCASE_CHARS.contains(it)||
|
||||
LOWERCASE_CHARS.contains(it) -> {
|
||||
spannableString.append(it)
|
||||
}
|
||||
DIGIT_CHARS.contains(it) -> {
|
||||
// RED
|
||||
spannableString.append(colorizeChar(it, Color.rgb(246, 79, 62)))
|
||||
}
|
||||
SPECIAL_CHARS.contains(it) -> {
|
||||
// Blue
|
||||
spannableString.append(colorizeChar(it, Color.rgb(39, 166, 228)))
|
||||
}
|
||||
MINUS_CHAR.contains(it)||
|
||||
UNDERLINE_CHAR.contains(it)||
|
||||
BRACKET_CHARS.contains(it) -> {
|
||||
// Purple
|
||||
spannableString.append(colorizeChar(it, Color.rgb(185, 38, 209)))
|
||||
}
|
||||
extendedChars().contains(it) -> {
|
||||
// Green
|
||||
spannableString.append(colorizeChar(it, Color.rgb(44, 181, 50)))
|
||||
}
|
||||
else -> {
|
||||
spannableString.append(it)
|
||||
}
|
||||
}
|
||||
password.forEach { char ->
|
||||
colorFromChar(char)?.let { color ->
|
||||
val spannableColorChar = SpannableString(char.toString())
|
||||
spannableColorChar.setSpan(
|
||||
ForegroundColorSpan(color),
|
||||
0,
|
||||
1,
|
||||
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
|
||||
)
|
||||
spannableString.append(spannableColorChar)
|
||||
} ?: spannableString.append(char)
|
||||
}
|
||||
}
|
||||
return spannableString
|
||||
}
|
||||
|
||||
private fun colorizeChar(char: Char, color: Int): Spannable {
|
||||
val spannableColorChar = SpannableString(char.toString())
|
||||
spannableColorChar.setSpan(
|
||||
ForegroundColorSpan(color),
|
||||
0,
|
||||
1,
|
||||
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
|
||||
)
|
||||
return spannableColorChar
|
||||
private fun colorFromChar(char: Char): Int? {
|
||||
return when {
|
||||
DIGIT_CHARS.contains(char) -> {
|
||||
// RED
|
||||
Color.rgb(246, 79, 62)
|
||||
}
|
||||
SPECIAL_CHARS.contains(char) -> {
|
||||
// Blue
|
||||
Color.rgb(39, 166, 228)
|
||||
}
|
||||
MINUS_CHAR.contains(char)||
|
||||
UNDERLINE_CHAR.contains(char)||
|
||||
BRACKET_CHARS.contains(char) -> {
|
||||
// Purple
|
||||
Color.rgb(185, 38, 209)
|
||||
}
|
||||
extendedChars().contains(char) -> {
|
||||
// Green
|
||||
Color.rgb(44, 181, 50)
|
||||
}
|
||||
else -> {
|
||||
null
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,7 +26,9 @@ class AdvancedUnlockNotificationService : NotificationService() {
|
||||
return mTempCipherDao.firstOrNull { it.databaseUri == databaseUri.toString()}
|
||||
}
|
||||
fun addOrUpdateCipherDatabase(cipherDatabaseEntity: CipherDatabaseEntity) {
|
||||
val cipherDatabaseRetrieve = mTempCipherDao.firstOrNull { it.databaseUri == cipherDatabaseEntity.databaseUri }
|
||||
val cipherDatabaseRetrieve = mTempCipherDao.firstOrNull {
|
||||
it.databaseUri == cipherDatabaseEntity.databaseUri
|
||||
}
|
||||
cipherDatabaseRetrieve?.replaceContent(cipherDatabaseEntity)
|
||||
?: mTempCipherDao.add(cipherDatabaseEntity)
|
||||
}
|
||||
@@ -35,6 +37,9 @@ class AdvancedUnlockNotificationService : NotificationService() {
|
||||
mTempCipherDao.remove(it)
|
||||
}
|
||||
}
|
||||
fun resetTimer() {
|
||||
resetTimeJob()
|
||||
}
|
||||
fun deleteAll() {
|
||||
mTempCipherDao.clear()
|
||||
}
|
||||
@@ -86,11 +91,19 @@ class AdvancedUnlockNotificationService : NotificationService() {
|
||||
val notificationTimeoutMilliSecs = PreferencesUtil.getAdvancedUnlockTimeout(this)
|
||||
// Not necessarily a foreground service
|
||||
if (mTimerJob == null && notificationTimeoutMilliSecs != TimeoutHelper.NEVER) {
|
||||
defineTimerJob(notificationBuilder, notificationTimeoutMilliSecs) {
|
||||
defineTimerJob(
|
||||
notificationBuilder,
|
||||
NotificationServiceType.ADVANCED_UNLOCK,
|
||||
notificationTimeoutMilliSecs
|
||||
) {
|
||||
sendBroadcast(Intent(REMOVE_ADVANCED_UNLOCK_KEY_ACTION))
|
||||
}
|
||||
} else {
|
||||
startForeground(notificationId, notificationBuilder.build())
|
||||
startForegroundCompat(
|
||||
notificationId,
|
||||
notificationBuilder,
|
||||
NotificationServiceType.ADVANCED_UNLOCK
|
||||
)
|
||||
}
|
||||
|
||||
return mActionTaskBinder
|
||||
|
||||
@@ -36,13 +36,13 @@ import com.kunzisoft.keepass.model.AttachmentState
|
||||
import com.kunzisoft.keepass.model.EntryAttachmentState
|
||||
import com.kunzisoft.keepass.model.StreamDirection
|
||||
import com.kunzisoft.keepass.tasks.BinaryDatabaseManager
|
||||
import com.kunzisoft.keepass.utils.getParcelableExtraCompat
|
||||
import com.kunzisoft.keepass.utils.UriUtil.getDocumentFile
|
||||
import com.kunzisoft.keepass.utils.getParcelableExtraCompat
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
import java.util.*
|
||||
import java.util.LinkedList
|
||||
import java.util.concurrent.CopyOnWriteArrayList
|
||||
|
||||
|
||||
@@ -282,15 +282,21 @@ class AttachmentFileNotificationService: LockNotificationService() {
|
||||
AttachmentState.ERROR -> {
|
||||
ServiceCompat.stopForeground(this, ServiceCompat.STOP_FOREGROUND_DETACH)
|
||||
try {
|
||||
notificationManager?.notify(
|
||||
attachmentNotification.notificationId,
|
||||
builder.build()
|
||||
)
|
||||
checkNotificationsPermission(this) {
|
||||
notificationManager?.notify(
|
||||
attachmentNotification.notificationId,
|
||||
builder.build()
|
||||
)
|
||||
}
|
||||
} catch (e: SecurityException) {
|
||||
Log.e(TAG, "Unable to notify the attachment state", e)
|
||||
}
|
||||
} else -> {
|
||||
startForeground(attachmentNotification.notificationId, builder.build())
|
||||
startForegroundCompat(
|
||||
attachmentNotification.notificationId,
|
||||
builder,
|
||||
NotificationServiceType.ATTACHMENT
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,16 +19,12 @@
|
||||
*/
|
||||
package com.kunzisoft.keepass.services
|
||||
|
||||
import android.Manifest
|
||||
import android.app.Activity
|
||||
import android.app.PendingIntent
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.content.pm.PackageManager
|
||||
import android.os.Build
|
||||
import android.util.Log
|
||||
import android.widget.Toast
|
||||
import androidx.core.content.ContextCompat
|
||||
import com.kunzisoft.keepass.R
|
||||
import com.kunzisoft.keepass.model.EntryInfo
|
||||
import com.kunzisoft.keepass.otp.OtpEntryFields.OTP_TOKEN_FIELD
|
||||
@@ -196,23 +192,29 @@ class ClipboardEntryNotificationService : LockNotificationService() {
|
||||
//Get settings
|
||||
val notificationTimeoutMilliSecs = PreferencesUtil.getClipboardTimeout(this)
|
||||
if (notificationTimeoutMilliSecs != NEVER) {
|
||||
defineTimerJob(builder, notificationTimeoutMilliSecs, {
|
||||
val newGeneratedValue = fieldToCopy.getGeneratedValue(mEntryInfo)
|
||||
// New auto generated value
|
||||
if (generatedValue != newGeneratedValue) {
|
||||
generatedValue = newGeneratedValue
|
||||
clipboardHelper?.copyToClipboard(
|
||||
fieldToCopy.label,
|
||||
generatedValue,
|
||||
fieldToCopy.isSensitive
|
||||
)
|
||||
defineTimerJob(
|
||||
builder,
|
||||
NotificationServiceType.CLIPBOARD,
|
||||
notificationTimeoutMilliSecs,
|
||||
{
|
||||
val newGeneratedValue = fieldToCopy.getGeneratedValue(mEntryInfo)
|
||||
// New auto generated value
|
||||
if (generatedValue != newGeneratedValue) {
|
||||
generatedValue = newGeneratedValue
|
||||
clipboardHelper?.copyToClipboard(
|
||||
fieldToCopy.label,
|
||||
generatedValue,
|
||||
fieldToCopy.isSensitive
|
||||
)
|
||||
}
|
||||
},
|
||||
{
|
||||
stopNotificationAndSendLockIfNeeded()
|
||||
// Clean password only if no next field
|
||||
if (nextFields.size <= 0)
|
||||
clipboardHelper?.cleanClipboard()
|
||||
}
|
||||
}) {
|
||||
stopNotificationAndSendLockIfNeeded()
|
||||
// Clean password only if no next field
|
||||
if (nextFields.size <= 0)
|
||||
clipboardHelper?.cleanClipboard()
|
||||
}
|
||||
)
|
||||
} else {
|
||||
// No timer
|
||||
checkNotificationsPermission {
|
||||
@@ -226,12 +228,11 @@ class ClipboardEntryNotificationService : LockNotificationService() {
|
||||
}
|
||||
|
||||
private fun checkNotificationsPermission(action: () -> Unit) {
|
||||
if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS)
|
||||
== PackageManager.PERMISSION_GRANTED) {
|
||||
action.invoke()
|
||||
} else {
|
||||
showPermissionErrorIfNeeded(this)
|
||||
}
|
||||
checkNotificationsPermission(
|
||||
this,
|
||||
PreferencesUtil.isClipboardNotificationsEnable(this),
|
||||
action
|
||||
)
|
||||
}
|
||||
|
||||
override fun onTaskRemoved(rootIntent: Intent?) {
|
||||
@@ -255,26 +256,14 @@ class ClipboardEntryNotificationService : LockNotificationService() {
|
||||
const val EXTRA_CLIPBOARD_FIELDS = "EXTRA_CLIPBOARD_FIELDS"
|
||||
const val ACTION_CLEAN_CLIPBOARD = "ACTION_CLEAN_CLIPBOARD"
|
||||
|
||||
private fun showPermissionErrorIfNeeded(context: Context) {
|
||||
if (PreferencesUtil.isClipboardNotificationsEnable(context)) {
|
||||
Toast.makeText(context, R.string.warning_copy_permission, Toast.LENGTH_LONG).show()
|
||||
}
|
||||
}
|
||||
|
||||
fun checkAndLaunchNotification(
|
||||
activity: Activity,
|
||||
entry: EntryInfo
|
||||
) {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
|
||||
if (ContextCompat.checkSelfPermission(
|
||||
activity,
|
||||
Manifest.permission.POST_NOTIFICATIONS
|
||||
) == PackageManager.PERMISSION_GRANTED) {
|
||||
launchNotificationIfAllowed(activity, entry)
|
||||
} else {
|
||||
showPermissionErrorIfNeeded(activity)
|
||||
}
|
||||
} else {
|
||||
checkNotificationsPermission(
|
||||
activity,
|
||||
PreferencesUtil.isClipboardNotificationsEnable(activity)
|
||||
) {
|
||||
launchNotificationIfAllowed(activity, entry)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,10 +36,24 @@ import com.kunzisoft.keepass.app.database.FileDatabaseHistoryAction
|
||||
import com.kunzisoft.keepass.database.ContextualDatabase
|
||||
import com.kunzisoft.keepass.database.MainCredential
|
||||
import com.kunzisoft.keepass.database.ProgressMessage
|
||||
import com.kunzisoft.keepass.database.action.*
|
||||
import com.kunzisoft.keepass.database.action.CreateDatabaseRunnable
|
||||
import com.kunzisoft.keepass.database.action.LoadDatabaseRunnable
|
||||
import com.kunzisoft.keepass.database.action.MergeDatabaseRunnable
|
||||
import com.kunzisoft.keepass.database.action.ReloadDatabaseRunnable
|
||||
import com.kunzisoft.keepass.database.action.RemoveUnlinkedDataDatabaseRunnable
|
||||
import com.kunzisoft.keepass.database.action.SaveDatabaseRunnable
|
||||
import com.kunzisoft.keepass.database.action.UpdateCompressionBinariesDatabaseRunnable
|
||||
import com.kunzisoft.keepass.database.action.history.DeleteEntryHistoryDatabaseRunnable
|
||||
import com.kunzisoft.keepass.database.action.history.RestoreEntryHistoryDatabaseRunnable
|
||||
import com.kunzisoft.keepass.database.action.node.*
|
||||
import com.kunzisoft.keepass.database.action.node.ActionNodesValues
|
||||
import com.kunzisoft.keepass.database.action.node.AddEntryRunnable
|
||||
import com.kunzisoft.keepass.database.action.node.AddGroupRunnable
|
||||
import com.kunzisoft.keepass.database.action.node.AfterActionNodesFinish
|
||||
import com.kunzisoft.keepass.database.action.node.CopyNodesRunnable
|
||||
import com.kunzisoft.keepass.database.action.node.DeleteNodesRunnable
|
||||
import com.kunzisoft.keepass.database.action.node.MoveNodesRunnable
|
||||
import com.kunzisoft.keepass.database.action.node.UpdateEntryRunnable
|
||||
import com.kunzisoft.keepass.database.action.node.UpdateGroupRunnable
|
||||
import com.kunzisoft.keepass.database.element.Entry
|
||||
import com.kunzisoft.keepass.database.element.Group
|
||||
import com.kunzisoft.keepass.database.element.database.CompressionAlgorithm
|
||||
@@ -62,9 +76,17 @@ import com.kunzisoft.keepass.utils.getParcelableExtraCompat
|
||||
import com.kunzisoft.keepass.utils.getParcelableList
|
||||
import com.kunzisoft.keepass.utils.putParcelableList
|
||||
import com.kunzisoft.keepass.viewmodels.FileDatabaseInfo
|
||||
import kotlinx.coroutines.*
|
||||
import kotlinx.coroutines.CancellationException
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Deferred
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
||||
import kotlinx.coroutines.async
|
||||
import kotlinx.coroutines.channels.Channel
|
||||
import java.util.*
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.runBlocking
|
||||
import kotlinx.coroutines.withContext
|
||||
import java.util.UUID
|
||||
|
||||
open class DatabaseTaskNotificationService : LockNotificationService(), ProgressTaskUpdater {
|
||||
|
||||
@@ -139,6 +161,7 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress
|
||||
fun onDatabaseInfoChanged(
|
||||
previousDatabaseInfo: SnapFileDatabaseInfo,
|
||||
newDatabaseInfo: SnapFileDatabaseInfo,
|
||||
readOnlyDatabase: Boolean
|
||||
)
|
||||
}
|
||||
|
||||
@@ -197,8 +220,11 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress
|
||||
// Call listener to indicate a change in database info
|
||||
if (!mSaveState && previousDatabaseInfo != null) {
|
||||
mDatabaseInfoListeners.forEach { listener ->
|
||||
listener.onDatabaseInfoChanged(previousDatabaseInfo,
|
||||
lastFileDatabaseInfo)
|
||||
listener.onDatabaseInfoChanged(
|
||||
previousDatabaseInfo,
|
||||
lastFileDatabaseInfo,
|
||||
mDatabase?.isReadOnly ?: true
|
||||
)
|
||||
}
|
||||
}
|
||||
mSnapFileDatabaseInfo = lastFileDatabaseInfo
|
||||
@@ -565,7 +591,11 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress
|
||||
}
|
||||
|
||||
// Create the notification
|
||||
startForeground(notificationId, notificationBuilder.build())
|
||||
startForegroundCompat(
|
||||
notificationId,
|
||||
notificationBuilder,
|
||||
NotificationServiceType.DATABASE_TASK
|
||||
)
|
||||
}
|
||||
|
||||
private fun removeIntentData(intent: Intent?) {
|
||||
@@ -831,6 +861,7 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress
|
||||
if (intent.hasExtra(MAIN_CREDENTIAL_KEY)) {
|
||||
databaseToMergeMainCredential = intent.getParcelableExtraCompat(MAIN_CREDENTIAL_KEY)
|
||||
}
|
||||
val saveDatabase = intent.getBooleanExtra(SAVE_DATABASE_KEY, false)
|
||||
return MergeDatabaseRunnable(
|
||||
this,
|
||||
databaseToMergeUri,
|
||||
@@ -839,7 +870,7 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress
|
||||
retrieveResponseFromChallenge(hardwareKey, seed)
|
||||
},
|
||||
database,
|
||||
!database.isReadOnly && intent.getBooleanExtra(SAVE_DATABASE_KEY, false),
|
||||
!database.isReadOnly && saveDatabase,
|
||||
{ hardwareKey, seed ->
|
||||
retrieveResponseFromChallenge(hardwareKey, seed)
|
||||
},
|
||||
@@ -932,12 +963,13 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress
|
||||
val parentId: NodeId<*>? = intent.getParcelableExtraCompat(PARENT_ID_KEY)
|
||||
val newGroup: Group? = intent.getParcelableExtraCompat(GROUP_KEY)
|
||||
if (parentId == null || newGroup == null) return null
|
||||
val saveDatabase = intent.getBooleanExtra(SAVE_DATABASE_KEY, false)
|
||||
database.getGroupById(parentId)?.let { parent ->
|
||||
AddGroupRunnable(this,
|
||||
database,
|
||||
newGroup,
|
||||
parent,
|
||||
!database.isReadOnly && intent.getBooleanExtra(SAVE_DATABASE_KEY, false),
|
||||
!database.isReadOnly && saveDatabase,
|
||||
AfterActionNodesRunnable()
|
||||
) { hardwareKey, seed ->
|
||||
retrieveResponseFromChallenge(hardwareKey, seed)
|
||||
@@ -959,12 +991,13 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress
|
||||
val groupId: NodeId<*>? = intent.getParcelableExtraCompat(GROUP_ID_KEY)
|
||||
val newGroup: Group? = intent.getParcelableExtraCompat(GROUP_KEY)
|
||||
if (groupId == null || newGroup == null) return null
|
||||
val saveDatabase = intent.getBooleanExtra(SAVE_DATABASE_KEY, false)
|
||||
database.getGroupById(groupId)?.let { oldGroup ->
|
||||
UpdateGroupRunnable(this,
|
||||
database,
|
||||
oldGroup,
|
||||
newGroup,
|
||||
!database.isReadOnly && intent.getBooleanExtra(SAVE_DATABASE_KEY, false),
|
||||
!database.isReadOnly && saveDatabase,
|
||||
AfterActionNodesRunnable()
|
||||
) { hardwareKey, seed ->
|
||||
retrieveResponseFromChallenge(hardwareKey, seed)
|
||||
@@ -986,12 +1019,13 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress
|
||||
val parentId: NodeId<*>? = intent.getParcelableExtraCompat(PARENT_ID_KEY)
|
||||
val newEntry: Entry? = intent.getParcelableExtraCompat(ENTRY_KEY)
|
||||
if (parentId == null || newEntry == null) return null
|
||||
val saveDatabase = intent.getBooleanExtra(SAVE_DATABASE_KEY, false)
|
||||
database.getGroupById(parentId)?.let { parent ->
|
||||
AddEntryRunnable(this,
|
||||
database,
|
||||
newEntry,
|
||||
parent,
|
||||
!database.isReadOnly && intent.getBooleanExtra(SAVE_DATABASE_KEY, false),
|
||||
!database.isReadOnly && saveDatabase,
|
||||
AfterActionNodesRunnable()
|
||||
) { hardwareKey, seed ->
|
||||
retrieveResponseFromChallenge(hardwareKey, seed)
|
||||
@@ -1013,12 +1047,13 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress
|
||||
val entryId: NodeId<UUID>? = intent.getParcelableExtraCompat(ENTRY_ID_KEY)
|
||||
val newEntry: Entry? = intent.getParcelableExtraCompat(ENTRY_KEY)
|
||||
if (entryId == null || newEntry == null) return null
|
||||
val saveDatabase = intent.getBooleanExtra(SAVE_DATABASE_KEY, false)
|
||||
database.getEntryById(entryId)?.let { oldEntry ->
|
||||
UpdateEntryRunnable(this,
|
||||
database,
|
||||
oldEntry,
|
||||
newEntry,
|
||||
!database.isReadOnly && intent.getBooleanExtra(SAVE_DATABASE_KEY, false),
|
||||
!database.isReadOnly && saveDatabase,
|
||||
AfterActionNodesRunnable()
|
||||
) { hardwareKey, seed ->
|
||||
retrieveResponseFromChallenge(hardwareKey, seed)
|
||||
@@ -1039,12 +1074,13 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress
|
||||
&& intent.hasExtra(SAVE_DATABASE_KEY)
|
||||
) {
|
||||
val parentId: NodeId<*> = intent.getParcelableExtraCompat(PARENT_ID_KEY) ?: return null
|
||||
val saveDatabase = intent.getBooleanExtra(SAVE_DATABASE_KEY, false)
|
||||
database.getGroupById(parentId)?.let { newParent ->
|
||||
CopyNodesRunnable(this,
|
||||
database,
|
||||
getListNodesFromBundle(database, intent.extras!!),
|
||||
newParent,
|
||||
!database.isReadOnly && intent.getBooleanExtra(SAVE_DATABASE_KEY, false),
|
||||
!database.isReadOnly && saveDatabase,
|
||||
AfterActionNodesRunnable()
|
||||
) { hardwareKey, seed ->
|
||||
retrieveResponseFromChallenge(hardwareKey, seed)
|
||||
@@ -1065,12 +1101,13 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress
|
||||
&& intent.hasExtra(SAVE_DATABASE_KEY)
|
||||
) {
|
||||
val parentId: NodeId<*> = intent.getParcelableExtraCompat(PARENT_ID_KEY) ?: return null
|
||||
val saveDatabase = intent.getBooleanExtra(SAVE_DATABASE_KEY, false)
|
||||
database.getGroupById(parentId)?.let { newParent ->
|
||||
MoveNodesRunnable(this,
|
||||
database,
|
||||
getListNodesFromBundle(database, intent.extras!!),
|
||||
newParent,
|
||||
!database.isReadOnly && intent.getBooleanExtra(SAVE_DATABASE_KEY, false),
|
||||
!database.isReadOnly && saveDatabase,
|
||||
AfterActionNodesRunnable()
|
||||
) { hardwareKey, seed ->
|
||||
retrieveResponseFromChallenge(hardwareKey, seed)
|
||||
@@ -1089,11 +1126,12 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress
|
||||
&& intent.hasExtra(ENTRIES_ID_KEY)
|
||||
&& intent.hasExtra(SAVE_DATABASE_KEY)
|
||||
) {
|
||||
val saveDatabase = intent.getBooleanExtra(SAVE_DATABASE_KEY, false)
|
||||
DeleteNodesRunnable(this,
|
||||
database,
|
||||
getListNodesFromBundle(database, intent.extras!!),
|
||||
resources.getString(R.string.recycle_bin),
|
||||
!database.isReadOnly && intent.getBooleanExtra(SAVE_DATABASE_KEY, false),
|
||||
!database.isReadOnly && saveDatabase,
|
||||
AfterActionNodesRunnable()
|
||||
) { hardwareKey, seed ->
|
||||
retrieveResponseFromChallenge(hardwareKey, seed)
|
||||
@@ -1112,12 +1150,13 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress
|
||||
&& intent.hasExtra(SAVE_DATABASE_KEY)
|
||||
) {
|
||||
val entryId: NodeId<UUID> = intent.getParcelableExtraCompat(ENTRY_ID_KEY) ?: return null
|
||||
val saveDatabase = intent.getBooleanExtra(SAVE_DATABASE_KEY, false)
|
||||
database.getEntryById(entryId)?.let { mainEntry ->
|
||||
RestoreEntryHistoryDatabaseRunnable(this,
|
||||
database,
|
||||
mainEntry,
|
||||
intent.getIntExtra(ENTRY_HISTORY_POSITION_KEY, -1),
|
||||
!database.isReadOnly && intent.getBooleanExtra(SAVE_DATABASE_KEY, false)
|
||||
!database.isReadOnly && saveDatabase
|
||||
) { hardwareKey, seed ->
|
||||
retrieveResponseFromChallenge(hardwareKey, seed)
|
||||
}
|
||||
@@ -1136,12 +1175,13 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress
|
||||
&& intent.hasExtra(SAVE_DATABASE_KEY)
|
||||
) {
|
||||
val entryId: NodeId<UUID> = intent.getParcelableExtraCompat(ENTRY_ID_KEY) ?: return null
|
||||
val saveDatabase = intent.getBooleanExtra(SAVE_DATABASE_KEY, false)
|
||||
database.getEntryById(entryId)?.let { mainEntry ->
|
||||
DeleteEntryHistoryDatabaseRunnable(this,
|
||||
database,
|
||||
mainEntry,
|
||||
intent.getIntExtra(ENTRY_HISTORY_POSITION_KEY, -1),
|
||||
!database.isReadOnly && intent.getBooleanExtra(SAVE_DATABASE_KEY, false)
|
||||
!database.isReadOnly && saveDatabase
|
||||
) { hardwareKey, seed ->
|
||||
retrieveResponseFromChallenge(hardwareKey, seed)
|
||||
}
|
||||
@@ -1162,11 +1202,12 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress
|
||||
val oldElement: CompressionAlgorithm? = intent.getParcelableExtraCompat(OLD_ELEMENT_KEY)
|
||||
val newElement: CompressionAlgorithm? = intent.getParcelableExtraCompat(NEW_ELEMENT_KEY)
|
||||
if (oldElement == null || newElement == null) return null
|
||||
val saveDatabase = intent.getBooleanExtra(SAVE_DATABASE_KEY, false)
|
||||
return UpdateCompressionBinariesDatabaseRunnable(this,
|
||||
database,
|
||||
oldElement,
|
||||
newElement,
|
||||
!database.isReadOnly && intent.getBooleanExtra(SAVE_DATABASE_KEY, false)
|
||||
!database.isReadOnly && saveDatabase
|
||||
) { hardwareKey, seed ->
|
||||
retrieveResponseFromChallenge(hardwareKey, seed)
|
||||
}.apply {
|
||||
@@ -1184,9 +1225,10 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress
|
||||
database: ContextualDatabase,
|
||||
): ActionRunnable? {
|
||||
return if (intent.hasExtra(SAVE_DATABASE_KEY)) {
|
||||
val saveDatabase = intent.getBooleanExtra(SAVE_DATABASE_KEY, false)
|
||||
return RemoveUnlinkedDataDatabaseRunnable(this,
|
||||
database,
|
||||
!database.isReadOnly && intent.getBooleanExtra(SAVE_DATABASE_KEY, false)
|
||||
!database.isReadOnly && saveDatabase
|
||||
) { hardwareKey, seed ->
|
||||
retrieveResponseFromChallenge(hardwareKey, seed)
|
||||
}.apply {
|
||||
@@ -1204,9 +1246,10 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress
|
||||
database: ContextualDatabase,
|
||||
): ActionRunnable? {
|
||||
return if (intent.hasExtra(SAVE_DATABASE_KEY)) {
|
||||
val saveDatabase = intent.getBooleanExtra(SAVE_DATABASE_KEY, false)
|
||||
return SaveDatabaseRunnable(this,
|
||||
database,
|
||||
!database.isReadOnly && intent.getBooleanExtra(SAVE_DATABASE_KEY, false),
|
||||
!database.isReadOnly && saveDatabase,
|
||||
null,
|
||||
{ hardwareKey, seed ->
|
||||
retrieveResponseFromChallenge(hardwareKey, seed)
|
||||
@@ -1229,13 +1272,14 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress
|
||||
database: ContextualDatabase
|
||||
): ActionRunnable? {
|
||||
return if (intent.hasExtra(SAVE_DATABASE_KEY)) {
|
||||
val saveDatabase = intent.getBooleanExtra(SAVE_DATABASE_KEY, false)
|
||||
var databaseCopyUri: Uri? = null
|
||||
if (intent.hasExtra(DATABASE_URI_KEY)) {
|
||||
databaseCopyUri = intent.getParcelableExtraCompat(DATABASE_URI_KEY)
|
||||
}
|
||||
SaveDatabaseRunnable(this,
|
||||
database,
|
||||
!database.isReadOnly && intent.getBooleanExtra(SAVE_DATABASE_KEY, false),
|
||||
!database.isReadOnly && saveDatabase,
|
||||
null,
|
||||
{ hardwareKey, seed ->
|
||||
retrieveResponseFromChallenge(hardwareKey, seed)
|
||||
|
||||
@@ -111,13 +111,18 @@ class KeyboardEntryNotificationService : LockNotificationService() {
|
||||
.setContentIntent(null)
|
||||
.setDeleteIntent(pendingDeleteIntent)
|
||||
|
||||
notificationManager?.cancel(notificationId)
|
||||
notificationManager?.notify(notificationId, builder.build())
|
||||
checkNotificationsPermission(this, PreferencesUtil.isKeyboardNotificationEntryEnable(this)) {
|
||||
notificationManager?.notify(notificationId, builder.build())
|
||||
}
|
||||
|
||||
// Timeout only if notification clear is available
|
||||
if (PreferencesUtil.isClearKeyboardNotificationEnable(this)) {
|
||||
if (mNotificationTimeoutMilliSecs != TimeoutHelper.NEVER) {
|
||||
defineTimerJob(builder, mNotificationTimeoutMilliSecs) {
|
||||
defineTimerJob(
|
||||
builder,
|
||||
NotificationServiceType.KEYBOARD,
|
||||
mNotificationTimeoutMilliSecs
|
||||
) {
|
||||
stopNotificationAndSendLockIfNeeded()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,17 +1,31 @@
|
||||
package com.kunzisoft.keepass.services
|
||||
|
||||
import android.Manifest
|
||||
import android.app.NotificationChannel
|
||||
import android.app.NotificationManager
|
||||
import android.app.Service
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.content.pm.PackageManager
|
||||
import android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC
|
||||
import android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_NONE
|
||||
import android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_SPECIAL_USE
|
||||
import android.os.Build
|
||||
import android.os.IBinder
|
||||
import android.util.TypedValue
|
||||
import android.widget.Toast
|
||||
import androidx.core.app.NotificationCompat
|
||||
import androidx.core.app.NotificationManagerCompat
|
||||
import androidx.core.content.ContextCompat
|
||||
import com.kunzisoft.keepass.R
|
||||
import com.kunzisoft.keepass.activities.stylish.Stylish
|
||||
import kotlinx.coroutines.*
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.Job
|
||||
import kotlinx.coroutines.cancel
|
||||
import kotlinx.coroutines.delay
|
||||
import kotlinx.coroutines.launch
|
||||
import org.joda.time.Instant
|
||||
|
||||
|
||||
abstract class NotificationService : Service() {
|
||||
@@ -20,6 +34,7 @@ abstract class NotificationService : Service() {
|
||||
private var colorNotificationAccent: Int = 0
|
||||
|
||||
protected var mTimerJob: Job? = null
|
||||
private var mReset: Boolean = false
|
||||
|
||||
protected abstract val notificationId: Int
|
||||
|
||||
@@ -74,21 +89,55 @@ abstract class NotificationService : Service() {
|
||||
}
|
||||
}
|
||||
|
||||
protected fun startForegroundCompat(notificationId: Int,
|
||||
builder: NotificationCompat.Builder,
|
||||
type: NotificationServiceType
|
||||
) {
|
||||
@Suppress("DEPRECATION")
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
|
||||
val foregroundServiceTimer = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
|
||||
FOREGROUND_SERVICE_TYPE_SPECIAL_USE
|
||||
} else {
|
||||
FOREGROUND_SERVICE_TYPE_NONE
|
||||
}
|
||||
val foregroundType = when (type) {
|
||||
NotificationServiceType.DATABASE_TASK -> FOREGROUND_SERVICE_TYPE_DATA_SYNC
|
||||
NotificationServiceType.ATTACHMENT -> FOREGROUND_SERVICE_TYPE_DATA_SYNC
|
||||
NotificationServiceType.CLIPBOARD -> foregroundServiceTimer
|
||||
NotificationServiceType.KEYBOARD -> foregroundServiceTimer
|
||||
NotificationServiceType.ADVANCED_UNLOCK -> foregroundServiceTimer
|
||||
}
|
||||
startForeground(notificationId, builder.build(), foregroundType)
|
||||
} else {
|
||||
startForeground(notificationId, builder.build())
|
||||
}
|
||||
}
|
||||
|
||||
protected fun defineTimerJob(builder: NotificationCompat.Builder,
|
||||
type: NotificationServiceType,
|
||||
timeoutMilliseconds: Long,
|
||||
actionAfterASecond: (() -> Unit)? = null,
|
||||
actionEnd: () -> Unit) {
|
||||
mTimerJob?.cancel()
|
||||
mTimerJob = CoroutineScope(Dispatchers.Main).launch {
|
||||
if (timeoutMilliseconds > 0) {
|
||||
val timeoutInSeconds = timeoutMilliseconds / 1000L
|
||||
for (currentTime in timeoutInSeconds downTo 0) {
|
||||
var startInstant = Instant.now().millis
|
||||
var currentTime = timeoutMilliseconds
|
||||
while (currentTime >= 0) {
|
||||
// Reset the timer if needed
|
||||
if (mReset) {
|
||||
mReset = false
|
||||
startInstant = Instant.now().millis
|
||||
currentTime = timeoutMilliseconds
|
||||
}
|
||||
// Update every second
|
||||
actionAfterASecond?.invoke()
|
||||
builder.setProgress(100,
|
||||
(currentTime * 100 / timeoutInSeconds).toInt(),
|
||||
false)
|
||||
startForeground(notificationId, builder.build())
|
||||
(currentTime * 100 / timeoutMilliseconds).toInt(),
|
||||
false)
|
||||
startForegroundCompat(notificationId, builder, type)
|
||||
delay(1000)
|
||||
currentTime = timeoutMilliseconds - (Instant.now().millis - startInstant)
|
||||
if (currentTime <= 0) {
|
||||
actionEnd()
|
||||
}
|
||||
@@ -103,6 +152,10 @@ abstract class NotificationService : Service() {
|
||||
}
|
||||
}
|
||||
|
||||
protected fun resetTimeJob() {
|
||||
mReset = true
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
mTimerJob?.cancel()
|
||||
mTimerJob = null
|
||||
@@ -114,5 +167,25 @@ abstract class NotificationService : Service() {
|
||||
companion object {
|
||||
private const val CHANNEL_ID = "com.kunzisoft.keepass.notification.channel"
|
||||
private const val CHANNEL_NAME = "KeePassDX notification"
|
||||
|
||||
fun checkNotificationsPermission(
|
||||
context: Context,
|
||||
showError: Boolean = true,
|
||||
action: () -> Unit
|
||||
) {
|
||||
if (ContextCompat.checkSelfPermission(context,
|
||||
Manifest.permission.POST_NOTIFICATIONS)
|
||||
== PackageManager.PERMISSION_GRANTED) {
|
||||
action.invoke()
|
||||
} else {
|
||||
if (showError) {
|
||||
Toast.makeText(
|
||||
context,
|
||||
R.string.warning_copy_permission,
|
||||
Toast.LENGTH_LONG
|
||||
).show()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
package com.kunzisoft.keepass.services
|
||||
|
||||
enum class NotificationServiceType {
|
||||
DATABASE_TASK,
|
||||
ATTACHMENT,
|
||||
CLIPBOARD,
|
||||
KEYBOARD,
|
||||
ADVANCED_UNLOCK
|
||||
}
|
||||
@@ -483,13 +483,15 @@ class NestedAppSettingsFragment : NestedSettingsFragment() {
|
||||
getString(R.string.setting_style_brightness_key),
|
||||
getString(R.string.setting_icon_pack_choose_key),
|
||||
getString(R.string.show_entry_colors_key),
|
||||
getString(R.string.hide_expired_entries_key),
|
||||
getString(R.string.hide_templates_key),
|
||||
getString(R.string.list_entries_show_username_key),
|
||||
getString(R.string.list_groups_show_number_entries_key),
|
||||
getString(R.string.recursive_number_entries_key),
|
||||
getString(R.string.show_otp_token_key),
|
||||
getString(R.string.show_uuid_key),
|
||||
getString(R.string.list_size_key),
|
||||
getString(R.string.monospace_font_fields_enable_key),
|
||||
getString(R.string.hide_expired_entries_key),
|
||||
getString(R.string.enable_education_screens_key),
|
||||
getString(R.string.reset_education_screens_key) -> {
|
||||
DATABASE_PREFERENCE_CHANGED = true
|
||||
|
||||
@@ -120,6 +120,18 @@ object PreferencesUtil {
|
||||
context.resources.getBoolean(R.bool.show_entry_colors_default))
|
||||
}
|
||||
|
||||
fun showExpiredEntries(context: Context): Boolean {
|
||||
val prefs = PreferenceManager.getDefaultSharedPreferences(context)
|
||||
return ! prefs.getBoolean(context.getString(R.string.hide_expired_entries_key),
|
||||
context.resources.getBoolean(R.bool.hide_expired_entries_default))
|
||||
}
|
||||
|
||||
fun showTemplates(context: Context): Boolean {
|
||||
val prefs = PreferenceManager.getDefaultSharedPreferences(context)
|
||||
return ! prefs.getBoolean(context.getString(R.string.hide_templates_key),
|
||||
context.resources.getBoolean(R.bool.hide_templates_default))
|
||||
}
|
||||
|
||||
fun hideProtectedValue(context: Context): Boolean {
|
||||
val prefs = PreferenceManager.getDefaultSharedPreferences(context)
|
||||
return prefs.getBoolean(context.getString(R.string.hide_password_key),
|
||||
@@ -144,6 +156,12 @@ object PreferencesUtil {
|
||||
context.resources.getBoolean(R.bool.list_groups_show_number_entries_default))
|
||||
}
|
||||
|
||||
fun recursiveNumberEntries(context: Context): Boolean {
|
||||
val prefs = PreferenceManager.getDefaultSharedPreferences(context)
|
||||
return prefs.getBoolean(context.getString(R.string.recursive_number_entries_key),
|
||||
context.resources.getBoolean(R.bool.recursive_number_entries_default))
|
||||
}
|
||||
|
||||
fun showOTPToken(context: Context): Boolean {
|
||||
val prefs = PreferenceManager.getDefaultSharedPreferences(context)
|
||||
return prefs.getBoolean(context.getString(R.string.show_otp_token_key),
|
||||
@@ -156,12 +174,6 @@ object PreferencesUtil {
|
||||
context.resources.getBoolean(R.bool.show_uuid_default))
|
||||
}
|
||||
|
||||
fun showExpiredEntries(context: Context): Boolean {
|
||||
val prefs = PreferenceManager.getDefaultSharedPreferences(context)
|
||||
return ! prefs.getBoolean(context.getString(R.string.hide_expired_entries_key),
|
||||
context.resources.getBoolean(R.bool.hide_expired_entries_default))
|
||||
}
|
||||
|
||||
fun getStyle(context: Context): String {
|
||||
val defaultStyleString = Stylish.defaultStyle(context)
|
||||
val styleString = PreferenceManager.getDefaultSharedPreferences(context)
|
||||
@@ -841,15 +853,17 @@ object PreferencesUtil {
|
||||
context.getString(R.string.setting_style_brightness_key) -> editor.putString(name, value)
|
||||
context.getString(R.string.setting_icon_pack_choose_key) -> editor.putString(name, value)
|
||||
context.getString(R.string.show_entry_colors_key) -> editor.putBoolean(name, value.toBoolean())
|
||||
context.getString(R.string.hide_expired_entries_key) -> editor.putBoolean(name, value.toBoolean())
|
||||
context.getString(R.string.hide_templates_key) -> editor.putBoolean(name, value.toBoolean())
|
||||
context.getString(R.string.hide_password_key) -> editor.putBoolean(name, value.toBoolean())
|
||||
context.getString(R.string.colorize_password_key) -> editor.putBoolean(name, value.toBoolean())
|
||||
context.getString(R.string.list_entries_show_username_key) -> editor.putBoolean(name, value.toBoolean())
|
||||
context.getString(R.string.list_groups_show_number_entries_key) -> editor.putBoolean(name, value.toBoolean())
|
||||
context.getString(R.string.recursive_number_entries_key) -> editor.putBoolean(name, value.toBoolean())
|
||||
context.getString(R.string.show_otp_token_key) -> editor.putBoolean(name, value.toBoolean())
|
||||
context.getString(R.string.show_uuid_key) -> editor.putBoolean(name, value.toBoolean())
|
||||
context.getString(R.string.list_size_key) -> editor.putString(name, value)
|
||||
context.getString(R.string.monospace_font_fields_enable_key) -> editor.putBoolean(name, value.toBoolean())
|
||||
context.getString(R.string.hide_expired_entries_key) -> editor.putBoolean(name, value.toBoolean())
|
||||
context.getString(R.string.enable_education_screens_key) -> editor.putBoolean(name, value.toBoolean())
|
||||
|
||||
context.getString(R.string.password_generator_length_key) -> editor.putInt(name, value.toInt())
|
||||
|
||||
@@ -26,7 +26,7 @@ import com.kunzisoft.keepass.model.SearchInfo
|
||||
class AutofillBlocklistWebDomainPreferenceDialogFragmentCompat
|
||||
: AutofillBlocklistPreferenceDialogFragmentCompat() {
|
||||
|
||||
override fun buildSearchInfoFromString(searchInfoString: String): SearchInfo? {
|
||||
override fun buildSearchInfoFromString(searchInfoString: String): SearchInfo {
|
||||
val newSearchInfo = searchInfoString
|
||||
// remove prefix https://
|
||||
.replace(Regex("^.*://"), "")
|
||||
|
||||
@@ -29,6 +29,7 @@ import android.content.Intent
|
||||
import android.content.IntentFilter
|
||||
import android.os.Build
|
||||
import android.util.Log
|
||||
import androidx.core.content.ContextCompat
|
||||
import com.kunzisoft.keepass.R
|
||||
import com.kunzisoft.keepass.database.ContextualDatabase
|
||||
import com.kunzisoft.keepass.magikeyboard.MagikeyboardService
|
||||
@@ -45,9 +46,9 @@ const val LOCK_ACTION = "com.kunzisoft.keepass.LOCK"
|
||||
const val REMOVE_ENTRY_MAGIKEYBOARD_ACTION = "com.kunzisoft.keepass.REMOVE_ENTRY_MAGIKEYBOARD"
|
||||
const val BACK_PREVIOUS_KEYBOARD_ACTION = "com.kunzisoft.keepass.BACK_PREVIOUS_KEYBOARD"
|
||||
|
||||
class LockReceiver(var lockAction: () -> Unit) : BroadcastReceiver() {
|
||||
class LockReceiver(private var lockAction: () -> Unit) : BroadcastReceiver() {
|
||||
|
||||
var mLockPendingIntent: PendingIntent? = null
|
||||
private var mLockPendingIntent: PendingIntent? = null
|
||||
var backToPreviousKeyboardAction: (() -> Unit)? = null
|
||||
|
||||
override fun onReceive(context: Context, intent: Intent) {
|
||||
@@ -60,7 +61,7 @@ class LockReceiver(var lockAction: () -> Unit) : BroadcastReceiver() {
|
||||
}
|
||||
Intent.ACTION_SCREEN_OFF -> {
|
||||
if (PreferencesUtil.isLockDatabaseWhenScreenShutOffEnable(context)) {
|
||||
mLockPendingIntent = PendingIntent.getBroadcast(context,
|
||||
val lockPendingIntent = PendingIntent.getBroadcast(context,
|
||||
4575,
|
||||
Intent(intent).apply {
|
||||
action = LOCK_ACTION
|
||||
@@ -71,6 +72,7 @@ class LockReceiver(var lockAction: () -> Unit) : BroadcastReceiver() {
|
||||
0
|
||||
}
|
||||
)
|
||||
this.mLockPendingIntent = lockPendingIntent
|
||||
// Launch the effective action after a small time
|
||||
val first: Long = System.currentTimeMillis() + context.getString(R.string.timeout_screen_off).toLong()
|
||||
(context.getSystemService(ALARM_SERVICE) as AlarmManager?)?.let { alarmManager ->
|
||||
@@ -80,20 +82,20 @@ class LockReceiver(var lockAction: () -> Unit) : BroadcastReceiver() {
|
||||
alarmManager.set(
|
||||
AlarmManager.RTC_WAKEUP,
|
||||
first,
|
||||
mLockPendingIntent
|
||||
lockPendingIntent
|
||||
)
|
||||
} else {
|
||||
alarmManager.setExact(
|
||||
AlarmManager.RTC_WAKEUP,
|
||||
first,
|
||||
mLockPendingIntent
|
||||
lockPendingIntent
|
||||
)
|
||||
}
|
||||
} else {
|
||||
alarmManager.set(
|
||||
AlarmManager.RTC_WAKEUP,
|
||||
first,
|
||||
mLockPendingIntent
|
||||
lockPendingIntent
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -120,9 +122,9 @@ class LockReceiver(var lockAction: () -> Unit) : BroadcastReceiver() {
|
||||
}
|
||||
|
||||
private fun cancelLockPendingIntent(context: Context) {
|
||||
mLockPendingIntent?.let {
|
||||
mLockPendingIntent?.let { lockPendingIntent ->
|
||||
val alarmManager = context.getSystemService(ALARM_SERVICE) as AlarmManager?
|
||||
alarmManager?.cancel(mLockPendingIntent)
|
||||
alarmManager?.cancel(lockPendingIntent)
|
||||
mLockPendingIntent = null
|
||||
}
|
||||
}
|
||||
@@ -131,7 +133,7 @@ class LockReceiver(var lockAction: () -> Unit) : BroadcastReceiver() {
|
||||
fun Context.registerLockReceiver(lockReceiver: LockReceiver?,
|
||||
registerKeyboardAction: Boolean = false) {
|
||||
lockReceiver?.let {
|
||||
registerReceiver(it, IntentFilter().apply {
|
||||
ContextCompat.registerReceiver(this, it, IntentFilter().apply {
|
||||
addAction(Intent.ACTION_SCREEN_OFF)
|
||||
addAction(Intent.ACTION_SCREEN_ON)
|
||||
addAction(LOCK_ACTION)
|
||||
@@ -139,7 +141,7 @@ fun Context.registerLockReceiver(lockReceiver: LockReceiver?,
|
||||
addAction(REMOVE_ENTRY_MAGIKEYBOARD_ACTION)
|
||||
addAction(BACK_PREVIOUS_KEYBOARD_ACTION)
|
||||
}
|
||||
})
|
||||
}, ContextCompat.RECEIVER_EXPORTED)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -3,13 +3,17 @@ package com.kunzisoft.keepass.utils
|
||||
import android.content.res.Resources
|
||||
import androidx.core.os.ConfigurationCompat
|
||||
import com.kunzisoft.keepass.database.element.DateInstant
|
||||
import com.kunzisoft.keepass.model.DataDate
|
||||
import java.text.DateFormat
|
||||
import java.util.Calendar
|
||||
import java.util.Locale
|
||||
import java.util.TimeZone
|
||||
|
||||
object TimeUtil {
|
||||
|
||||
fun DateInstant.getDateTimeString(resources: Resources): String {
|
||||
val locale = ConfigurationCompat.getLocales(resources.configuration)[0] ?: Locale.ROOT
|
||||
val date = instant.toDate()
|
||||
return when (type) {
|
||||
DateInstant.Type.DATE -> DateFormat.getDateInstance(
|
||||
DateFormat.MEDIUM,
|
||||
@@ -26,4 +30,22 @@ object TimeUtil {
|
||||
.format(date)
|
||||
}
|
||||
}
|
||||
|
||||
// https://github.com/material-components/material-components-android/issues/882#issuecomment-1111374962
|
||||
// To fix UTC time in date picker
|
||||
fun datePickerToDataDate(millis: Long): DataDate {
|
||||
val selectedUtc = Calendar.getInstance(TimeZone.getTimeZone("UTC"))
|
||||
selectedUtc.timeInMillis = millis
|
||||
val selectedLocal = Calendar.getInstance()
|
||||
selectedLocal.clear()
|
||||
selectedLocal.set(
|
||||
selectedUtc.get(Calendar.YEAR),
|
||||
selectedUtc.get(Calendar.MONTH),
|
||||
selectedUtc.get(Calendar.DAY_OF_MONTH))
|
||||
return DataDate(
|
||||
selectedLocal.get(Calendar.YEAR),
|
||||
selectedLocal.get(Calendar.MONTH) + 1,
|
||||
selectedLocal.get(Calendar.DAY_OF_MONTH),
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -68,6 +68,7 @@ class AddNodeButtonView @JvmOverloads constructor(context: Context,
|
||||
|
||||
init {
|
||||
inflate(context)
|
||||
hideButton()
|
||||
}
|
||||
|
||||
private fun inflate(context: Context) {
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
package com.kunzisoft.keepass.view
|
||||
|
||||
data class DataTime(val hours: Int, val minutes: Int)
|
||||
@@ -111,7 +111,7 @@ class DateTimeEditFieldView @JvmOverloads constructor(context: Context,
|
||||
mDefault
|
||||
}
|
||||
set(value) {
|
||||
mDateTime = DateInstant(value.date, mDateTime.type)
|
||||
mDateTime = DateInstant(value.instant, mDateTime.type)
|
||||
entryExpiresTextView.text = if (entryExpiresCheckBox.isChecked) {
|
||||
mDateTime.getDateTimeString(resources)
|
||||
} else {
|
||||
|
||||
@@ -57,8 +57,6 @@ class DateTimeFieldView @JvmOverloads constructor(context: Context,
|
||||
}
|
||||
|
||||
private fun assignExpiresDateText() {
|
||||
val isExpires = mDateTime.isCurrentlyExpire()
|
||||
|
||||
// Show or not the warning icon
|
||||
expiresImage.isVisible = if (mActivated) {
|
||||
isExpires
|
||||
@@ -100,6 +98,13 @@ class DateTimeFieldView @JvmOverloads constructor(context: Context,
|
||||
mDateTime.type = value
|
||||
}
|
||||
|
||||
var isExpirable: Boolean = false
|
||||
|
||||
val isExpires: Boolean
|
||||
get() {
|
||||
return isExpirable && mDateTime.isCurrentlyExpire()
|
||||
}
|
||||
|
||||
override var activation: Boolean
|
||||
get() {
|
||||
return mActivated
|
||||
@@ -128,7 +133,7 @@ class DateTimeFieldView @JvmOverloads constructor(context: Context,
|
||||
mDefault
|
||||
}
|
||||
set(value) {
|
||||
mDateTime = DateInstant(value.date, mDateTime.type)
|
||||
mDateTime = DateInstant(value.instant, mDateTime.type)
|
||||
assignExpiresDateText()
|
||||
}
|
||||
|
||||
|
||||
@@ -53,9 +53,7 @@ class MainCredentialView @JvmOverloads constructor(context: Context,
|
||||
private var checkboxHardwareView: CompoundButton
|
||||
private var hardwareKeySelectionView: HardwareKeySelectionView
|
||||
|
||||
var onPasswordChecked: (CompoundButton.OnCheckedChangeListener)? = null
|
||||
var onKeyFileChecked: (CompoundButton.OnCheckedChangeListener)? = null
|
||||
var onHardwareKeyChecked: (CompoundButton.OnCheckedChangeListener)? = null
|
||||
var onConditionToStoreCredentialChanged: ((CredentialStorage, verified: Boolean) -> Unit)? = null
|
||||
var onValidateListener: (() -> Unit)? = null
|
||||
|
||||
private var mCredentialStorage: CredentialStorage = CredentialStorage.PASSWORD
|
||||
@@ -103,24 +101,33 @@ class MainCredentialView @JvmOverloads constructor(context: Context,
|
||||
handled
|
||||
}
|
||||
|
||||
checkboxPasswordView.setOnCheckedChangeListener { view, checked ->
|
||||
onPasswordChecked?.onCheckedChanged(view, checked)
|
||||
checkboxPasswordView.setOnCheckedChangeListener { _, _ ->
|
||||
onConditionToStoreCredentialChanged?.invoke(
|
||||
mCredentialStorage,
|
||||
conditionToStoreCredential()
|
||||
)
|
||||
}
|
||||
checkboxKeyFileView.setOnCheckedChangeListener { view, checked ->
|
||||
checkboxKeyFileView.setOnCheckedChangeListener { _, checked ->
|
||||
if (checked) {
|
||||
if (keyFileSelectionView.uri == null) {
|
||||
checkboxKeyFileView.isChecked = false
|
||||
}
|
||||
}
|
||||
onKeyFileChecked?.onCheckedChanged(view, checked)
|
||||
onConditionToStoreCredentialChanged?.invoke(
|
||||
mCredentialStorage,
|
||||
conditionToStoreCredential()
|
||||
)
|
||||
}
|
||||
checkboxHardwareView.setOnCheckedChangeListener { view, checked ->
|
||||
checkboxHardwareView.setOnCheckedChangeListener { _, checked ->
|
||||
if (checked) {
|
||||
if (hardwareKeySelectionView.hardwareKey == null) {
|
||||
checkboxHardwareView.isChecked = false
|
||||
}
|
||||
}
|
||||
onHardwareKeyChecked?.onCheckedChanged(view, checked)
|
||||
onConditionToStoreCredentialChanged?.invoke(
|
||||
mCredentialStorage,
|
||||
conditionToStoreCredential()
|
||||
)
|
||||
}
|
||||
|
||||
hardwareKeySelectionView.selectionListener = { _ ->
|
||||
|
||||
@@ -22,28 +22,30 @@ package com.kunzisoft.keepass.view
|
||||
import android.content.Context
|
||||
import android.text.Editable
|
||||
import android.text.InputType
|
||||
import android.text.Spannable
|
||||
import android.text.SpannableString
|
||||
import android.text.TextWatcher
|
||||
import android.util.AttributeSet
|
||||
import android.view.LayoutInflater
|
||||
import android.widget.EditText
|
||||
import android.widget.FrameLayout
|
||||
import android.widget.TextView
|
||||
import com.google.android.material.progressindicator.LinearProgressIndicator
|
||||
import com.google.android.material.textfield.TextInputLayout
|
||||
import com.kunzisoft.keepass.R
|
||||
import com.kunzisoft.keepass.password.PasswordGenerator
|
||||
import com.kunzisoft.keepass.password.PasswordEntropy
|
||||
import com.kunzisoft.keepass.password.PasswordGenerator
|
||||
import com.kunzisoft.keepass.settings.PreferencesUtil
|
||||
|
||||
class PassKeyView @JvmOverloads constructor(context: Context,
|
||||
attrs: AttributeSet? = null,
|
||||
defStyle: Int = 0)
|
||||
class PasswordEditView @JvmOverloads constructor(context: Context,
|
||||
attrs: AttributeSet? = null,
|
||||
defStyle: Int = 0)
|
||||
: FrameLayout(context, attrs, defStyle) {
|
||||
|
||||
private var mPasswordEntropyCalculator: PasswordEntropy? = null
|
||||
|
||||
private val passwordInputLayout: TextInputLayout
|
||||
private val passwordText: TextView
|
||||
private val passwordText: EditText
|
||||
private val passwordStrengthProgress: LinearProgressIndicator
|
||||
private val passwordEntropy: TextView
|
||||
|
||||
@@ -51,38 +53,19 @@ class PassKeyView @JvmOverloads constructor(context: Context,
|
||||
private var mMaxLines: Int = 3
|
||||
private var mShowPassword: Boolean = false
|
||||
|
||||
private var mPasswordTextWatcher: MutableList<TextWatcher> = mutableListOf()
|
||||
private val passwordTextWatcher = object : TextWatcher {
|
||||
override fun beforeTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {
|
||||
mPasswordTextWatcher.forEach {
|
||||
it.beforeTextChanged(charSequence, i, i1, i2)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {
|
||||
mPasswordTextWatcher.forEach {
|
||||
it.onTextChanged(charSequence, i, i1, i2)
|
||||
}
|
||||
}
|
||||
|
||||
override fun afterTextChanged(editable: Editable) {
|
||||
mPasswordTextWatcher.forEach {
|
||||
it.afterTextChanged(editable)
|
||||
}
|
||||
getEntropyStrength(editable.toString())
|
||||
}
|
||||
}
|
||||
private var mPasswordTextWatchers: MutableList<TextWatcher> = mutableListOf()
|
||||
private var mPasswordTextWatcher: TextWatcher? = null
|
||||
|
||||
init {
|
||||
context.theme.obtainStyledAttributes(
|
||||
attrs,
|
||||
R.styleable.PassKeyView,
|
||||
R.styleable.PasswordView,
|
||||
0, 0).apply {
|
||||
try {
|
||||
mViewHint = getString(R.styleable.PassKeyView_passKeyHint)
|
||||
mViewHint = getString(R.styleable.PasswordView_passwordHint)
|
||||
?: context.getString(R.string.password)
|
||||
mMaxLines = getInteger(R.styleable.PassKeyView_passKeyMaxLines, mMaxLines)
|
||||
mShowPassword = getBoolean(R.styleable.PassKeyView_passKeyVisible,
|
||||
mMaxLines = getInteger(R.styleable.PasswordView_passwordMaxLines, mMaxLines)
|
||||
mShowPassword = getBoolean(R.styleable.PasswordView_passwordVisible,
|
||||
!PreferencesUtil.hideProtectedValue(context))
|
||||
} finally {
|
||||
recycle()
|
||||
@@ -90,31 +73,53 @@ class PassKeyView @JvmOverloads constructor(context: Context,
|
||||
}
|
||||
|
||||
val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater?
|
||||
inflater?.inflate(R.layout.view_passkey, this)
|
||||
inflater?.inflate(R.layout.view_password_edit, this)
|
||||
|
||||
passwordInputLayout = findViewById(R.id.password_input_layout)
|
||||
passwordInputLayout = findViewById(R.id.password_edit_input_layout)
|
||||
passwordInputLayout?.hint = mViewHint
|
||||
passwordText = findViewById(R.id.password_text)
|
||||
passwordText = findViewById(R.id.password_edit_text)
|
||||
if (mShowPassword) {
|
||||
passwordText?.inputType = passwordText.inputType or
|
||||
InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
|
||||
}
|
||||
passwordText?.maxLines = mMaxLines
|
||||
passwordText?.applyFontVisibility()
|
||||
passwordText.addTextChangedListener(passwordTextWatcher)
|
||||
passwordStrengthProgress = findViewById(R.id.password_strength_progress)
|
||||
passwordStrengthProgress = findViewById(R.id.password_edit_strength_progress)
|
||||
passwordStrengthProgress?.apply {
|
||||
setIndicatorColor(PasswordEntropy.Strength.RISKY.color)
|
||||
progress = 0
|
||||
max = 100
|
||||
}
|
||||
passwordEntropy = findViewById(R.id.password_entropy)
|
||||
passwordEntropy = findViewById(R.id.password_edit_entropy)
|
||||
|
||||
mPasswordEntropyCalculator = PasswordEntropy {
|
||||
passwordText?.text?.toString()?.let { firstPassword ->
|
||||
getEntropyStrength(firstPassword)
|
||||
}
|
||||
}
|
||||
|
||||
mPasswordTextWatcher = object : TextWatcher {
|
||||
override fun beforeTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {
|
||||
mPasswordTextWatchers.forEach {
|
||||
it.beforeTextChanged(charSequence, i, i1, i2)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {
|
||||
mPasswordTextWatchers.forEach {
|
||||
it.onTextChanged(charSequence, i, i1, i2)
|
||||
}
|
||||
}
|
||||
|
||||
override fun afterTextChanged(editable: Editable) {
|
||||
mPasswordTextWatchers.forEach {
|
||||
it.afterTextChanged(editable)
|
||||
}
|
||||
getEntropyStrength(editable.toString())
|
||||
PasswordGenerator.colorizedPassword(editable)
|
||||
}
|
||||
}
|
||||
passwordText?.addTextChangedListener(mPasswordTextWatcher)
|
||||
}
|
||||
|
||||
private fun getEntropyStrength(passwordText: String) {
|
||||
@@ -134,11 +139,18 @@ class PassKeyView @JvmOverloads constructor(context: Context,
|
||||
}
|
||||
|
||||
fun addTextChangedListener(textWatcher: TextWatcher) {
|
||||
mPasswordTextWatcher.add(textWatcher)
|
||||
mPasswordTextWatchers.add(textWatcher)
|
||||
}
|
||||
|
||||
fun removeTextChangedListener(textWatcher: TextWatcher) {
|
||||
mPasswordTextWatcher.remove(textWatcher)
|
||||
mPasswordTextWatchers.remove(textWatcher)
|
||||
}
|
||||
|
||||
private fun spannableValue(value: String): Spannable {
|
||||
return if (PreferencesUtil.colorizePassword(context))
|
||||
PasswordGenerator.getColorizedPassword(value)
|
||||
else
|
||||
SpannableString(value)
|
||||
}
|
||||
|
||||
var passwordString: String
|
||||
@@ -146,11 +158,6 @@ class PassKeyView @JvmOverloads constructor(context: Context,
|
||||
return passwordText.text.toString()
|
||||
}
|
||||
set(value) {
|
||||
val spannableString =
|
||||
if (PreferencesUtil.colorizePassword(context))
|
||||
PasswordGenerator.getColorizedPassword(value)
|
||||
else
|
||||
SpannableString(value)
|
||||
passwordText.text = spannableString
|
||||
passwordText.setText(spannableValue(value))
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,159 @@
|
||||
/*
|
||||
* Copyright 2024 Jeremy Jamet / Kunzisoft.
|
||||
*
|
||||
* This file is part of KeePassDX.
|
||||
*
|
||||
* KeePassDX is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* KeePassDX is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with KeePassDX. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
package com.kunzisoft.keepass.view
|
||||
|
||||
import android.content.Context
|
||||
import android.os.Build
|
||||
import android.text.Spannable
|
||||
import android.util.AttributeSet
|
||||
import android.util.TypedValue
|
||||
import android.widget.TextView
|
||||
import androidx.core.view.ViewCompat
|
||||
import androidx.core.view.setPadding
|
||||
import androidx.core.widget.TextViewCompat
|
||||
import androidx.core.widget.doAfterTextChanged
|
||||
import com.google.android.material.progressindicator.LinearProgressIndicator
|
||||
import com.kunzisoft.keepass.R
|
||||
import com.kunzisoft.keepass.password.PasswordEntropy
|
||||
import com.kunzisoft.keepass.password.PasswordGenerator
|
||||
import com.kunzisoft.keepass.settings.PreferencesUtil
|
||||
|
||||
|
||||
class PasswordTextEditFieldView @JvmOverloads constructor(context: Context,
|
||||
attrs: AttributeSet? = null,
|
||||
defStyle: Int = 0)
|
||||
: TextEditFieldView(context, attrs, defStyle) {
|
||||
|
||||
private var mPasswordEntropyCalculator: PasswordEntropy = PasswordEntropy {
|
||||
valueView.text?.toString()?.let { firstPassword ->
|
||||
getEntropyStrength(firstPassword)
|
||||
}
|
||||
}
|
||||
private var isColorizedPasswordActivated = PreferencesUtil.colorizePassword(context)
|
||||
|
||||
private var passwordProgressViewId = ViewCompat.generateViewId()
|
||||
private var passwordEntropyViewId = ViewCompat.generateViewId()
|
||||
|
||||
private var mPasswordProgress = LinearProgressIndicator(context).apply {
|
||||
layoutParams = LayoutParams(
|
||||
LayoutParams.MATCH_PARENT,
|
||||
LayoutParams.WRAP_CONTENT
|
||||
).apply {
|
||||
addRule(ALIGN_PARENT_BOTTOM)
|
||||
}
|
||||
setPadding(
|
||||
TypedValue.applyDimension(
|
||||
TypedValue.COMPLEX_UNIT_DIP,
|
||||
1f,
|
||||
context.resources.displayMetrics
|
||||
).toInt()
|
||||
)
|
||||
setIndicatorColor(PasswordEntropy.Strength.RISKY.color)
|
||||
progress = 0
|
||||
max = 100
|
||||
}
|
||||
|
||||
private val mPasswordEntropyView = TextView(context).apply {
|
||||
layoutParams = LayoutParams(
|
||||
LayoutParams.WRAP_CONTENT,
|
||||
LayoutParams.WRAP_CONTENT
|
||||
).apply {
|
||||
addRule(ALIGN_PARENT_BOTTOM)
|
||||
}
|
||||
setPadding(
|
||||
TypedValue.applyDimension(
|
||||
TypedValue.COMPLEX_UNIT_DIP,
|
||||
4f,
|
||||
context.resources.displayMetrics
|
||||
).toInt()
|
||||
)
|
||||
TextViewCompat.setTextAppearance(this, R.style.KeepassDXStyle_Text_Indicator)
|
||||
}
|
||||
|
||||
init {
|
||||
buildViews()
|
||||
|
||||
valueView.doAfterTextChanged { editable ->
|
||||
getEntropyStrength(editable.toString())
|
||||
PasswordGenerator.colorizedPassword(editable)
|
||||
}
|
||||
|
||||
addView(mPasswordProgress)
|
||||
addView(mPasswordEntropyView)
|
||||
}
|
||||
|
||||
private fun buildViews() {
|
||||
mPasswordProgress.apply {
|
||||
id = passwordProgressViewId
|
||||
layoutParams = (layoutParams as LayoutParams?)?.also {
|
||||
it.addRule(LEFT_OF, actionImageButtonId)
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
|
||||
it.addRule(START_OF, actionImageButtonId)
|
||||
}
|
||||
}
|
||||
}
|
||||
mPasswordEntropyView.apply {
|
||||
id = passwordEntropyViewId
|
||||
layoutParams = (layoutParams as LayoutParams?)?.also {
|
||||
it.addRule(ALIGN_RIGHT, passwordProgressViewId)
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
|
||||
it.addRule(ALIGN_END, passwordProgressViewId)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun getEntropyStrength(passwordText: String) {
|
||||
mPasswordEntropyCalculator.getEntropyStrength(passwordText) { entropyStrength ->
|
||||
mPasswordProgress.apply {
|
||||
post {
|
||||
setIndicatorColor(entropyStrength.strength.color)
|
||||
setProgressCompat(entropyStrength.estimationPercent, true)
|
||||
}
|
||||
}
|
||||
mPasswordEntropyView.apply {
|
||||
post {
|
||||
text = PasswordEntropy.getStringEntropy(resources, entropyStrength.entropy)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun spannableValue(value: String?): Spannable? {
|
||||
if (value == null)
|
||||
return null
|
||||
return if (isColorizedPasswordActivated)
|
||||
PasswordGenerator.getColorizedPassword(value)
|
||||
else
|
||||
super.spannableValue(value)
|
||||
}
|
||||
|
||||
override var label: String
|
||||
get() {
|
||||
return super.label
|
||||
}
|
||||
set(value) {
|
||||
super.label = value
|
||||
// Define views Ids with label value
|
||||
passwordProgressViewId = "passwordProgressViewId $value".hashCode()
|
||||
passwordEntropyViewId = "passwordEntropyViewId $value".hashCode()
|
||||
buildViews()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,119 @@
|
||||
/*
|
||||
* Copyright 2024 Jeremy Jamet / Kunzisoft.
|
||||
*
|
||||
* This file is part of KeePassDX.
|
||||
*
|
||||
* KeePassDX is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* KeePassDX is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with KeePassDX. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
package com.kunzisoft.keepass.view
|
||||
|
||||
import android.content.Context
|
||||
import android.graphics.Color
|
||||
import android.text.SpannableString
|
||||
import android.text.Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
|
||||
import android.text.style.ImageSpan
|
||||
import android.util.AttributeSet
|
||||
import androidx.annotation.StringRes
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.core.graphics.drawable.DrawableCompat
|
||||
import com.kunzisoft.keepass.R
|
||||
import com.kunzisoft.keepass.password.PasswordEntropy
|
||||
import com.kunzisoft.keepass.password.PasswordGenerator
|
||||
import com.kunzisoft.keepass.settings.PreferencesUtil
|
||||
|
||||
|
||||
class PasswordTextFieldView @JvmOverloads constructor(context: Context,
|
||||
attrs: AttributeSet? = null,
|
||||
defStyle: Int = 0)
|
||||
: TextFieldView(context, attrs, defStyle) {
|
||||
|
||||
private var mPasswordEntropyCalculator: PasswordEntropy = PasswordEntropy {
|
||||
valueView.text?.toString()?.let { firstPassword ->
|
||||
getEntropyStrength(firstPassword)
|
||||
}
|
||||
}
|
||||
|
||||
private var indicatorDrawable = ContextCompat.getDrawable(
|
||||
context,
|
||||
R.drawable.ic_shield_white_24dp
|
||||
)?.apply {
|
||||
val lineHeight = labelView.lineHeight
|
||||
setBounds(0,0,lineHeight, lineHeight)
|
||||
DrawableCompat.setTint(this, Color.TRANSPARENT)
|
||||
}
|
||||
|
||||
override var label: String
|
||||
get() {
|
||||
return labelView.text.toString().removeSuffix(ICON_STRING_SPACES)
|
||||
}
|
||||
set(value) {
|
||||
indicatorDrawable?.let { drawable ->
|
||||
val spannableString = SpannableString("$value$ICON_STRING_SPACES")
|
||||
val startPosition = spannableString.split(ICON_STRING)[0].length
|
||||
val endPosition = startPosition + ICON_STRING.length
|
||||
spannableString
|
||||
.setSpan(
|
||||
ImageSpan(drawable),
|
||||
startPosition,
|
||||
endPosition,
|
||||
SPAN_EXCLUSIVE_EXCLUSIVE
|
||||
)
|
||||
labelView.text = spannableString
|
||||
} ?: kotlin.run {
|
||||
labelView.text = value
|
||||
}
|
||||
}
|
||||
|
||||
override fun setLabel(@StringRes labelId: Int) {
|
||||
label = resources.getString(labelId)
|
||||
}
|
||||
|
||||
override var value: String
|
||||
get() {
|
||||
return valueView.text.toString()
|
||||
}
|
||||
set(value) {
|
||||
val spannableString =
|
||||
if (PreferencesUtil.colorizePassword(context))
|
||||
PasswordGenerator.getColorizedPassword(value)
|
||||
else
|
||||
SpannableString(value)
|
||||
valueView.text = spannableString
|
||||
changeProtectedValueParameters()
|
||||
}
|
||||
|
||||
override fun setValue(@StringRes valueId: Int) {
|
||||
value = resources.getString(valueId)
|
||||
}
|
||||
|
||||
private fun getEntropyStrength(passwordText: String) {
|
||||
mPasswordEntropyCalculator.getEntropyStrength(passwordText) { entropyStrength ->
|
||||
labelView.apply {
|
||||
post {
|
||||
val strengthColor = entropyStrength.strength.color
|
||||
indicatorDrawable?.let { drawable ->
|
||||
DrawableCompat.setTint(drawable, strengthColor)
|
||||
}
|
||||
invalidate()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
private const val ICON_STRING = "[icon]"
|
||||
private const val ICON_STRING_SPACES = " $ICON_STRING"
|
||||
}
|
||||
}
|
||||
@@ -31,6 +31,7 @@ class SearchFiltersView @JvmOverloads constructor(context: Context,
|
||||
private var searchUsername: CompoundButton
|
||||
private var searchPassword: CompoundButton
|
||||
private var searchURL: CompoundButton
|
||||
private var searchByURLDomain: Boolean = false
|
||||
private var searchExpired: CompoundButton
|
||||
private var searchNotes: CompoundButton
|
||||
private var searchOther: CompoundButton
|
||||
@@ -50,6 +51,7 @@ class SearchFiltersView @JvmOverloads constructor(context: Context,
|
||||
this.searchInUsernames = searchUsername.isChecked
|
||||
this.searchInPasswords = searchPassword.isChecked
|
||||
this.searchInUrls = searchURL.isChecked
|
||||
this.searchByDomain = searchByURLDomain
|
||||
this.searchInExpired = searchExpired.isChecked
|
||||
this.searchInNotes = searchNotes.isChecked
|
||||
this.searchInOther = searchOther.isChecked
|
||||
@@ -70,6 +72,7 @@ class SearchFiltersView @JvmOverloads constructor(context: Context,
|
||||
searchUsername.isChecked = value.searchInUsernames
|
||||
searchPassword.isChecked = value.searchInPasswords
|
||||
searchURL.isChecked = value.searchInUrls
|
||||
searchByURLDomain = value.searchByDomain
|
||||
searchExpired.isChecked = value.searchInExpired
|
||||
searchNotes.isChecked = value.searchInNotes
|
||||
searchOther.isChecked = value.searchInOther
|
||||
|
||||
@@ -18,8 +18,14 @@ import com.kunzisoft.keepass.database.element.DateInstant
|
||||
import com.kunzisoft.keepass.database.element.Field
|
||||
import com.kunzisoft.keepass.database.element.icon.IconImage
|
||||
import com.kunzisoft.keepass.database.element.security.ProtectedString
|
||||
import com.kunzisoft.keepass.database.element.template.*
|
||||
import com.kunzisoft.keepass.database.element.template.Template
|
||||
import com.kunzisoft.keepass.database.element.template.TemplateAttribute
|
||||
import com.kunzisoft.keepass.database.element.template.TemplateAttributeAction
|
||||
import com.kunzisoft.keepass.database.element.template.TemplateAttributeOption
|
||||
import com.kunzisoft.keepass.database.element.template.TemplateAttributeType
|
||||
import com.kunzisoft.keepass.database.element.template.TemplateEngine
|
||||
import com.kunzisoft.keepass.database.element.template.TemplateEngine.Companion.addTemplateDecorator
|
||||
import com.kunzisoft.keepass.database.element.template.TemplateField
|
||||
import com.kunzisoft.keepass.model.EntryInfo
|
||||
import com.kunzisoft.keepass.otp.OtpElement
|
||||
import com.kunzisoft.keepass.otp.OtpEntryFields
|
||||
@@ -608,9 +614,8 @@ abstract class TemplateAbstractView<
|
||||
getViewFieldByName(oldField.name)?.view?.let { viewToReplace ->
|
||||
val oldValue = getCustomField(oldField.name).protectedValue.toString()
|
||||
|
||||
val parentGroup = viewToReplace.parent as ViewGroup
|
||||
val indexInParent = parentGroup.indexOfChild(viewToReplace)
|
||||
parentGroup.removeView(viewToReplace)
|
||||
val parentGroup = viewToReplace.parent as? ViewGroup?
|
||||
parentGroup?.removeView(viewToReplace)
|
||||
|
||||
val newCustomFieldWithValue = if (keepOldValue)
|
||||
Field(newField.name,
|
||||
@@ -624,7 +629,9 @@ abstract class TemplateAbstractView<
|
||||
|
||||
val newCustomView = buildViewForCustomField(newCustomFieldWithValue)
|
||||
newCustomView?.let {
|
||||
parentGroup.addView(newCustomView, indexInParent)
|
||||
parentGroup?.indexOfChild(viewToReplace)?.let { indexInParent ->
|
||||
parentGroup.addView(newCustomView, indexInParent)
|
||||
}
|
||||
mViewFields.add(
|
||||
oldPosition,
|
||||
ViewField(
|
||||
|
||||
@@ -17,8 +17,10 @@ import com.kunzisoft.keepass.database.element.template.TemplateAttribute
|
||||
import com.kunzisoft.keepass.database.element.template.TemplateAttributeAction
|
||||
import com.kunzisoft.keepass.database.element.template.TemplateField
|
||||
import com.kunzisoft.keepass.database.helper.getLocalizedName
|
||||
import com.kunzisoft.keepass.database.helper.isStandardPasswordName
|
||||
import com.kunzisoft.keepass.model.DataDate
|
||||
import com.kunzisoft.keepass.model.DataTime
|
||||
import com.kunzisoft.keepass.otp.OtpEntryFields
|
||||
import org.joda.time.DateTime
|
||||
|
||||
|
||||
class TemplateEditView @JvmOverloads constructor(context: Context,
|
||||
@@ -112,15 +114,22 @@ class TemplateEditView @JvmOverloads constructor(context: Context,
|
||||
override fun buildLinearTextView(templateAttribute: TemplateAttribute,
|
||||
field: Field): TextEditFieldView? {
|
||||
return context?.let {
|
||||
TextEditFieldView(it).apply {
|
||||
(if (TemplateField.isStandardPasswordName(context, templateAttribute.label))
|
||||
PasswordTextEditFieldView(it)
|
||||
else TextEditFieldView(it)).apply {
|
||||
// hiddenProtectedValue (mHideProtectedValue) don't work with TextInputLayout
|
||||
setProtection(field.protectedValue.isProtected)
|
||||
default = templateAttribute.default
|
||||
setMaxChars(templateAttribute.options.getNumberChars())
|
||||
setMaxLines(templateAttribute.options.getNumberLines())
|
||||
setActionClick(templateAttribute, field, this)
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
importantForAutofill = View.IMPORTANT_FOR_AUTOFILL_NO
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
|
||||
if (field.protectedValue.isProtected) {
|
||||
textDirection = TEXT_DIRECTION_LTR
|
||||
}
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
importantForAutofill = View.IMPORTANT_FOR_AUTOFILL_NO
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -211,35 +220,31 @@ class TemplateEditView @JvmOverloads constructor(context: Context,
|
||||
val dateTimeView = getFieldViewById(viewId)
|
||||
if (dateTimeView is DateTimeEditFieldView) {
|
||||
dateTimeView.dateTime = DateInstant(
|
||||
action.invoke(dateTimeView.dateTime).date,
|
||||
dateTimeView.dateTime.type)
|
||||
action.invoke(dateTimeView.dateTime).instant,
|
||||
dateTimeView.dateTime.type
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun setCurrentDateTimeValue(dateMilliseconds: Long) {
|
||||
fun setCurrentDateTimeValue(date: DataDate) {
|
||||
// Save the date
|
||||
setCurrentDateTimeSelection { instant ->
|
||||
val newDateInstant = DateInstant(
|
||||
DateTime(instant.date)
|
||||
.withMillis(dateMilliseconds)
|
||||
.toDate(), instant.type)
|
||||
if (instant.type == DateInstant.Type.DATE_TIME) {
|
||||
val instantTime = DateInstant(instant.date, DateInstant.Type.TIME)
|
||||
setCurrentDateTimeSelection { dateInstant ->
|
||||
dateInstant.setDate(date.year, date.month, date.day)
|
||||
if (dateInstant.type == DateInstant.Type.DATE_TIME) {
|
||||
// Trick to recall selection with time
|
||||
mOnDateInstantClickListener?.invoke(instantTime)
|
||||
mOnDateInstantClickListener?.invoke(
|
||||
DateInstant(dateInstant.instant, DateInstant.Type.TIME)
|
||||
)
|
||||
}
|
||||
newDateInstant
|
||||
dateInstant
|
||||
}
|
||||
}
|
||||
|
||||
fun setCurrentTimeValue(time: DataTime) {
|
||||
setCurrentDateTimeSelection { instant ->
|
||||
DateInstant(
|
||||
DateTime(instant.date)
|
||||
.withHourOfDay(time.hours)
|
||||
.withMinuteOfHour(time.minutes)
|
||||
.toDate(), instant.type)
|
||||
setCurrentDateTimeSelection { dateInstant ->
|
||||
dateInstant.setTime(time.hour, time.minute)
|
||||
dateInstant
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.kunzisoft.keepass.view
|
||||
|
||||
import android.content.Context
|
||||
import android.os.Build
|
||||
import android.util.AttributeSet
|
||||
import android.view.View
|
||||
import androidx.core.view.isVisible
|
||||
@@ -10,6 +11,7 @@ import com.kunzisoft.keepass.database.element.security.ProtectedString
|
||||
import com.kunzisoft.keepass.database.element.template.TemplateAttribute
|
||||
import com.kunzisoft.keepass.database.element.template.TemplateField
|
||||
import com.kunzisoft.keepass.database.helper.getLocalizedName
|
||||
import com.kunzisoft.keepass.database.helper.isStandardPasswordName
|
||||
import com.kunzisoft.keepass.model.OtpModel
|
||||
import com.kunzisoft.keepass.otp.OtpElement
|
||||
import com.kunzisoft.keepass.otp.OtpEntryFields.OTP_TOKEN_FIELD
|
||||
@@ -48,7 +50,9 @@ class TemplateView @JvmOverloads constructor(context: Context,
|
||||
field: Field): TextFieldView? {
|
||||
// Add an action icon if needed
|
||||
return context?.let {
|
||||
TextFieldView(it).apply {
|
||||
(if (TemplateField.isStandardPasswordName(context, templateAttribute.label))
|
||||
PasswordTextFieldView(it)
|
||||
else TextFieldView(it)).apply {
|
||||
applyFontVisibility(mFontInVisibility)
|
||||
setProtection(field.protectedValue.isProtected, mHideProtectedValue)
|
||||
label = templateAttribute.alias
|
||||
@@ -59,6 +63,9 @@ class TemplateView @JvmOverloads constructor(context: Context,
|
||||
// Here the value is often empty
|
||||
|
||||
if (field.protectedValue.isProtected) {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
|
||||
textDirection = TEXT_DIRECTION_LTR
|
||||
}
|
||||
if (mFirstTimeAskAllowCopyProtectedFields) {
|
||||
setCopyButtonState(TextFieldView.ButtonState.DEACTIVATE)
|
||||
setCopyButtonClickListener { _, _ ->
|
||||
@@ -100,13 +107,12 @@ class TemplateView @JvmOverloads constructor(context: Context,
|
||||
return context?.let {
|
||||
DateTimeFieldView(it).apply {
|
||||
label = TemplateField.getLocalizedName(context, field.name)
|
||||
val dateInstantType = templateAttribute.options.getDateFormat()
|
||||
type = templateAttribute.options.getDateFormat()
|
||||
isExpirable = templateAttribute.options.getExpirable()
|
||||
try {
|
||||
val value = field.protectedValue.toString().trim()
|
||||
type = dateInstantType
|
||||
activation = value.isNotEmpty()
|
||||
} catch (e: Exception) {
|
||||
type = dateInstantType
|
||||
activation = false
|
||||
}
|
||||
}
|
||||
@@ -173,6 +179,9 @@ class TemplateView @JvmOverloads constructor(context: Context,
|
||||
otpElement.type.name,
|
||||
ProtectedString(false, otpElement.token)))
|
||||
}
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
|
||||
textDirection = TEXT_DIRECTION_LTR
|
||||
}
|
||||
mLastOtpTokenView = this
|
||||
mOtpRunnable = Runnable {
|
||||
if (otpElement.shouldRefreshToken()) {
|
||||
|
||||
@@ -8,45 +8,40 @@ import android.text.Spannable
|
||||
import android.text.SpannableString
|
||||
import android.util.AttributeSet
|
||||
import android.util.TypedValue
|
||||
import android.view.ContextThemeWrapper
|
||||
import android.view.View
|
||||
import android.view.inputmethod.EditorInfo
|
||||
import android.widget.LinearLayout
|
||||
import android.widget.RelativeLayout
|
||||
import androidx.annotation.DrawableRes
|
||||
import androidx.appcompat.view.ContextThemeWrapper
|
||||
import androidx.appcompat.widget.AppCompatImageButton
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.core.view.ViewCompat
|
||||
import androidx.core.view.isVisible
|
||||
import androidx.core.widget.doAfterTextChanged
|
||||
import com.google.android.material.textfield.TextInputEditText
|
||||
import com.google.android.material.textfield.TextInputLayout
|
||||
import com.kunzisoft.keepass.R
|
||||
import com.kunzisoft.keepass.database.element.template.TemplateField
|
||||
import com.kunzisoft.keepass.database.helper.isStandardPasswordName
|
||||
import com.kunzisoft.keepass.password.PasswordGenerator
|
||||
import com.kunzisoft.keepass.settings.PreferencesUtil
|
||||
|
||||
class TextEditFieldView @JvmOverloads constructor(context: Context,
|
||||
open class TextEditFieldView @JvmOverloads constructor(context: Context,
|
||||
attrs: AttributeSet? = null,
|
||||
defStyle: Int = 0)
|
||||
: RelativeLayout(context, attrs, defStyle), GenericTextFieldView {
|
||||
|
||||
private var labelViewId = ViewCompat.generateViewId()
|
||||
private var valueViewId = ViewCompat.generateViewId()
|
||||
private var actionImageButtonId = ViewCompat.generateViewId()
|
||||
|
||||
private var textModified = false
|
||||
private var isColorizedPasswordActivated = PreferencesUtil.colorizePassword(context)
|
||||
protected var actionImageButtonId = ViewCompat.generateViewId()
|
||||
|
||||
private val labelView = TextInputLayout(context).apply {
|
||||
layoutParams = LayoutParams(
|
||||
LayoutParams.MATCH_PARENT,
|
||||
LayoutParams.WRAP_CONTENT)
|
||||
}
|
||||
private val valueView = TextInputEditText(
|
||||
ContextThemeWrapper(getContext(),
|
||||
R.style.KeepassDXStyle_TextInputLayout)
|
||||
protected val valueView = TextInputEditText(
|
||||
ContextThemeWrapper(
|
||||
getContext(),
|
||||
R.style.KeepassDXStyle_TextInputLayout
|
||||
)
|
||||
).apply {
|
||||
layoutParams = LinearLayout.LayoutParams(
|
||||
LayoutParams.MATCH_PARENT,
|
||||
@@ -62,7 +57,10 @@ class TextEditFieldView @JvmOverloads constructor(context: Context,
|
||||
maxLines = 1
|
||||
}
|
||||
private var actionImageButton = AppCompatImageButton(
|
||||
ContextThemeWrapper(context, R.style.KeepassDXStyle_ImageButton_Simple), null, 0).apply {
|
||||
ContextThemeWrapper(
|
||||
context,
|
||||
R.style.KeepassDXStyle_ImageButton_Simple
|
||||
), null, 0).apply {
|
||||
layoutParams = LayoutParams(
|
||||
LayoutParams.WRAP_CONTENT,
|
||||
LayoutParams.WRAP_CONTENT).also {
|
||||
@@ -83,20 +81,6 @@ class TextEditFieldView @JvmOverloads constructor(context: Context,
|
||||
init {
|
||||
// Manually write view to avoid view id bugs
|
||||
buildViews()
|
||||
// To change the password color dynamically
|
||||
valueView.doAfterTextChanged { editable ->
|
||||
editable?.let { text ->
|
||||
if (textModified) {
|
||||
textModified = false
|
||||
} else {
|
||||
textModified = true
|
||||
val selectionStart = valueView.selectionStart
|
||||
val selectionEnd = valueView.selectionEnd
|
||||
value = spannableValue(text.toString()).toString()
|
||||
valueView.setSelection(selectionStart, selectionEnd)
|
||||
}
|
||||
}
|
||||
}
|
||||
labelView.addView(valueView)
|
||||
addView(labelView)
|
||||
addView(actionImageButton)
|
||||
@@ -105,10 +89,10 @@ class TextEditFieldView @JvmOverloads constructor(context: Context,
|
||||
private fun buildViews() {
|
||||
labelView.apply {
|
||||
id = labelViewId
|
||||
layoutParams = (layoutParams as LayoutParams?).also {
|
||||
it?.addRule(LEFT_OF, actionImageButtonId)
|
||||
layoutParams = (layoutParams as LayoutParams?)?.also {
|
||||
it.addRule(LEFT_OF, actionImageButtonId)
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
|
||||
it?.addRule(START_OF, actionImageButtonId)
|
||||
it.addRule(START_OF, actionImageButtonId)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -129,15 +113,6 @@ class TextEditFieldView @JvmOverloads constructor(context: Context,
|
||||
return actionImageButton
|
||||
}
|
||||
|
||||
private fun spannableValue(value: String?): Spannable? {
|
||||
if (value == null)
|
||||
return null
|
||||
return if (isColorizedPasswordActivated && TemplateField.isStandardPasswordName(context, label))
|
||||
PasswordGenerator.getColorizedPassword(value)
|
||||
else
|
||||
SpannableString(value)
|
||||
}
|
||||
|
||||
override var label: String
|
||||
get() {
|
||||
return labelView.hint?.toString() ?: ""
|
||||
@@ -151,6 +126,10 @@ class TextEditFieldView @JvmOverloads constructor(context: Context,
|
||||
buildViews()
|
||||
}
|
||||
|
||||
protected open fun spannableValue(value: String?): Spannable? {
|
||||
return SpannableString(value)
|
||||
}
|
||||
|
||||
override var value: String
|
||||
get() {
|
||||
return valueView.text?.toString() ?: ""
|
||||
|
||||
@@ -22,7 +22,6 @@ package com.kunzisoft.keepass.view
|
||||
import android.content.Context
|
||||
import android.os.Build
|
||||
import android.text.InputFilter
|
||||
import android.text.SpannableString
|
||||
import android.text.util.Linkify
|
||||
import android.util.AttributeSet
|
||||
import android.util.TypedValue
|
||||
@@ -38,15 +37,11 @@ import androidx.core.text.util.LinkifyCompat
|
||||
import androidx.core.view.ViewCompat
|
||||
import androidx.core.view.isVisible
|
||||
import com.kunzisoft.keepass.R
|
||||
import com.kunzisoft.keepass.database.element.template.TemplateField
|
||||
import com.kunzisoft.keepass.database.helper.isStandardPasswordName
|
||||
import com.kunzisoft.keepass.model.EntryInfo.Companion.APPLICATION_ID_FIELD_NAME
|
||||
import com.kunzisoft.keepass.password.PasswordGenerator
|
||||
import com.kunzisoft.keepass.settings.PreferencesUtil
|
||||
import com.kunzisoft.keepass.utils.UriUtil.openExternalApp
|
||||
|
||||
|
||||
class TextFieldView @JvmOverloads constructor(context: Context,
|
||||
open class TextFieldView @JvmOverloads constructor(context: Context,
|
||||
attrs: AttributeSet? = null,
|
||||
defStyle: Int = 0)
|
||||
: RelativeLayout(context, attrs, defStyle), GenericTextFieldView {
|
||||
@@ -56,7 +51,7 @@ class TextFieldView @JvmOverloads constructor(context: Context,
|
||||
private var showButtonId = ViewCompat.generateViewId()
|
||||
private var copyButtonId = ViewCompat.generateViewId()
|
||||
|
||||
private val labelView = AppCompatTextView(context).apply {
|
||||
protected val labelView = AppCompatTextView(context).apply {
|
||||
setTextAppearance(context,
|
||||
R.style.KeepassDXStyle_TextAppearance_LabelTextStyle)
|
||||
layoutParams = LayoutParams(
|
||||
@@ -77,7 +72,7 @@ class TextFieldView @JvmOverloads constructor(context: Context,
|
||||
}
|
||||
}
|
||||
}
|
||||
private val valueView = AppCompatTextView(context).apply {
|
||||
protected val valueView = AppCompatTextView(context).apply {
|
||||
setTextAppearance(context,
|
||||
R.style.KeepassDXStyle_TextAppearance_TextNode)
|
||||
layoutParams = LayoutParams(
|
||||
@@ -131,46 +126,46 @@ class TextFieldView @JvmOverloads constructor(context: Context,
|
||||
private fun buildViews() {
|
||||
copyButton.apply {
|
||||
id = copyButtonId
|
||||
layoutParams = (layoutParams as LayoutParams?).also {
|
||||
it?.addRule(ALIGN_PARENT_RIGHT)
|
||||
layoutParams = (layoutParams as LayoutParams?)?.also {
|
||||
it.addRule(ALIGN_PARENT_RIGHT)
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
|
||||
it?.addRule(ALIGN_PARENT_END)
|
||||
it.addRule(ALIGN_PARENT_END)
|
||||
}
|
||||
}
|
||||
}
|
||||
showButton.apply {
|
||||
id = showButtonId
|
||||
layoutParams = (layoutParams as LayoutParams?).also {
|
||||
layoutParams = (layoutParams as LayoutParams?)?.also {
|
||||
if (copyButton.isVisible) {
|
||||
it?.addRule(LEFT_OF, copyButtonId)
|
||||
it.addRule(LEFT_OF, copyButtonId)
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
|
||||
it?.addRule(START_OF, copyButtonId)
|
||||
it.addRule(START_OF, copyButtonId)
|
||||
}
|
||||
} else {
|
||||
it?.addRule(ALIGN_PARENT_RIGHT)
|
||||
it.addRule(ALIGN_PARENT_RIGHT)
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
|
||||
it?.addRule(ALIGN_PARENT_END)
|
||||
it.addRule(ALIGN_PARENT_END)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
labelView.apply {
|
||||
id = labelViewId
|
||||
layoutParams = (layoutParams as LayoutParams?).also {
|
||||
it?.addRule(LEFT_OF, showButtonId)
|
||||
layoutParams = (layoutParams as LayoutParams?)?.also {
|
||||
it.addRule(LEFT_OF, showButtonId)
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
|
||||
it?.addRule(START_OF, showButtonId)
|
||||
it.addRule(START_OF, showButtonId)
|
||||
}
|
||||
}
|
||||
}
|
||||
valueView.apply {
|
||||
id = valueViewId
|
||||
layoutParams = (layoutParams as LayoutParams?).also {
|
||||
it?.addRule(LEFT_OF, showButtonId)
|
||||
layoutParams = (layoutParams as LayoutParams?)?.also {
|
||||
it.addRule(LEFT_OF, showButtonId)
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
|
||||
it?.addRule(START_OF, showButtonId)
|
||||
it.addRule(START_OF, showButtonId)
|
||||
}
|
||||
it?.addRule(BELOW, labelViewId)
|
||||
it.addRule(BELOW, labelViewId)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -188,7 +183,7 @@ class TextFieldView @JvmOverloads constructor(context: Context,
|
||||
labelView.text = value
|
||||
}
|
||||
|
||||
fun setLabel(@StringRes labelId: Int) {
|
||||
open fun setLabel(@StringRes labelId: Int) {
|
||||
labelView.setText(labelId)
|
||||
}
|
||||
|
||||
@@ -197,17 +192,11 @@ class TextFieldView @JvmOverloads constructor(context: Context,
|
||||
return valueView.text.toString()
|
||||
}
|
||||
set(value) {
|
||||
val spannableString =
|
||||
if (PreferencesUtil.colorizePassword(context)
|
||||
&& TemplateField.isStandardPasswordName(context, label))
|
||||
PasswordGenerator.getColorizedPassword(value)
|
||||
else
|
||||
SpannableString(value)
|
||||
valueView.text = spannableString
|
||||
valueView.text = value
|
||||
changeProtectedValueParameters()
|
||||
}
|
||||
|
||||
fun setValue(@StringRes valueId: Int) {
|
||||
open fun setValue(@StringRes valueId: Int) {
|
||||
value = resources.getString(valueId)
|
||||
changeProtectedValueParameters()
|
||||
}
|
||||
@@ -237,7 +226,7 @@ class TextFieldView @JvmOverloads constructor(context: Context,
|
||||
invalidate()
|
||||
}
|
||||
|
||||
private fun changeProtectedValueParameters() {
|
||||
protected fun changeProtectedValueParameters() {
|
||||
valueView.apply {
|
||||
if (showButton.isVisible) {
|
||||
applyHiddenStyle(showButton.isSelected)
|
||||
|
||||
@@ -59,6 +59,7 @@ import androidx.core.view.forEach
|
||||
import androidx.core.view.isVisible
|
||||
import androidx.core.view.updateLayoutParams
|
||||
import androidx.core.view.updatePadding
|
||||
import androidx.core.view.updatePaddingRelative
|
||||
import com.google.android.material.appbar.CollapsingToolbarLayout
|
||||
import com.google.android.material.snackbar.Snackbar
|
||||
import com.kunzisoft.keepass.R
|
||||
@@ -225,14 +226,20 @@ fun View.showByFading() {
|
||||
}
|
||||
}
|
||||
|
||||
fun View.updateLockPaddingLeft() {
|
||||
updatePadding(resources.getDimensionPixelSize(
|
||||
if (PreferencesUtil.showLockDatabaseButton(context)) {
|
||||
R.dimen.lock_button_size
|
||||
} else {
|
||||
R.dimen.hidden_lock_button_size
|
||||
}
|
||||
))
|
||||
fun View.updateLockPaddingStart() {
|
||||
resources.getDimensionPixelSize(
|
||||
if (PreferencesUtil.showLockDatabaseButton(context)) {
|
||||
R.dimen.lock_button_size
|
||||
} else {
|
||||
R.dimen.hidden_lock_button_size
|
||||
}
|
||||
).let { lockPadding ->
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
|
||||
updatePaddingRelative(lockPadding)
|
||||
} else {
|
||||
updatePadding(lockPadding)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun Context.showActionErrorIfNeeded(result: ActionRunnable.Result) {
|
||||
@@ -306,9 +313,12 @@ fun Activity.setTransparentNavigationBar(applyToStatusBar: Boolean = false, appl
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1
|
||||
&& resources.configuration.orientation == Configuration.ORIENTATION_PORTRAIT) {
|
||||
WindowCompat.setDecorFitsSystemWindows(window, false)
|
||||
this.window.navigationBarColor = ContextCompat.getColor(this, R.color.surface_selector)
|
||||
window.navigationBarColor = ContextCompat.getColor(this, R.color.surface_selector)
|
||||
if (applyToStatusBar) {
|
||||
this.window.statusBarColor = ContextCompat.getColor(this, R.color.surface_selector)
|
||||
obtainStyledAttributes(intArrayOf(R.attr.colorSurface)).apply {
|
||||
window.statusBarColor = getColor(0, Color.GRAY)
|
||||
recycle()
|
||||
}
|
||||
}
|
||||
applyWindowInsets.invoke()
|
||||
}
|
||||
@@ -356,6 +366,23 @@ fun View.applyWindowInsets(position: WindowInsetPosition = WindowInsetPosition.B
|
||||
}
|
||||
}
|
||||
}
|
||||
WindowInsetPosition.BOTTOM_IME -> {
|
||||
val imeHeight = windowInsets.getInsets(WindowInsetsCompat.Type.ime()).bottom
|
||||
if (view.layoutParams is ViewGroup.MarginLayoutParams) {
|
||||
view.updateLayoutParams<ViewGroup.MarginLayoutParams> {
|
||||
bottomMargin = if (imeHeight > 1) 0 else insets.bottom
|
||||
}
|
||||
}
|
||||
}
|
||||
WindowInsetPosition.TOP_BOTTOM_IME -> {
|
||||
val imeHeight = windowInsets.getInsets(WindowInsetsCompat.Type.ime()).bottom
|
||||
if (view.layoutParams is ViewGroup.MarginLayoutParams) {
|
||||
view.updateLayoutParams<ViewGroup.MarginLayoutParams> {
|
||||
topMargin = insets.top
|
||||
bottomMargin = if (imeHeight > 1) imeHeight else 0
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// If any of the children consumed the insets, return an appropriate value
|
||||
if (consumed) WindowInsetsCompat.CONSUMED else windowInsets
|
||||
@@ -363,5 +390,5 @@ fun View.applyWindowInsets(position: WindowInsetPosition = WindowInsetPosition.B
|
||||
}
|
||||
|
||||
enum class WindowInsetPosition {
|
||||
TOP, BOTTOM, LEGIT_TOP
|
||||
TOP, BOTTOM, LEGIT_TOP, BOTTOM_IME, TOP_BOTTOM_IME
|
||||
}
|
||||
|
||||
@@ -1,32 +1,152 @@
|
||||
package com.kunzisoft.keepass.viewmodels
|
||||
|
||||
import android.net.Uri
|
||||
import androidx.lifecycle.LiveData
|
||||
import androidx.lifecycle.ViewModel
|
||||
import com.kunzisoft.keepass.model.CipherDecryptDatabase
|
||||
import com.kunzisoft.keepass.model.CipherEncryptDatabase
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlinx.coroutines.flow.StateFlow
|
||||
import kotlinx.coroutines.flow.update
|
||||
|
||||
class AdvancedUnlockViewModel : ViewModel() {
|
||||
|
||||
var allowAutoOpenBiometricPrompt : Boolean = true
|
||||
var deviceCredentialAuthSucceeded: Boolean? = null
|
||||
|
||||
val onInitAdvancedUnlockModeRequested : LiveData<Void?> get() = _onInitAdvancedUnlockModeRequested
|
||||
private val _onInitAdvancedUnlockModeRequested = SingleLiveEvent<Void?>()
|
||||
private val _uiState = MutableStateFlow(DeviceUnlockState())
|
||||
val uiState: StateFlow<DeviceUnlockState> = _uiState
|
||||
|
||||
val onUnlockAvailabilityCheckRequested : LiveData<Void?> get() = _onUnlockAvailabilityCheckRequested
|
||||
private val _onUnlockAvailabilityCheckRequested = SingleLiveEvent<Void?>()
|
||||
|
||||
val onDatabaseFileLoaded : LiveData<Uri?> get() = _onDatabaseFileLoaded
|
||||
private val _onDatabaseFileLoaded = SingleLiveEvent<Uri?>()
|
||||
|
||||
fun initAdvancedUnlockMode() {
|
||||
_onInitAdvancedUnlockModeRequested.call()
|
||||
fun checkUnlockAvailability(conditionToStoreCredentialVerified: Boolean? = null) {
|
||||
_uiState.update { currentState ->
|
||||
currentState.copy(
|
||||
onUnlockAvailabilityCheckRequested = true,
|
||||
isConditionToStoreCredentialVerified = conditionToStoreCredentialVerified
|
||||
?: _uiState.value.isConditionToStoreCredentialVerified
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
fun checkUnlockAvailability() {
|
||||
_onUnlockAvailabilityCheckRequested.call()
|
||||
fun consumeCheckUnlockAvailability() {
|
||||
_uiState.update { currentState ->
|
||||
currentState.copy(
|
||||
onUnlockAvailabilityCheckRequested = false
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
fun databaseFileLoaded(databaseUri: Uri?) {
|
||||
_onDatabaseFileLoaded.value = databaseUri
|
||||
_uiState.update { currentState ->
|
||||
currentState.copy(
|
||||
databaseFileLoaded = databaseUri
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
fun consumeDatabaseFileLoaded() {
|
||||
_uiState.update { currentState ->
|
||||
currentState.copy(
|
||||
databaseFileLoaded = null
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
fun retrieveCredentialForEncryption() {
|
||||
_uiState.update { currentState ->
|
||||
currentState.copy(
|
||||
isCredentialRequired = true,
|
||||
credential = null
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
fun provideCredentialForEncryption(credential: ByteArray) {
|
||||
_uiState.update { currentState ->
|
||||
currentState.copy(
|
||||
isCredentialRequired = false,
|
||||
credential = credential
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
fun consumeCredentialForEncryption() {
|
||||
_uiState.update { currentState ->
|
||||
currentState.copy(
|
||||
isCredentialRequired = false,
|
||||
credential = null
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
fun onCredentialEncrypted(cipherEncryptDatabase: CipherEncryptDatabase) {
|
||||
_uiState.update { currentState ->
|
||||
currentState.copy(
|
||||
cipherEncryptDatabase = cipherEncryptDatabase
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
fun consumeCredentialEncrypted() {
|
||||
_uiState.update { currentState ->
|
||||
currentState.copy(
|
||||
cipherEncryptDatabase = null
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
fun onCredentialDecrypted(cipherDecryptDatabase: CipherDecryptDatabase) {
|
||||
_uiState.update { currentState ->
|
||||
currentState.copy(
|
||||
cipherDecryptDatabase = cipherDecryptDatabase
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
fun consumeCredentialDecrypted() {
|
||||
_uiState.update { currentState ->
|
||||
currentState.copy(
|
||||
cipherDecryptDatabase = null
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
data class DeviceUnlockState(
|
||||
val initAdvancedUnlockMode: Boolean = false,
|
||||
val databaseFileLoaded: Uri? = null,
|
||||
val isCredentialRequired: Boolean = false,
|
||||
val credential: ByteArray? = null,
|
||||
val isConditionToStoreCredentialVerified: Boolean = false,
|
||||
val onUnlockAvailabilityCheckRequested: Boolean = false,
|
||||
val cipherEncryptDatabase: CipherEncryptDatabase? = null,
|
||||
val cipherDecryptDatabase: CipherDecryptDatabase? = null
|
||||
) {
|
||||
override fun equals(other: Any?): Boolean {
|
||||
if (this === other) return true
|
||||
if (javaClass != other?.javaClass) return false
|
||||
|
||||
other as DeviceUnlockState
|
||||
|
||||
if (initAdvancedUnlockMode != other.initAdvancedUnlockMode) return false
|
||||
if (isCredentialRequired != other.isCredentialRequired) return false
|
||||
if (isConditionToStoreCredentialVerified != other.isConditionToStoreCredentialVerified) return false
|
||||
if (onUnlockAvailabilityCheckRequested != other.onUnlockAvailabilityCheckRequested) return false
|
||||
if (databaseFileLoaded != other.databaseFileLoaded) return false
|
||||
if (!credential.contentEquals(other.credential)) return false
|
||||
if (cipherEncryptDatabase != other.cipherEncryptDatabase) return false
|
||||
if (cipherDecryptDatabase != other.cipherDecryptDatabase) return false
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
override fun hashCode(): Int {
|
||||
var result = initAdvancedUnlockMode.hashCode()
|
||||
result = 31 * result + isCredentialRequired.hashCode()
|
||||
result = 31 * result + isConditionToStoreCredentialVerified.hashCode()
|
||||
result = 31 * result + onUnlockAvailabilityCheckRequested.hashCode()
|
||||
result = 31 * result + (databaseFileLoaded?.hashCode() ?: 0)
|
||||
result = 31 * result + (credential?.contentHashCode() ?: 0)
|
||||
result = 31 * result + (cipherEncryptDatabase?.hashCode() ?: 0)
|
||||
result = 31 * result + (cipherDecryptDatabase?.hashCode() ?: 0)
|
||||
return result
|
||||
}
|
||||
}
|
||||
@@ -51,7 +51,9 @@ class DatabaseFileViewModel(application: Application) : AndroidViewModel(applica
|
||||
|
||||
fun loadDatabaseFile(databaseUri: Uri) {
|
||||
mFileDatabaseHistoryAction?.getDatabaseFile(databaseUri) { databaseFileRetrieved ->
|
||||
mDatabaseFileLoaded.value = databaseFileRetrieved
|
||||
databaseFileRetrieved?.let {
|
||||
mDatabaseFileLoaded.value = it
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2,6 +2,7 @@ package com.kunzisoft.keepass.viewmodels
|
||||
|
||||
import android.app.Application
|
||||
import android.net.Uri
|
||||
import android.util.Log
|
||||
import androidx.lifecycle.AndroidViewModel
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import com.kunzisoft.keepass.app.App
|
||||
@@ -10,8 +11,8 @@ import com.kunzisoft.keepass.hardware.HardwareKey
|
||||
import com.kunzisoft.keepass.model.DatabaseFile
|
||||
import com.kunzisoft.keepass.settings.PreferencesUtil
|
||||
import com.kunzisoft.keepass.utils.IOActionTask
|
||||
import com.kunzisoft.keepass.utils.parseUri
|
||||
import com.kunzisoft.keepass.utils.UriUtil.releaseUriPermission
|
||||
import com.kunzisoft.keepass.utils.parseUri
|
||||
|
||||
class DatabaseFilesViewModel(application: Application) : AndroidViewModel(application) {
|
||||
|
||||
@@ -25,11 +26,29 @@ class DatabaseFilesViewModel(application: Application) : AndroidViewModel(applic
|
||||
MutableLiveData<DatabaseFileData>()
|
||||
}
|
||||
|
||||
private var mDefaultDatabaseAlreadyChecked : Boolean = false
|
||||
|
||||
val defaultDatabase: MutableLiveData<Uri?> by lazy {
|
||||
MutableLiveData<Uri?>()
|
||||
}
|
||||
|
||||
fun checkDefaultDatabase() {
|
||||
fun doForDefaultDatabase(action: (defaultDatabaseUri: Uri) -> Unit) {
|
||||
if (!mDefaultDatabaseAlreadyChecked) {
|
||||
mDefaultDatabaseAlreadyChecked = true
|
||||
val context = getApplication<App>().applicationContext
|
||||
PreferencesUtil.getDefaultDatabasePath(context)?.parseUri()?.let { databaseFileUri ->
|
||||
if (FileDatabaseInfo(context, databaseFileUri).exists) {
|
||||
action.invoke(databaseFileUri)
|
||||
} else {
|
||||
Log.e(TAG, "Unable to automatically load a non-accessible file")
|
||||
}
|
||||
} ?: run {
|
||||
Log.i(TAG, "No default database to prepare")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun checkDefaultDatabase() {
|
||||
IOActionTask(
|
||||
{
|
||||
PreferencesUtil.getDefaultDatabasePath(getApplication<App>().applicationContext)
|
||||
@@ -149,4 +168,8 @@ class DatabaseFilesViewModel(application: Application) : AndroidViewModel(applic
|
||||
enum class DatabaseFileAction {
|
||||
NONE, ADD, UPDATE, DELETE
|
||||
}
|
||||
|
||||
companion object {
|
||||
private val TAG = DatabaseFilesViewModel::class.java.name
|
||||
}
|
||||
}
|
||||
@@ -43,8 +43,8 @@ class KeyGeneratorViewModel: ViewModel() {
|
||||
val requirePassphraseGeneration : LiveData<Void?> get() = _requirePassphraseGeneration
|
||||
private val _requirePassphraseGeneration = SingleLiveEvent<Void?>()
|
||||
|
||||
fun setKeyGenerated(passKey: String) {
|
||||
_keyGenerated.value = passKey
|
||||
fun setKeyGenerated(value: String) {
|
||||
_keyGenerated.value = value
|
||||
}
|
||||
|
||||
fun validateKeyGenerated() {
|
||||
|
||||
@@ -4,7 +4,8 @@ import androidx.lifecycle.LiveData
|
||||
import androidx.lifecycle.ViewModel
|
||||
import com.kunzisoft.keepass.database.element.DateInstant
|
||||
import com.kunzisoft.keepass.database.element.icon.IconImage
|
||||
import com.kunzisoft.keepass.view.DataTime
|
||||
import com.kunzisoft.keepass.model.DataDate
|
||||
import com.kunzisoft.keepass.model.DataTime
|
||||
|
||||
abstract class NodeEditViewModel : ViewModel() {
|
||||
|
||||
@@ -23,8 +24,8 @@ abstract class NodeEditViewModel : ViewModel() {
|
||||
|
||||
val requestDateTimeSelection : LiveData<DateInstant> get() = _requestDateTimeSelection
|
||||
private val _requestDateTimeSelection = SingleLiveEvent<DateInstant>()
|
||||
val onDateSelected : LiveData<Long> get() = _onDateSelected
|
||||
private val _onDateSelected = SingleLiveEvent<Long>()
|
||||
val onDateSelected : LiveData<DataDate> get() = _onDateSelected
|
||||
private val _onDateSelected = SingleLiveEvent<DataDate>()
|
||||
val onTimeSelected : LiveData<DataTime> get() = _onTimeSelected
|
||||
private val _onTimeSelected = SingleLiveEvent<DataTime>()
|
||||
|
||||
@@ -57,12 +58,12 @@ abstract class NodeEditViewModel : ViewModel() {
|
||||
_requestDateTimeSelection.value = dateInstant
|
||||
}
|
||||
|
||||
fun selectDate(dateMilliseconds: Long) {
|
||||
_onDateSelected.value = dateMilliseconds
|
||||
fun selectDate(date: DataDate) {
|
||||
_onDateSelected.value = date
|
||||
}
|
||||
|
||||
fun selectTime(hours: Int, minutes: Int) {
|
||||
_onTimeSelected.value = DataTime(hours, minutes)
|
||||
fun selectTime(dataTime: DataTime) {
|
||||
_onTimeSelected.value = dataTime
|
||||
}
|
||||
|
||||
private enum class ColorRequest {
|
||||
|
||||
13
app/src/main/res/drawable-ldrtl/ic_arrow_back_white_24dp.xml
Normal file
13
app/src/main/res/drawable-ldrtl/ic_arrow_back_white_24dp.xml
Normal file
@@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<group>
|
||||
<path
|
||||
android:fillColor="#ffffff"
|
||||
android:strokeWidth="1.78885484"
|
||||
android:pathData="M10,19Q7.5,19 5.5,17.5Q4,16 4,13.5Q4,11 5.5,9.5Q7.5,8 10,8L16,8L13.5,5.5L15,4L20,9L15,14L13.5,12.5L16,10L10,10Q8.5,10 7,11Q6,12 6,13.5Q6,15 7,16Q8.5,17 10,17L17,17L17,19L10,19Z" />
|
||||
</group>
|
||||
</vector>
|
||||
@@ -0,0 +1,9 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24.0"
|
||||
android:viewportHeight="24.0">
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M8.59,16.59L13.17,12 8.59,7.41 10,6l6,6 -6,6 -1.41,-1.41z"/>
|
||||
</vector>
|
||||
@@ -0,0 +1,9 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportHeight="24"
|
||||
android:viewportWidth="24">
|
||||
<path
|
||||
android:fillColor="@color/green"
|
||||
android:pathData="M14,7l-5,5 5,5V7z"/>
|
||||
</vector>
|
||||
@@ -0,0 +1,5 @@
|
||||
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:drawable="@drawable/ic_arrow_left_white_24dp"
|
||||
android:fromDegrees="180"
|
||||
android:toDegrees="180"
|
||||
android:visible="true" />
|
||||
9
app/src/main/res/drawable/ic_file_key_white_24dp.xml
Normal file
9
app/src/main/res/drawable/ic_file_key_white_24dp.xml
Normal file
@@ -0,0 +1,9 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<path
|
||||
android:fillColor="#ffffff"
|
||||
android:pathData="M11 16C11 16.6 10.6 17 10 17S9 16.6 9 16C9 15.4 9.4 15 10 15S11 15.4 11 16M20 8V20C20 21.1 19.1 22 18 22H6C4.9 22 4 21.1 4 20V4C4 2.9 4.9 2 6 2H14M18 15H12.8C12.2 13.4 10.5 12.6 9 13.2C7.4 13.8 6.6 15.5 7.2 17S9.5 19.4 11 18.8C11.9 18.5 12.5 17.8 12.8 17H14V19H16V17H18M18.5 9L13 3.5V9H18.5Z" />
|
||||
</vector>
|
||||
@@ -0,0 +1,5 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:tint="#FFFFFF" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp">
|
||||
|
||||
<path android:fillColor="@android:color/white" android:pathData="M18,22l-0.01,-6L14,12l3.99,-4.01L18,2H6v6l4,4l-4,3.99V22H18zM8,7.5V4h8v3.5l-4,4L8,7.5z"/>
|
||||
|
||||
</vector>
|
||||
9
app/src/main/res/drawable/ic_shield_white_24dp.xml
Normal file
9
app/src/main/res/drawable/ic_shield_white_24dp.xml
Normal file
@@ -0,0 +1,9 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M12,1L3,5v6c0,5.55 3.84,10.74 9,12 5.16,-1.26 9,-6.45 9,-12V5l-9,-4z"/>
|
||||
</vector>
|
||||
@@ -1,7 +0,0 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:height="24dp"
|
||||
android:viewportHeight="24"
|
||||
android:viewportWidth="24"
|
||||
android:width="24dp">
|
||||
<path android:fillColor="#ffffff" android:pathData="M1,21h22L12,2 1,21zM13,18h-2v-2h2v2zM13,14h-2v-4h2v4z"/>
|
||||
</vector>
|
||||
@@ -22,59 +22,55 @@
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:importantForAutofill="noExcludeDescendants"
|
||||
android:id="@+id/activity_entry_edit_container"
|
||||
tools:targetApi="o"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:filterTouchesWhenObscured="true">
|
||||
|
||||
<com.kunzisoft.keepass.view.ToolbarSpecial
|
||||
android:id="@+id/special_mode_view"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||
android:id="@+id/entry_edit_coordinator_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
android:layout_height="0dp"
|
||||
app:layout_constraintTop_toBottomOf="@+id/special_mode_view"
|
||||
app:layout_constraintBottom_toBottomOf="parent">
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:id="@+id/activity_entry_edit_container"
|
||||
<androidx.core.widget.NestedScrollView
|
||||
android:id="@+id/entry_edit_scroll"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<com.kunzisoft.keepass.view.ToolbarSpecial
|
||||
android:id="@+id/special_mode_view"
|
||||
android:layout_height="match_parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
android:scrollbarStyle="insideOverlay"
|
||||
android:scrollbars="none"
|
||||
app:layout_behavior="@string/appbar_scrolling_view_behavior">
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<androidx.core.widget.NestedScrollView
|
||||
android:id="@+id/entry_edit_scroll"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
app:layout_constraintTop_toBottomOf="@+id/special_mode_view"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
android:scrollbarStyle="insideOverlay"
|
||||
android:scrollbars="none"
|
||||
app:layout_behavior="@string/appbar_scrolling_view_behavior">
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:layout_height="match_parent"
|
||||
android:paddingTop="@dimen/card_view_margin_vertical"
|
||||
android:paddingBottom="128dp">
|
||||
<androidx.appcompat.widget.AppCompatSpinner
|
||||
android:id="@+id/entry_edit_template_selector"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:paddingTop="@dimen/card_view_margin_vertical"
|
||||
android:paddingBottom="128dp">
|
||||
<androidx.appcompat.widget.AppCompatSpinner
|
||||
android:id="@+id/entry_edit_template_selector"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
<androidx.fragment.app.FragmentContainerView
|
||||
android:id="@+id/entry_edit_content"
|
||||
android:name="com.kunzisoft.keepass.activities.fragments.EntryEditFragment"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintWidth_percent="@dimen/content_percent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/entry_edit_template_selector"/>
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
</androidx.core.widget.NestedScrollView>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
<androidx.fragment.app.FragmentContainerView
|
||||
android:id="@+id/entry_edit_content"
|
||||
android:name="com.kunzisoft.keepass.activities.fragments.EntryEditFragment"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintWidth_percent="@dimen/content_percent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/entry_edit_template_selector"/>
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
</androidx.core.widget.NestedScrollView>
|
||||
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
|
||||
@@ -84,35 +80,47 @@
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintBottom_toBottomOf="parent">
|
||||
|
||||
<com.kunzisoft.keepass.view.ToolbarAction
|
||||
android:id="@+id/entry_edit_bottom_bar"
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:id="@+id/bottom_toolbar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom"
|
||||
app:layout_constraintBottom_toTopOf="@+id/screenshot_mode_banner" />
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toTopOf="@+id/screenshot_mode_banner">
|
||||
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
android:id="@+id/entry_edit_validate"
|
||||
style="@style/KeepassDXStyle.Fab"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:contentDescription="@string/validate"
|
||||
android:src="@drawable/ic_check_white_24dp"
|
||||
app:fabCustomSize="@dimen/button_small_size"
|
||||
app:layout_constraintTop_toTopOf="@+id/entry_edit_bottom_bar"
|
||||
app:layout_constraintBottom_toBottomOf="@+id/entry_edit_bottom_bar"
|
||||
android:layout_marginBottom="6dp"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent" />
|
||||
<com.kunzisoft.keepass.view.ToolbarAction
|
||||
android:id="@+id/entry_edit_bottom_bar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom"
|
||||
app:layout_constraintBottom_toBottomOf="parent" />
|
||||
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
android:id="@+id/entry_edit_validate"
|
||||
style="@style/KeepassDXStyle.Fab"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:contentDescription="@string/validate"
|
||||
android:src="@drawable/ic_check_white_24dp"
|
||||
app:fabCustomSize="@dimen/button_small_size"
|
||||
app:layout_constraintTop_toTopOf="@+id/entry_edit_bottom_bar"
|
||||
app:layout_constraintBottom_toBottomOf="@+id/entry_edit_bottom_bar"
|
||||
android:layout_marginBottom="6dp"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent" />
|
||||
|
||||
<include
|
||||
layout="@layout/view_button_lock"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"/>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
<include
|
||||
layout="@layout/view_button_lock"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintBottom_toTopOf="@+id/screenshot_mode_banner"/>
|
||||
|
||||
<include layout="@layout/view_screenshot_mode_banner" />
|
||||
app:layout_constraintTop_toBottomOf="@+id/bottom_toolbar"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
layout="@layout/view_screenshot_mode_banner" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
|
||||
@@ -58,6 +58,7 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_collapseMode="parallax"
|
||||
android:layoutDirection="ltr"
|
||||
android:layout_gravity="center_horizontal|bottom"
|
||||
android:gravity="center"
|
||||
android:orientation="horizontal"
|
||||
|
||||
@@ -46,14 +46,15 @@
|
||||
app:layout_constraintBottom_toBottomOf="parent"/>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
|
||||
<include
|
||||
layout="@layout/view_button_lock"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintBottom_toTopOf="@+id/screenshot_mode_banner" />
|
||||
<include
|
||||
layout="@layout/view_button_lock"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom|start"
|
||||
app:layout_anchorGravity="bottom|start"
|
||||
app:layout_dodgeInsetEdges="bottom" />
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
|
||||
<include layout="@layout/view_screenshot_mode_banner"
|
||||
app:layout_constraintBottom_toBottomOf="parent"/>
|
||||
|
||||
@@ -50,14 +50,14 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="@dimen/card_view_padding">
|
||||
|
||||
<com.kunzisoft.keepass.view.PassKeyView
|
||||
<com.kunzisoft.keepass.view.PasswordEditView
|
||||
android:id="@+id/passphrase_view"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_toStartOf="@+id/passphrase_copy_button"
|
||||
android:layout_toLeftOf="@+id/passphrase_copy_button"
|
||||
app:passKeyHint="@string/passphrase"
|
||||
app:passKeyMaxLines="7"/>
|
||||
app:passwordHint="@string/passphrase"
|
||||
app:passwordMaxLines="7"/>
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageButton
|
||||
android:id="@+id/passphrase_copy_button"
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="@dimen/card_view_padding">
|
||||
|
||||
<com.kunzisoft.keepass.view.PassKeyView
|
||||
<com.kunzisoft.keepass.view.PasswordEditView
|
||||
android:id="@+id/password_view"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
|
||||
@@ -72,11 +72,11 @@
|
||||
android:text="@string/password"/>
|
||||
|
||||
<!-- Password Input -->
|
||||
<com.kunzisoft.keepass.view.PassKeyView
|
||||
<com.kunzisoft.keepass.view.PasswordEditView
|
||||
android:id="@+id/password_view"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
app:passKeyVisible="false"/>
|
||||
app:passwordVisible="false"/>
|
||||
<com.google.android.material.textfield.TextInputLayout
|
||||
android:id="@+id/password_repeat_input_layout"
|
||||
android:layout_width="match_parent"
|
||||
@@ -94,6 +94,7 @@
|
||||
android:importantForAccessibility="no"
|
||||
android:importantForAutofill="no"
|
||||
android:inputType="textPassword|textMultiLine"
|
||||
android:textDirection="ltr"
|
||||
android:maxLines="3"
|
||||
android:hint="@string/hint_conf_pass"/>
|
||||
</com.google.android.material.textfield.TextInputLayout>
|
||||
@@ -121,6 +122,15 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/entry_keyfile"/>
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
style="@style/KeepassDXStyle.Button.Secondary"
|
||||
android:id="@+id/keyfile_generate"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="end"
|
||||
app:icon="@drawable/ic_file_key_white_24dp"
|
||||
android:text="@string/generate_keyfile" />
|
||||
|
||||
<com.kunzisoft.keepass.view.KeyFileSelectionView
|
||||
android:id="@+id/keyfile_selection"
|
||||
android:layout_width="match_parent"
|
||||
|
||||
@@ -125,8 +125,7 @@
|
||||
android:paddingStart="8dp"
|
||||
android:paddingLeft="8dp"
|
||||
android:paddingEnd="4dp"
|
||||
android:paddingRight="4dp"
|
||||
android:paddingVertical="4dp">
|
||||
android:paddingRight="4dp">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/node_otp_token"
|
||||
@@ -179,4 +178,4 @@
|
||||
tools:text="Database / Group A / Group B" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
@@ -61,11 +61,11 @@
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignTop="@+id/node_icon"
|
||||
android:layout_marginEnd="-32dp"
|
||||
android:layout_marginRight="-32dp"
|
||||
android:layout_toStartOf="@+id/node_icon"
|
||||
android:layout_toLeftOf="@+id/node_icon"
|
||||
tools:text="3" />
|
||||
android:layout_marginStart="8dp"
|
||||
android:layout_marginLeft="8dp"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:layout_alignParentStart="true"
|
||||
tools:text="123" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
|
||||
@@ -1,91 +1,90 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
<FrameLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="?attr/colorSurface"
|
||||
android:gravity="bottom"
|
||||
android:orientation="vertical"
|
||||
android:layout_marginBottom="6dp"
|
||||
android:paddingTop="36dp"
|
||||
android:paddingLeft="@dimen/default_margin"
|
||||
android:paddingRight="@dimen/default_margin"
|
||||
android:paddingBottom="@dimen/default_margin"
|
||||
tools:ignore="UnusedAttribute">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/nav_database_version"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
android:paddingStart="8dp"
|
||||
android:paddingLeft="8dp"
|
||||
android:paddingEnd="8dp"
|
||||
android:paddingRight="8dp"
|
||||
style="@style/KeepassDXStyle.Text.Info.OnSurface"
|
||||
android:textSize="11sp"
|
||||
tools:text="version"
|
||||
android:textIsSelectable="true" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/nav_database_icon"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:contentDescription="@string/content_description_nav_header"
|
||||
app:layout_constraintTop_toBottomOf="@+id/nav_database_version"
|
||||
app:layout_constraintBottom_toTopOf="@+id/nav_database_name"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
android:layout_marginStart="6dp"
|
||||
android:layout_marginLeft="6dp"
|
||||
android:layout_marginBottom="12dp"
|
||||
app:srcCompat="@drawable/ic_database_white_36dp"
|
||||
style="@style/KeepassDXStyle.Icon"
|
||||
app:tint="?attr/colorSecondary" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/nav_database_modified"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:contentDescription="@string/save"
|
||||
android:src="@drawable/ic_modified_white_12dp"
|
||||
android:visibility="gone"
|
||||
app:layout_constraintBottom_toBottomOf="@+id/nav_database_icon"
|
||||
app:layout_constraintStart_toEndOf="@+id/nav_database_icon"
|
||||
app:layout_constraintTop_toTopOf="@+id/nav_database_icon" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/nav_database_color"
|
||||
android:layout_width="18dp"
|
||||
android:layout_height="18dp"
|
||||
android:layout_gravity="center"
|
||||
android:contentDescription="@string/content_description_database_color"
|
||||
android:src="@drawable/background_icon"
|
||||
app:layout_constraintBottom_toBottomOf="@+id/nav_database_name"
|
||||
app:layout_constraintEnd_toEndOf="parent" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/nav_database_name"
|
||||
style="@style/KeepassDXStyle.Title.OnSurface"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="6dp"
|
||||
android:maxLines="2"
|
||||
android:text="@string/database"
|
||||
android:textIsSelectable="true"
|
||||
app:layout_constraintBottom_toTopOf="@+id/nav_database_path"
|
||||
app:layout_constraintEnd_toStartOf="@+id/nav_database_color"
|
||||
app:layout_constraintStart_toStartOf="parent" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/nav_database_path"
|
||||
style="@style/KeepassDXStyle.Text.Info.OnSurface"
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
android:textSize="11sp"
|
||||
android:text="@string/path"
|
||||
android:textIsSelectable="true"/>
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
android:gravity="bottom"
|
||||
android:layout_margin="@dimen/default_margin">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/nav_database_version"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
android:paddingStart="8dp"
|
||||
android:paddingLeft="8dp"
|
||||
android:paddingEnd="8dp"
|
||||
android:paddingRight="8dp"
|
||||
style="@style/KeepassDXStyle.Text.Info.OnSurface"
|
||||
android:textSize="11sp"
|
||||
tools:text="version"
|
||||
android:textIsSelectable="true" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/nav_database_icon"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:contentDescription="@string/content_description_nav_header"
|
||||
app:layout_constraintTop_toBottomOf="@+id/nav_database_version"
|
||||
app:layout_constraintBottom_toTopOf="@+id/nav_database_name"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
android:layout_marginStart="6dp"
|
||||
android:layout_marginLeft="6dp"
|
||||
android:layout_marginBottom="12dp"
|
||||
app:srcCompat="@drawable/ic_database_white_36dp"
|
||||
style="@style/KeepassDXStyle.Icon"
|
||||
app:tint="?attr/colorSecondary" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/nav_database_modified"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:contentDescription="@string/save"
|
||||
android:src="@drawable/ic_modified_white_12dp"
|
||||
android:visibility="gone"
|
||||
app:layout_constraintBottom_toBottomOf="@+id/nav_database_icon"
|
||||
app:layout_constraintStart_toEndOf="@+id/nav_database_icon"
|
||||
app:layout_constraintTop_toTopOf="@+id/nav_database_icon" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/nav_database_color"
|
||||
android:layout_width="18dp"
|
||||
android:layout_height="18dp"
|
||||
android:layout_gravity="center"
|
||||
android:contentDescription="@string/content_description_database_color"
|
||||
android:src="@drawable/background_icon"
|
||||
app:layout_constraintBottom_toBottomOf="@+id/nav_database_name"
|
||||
app:layout_constraintEnd_toEndOf="parent" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/nav_database_name"
|
||||
style="@style/KeepassDXStyle.Title.OnSurface"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="6dp"
|
||||
android:maxLines="2"
|
||||
android:text="@string/database"
|
||||
android:textIsSelectable="true"
|
||||
app:layout_constraintBottom_toTopOf="@+id/nav_database_path"
|
||||
app:layout_constraintEnd_toStartOf="@+id/nav_database_color"
|
||||
app:layout_constraintStart_toStartOf="parent" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/nav_database_path"
|
||||
style="@style/KeepassDXStyle.Text.Info.OnSurface"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
android:textSize="11sp"
|
||||
android:text="@string/path"
|
||||
android:textIsSelectable="true"/>
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
</FrameLayout>
|
||||
@@ -76,6 +76,7 @@
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layoutDirection="ltr"
|
||||
app:layout_constraintTop_toBottomOf="@+id/switch_element">
|
||||
|
||||
<LinearLayout
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:src="@drawable/ic_warning_white_24dp"
|
||||
android:src="@drawable/ic_hourglass_bottom_white_24dp"
|
||||
android:contentDescription="@string/content_description_file_information"
|
||||
app:tint="?android:attr/textColor"/>
|
||||
<androidx.appcompat.widget.AppCompatTextView
|
||||
|
||||
@@ -36,6 +36,7 @@
|
||||
android:minHeight="48dp"
|
||||
android:hint="@string/password"
|
||||
android:inputType="textPassword"
|
||||
android:textDirection="ltr"
|
||||
android:importantForAutofill="no"
|
||||
android:focusable="true"
|
||||
android:focusableInTouchMode="true"
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
xmlns:tools="http://schemas.android.com/tools">
|
||||
|
||||
<com.google.android.material.textfield.TextInputLayout
|
||||
android:id="@+id/password_input_layout"
|
||||
android:id="@+id/password_edit_input_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
@@ -18,7 +18,7 @@
|
||||
tools:ignore="UnusedAttribute">
|
||||
|
||||
<com.google.android.material.textfield.TextInputEditText
|
||||
android:id="@+id/password_text"
|
||||
android:id="@+id/password_edit_text"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:ems="10"
|
||||
@@ -26,28 +26,27 @@
|
||||
android:importantForAccessibility="no"
|
||||
android:importantForAutofill="no"
|
||||
android:inputType="textPassword|textMultiLine"
|
||||
android:textDirection="ltr"
|
||||
android:maxLines="3"
|
||||
tools:ignore="TextFields" />
|
||||
</com.google.android.material.textfield.TextInputLayout>
|
||||
|
||||
<com.google.android.material.progressindicator.LinearProgressIndicator
|
||||
android:id="@+id/password_strength_progress"
|
||||
android:id="@+id/password_edit_strength_progress"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="4dp"
|
||||
android:padding="1dp"
|
||||
app:trackCornerRadius="8dp"
|
||||
app:layout_constraintTop_toBottomOf="@+id/password_input_layout"/>
|
||||
app:layout_constraintBottom_toBottomOf="@+id/password_edit_input_layout"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/password_entropy"
|
||||
android:id="@+id/password_edit_entropy"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
tools:text="Entropy: 72.50 bit"
|
||||
android:textSize="11sp"
|
||||
android:layout_margin="4dp"
|
||||
android:textColor="?attr/colorSecondary"
|
||||
android:textStyle="bold"
|
||||
app:layout_constraintBottom_toBottomOf="@+id/password_input_layout"
|
||||
app:layout_constraintEnd_toEndOf="@+id/password_input_layout" />
|
||||
style="@style/KeepassDXStyle.Text.Indicator"
|
||||
android:padding="4dp"
|
||||
app:layout_constraintBottom_toBottomOf="@+id/password_edit_input_layout"
|
||||
app:layout_constraintEnd_toEndOf="@+id/password_edit_input_layout" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
@@ -18,39 +18,39 @@
|
||||
along with KeePassDX. If not, see <http://www.gnu.org/licenses/>.
|
||||
--><resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||
<string name="homepage">الصفحة الرئيسة</string>
|
||||
<string name="accept">قبول</string>
|
||||
<string name="add_group">إضافة مجموعة</string>
|
||||
<string name="encryption">التشفير</string>
|
||||
<string name="encryption_algorithm">خوارزمية التشفير</string>
|
||||
<string name="accept">اقبل</string>
|
||||
<string name="add_group">أضف مجموعة</string>
|
||||
<string name="encryption">التعمية</string>
|
||||
<string name="encryption_algorithm">خوارزمية التعمية</string>
|
||||
<string name="application">التطبيق</string>
|
||||
<string name="brackets">الأقواس</string>
|
||||
<string name="extended_ASCII">تمديد ASCII</string>
|
||||
<string name="allow">سماح</string>
|
||||
<string name="extended_ASCII">ASCII ممتد</string>
|
||||
<string name="allow">اسمح</string>
|
||||
<string name="clipboard_cleared">مُسِحت الحافظة</string>
|
||||
<string name="clipboard_error_title">خطأ في الحافظة</string>
|
||||
<string name="clipboard_error_clear">تعذَّر مسح الحافظة</string>
|
||||
<string name="database">قاعدة البيانات</string>
|
||||
<string name="decrypting_db">يفك تشفير محتوى قاعدة البيانات…</string>
|
||||
<string name="decrypting_db">يفك تعمية محتوى قاعدة البيانات…</string>
|
||||
<string name="digits">أرقام</string>
|
||||
<string name="entry_cancel">إلغاء</string>
|
||||
<string name="entry_cancel">ألغِ</string>
|
||||
<string name="entry_notes">ملاحظات</string>
|
||||
<string name="entry_confpassword">تأكيد كلمة السر</string>
|
||||
<string name="entry_confpassword">أكّد كلمة السر</string>
|
||||
<string name="entry_created">أُنشئ</string>
|
||||
<string name="entry_modified">معدل</string>
|
||||
<string name="entry_modified">مُعدل</string>
|
||||
<string name="entry_not_found">تعذر العثور على بيانات المُدخلة.</string>
|
||||
<string name="entry_password">كلمة السر</string>
|
||||
<string name="save">حفظ</string>
|
||||
<string name="save">احفظ</string>
|
||||
<string name="entry_title">العنوان</string>
|
||||
<string name="entry_url">رابط</string>
|
||||
<string name="entry_user_name">اسم المستخدم</string>
|
||||
<string name="error_file_not_create">تعذر إنشاء الملف</string>
|
||||
<string name="error_file_not_create">تعذر إنشاء الملف.</string>
|
||||
<string name="error_invalid_path">تأكد أن المسار صحيح.</string>
|
||||
<string name="error_no_name">ادخل اسمًا.</string>
|
||||
<string name="error_pass_match">كلمتا السر غير متطابقتين.</string>
|
||||
<string name="field_name">اسم الحقل</string>
|
||||
<string name="field_value">قيمة الحقل</string>
|
||||
<string name="generate_password">توليد كلمة سر</string>
|
||||
<string name="hint_conf_pass">تأكيد كلمة السر</string>
|
||||
<string name="generate_password">ولّد كلمة سر</string>
|
||||
<string name="hint_conf_pass">أكّد كلمة السر</string>
|
||||
<string name="hint_group_name">اسم المجموعة</string>
|
||||
<string name="hint_length">الطول</string>
|
||||
<string name="hint_pass">كلمة السر</string>
|
||||
@@ -61,15 +61,15 @@
|
||||
<string name="list_size_summary">حجم النص في قائمة العناصر</string>
|
||||
<string name="loading_database">يحمل قاعدة البيانات…</string>
|
||||
<string name="lowercase">حروف صغيرة</string>
|
||||
<string name="hide_password_summary">إخفاء كلمات السر بشكل افتراضي</string>
|
||||
<string name="hide_password_summary">أخفِ كلمات السر (***) افتراضيًا</string>
|
||||
<string name="about">عن التطبيق</string>
|
||||
<string name="menu_change_key_settings">تغيير المفتاح الرئيسي</string>
|
||||
<string name="settings">الإعدادات</string>
|
||||
<string name="menu_app_settings">إعدادات التطبيق</string>
|
||||
<string name="menu_database_settings">إعدادات قاعدة البيانات</string>
|
||||
<string name="menu_delete">حذف</string>
|
||||
<string name="menu_delete">احذف</string>
|
||||
<string name="menu_donate">التبرع</string>
|
||||
<string name="menu_edit">تعديل</string>
|
||||
<string name="menu_edit">عدّل</string>
|
||||
<string name="menu_lock">اقفل قاعدة البيانات</string>
|
||||
<string name="menu_open">فتح</string>
|
||||
<string name="menu_search">البحث</string>
|
||||
@@ -80,7 +80,7 @@
|
||||
<string name="progress_create">إنشاء قاعدة بيانات جديدة …</string>
|
||||
<string name="protection">الحماية</string>
|
||||
<string name="read_only">محمي من التعديل</string>
|
||||
<string name="content_description_remove_from_list">إزالة</string>
|
||||
<string name="content_description_remove_from_list">أزل</string>
|
||||
<string name="root">الجذر</string>
|
||||
<string name="memory_usage">استخدام الذاكرة</string>
|
||||
<string name="parallelism">التَّوازِي</string>
|
||||
@@ -107,20 +107,19 @@
|
||||
<string name="feedback">أرسل انطباعاتك</string>
|
||||
<string name="about_description">\"KeePassDX\" هو تطبيق أندرويد لمدير كلمات المرور كي باس \"KeePass\"</string>
|
||||
<string name="add_entry">أضف مدخل</string>
|
||||
<string name="edit_entry">تحرير مدخل</string>
|
||||
<string name="edit_entry">عدّل مدخل</string>
|
||||
<string name="key_derivation_function">وظيفة اشتقاق المفتاح</string>
|
||||
<string name="app_timeout">المهلة</string>
|
||||
<string name="app_timeout_summary">مدة الخمول قبل قفل قاعدة البيانات</string>
|
||||
<string name="file_manager_install_description">مدير الملفات الذي يمكنه القيام بالإجراءين ACTION_CREATE_DOCUMENT و ACTION_OPEN_DOCUMENT ضروري لانشاء, وفتح وحفض قواعد البيانات.</string>
|
||||
<string name="file_manager_install_description">مدير الملفات الذي يمكنه القيام بالإجراءين ACTION_CREATE_DOCUMENT و ACTION_OPEN_DOCUMENT ضروري لانشاء، وفتح وحفظ قواعد البيانات.</string>
|
||||
<string name="clipboard_error">بعض الأجهزة لا تسمح للتطبيقات باستعمال الحافظة.</string>
|
||||
<string name="clipboard_timeout">مهلة الحافظة</string>
|
||||
<string name="clipboard_timeout_summary">مدة التخزين في الحافظة(إذا كان جهازك يدعمها)</string>
|
||||
<string name="clipboard_timeout_summary">مدة التخزين في الحافظة (إذا كان جهازك يدعمها)</string>
|
||||
<string name="select_to_copy">اختر لنسخ %1$s إلى الحافظة</string>
|
||||
<string name="retrieving_db_key">يجلب مفتاح قاعدة البيانات…</string>
|
||||
<string name="default_checkbox">استخدامها كقاعدة بيانات افتراضية</string>
|
||||
<string name="html_about_licence">KeePassDX © %1$d كونزيسوفت <strong>مفتوح المصدر</strong> و <strong>بدون اعلانات</strong>.
|
||||
\n يوزع كما هو، بدون ضمان, تحت ترخيص <strong>GPLv3</strong>.</string>
|
||||
<string name="entry_accessed">نُفذ إليه</string>
|
||||
<string name="html_about_licence">KeePassDX © %1$d كونزيسوفت <strong>مفتوح المصدر</strong> و <strong>بدون إعلانات</strong>. \n يوزع كما هو، دون ضمان، تحت ترخيص <strong>GPLv3</strong>.</string>
|
||||
<string name="entry_accessed">وُصِل إليه</string>
|
||||
<string name="entry_expires">تنتهي صلاحيته في</string>
|
||||
<string name="entry_keyfile">ملف المفتاح</string>
|
||||
<string name="error_arc4">تشفير دفق Arcfour غير مدعوم.</string>
|
||||
@@ -129,7 +128,7 @@
|
||||
<string name="error_nokeyfile">اختر ملف مفتاح.</string>
|
||||
<string name="error_out_of_memory">لا ذاكرة لتحميل قاعدة البيانات كاملة.</string>
|
||||
<string name="error_load_database">تعذر تحميل قاعدة البيانات.</string>
|
||||
<string name="error_load_database_KDF_memory">لا يمكن تحميل المفتاح، حاول تقليل \"الذاكرة المستخدمة\" من قبل KDF.</string>
|
||||
<string name="error_load_database_KDF_memory">تعذر تحميل المفتاح. حاول تقليل \"الذاكرة المستخدمة\" من قِبل KDF.</string>
|
||||
<string name="error_pass_gen_type">يجب تحديد نوع واحد على الأقل لتوليد كلمة السر.</string>
|
||||
<string name="error_rounds_too_large">\"جولات التحويل\" كثيرة جداً. الإعداد إلى 2147483648.</string>
|
||||
<string name="error_string_key">يجب أن يكون لكل سلسلة اسم حقل.</string>
|
||||
@@ -141,17 +140,17 @@
|
||||
<string name="invalid_db_sig">تعذر تمييز نسق قاعدة البيانات.</string>
|
||||
<string name="keyfile_is_empty">ملف المفتاح فارغ.</string>
|
||||
<string name="list_entries_show_username_title">أظهر أسماء المستخدمين</string>
|
||||
<string name="list_entries_show_username_summary">اعرض اسماء المستخدمين في قوائم المدخلات</string>
|
||||
<string name="hint_generated_password">كلمة السر الموَلدة</string>
|
||||
<string name="hint_keyfile">الملف المفتاحي</string>
|
||||
<string name="hide_password_title">اخفاء كلمات السر</string>
|
||||
<string name="list_entries_show_username_summary">يعرض اسماء المستخدمين في قوائم المدخلات</string>
|
||||
<string name="hint_generated_password">كلمة السر مولّدة</string>
|
||||
<string name="hint_keyfile">ملف المفتاح</string>
|
||||
<string name="hide_password_title">أخفِ كلمات السر</string>
|
||||
<string name="copy_field">نُسخة من %1$s</string>
|
||||
<string name="menu_copy">نسخ</string>
|
||||
<string name="menu_move">نقل</string>
|
||||
<string name="menu_paste">لصق</string>
|
||||
<string name="menu_cancel">الغاء</string>
|
||||
<string name="menu_hide_password">اخفاء كلمة السر</string>
|
||||
<string name="menu_showpass">اظهار كلمة السر</string>
|
||||
<string name="menu_cancel">ألغِ</string>
|
||||
<string name="menu_hide_password">أخفِ كلمة السر</string>
|
||||
<string name="menu_showpass">أظهر كلمة السر</string>
|
||||
<string name="menu_url">الانتقال الى الرابط</string>
|
||||
<string name="menu_file_selection_read_only">محمي من التعديل</string>
|
||||
<string name="menu_open_file_read_and_write">قابل للتعديل</string>
|
||||
@@ -166,7 +165,7 @@
|
||||
<string name="unavailable">غير متوفر</string>
|
||||
<string name="menu_appearance_settings">المظهر</string>
|
||||
<string name="general">عام</string>
|
||||
<string name="autofill">ملأ تلقائي</string>
|
||||
<string name="autofill">الملء التلقائي</string>
|
||||
<string name="autofill_sign_in_prompt">سجل باستخدام KeePassDX</string>
|
||||
<string name="set_autofill_service_title">تعيين خدمة الملأ التلقائي الافتراضية</string>
|
||||
<string name="password_size_title">حجم كلمة السر المولدة</string>
|
||||
@@ -178,7 +177,7 @@
|
||||
<string name="clipboard_warning">اذا فشل الحذف التلقائي من الحافظة ,احذف تأريخه يدويا.</string>
|
||||
<string name="lock_database_screen_off_title">قفل الشاشة</string>
|
||||
<string name="lock_database_screen_off_summary">اقفل قاعدة البيانات بعد بضع ثوانٍ بمجرد إيقاف تشغيل الشاشة</string>
|
||||
<string name="biometric_delete_all_key_title">حذف مفاتيح التشفير</string>
|
||||
<string name="biometric_delete_all_key_title">احذف مفاتيح التعمية</string>
|
||||
<string name="unavailable_feature_text">لا يمكن بدأ هذه الميزة .</string>
|
||||
<string name="unavailable_feature_version">هذا الجهاز يعمل بأندرويد %1$s لكن يحتاج نسخة %2$s على الأقل.</string>
|
||||
<string name="file_name">اسم الملف</string>
|
||||
@@ -234,10 +233,10 @@
|
||||
<string name="keyboard_notification_entry_content_title">%1$s متوفر على Magikeyboard</string>
|
||||
<string name="keyboard_notification_entry_content_text">%1$s</string>
|
||||
<string name="reset_education_screens_title">إعادة تعيين التلميحات التعليمية</string>
|
||||
<string name="education_search_title">البحث من خلال الإدخالات</string>
|
||||
<string name="education_search_title">ابحث من خلال المدخلات</string>
|
||||
<string name="content_description_open_file">افتح الملف</string>
|
||||
<string name="content_description_add_entry">إضافة مدخلة</string>
|
||||
<string name="content_description_add_group">إضافة مجموعة</string>
|
||||
<string name="content_description_add_entry">أضف مدخل</string>
|
||||
<string name="content_description_add_group">أضف مجموعة</string>
|
||||
<string name="content_description_file_information">معلومات الملف</string>
|
||||
<string name="entry_password_generator">مولد كلمة السر</string>
|
||||
<string name="content_description_background">الخلفية</string>
|
||||
@@ -250,50 +249,50 @@
|
||||
<string name="do_not_kill_app">لا تقتل التطبيق…</string>
|
||||
<string name="content_description_node_children">العقد الفرعية</string>
|
||||
<string name="content_description_add_node">أضف عقدة</string>
|
||||
<string name="content_description_entry_icon">ايقونة المدخل</string>
|
||||
<string name="content_description_entry_icon">أيقونة المدخل</string>
|
||||
<string name="content_description_password_length">طول كلمة السر</string>
|
||||
<string name="entry_add_field">أضف حقل</string>
|
||||
<string name="content_description_remove_field">أزل حقل</string>
|
||||
<string name="error_move_entry_here">يتعذر نقل مدخل إلى هنا.</string>
|
||||
<string name="error_copy_entry_here">يتعذر نسخ مدخال إلى هنا.</string>
|
||||
<string name="list_groups_show_number_entries_title">عرض عدد المدخلات</string>
|
||||
<string name="list_groups_show_number_entries_summary">عرض عدد المدخلات في المجموعة</string>
|
||||
<string name="content_description_update_from_list">تحديث</string>
|
||||
<string name="error_move_entry_here">لا يمكنك نقل مدخل هنا.</string>
|
||||
<string name="error_copy_entry_here">لا يمكنك نسخ مدخل هنا.</string>
|
||||
<string name="list_groups_show_number_entries_title">أظهر عدد المدخلات</string>
|
||||
<string name="list_groups_show_number_entries_summary">يعرض عدد المدخلات في المجموعة</string>
|
||||
<string name="content_description_update_from_list">حدِّث</string>
|
||||
<string name="content_description_keyboard_close_fields">أغلق الحقول</string>
|
||||
<string name="error_create_database_file">لا يمكن انشاء قاعدة بيانات بكلمة السر وملف المفتاح الحاليين.</string>
|
||||
<string name="error_create_database_file">تعذر إنشاء قاعدة بيانات بكلمة السر وملف المفتاح الحاليين.</string>
|
||||
<string name="menu_advanced_unlock_settings">فك قفل الجهاز</string>
|
||||
<string name="entry_attachments">مرفقات</string>
|
||||
<string name="entry_history">السجل</string>
|
||||
<string name="entry_add_attachment">أضف مرفقا</string>
|
||||
<string name="discard">إلغاء</string>
|
||||
<string name="entry_history">التاريخ</string>
|
||||
<string name="entry_add_attachment">أضف مرفقًا</string>
|
||||
<string name="discard">تجاهل</string>
|
||||
<string name="discard_changes">تجاهل التغييرات؟</string>
|
||||
<string name="validate">تأكيد</string>
|
||||
<string name="security">الأمان</string>
|
||||
<string name="master_key">المفتاح الرئيسي</string>
|
||||
<string name="error_otp_period">يجب ان تكون المدة بين %1$d و%2$d ثانية.</string>
|
||||
<string name="error_otp_secret_key">المفتاح السري يجب ان يكون بصيغة Base32.</string>
|
||||
<string name="error_save_database">لا يمكن حفظ قاعدة البيانات.</string>
|
||||
<string name="error_create_database">لا يمكن إنشاء ملف قاعدة البيانات.</string>
|
||||
<string name="error_copy_group_here">لا يمكن نسخ مجموعة هنا.</string>
|
||||
<string name="error_save_database">تعذر حفظ قاعدة البيانات.</string>
|
||||
<string name="error_create_database">تعذر إنشاء ملف قاعدة البيانات.</string>
|
||||
<string name="error_copy_group_here">لا يمكنك نسخ مجموعة هنا.</string>
|
||||
<string name="error_label_exists">هذه التسمية موجودة بالفعل.</string>
|
||||
<string name="otp_period">المدة (ثواني)</string>
|
||||
<string name="otp_algorithm">الخوارزمية</string>
|
||||
<string name="otp_digits">أرقام</string>
|
||||
<string name="otp_counter">العداد</string>
|
||||
<string name="entry_setup_otp">عيّن كلمة مرور لمرة واحدة</string>
|
||||
<string name="entry_setup_otp">عيّن كلمة سر لمرة واحدة</string>
|
||||
<string name="entry_UUID">UUID</string>
|
||||
<string name="html_about_contribution">من أجل <strong>حماية خصوصيتا</strong>٫<strong> إصلاح العلل</strong>٫ <strong>إضافة مميزات</strong> <strong>وجعلنا نشطاء دائما</strong>٫ نحن نعتمد على <strong>مساهمتك</strong>.</string>
|
||||
<string name="content_description_keyfile_checkbox">خانة تأشير الملف المفتاحي</string>
|
||||
<string name="html_about_contribution">لكي <strong>نحافظ على حريتنا</strong>، و<strong>نصلح الأخطاء</strong>، و<strong>نضيف ميزات</strong>، و<strong>نبقى دائمًا نشطين</strong>، فإننا نعتمد على <strong>مساهمتكم</strong>.</string>
|
||||
<string name="content_description_keyfile_checkbox">خانة تأشير ملف المفتاح</string>
|
||||
<string name="content_description_password_checkbox">خانة تأشير كلمة السر</string>
|
||||
<string name="content_description_add_item">أضف عنصر</string>
|
||||
<string name="warning_permanently_delete_nodes">حذف العقد المحددة نهائيا؟</string>
|
||||
<string name="filter">مرشح</string>
|
||||
<string name="command_execution">ينفذ الأمر…</string>
|
||||
<string name="hide_broken_locations_title">اِخفي روابط قواعد البيانات المعطلة</string>
|
||||
<string name="hide_broken_locations_title">أخفِ روابط قواعد البيانات المعطوبة</string>
|
||||
<string name="show_recent_files_summary">أظهر موقع قواعد البيانات الأخيرة</string>
|
||||
<string name="show_recent_files_title">أظهر الملفات الأخيرة</string>
|
||||
<string name="remember_keyfile_locations_summary">تعقب موقع الملفات المفتاحية لقاعدة البيانات</string>
|
||||
<string name="remember_keyfile_locations_title">تذكر موقع الملف المفتاحي</string>
|
||||
<string name="remember_keyfile_locations_title">تذكر موقع ملف المفتاح</string>
|
||||
<string name="remember_database_locations_summary">تعقب موقع قاعدة البيانات</string>
|
||||
<string name="remember_database_locations_title">تذكر موقع تخزين قاعدة البيانات</string>
|
||||
<string name="contains_duplicate_uuid_procedure">للمتابعة هل تريد حل المشكلة بتوليد UUID للعناصر المكررة ؟</string>
|
||||
@@ -308,42 +307,42 @@
|
||||
<string name="creating_database">ينشئ قاعدة البيانات…</string>
|
||||
<string name="error_string_type">لا يطابق هذا النص العنصر المطلوب.</string>
|
||||
<string name="error_otp_counter">على العداد أن يكون ما بين %1$d و %2$d.</string>
|
||||
<string name="entry_otp">كلمة مرور لمرة واحدة</string>
|
||||
<string name="otp_type">نوع كلمة المرور لمرة واحدة</string>
|
||||
<string name="entry_otp">كلمة سر لمرة واحدة</string>
|
||||
<string name="otp_type">نوع كلمة السر لمرة واحدة (OTP)</string>
|
||||
<string name="error_disallow_no_credentials">عين اعتماد واحد على الأقل.</string>
|
||||
<string name="contribution">ساهم</string>
|
||||
<string name="contact">الإتصال بنا</string>
|
||||
<string name="contact">التواصل</string>
|
||||
<string name="biometric">البصمة</string>
|
||||
<string name="warning_empty_keyfile_explanation">يجب ألا تغير محتوى ملف المفتاح، في أحسن الحالات يجب أن يحتوي بيانات مولدة عشوائيا.</string>
|
||||
<string name="warning_empty_keyfile">من غير المستحسن اضافة ملف مفتاح فارغ.</string>
|
||||
<string name="warning_sure_remove_data">أزل هذه البيانات عل أي حال؟</string>
|
||||
<string name="warning_sure_add_file">أأضف الملف على أي حال؟</string>
|
||||
<string name="warning_replace_file">رفعُ هذا الملف سيستبدل الموجود مسبقا.</string>
|
||||
<string name="warning_replace_file">رفع هذا الملف سيستبدل الموجود مسبقًا.</string>
|
||||
<string name="warning_database_link_revoked">أبطلَ مدير الملفات الوصول للملف</string>
|
||||
<string name="warning_database_read_only">أعط صلاحية الكتابة من أجل حفظ قاعدة البيانات</string>
|
||||
<string name="warning_password_encoding">تجنب استخدام المحارف غير الموجودة في ترميز قاعدة البيانات (تحوَّل المحارف غير الموجودة لنفس الحرف).</string>
|
||||
<string name="hide_broken_locations_summary">إخف الروابط المعطلة في قائمة قواعد البيانات الحديثة</string>
|
||||
<string name="hide_broken_locations_summary">أخفِ الروابط المعطوبة في قائمة قواعد البيانات الحديثة</string>
|
||||
<string name="auto_focus_search_summary">افتح البحث عند فتح قاعدة البيانات</string>
|
||||
<string name="content_description_credentials_information">معلومات بيانات الاعتماد</string>
|
||||
<string name="max_history_items_title">العدد الأقصى</string>
|
||||
<string name="recycle_bin_group_title">مجموعة سلة المحذوفات</string>
|
||||
<string name="recycle_bin_summary">أُنقل المجموعات والمدخلات لسلة المحذوفات قبل حذفها</string>
|
||||
<string name="database_data_remove_unlinked_attachments_summary">أزِل المرفقات غير المرتبطة بإدخال في قاعدة البيانات</string>
|
||||
<string name="database_data_remove_unlinked_attachments_summary">أزل المرفقات غير المرتبطة بمدخل في قاعدة البيانات</string>
|
||||
<string name="database_data_remove_unlinked_attachments_title">أزل البيانات غير المرتبطة</string>
|
||||
<string name="database_data_compression_summary">ضغط البيانات يقلص من حجم قاعدة البيانات</string>
|
||||
<string name="database_data_compression_title">ضغط البيانات</string>
|
||||
<string name="data">البيانات</string>
|
||||
<string name="unavailable_feature_hardware">تعذر العثور على ماسح البصمة.</string>
|
||||
<string name="biometric_delete_all_key_summary">احذف كل مفاتيح التشفير المرتبطة بفتح الجهاز</string>
|
||||
<string name="biometric_delete_all_key_summary">احذف كل مفاتيح التعمية المرتبطة بفتح الجهاز</string>
|
||||
<string name="advanced_unlock_explanation_summary">استخدم إلغاء القفل الجهاز لفتح قاعدة البيانات بسهولة</string>
|
||||
<string name="lock_database_show_button_summary">يعرض زر القَفل في الواجهة</string>
|
||||
<string name="lock_database_show_button_title">اعرض زر القَفل</string>
|
||||
<string name="lock_database_show_button_title">أظهر زر القفل</string>
|
||||
<string name="lock_database_back_root_summary">قفل قاعدة البيانات عند النقر على زر الرجوع في الشاشة الرئيسية</string>
|
||||
<string name="lock_database_back_root_title">اضغط على \"رجوع\" للإقفال</string>
|
||||
<string name="clipboard_explanation_summary">انسخ حقول الإدخال باستخدام الحافظة</string>
|
||||
<string name="clipboard_explanation_summary">انسخ حقول المدخل باستخدام الحافظة</string>
|
||||
<string name="database_opened">قاعدة البيانات مفتوحة</string>
|
||||
<string name="autofill_preference_title">إعدادات الملء التلقائي</string>
|
||||
<string name="education_entry_edit_title">حرر المدخلة</string>
|
||||
<string name="education_entry_edit_title">عدّل المدخل</string>
|
||||
<string name="education_advanced_unlock_summary">لفتح قاعدة البيانات بسرعة اربط كلمة المرور بالبصمة.</string>
|
||||
<string name="education_search_summary">لإيجاد كلمة المرور، أدخل العنوان أو اسم المستخدم أو محتوى أحد الحقول.</string>
|
||||
<string name="education_new_node_summary">المدخلات لإدارة معرفاتك الرقمية.
|
||||
@@ -357,15 +356,15 @@
|
||||
<string name="autofill_web_domain_blocklist_title">قائمة النطاقات المحظورة</string>
|
||||
<string name="autofill_application_id_blocklist_summary">منع الملء التلقائي للتطبيقات الموجودة في القائمة</string>
|
||||
<string name="autofill_application_id_blocklist_title">قائمة التطبيقات المحظورة</string>
|
||||
<string name="content_description_repeat_toggle_password_visibility">بدِّل ظهور كلمة السر</string>
|
||||
<string name="hide_expired_entries_summary">لن تعرض المدخلات منتهية الصلاحية</string>
|
||||
<string name="content_description_repeat_toggle_password_visibility">أعد تبديل ظهور كلمة السر</string>
|
||||
<string name="hide_expired_entries_summary">لا يتم عرض المدخلات منتهية الصلاحية</string>
|
||||
<string name="education_read_only_summary">تغيير وضع الافتتاح للجلسة.
|
||||
\n
|
||||
\nيمنع \"محمي ضد الكتابة\" التغييرات غير المقصودة في قاعدة البيانات.
|
||||
\n\"قابل للتعديل\" يتيح لك إضافة أو حذف أو تعديل جميع العناصر كما تريد.</string>
|
||||
<string name="education_read_only_title">احمي قاعدة البيانات من التعديل</string>
|
||||
<string name="education_unlock_title">افتح قاعدة البيانات</string>
|
||||
<string name="education_add_attachment_summary">أضف مرفقا للمدخلة لحفظ بيانات اضافية.</string>
|
||||
<string name="education_add_attachment_summary">ارفع مرفقًا إلى مدخلك لحفظ البيانات الخارجية الهامة.</string>
|
||||
<string name="education_add_attachment_title">أضف مرفقا</string>
|
||||
<string name="autofill_block">احظر الملء التلقائي</string>
|
||||
<string name="keyboard_previous_database_credentials_title">شاشة بيانات اعتماد قاعدة البيانات</string>
|
||||
@@ -402,7 +401,7 @@
|
||||
<string name="education_generate_password_title">أنشئ كلمة سر قوية</string>
|
||||
<string name="save_mode">وضع الحفظ</string>
|
||||
<string name="search_mode">وضع البحث</string>
|
||||
<string name="version">النسخة</string>
|
||||
<string name="version">النُسخة</string>
|
||||
<string name="template_group_name">النماذج</string>
|
||||
<string name="holder">الحامل</string>
|
||||
<string name="number">الرقم</string>
|
||||
@@ -410,7 +409,7 @@
|
||||
<string name="personal_identification_number">PIN</string>
|
||||
<string name="id_card">بطاقة الهوية</string>
|
||||
<string name="type">النوع</string>
|
||||
<string name="cryptocurrency">محفظة عملات مشفرة</string>
|
||||
<string name="cryptocurrency">محفظة عملات التعموية</string>
|
||||
<string name="public_key">المفتاح العمومي</string>
|
||||
<string name="private_key">المفتاح الخاص</string>
|
||||
<string name="account">الحساب</string>
|
||||
@@ -418,20 +417,20 @@
|
||||
<string name="bank_name">اسم المصرف</string>
|
||||
<string name="secure_note">ملاحظة آمنة</string>
|
||||
<string name="error_word_reserved">هذه الكلمة محجوزة ولا يمكن استخدامها.</string>
|
||||
<string name="error_field_name_already_exists">اسم الحقل موجود سلفًا.</string>
|
||||
<string name="error_file_to_big">الملف الذي ترفعه كبير.</string>
|
||||
<string name="error_field_name_already_exists">اسم الحقل موجود بالفعل.</string>
|
||||
<string name="error_file_to_big">الملف الذي تحاول رفعه كبير جدًا.</string>
|
||||
<string name="error_upload_file">حدث خطأ أثناء رفع الملف.</string>
|
||||
<string name="error_duplicate_file">بيانات الملف موجودة سلفًا.</string>
|
||||
<string name="error_duplicate_file">بيانات الملف موجودة بالفعل.</string>
|
||||
<string name="error_remove_file">حدث خطأ أثناء إزالة بيانات الملف.</string>
|
||||
<string name="error_start_database_action">حدث خطأ أثناء تنفيذ إجراء على قاعدة البيانات.</string>
|
||||
<string name="content_description_otp_information">معلومات كلمة المرور لمرة واحدة</string>
|
||||
<string name="content_description_otp_information">معلومات كلمة السر لمرة واحدة</string>
|
||||
<string name="membership">العضوية</string>
|
||||
<string name="name">الاسم</string>
|
||||
<string name="email">البريد الإلكتروني</string>
|
||||
<string name="email_address">عنوان البريد الإلكتروني</string>
|
||||
<string name="ssid">SSID</string>
|
||||
<string name="debit_credit_card">بطاقة السحب الفوري / الإئتمان</string>
|
||||
<string name="error_registration_read_only">لا يمكن حفظ عنصر في قاعدة بيانات مفتوحة للقراءة فقط</string>
|
||||
<string name="error_registration_read_only">لا يمكن حفظ عنصر في قاعدة بيانات مفتوحة للقراءة فقط.</string>
|
||||
<string name="otp_secret">الرمز السري</string>
|
||||
<string name="place_of_issue">مكان المشكلة</string>
|
||||
<string name="date_of_issue">تاريخ المشكلة</string>
|
||||
@@ -452,8 +451,8 @@
|
||||
<string name="properties">الخصائص</string>
|
||||
<string name="token">الرمز</string>
|
||||
<string name="seed">البذرة</string>
|
||||
<string name="error_database_uri_null">يتعذر استرداد مسار قاعدة البيانات.</string>
|
||||
<string name="error_rebuild_list">يتعذر إعادة بناء القائمة بشكل صحيح.</string>
|
||||
<string name="error_database_uri_null">لا يمكن استرداد URI قاعدة البيانات.</string>
|
||||
<string name="error_rebuild_list">تعذر إعادة بناء القائمة بشكل صحيح.</string>
|
||||
<string name="menu_keystore_remove_key">احذف رمز فك القفل الجهاز</string>
|
||||
<string name="menu_form_filling_settings">ملء النموذج</string>
|
||||
<string name="menu_reload_database">أعد تحميل البيانات</string>
|
||||
@@ -463,8 +462,8 @@
|
||||
<string name="import_app_properties_summary">اختر ملفًا لاستيراد إعدادات التطبيق</string>
|
||||
<string name="export_app_properties_title">صدّر إعدادات التطبيق</string>
|
||||
<string name="export_app_properties_summary">أنشئ ملفًا لتصدير إعدادات التطبيق</string>
|
||||
<string name="error_import_app_properties">خطأ أثناء استيراد إعدادات التطبيق</string>
|
||||
<string name="error_export_app_properties">خطأ أثناء تصدير إعدادات التطبيق</string>
|
||||
<string name="error_import_app_properties">خطأ أثناء استيراد إعدادات التطبيق.</string>
|
||||
<string name="error_export_app_properties">خطأ أثناء تصدير إعدادات التطبيق.</string>
|
||||
<string name="warning_database_info_changed">غُيِّرت معلومات قاعدة البيانات من خارج هذا التطبيق.</string>
|
||||
<string name="warning_database_info_changed_options">ادمج البيانات أو استبدل التعديلات الخارجية بحفظ قاعدة البيانات أو أعد تحميلها لجلب آخر التغييرات.</string>
|
||||
<string name="credential_before_click_advanced_unlock_button">اكتب كلمة السر، وأنقر هذا الزر.</string>
|
||||
@@ -482,7 +481,7 @@
|
||||
<string name="autofill_ask_to_save_data_title">اسأل لحفظ البيانات</string>
|
||||
<string name="content_description_database_color">لون قاعدة البيانات</string>
|
||||
<string name="menu_merge_from">ادمج من…</string>
|
||||
<string name="show_uuid_summary">يعرض \"المعرف العام\" المرتبط بمُدخل او بمجموعة</string>
|
||||
<string name="show_uuid_summary">يعرض UUID المرتبط بمدخل أو بمجموعة</string>
|
||||
<string name="expired">انتهت</string>
|
||||
<string name="tags">الوسوم</string>
|
||||
<string name="menu_merge_database">ادمج البيانات</string>
|
||||
@@ -491,10 +490,10 @@
|
||||
<string name="warning_file_too_big">يفترض بقاعدة البيانات أن تحوي ملفات صغيرة الحجم ( كمفاتيح PGP).
|
||||
\n
|
||||
\nبرفع هذا الملف قد يزداد حجم قاعدة البيانات ويضعف أداءها.</string>
|
||||
<string name="error_move_group_here">يتعذر نقل المجموعة إلى هنا.</string>
|
||||
<string name="error_move_group_here">لا يمكنك نقل مجموعة هنا.</string>
|
||||
<string name="menu_save_copy_to">احفظ نسخة إلى…</string>
|
||||
<string name="searchable">يمكن البحث عنه</string>
|
||||
<string name="custom_data">بيانات مخصصة</string>
|
||||
<string name="custom_data">بيانات مخصّصة</string>
|
||||
<string name="case_sensitive">حساسة لحالة الأحرف</string>
|
||||
<string name="regex">تعابير نمطية</string>
|
||||
<string name="enable_keep_screen_on_title">أبقِ الشاشة شغّالة</string>
|
||||
@@ -512,18 +511,18 @@
|
||||
<string name="templates_group_uuid_title">مجموعة القوالب</string>
|
||||
<string name="advanced_unlock_timeout">انتهت مهلة فتح الجهاز</string>
|
||||
<string name="temp_advanced_unlock_timeout_summary">مهلة استخدام فتح الجهاز قبل حذف محتواها</string>
|
||||
<string name="advanced_unlock_delete_all_key_warning">أتريد حذف كل مفاتيح التشفير المرتبطة بفتح الجهاز؟</string>
|
||||
<string name="advanced_unlock_delete_all_key_warning">أتريد حذف كل مفاتيح التعمية المرتبطة بفتح الجهاز؟</string>
|
||||
<string name="templates">القوالب</string>
|
||||
<string name="templates_group_enable_title">استخدام القوالب</string>
|
||||
<string name="notification">الإشعارات</string>
|
||||
<string name="temp_advanced_unlock_enable_summary">لا تقم بتخزين أي محتوى مشفر لاستخدام إلغاء قفل الجهاز</string>
|
||||
<string name="temp_advanced_unlock_timeout_title">انتهاء صلاحية فتح الحهاز</string>
|
||||
<string name="hide_expired_entries_title">إخفاء الإدخالات منتهية الصلاحية</string>
|
||||
<string name="content_description_hardware_key_checkbox">خانة إختيار مفتاح الجهاز</string>
|
||||
<string name="hide_expired_entries_title">أخفِ المدخلات منتهية الصلاحية</string>
|
||||
<string name="content_description_hardware_key_checkbox">خانة إختيار مفتاح العتاد</string>
|
||||
<string name="content_description_passphrase_word_count">عدد عبارات المرور</string>
|
||||
<string name="content_description_entry_background_color">لون خلفية المدخل</string>
|
||||
<string name="passphrase">عبارة المرور</string>
|
||||
<string name="colorize_password_title">تلوين كلمات المرور</string>
|
||||
<string name="passphrase">عبارة السر</string>
|
||||
<string name="colorize_password_title">لوّن كلمات السر</string>
|
||||
<string name="permission">الإذن</string>
|
||||
<string name="advanced_unlock_prompt_not_initialized">تعذر تهيئة موجه إلغاء قفل الجهاز.</string>
|
||||
<string name="biometric_security_update_required">مطلوب تحديث أمان المقاييس الحيوية.</string>
|
||||
@@ -536,12 +535,12 @@
|
||||
\nاستخدم طريقة ملء النموذج التي تفضلها.</string>
|
||||
<string name="html_text_dev_feature_work_hard">نحن نعمل بجد لإصدار هذه الميزة بسرعة.</string>
|
||||
<string name="autofill_inline_suggestions_summary">حاول عرض اقتراحات الملء التلقائي مباشرة من لوحة مفاتيح متوافقة</string>
|
||||
<string name="delete_entered_password_summary">يحذف كلمة المرور التي تم إدخالها بعد محاولة الاتصال بقاعدة البيانات</string>
|
||||
<string name="delete_entered_password_summary">يحذف كلمة السر التي أُدخلت بعد محاولة الاتصال بقاعدة البيانات</string>
|
||||
<string name="education_lock_summary">اقفل قاعدةبياناتك بسرعة، يمكنك إعداد التطبيق لقفلها بعد فترة، وعند إيقاف تشغيل الشاشة.</string>
|
||||
<string name="education_sort_title">فرز العنصر</string>
|
||||
<string name="contribute">ساهِم</string>
|
||||
<string name="upload_attachment">رفع %1$s</string>
|
||||
<string name="download_canceled">ألغيت!</string>
|
||||
<string name="upload_attachment">ارفع %1$s</string>
|
||||
<string name="download_canceled">أُلغِيَ!</string>
|
||||
<string name="unit_kibibyte">كيلو بايت</string>
|
||||
<string name="unit_mebibyte">ميغا بايت</string>
|
||||
<string name="unit_gibibyte">جيجابت</string>
|
||||
@@ -557,7 +556,7 @@
|
||||
<string name="title_case">حالة العنوان</string>
|
||||
<string name="character_count">عدد الأحرف: %1$d</string>
|
||||
<string name="style_choose_summary">السمة المستخدمة في التطبيق</string>
|
||||
<string name="show_entry_colors_summary">يعرض ألوان المقدمة والخلفية لإدخال</string>
|
||||
<string name="show_entry_colors_summary">يعرض ألوان المقدمة والخلفية للمدخل</string>
|
||||
<string name="icon_pack_choose_summary">حزمة الأيقونات المستخدمة في التطبيق</string>
|
||||
<string name="show_entry_colors_title">ألوان الدخول</string>
|
||||
<string name="device_credential_unlock_enable_title">فتح بيانات اعتماد الجهاز</string>
|
||||
@@ -574,15 +573,15 @@
|
||||
<string name="keyboard_previous_fill_in_summary">العودة تلقائيًا إلى لوحة المفاتيح السابقة بعد تنفيذ \"إجراء المفتاح التلقائي\"</string>
|
||||
<string name="download_attachment">تثبيت %1$s</string>
|
||||
<string name="html_about_privacy"><strong> لا يتم استرداد أي بيانات مستخدم</strong>، هذا التطبيق لا يتصل بأي خادم، ويعمل محليًا فقط ويحترم خصوصية المستخدمين تمامًا.</string>
|
||||
<string name="error_cancel_by_user">ألغى المستخدم.</string>
|
||||
<string name="show_otp_token_title">إظهار رمز \"الاقتران لمرة واحدة\" OTP</string>
|
||||
<string name="show_otp_token_summary">إظهار رموز\"الاقتران لمرة واحدة\" في قائمة المدخلات</string>
|
||||
<string name="error_cancel_by_user">أُلغِيَ بواسطة المستخدم.</string>
|
||||
<string name="show_otp_token_title">أظهر رمز OTP</string>
|
||||
<string name="show_otp_token_summary">يعرض رموز OTP في قائمة المدخلات</string>
|
||||
<string name="warning_database_already_opened">قاعدة البيانات مفتوحة بالفعل، أغلقها أولاً لفتح قاعدة البيانات الجديدة</string>
|
||||
<string name="warning_database_info_reloaded">ستؤدي إعادة تحميل قاعدة البيانات إلى حذف البيانات المعدلة محليًا.</string>
|
||||
<string name="templates_group_enable_summary">استخدم القوالب الديناميكية لملء حقول الإدخال</string>
|
||||
<string name="templates_group_enable_summary">استخدم القوالب الديناميكية لملء حقول المدخل</string>
|
||||
<string name="keyboard_auto_go_action_summary">إجراء مفتاح \"Go\" بعد الضغط على مفتاح \"Field\"</string>
|
||||
<string name="allow_no_password_summary">يسمح بالنقر فوق الزر \"فتح\" إذا لم يتم تحديد بيانات اعتماد</string>
|
||||
<string name="education_generate_password_summary">أنشئ كلمة مرور قوية لربطها بإدخالك، وحددها بسهولة وفقًا لمعايير النموذج ولا تنس كلمة المرور الآمنة.</string>
|
||||
<string name="education_generate_password_summary">أنشئ كلمة سر قوية لربطها بإدخالك، وحددها بسهولة وفقًا لمعايير النموذج ولا تنسَ كلمة السر الآمنة.</string>
|
||||
<string name="education_setup_OTP_title">قم بإعداد OTP</string>
|
||||
<string name="style_brightness_title">سطوع السمة</string>
|
||||
<string name="word_separator">الفاصل</string>
|
||||
@@ -597,43 +596,43 @@
|
||||
<string name="kdf_explanation">لإنشاء مفتاح خوارزمية التشفير، يتحول المفتاح الرئيسي باستخدام وظيفة اشتقاق مفتاح مملح عشوائيًا.</string>
|
||||
<string name="html_text_dev_feature_buy_pro">بشراء الإصدار <strong> pro </strong>،</string>
|
||||
<string name="auto_type">كتابة تلقائيًا</string>
|
||||
<string name="hardware_key">مفتاح الجهاز</string>
|
||||
<string name="hardware_key">مفتاح العتاد</string>
|
||||
<string name="advanced_unlock_prompt_store_credential_title">رابط لفتح الجهاز</string>
|
||||
<string name="backspace">فراغ للخلف</string>
|
||||
<string name="enter">دخول</string>
|
||||
<string name="education_sort_summary">اختر كيفية فرز الإدخالات والمجموعات.</string>
|
||||
<string name="education_sort_summary">اختر كيفية فرز المدخلات والمجموعات.</string>
|
||||
<string name="html_text_feature_generosity">هذا <strong> النمط المرئي</strong> متاح بفضل كرمك.</string>
|
||||
<string name="info">المعلومات</string>
|
||||
<string name="waiting_challenge_response">في انتظار استجابة التحدي…</string>
|
||||
<string name="bank_identifier_code">SWIFT / BIC</string>
|
||||
<string name="international_bank_account_number">IBAN</string>
|
||||
<string name="error_no_hardware_key">حدد مفتاح الجهاز.</string>
|
||||
<string name="colorize_password_summary">تلوين أحرف كلمة المرور حسب النوع</string>
|
||||
<string name="enable_keep_screen_on_summary">استمر في تشغيل الشاشة عند مشاهدة إدخال أو تعديله</string>
|
||||
<string name="error_no_hardware_key">حدّد مفتاح العتاد.</string>
|
||||
<string name="colorize_password_summary">لوّن أحرف كلمة السر حسب النوع</string>
|
||||
<string name="enable_keep_screen_on_summary">استمر في تشغيل الشاشة عند مشاهدة مدخل أو تعديله</string>
|
||||
<string name="enable_screenshot_mode_title">وضع لقطة الشاشة</string>
|
||||
<string name="navigation_drawer_open">درج التنقل مفتوح</string>
|
||||
<string name="waiting_challenge_request">في انتظار طلب التحدي…</string>
|
||||
<string name="navigation_drawer_close">درج التنقل مقفول</string>
|
||||
<string name="error_XML_malformed">XML تالف.</string>
|
||||
<string name="error_otp_type">لم يتم التعرف على نوع OTP الحالي من خلال هذا النموذج، وقد لا يؤدي التحقق من صحته إلى إنشاء الرمز المميز بشكل صحيح.</string>
|
||||
<string name="error_challenge_already_requested">التحدي مطلوب بالفعل</string>
|
||||
<string name="error_challenge_already_requested">التحدي طُلَب بالفعل.</string>
|
||||
<string name="error_response_already_provided">تقدم الرد بالفعل.</string>
|
||||
<string name="error_no_response_from_challenge">غير قادر على الحصول على رد من التحدي.</string>
|
||||
<string name="error_driver_required">مطلوب تعريف لـ%1$s.</string>
|
||||
<string name="error_unable_merge_database_kdb">تعذر الدمج من قاعدة بيانات V1.</string>
|
||||
<string name="error_unable_merge_database_kdb">غير قادر على الدمج مع ملف قاعدة بيانات kdb.</string>
|
||||
<string name="error_location_unknown">موقع قاعدة البيانات غير معروف، لا يمكن تنفيذ إجراء قاعدة البيانات.</string>
|
||||
<string name="menu_advanced_unlock_settings_summary">القياس الحيوي، بيانات اعتماد الجهاز</string>
|
||||
<string name="menu_database_settings_summary">البيانات الوصفية، سلة المحذوفات، القوالب، التاريخ</string>
|
||||
<string name="menu_security_settings_summary">التشفير، وظيفة اشتقاق المفتاح</string>
|
||||
<string name="error_hardware_key_unsupported">مفتاح الجهاز غير مدعوم.</string>
|
||||
<string name="error_hardware_key_unsupported">مفتاح العتاد غير مدعوم.</string>
|
||||
<string name="master_key_settings_summary">التغيير والتجديد</string>
|
||||
<string name="error_empty_key">لا يمكن أن يكون المفتاح فارغًا.</string>
|
||||
<string name="corrupted_file">ملف تالف.</string>
|
||||
<string name="warning_keyfile_integrity">لا يتم ضمان تجزئة الملف لأن Android يمكنه تغيير بياناته بسرعة. قم بتغيير امتداد الملف إلى bin. من أجل التكامل الصحيح.</string>
|
||||
<string name="invalid_db_same_uuid">%1$s بنفس UUID %2$s موجود بالفعل.</string>
|
||||
<string name="remember_hardware_key_title">تذكر مفاتيح الأجهزة</string>
|
||||
<string name="remember_hardware_key_title">تذكر مفاتيح العتاد</string>
|
||||
<string name="warning_exact_alarm">لم تسمح للتطبيق باستخدام منبه دقيق. نتيجة لذلك، لن يتم تنفيذ الميزات التي تتطلب مؤقتًا في وقت محدد.</string>
|
||||
<string name="remember_hardware_key_summary">يتتبع مفاتيح الأجهزة المستخدمة</string>
|
||||
<string name="remember_hardware_key_summary">يتتبع مفاتيح العتاد المستخدمة</string>
|
||||
<string name="warning_database_notification_permission">يسمح لك إذن الإشعار بعرض حالة قاعدة البيانات وقفلها باستخدام زر يسهل الوصول إليه.
|
||||
\n
|
||||
\nإذا لم تنشط هذا الإذن، فلن تكون قاعدة البيانات المفتوحة في الخلفية مرئية إذا كان هناك تطبيق آخر في المقدمة.</string>
|
||||
@@ -646,7 +645,7 @@
|
||||
<string name="advanced_unlock_prompt_extract_credential_message">استخراج بيانات اعتماد قاعدة البيانات مع بيانات فتح الجهاز</string>
|
||||
<string name="ask">إسأل</string>
|
||||
<string name="configure_biometric">لم تسجل بيانات اعتماد المقاييس الحيوية أو الجهاز.</string>
|
||||
<string name="show_uuid_title">إظهار \"المعرف العام المميز\" UUID</string>
|
||||
<string name="show_uuid_title">أظهر \"المعرّف العام المميز\" UUID</string>
|
||||
<string name="unlock_and_link_biometric">رابط فتح الجهاز</string>
|
||||
<string name="advanced_unlock_invalid_key">لا يمكن قراءة مفتاح فتح الجهاز. يرجى حذفه وتكرار إجراء التعرف على الفتح.</string>
|
||||
<string name="advanced_unlock_scanning_error">خطأ في فتح الجهاز: %1$s</string>
|
||||
@@ -660,15 +659,14 @@
|
||||
<string name="advanced_unlock_keystore_warning">ستقوم هذه الميزة بتخزين بيانات الاعتماد المشفرة في KeyStore الآمن بجهازك.
|
||||
\n
|
||||
\nاعتمادًا على تطبيق API الأصلي لنظام التشغيل، قد لا يعمل بكامل طاقته.
|
||||
\nتحقق من توافق وأمن KeyStore مع الشركة المصنعة لجهازك ومنشئ ROM الذي تستخدمه.</string>
|
||||
<string name="keyboard_selection_entry_summary">عند عرض إدخال في KeePassDX، عبئ Magikeyboard بهذا الإدخال</string>
|
||||
<string name="enable_screenshot_mode_summary">اسمح لتطبيقات الطرف الثالث بتسجيل أو التقاط لقطات شاشة للتطبيق</string>
|
||||
<string name="keyboard_save_search_info_summary">حاول حفظ المعلومات المشتركة عند إجراء اختيار إدخال يدوي لاستخدامات مستقبلية أسهل</string>
|
||||
<string name="education_entry_edit_summary">تحرير الإدخال الخاص بك مع الحقول المخصصة. يمكن الرجوع إلى بيانات التجمع بين حقول الإدخال المختلفة.</string>
|
||||
<string name="education_validate_entry_title">تحقق من صحة الإدخال</string>
|
||||
<string name="education_validate_entry_summary">تذكر التحقق من صحة الإدخال الخاص بك وحفظ قاعدة البيانات الخاصة بك.
|
||||
\n
|
||||
\nإذا تم تنشيط القفل التلقائي ونسيت أنك تجري تعديلاً، فإنك تخاطر بفقدان بياناتك.</string>
|
||||
\nتحقق من توافق وأمن KeyStore مع الشركة المصنعة لجهازك ومنشئ ROM الذي تستخدمه.</string>
|
||||
<string name="keyboard_selection_entry_summary">عند عرض مدخل في KeePassDX، عبئ Magikeyboard بهذا المدخل</string>
|
||||
<string name="enable_screenshot_mode_summary">اسمح لتطبيقات الطرف الثالث بتسجيل أو التقاط لقطات شاشة للتطبيق</string>
|
||||
<string name="keyboard_save_search_info_summary">حاول حفظ المعلومات المشتركة عند إجراء اختيار مدخل يدوي لاستخدامات مستقبلية أسهل</string>
|
||||
<string name="education_entry_edit_summary">عدّل إدخالك مع الحقول المخصّصة. يمكن الرجوع إلى بيانات التجمع بين حقول مدخل المختلفة.</string>
|
||||
<string name="education_validate_entry_title">تحقق من صحة المدخل</string>
|
||||
<string name="education_validate_entry_summary">تذكر التحقق من صحة إدخالك وحفظ قاعدة بياناتك. \n \nإذا القفل التلقائي مُنشّط ونسيت أنك تجري تعديلاً، فإنك تخاطر بفقدان بياناتك.</string>
|
||||
<string name="education_entry_new_field_summary">قم بتسجيل حقل إضافي، أضف قيمة وقم بحمايته بشكل اختياري.</string>
|
||||
<string name="education_unlock_summary">أدخل كلمة المرور و/أو ملف المفتاح لفتح قاعدة بياناتك.
|
||||
\n
|
||||
@@ -681,6 +679,25 @@
|
||||
<string name="download_initialization">جارِ التهيئة…</string>
|
||||
<string name="download_progression">قيد التقدم: %1$d%%</string>
|
||||
<string name="html_text_buy_pro">بشراء الإصدار الاحترافي، ستتمتع بإمكانية الوصول إلى هذا <strong> النمط المرئي</strong> وستساعد بشكل خاص في <strong> تنفيذ مشروعات المجتمع. </strong></string>
|
||||
<string name="html_text_donation">من أجل الحفاظ على حريتنا ولكي نكون نشيطين دائمًا، فإننا نعتمد على <strong> مساهمتك.</strong></string>
|
||||
<string name="html_text_donation">من خلال <strong>المساهمة</strong> في المشروع <i>(مالياً أو برمجياً أو ترجمة)</i>، ستساعده على الاستمرار في الحياة والازدهار، وستكون مؤهلاً أيضاً لإجراء فتح <strong>السمة</strong>.</string>
|
||||
<string name="html_text_dev_feature_encourage">أنت تشجع المطورين على إنشاء <strong> ميزات جديدة</strong> و <strong> إصلاح الخلل</strong> وفقًا لملاحظاتك.</string>
|
||||
</resources>
|
||||
<string name="style_name_forest">غابة</string>
|
||||
<string name="style_name_simple">بسيط</string>
|
||||
<string name="style_name_moon">قمر</string>
|
||||
<string name="style_name_divine">إلهي</string>
|
||||
<string name="style_name_classic">كلاسيكي</string>
|
||||
<string name="style_name_dark">داكن</string>
|
||||
<string name="style_name_reply">رد</string>
|
||||
<string name="warning_database_info_changed_options_read_only">أعِد تحميل قاعدة البيانات بأحدث التغييرات.</string>
|
||||
<string name="style_name_sun">شمس</string>
|
||||
<string name="style_name_kunzite">الكونزيت</string>
|
||||
<string name="style_name_follow_system">اتبع النظام</string>
|
||||
<string name="style_name_light">فاتح</string>
|
||||
<string name="hide_templates_summary">لا يتم عرض القوالب</string>
|
||||
<string name="generate_keyfile">ولّد ملف مفتاح</string>
|
||||
<string name="nodes">العُقد</string>
|
||||
<string name="recursive_number_entries_title">عدد متكرر من المدخلات</string>
|
||||
<string name="recursive_number_entries_summary">يحسب بشكل متكرر عدد المدخلات في المجموعة</string>
|
||||
<string name="warning_large_keyfile">لا يُنصح بإضافة ملف مفتاحي كبير، فقد يؤدي هذا إلى منع فتح قاعدة البيانات.</string>
|
||||
<string name="hide_templates_title">أخفِ القوالب</string>
|
||||
</resources>
|
||||
|
||||
662
app/src/main/res/values-az/strings.xml
Normal file
662
app/src/main/res/values-az/strings.xml
Normal file
@@ -0,0 +1,662 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="info">Məlumat</string>
|
||||
<string name="contact">Əlaqə</string>
|
||||
<string name="homepage">Ana səhifə</string>
|
||||
<string name="add_entry">Şifrə əlavə et</string>
|
||||
<string name="edit_entry">Şifrəyə düzəliş et</string>
|
||||
<string name="add_group">Qrup əlavə et</string>
|
||||
<string name="key_derivation_function">Açar yaratma funksiyası</string>
|
||||
<string name="app_timeout">Taym-aut</string>
|
||||
<string name="app_timeout_summary">Məlumat bazasını kilidləmədən öncəki boşluq müddəti</string>
|
||||
<string name="application">Tətbiq</string>
|
||||
<string name="brackets">Mötərizə</string>
|
||||
<string name="extended_ASCII">Artırılmış ASCII</string>
|
||||
<string name="allow">İcazə ver</string>
|
||||
<string name="clipboard_cleared">Mübadilə buferi təmizləndi</string>
|
||||
<string name="clipboard_error_title">Mübadilə buferi xətası</string>
|
||||
<string name="clipboard_timeout">Mübadilə buferinin taym-aut (boşda qalma) müddəti</string>
|
||||
<string name="clipboard_timeout_summary">Mübadilə buferində məlumatların saxlanma müddəti (əgər cihazınız dəstəkləyirsə)</string>
|
||||
<string name="content_description_background">Arxaplan</string>
|
||||
<string name="content_description_open_file">Faylı aç</string>
|
||||
<string name="content_description_add_entry">Qeyd əlavə et</string>
|
||||
<string name="content_description_add_group">Qrup əlavə et</string>
|
||||
<string name="content_description_add_item">Fayl əlavə et</string>
|
||||
<string name="content_description_file_information">Fayl məlumatları</string>
|
||||
<string name="content_description_credentials_information">Şəxsiyyəti təsdiq edən məlumatlar</string>
|
||||
<string name="content_description_otp_information">Birdəfəlik şifrə məlumatları</string>
|
||||
<string name="content_description_keyfile_checkbox">Açar fayl təsdiqi</string>
|
||||
<string name="content_description_hardware_key_checkbox">Aparat-təchizat açarının təsdiqi</string>
|
||||
<string name="content_description_entry_icon">Şifrə ikonu</string>
|
||||
<string name="content_description_database_color">Məlumat bazasının rəngi</string>
|
||||
<string name="discard_changes">Dəyişiklikləri ləğv et?</string>
|
||||
<string name="entry_password_generator">Şifrə generatoru</string>
|
||||
<string name="content_description_password_length">Şifrə uzunluğu</string>
|
||||
<string name="entry_add_attachment">Qoşma əlavə et</string>
|
||||
<string name="select_to_copy">%1$sfaylını mübadilə buferinə köçürmək üçün seçin</string>
|
||||
<string name="retrieving_db_key">Məlumat bazası açarı əldə edilir …</string>
|
||||
<string name="waiting_challenge_request">Doğrulama istəyi gözlənilir …</string>
|
||||
<string name="waiting_challenge_response">Doğrulama cavabı gözlənilir …</string>
|
||||
<string name="database">Məlumat bazası</string>
|
||||
<string name="template_group_name">Şablonlar</string>
|
||||
<string name="decrypting_db">Məlumat bazası məzmunun şifrəsi açılır …</string>
|
||||
<string name="digits">Rəqəmlər</string>
|
||||
<string name="default_checkbox">Standart məlumat bazası olaraq istifədə et</string>
|
||||
<string name="html_about_privacy"><strong>Heç bir istifadəçi məlumatı toplanmır</strong>, bu tətbiq heç bir serverə bağlanmır, yalnız lokal olaraq işləyir və tamamilə istidəçilərin gizliliyinə hörmət edir.</string>
|
||||
<string name="entry_accessed">Giriş edildi</string>
|
||||
<string name="entry_cancel">Ləğv et</string>
|
||||
<string name="entry_notes">Qeydlər</string>
|
||||
<string name="entry_confpassword">Şifrəni təsdiq et</string>
|
||||
<string name="entry_UUID">UUID (Qlobal Unikal İdentifikator)</string>
|
||||
<string name="entry_history">Tarixçə</string>
|
||||
<string name="entry_attachments">Qoşmalar</string>
|
||||
<string name="entry_keyfile">Açar fayl</string>
|
||||
<string name="hardware_key">Aparat-təchizat açarı</string>
|
||||
<string name="entry_modified">Modifikasiya edilmiş</string>
|
||||
<string name="searchable">Axtarıla bilən</string>
|
||||
<string name="error_pass_match">Şifrələr uyğun deyil.</string>
|
||||
<string name="error_string_key">Hər bir sıranın bir adı olmalıdır.</string>
|
||||
<string name="error_label_exists">Bu etiket artıq mövcuddur.</string>
|
||||
<string name="error_wrong_length">\"Uzunluq\" sahəsinə müsbət bir rəqəm yazın.</string>
|
||||
<string name="error_autofill_enable_service">\"Avtomatik doldurma\" xidmətini aktiv etmək mümkün olmadı.</string>
|
||||
<string name="error_move_group_here">Qrupu buraya köçürə bilməzsiniz.</string>
|
||||
<string name="error_copy_group_here">Qrupu buraya nüsxələyə bilməzsiniz.</string>
|
||||
<string name="error_create_database">Məlumat bazası yaratmaq mümkün deyil.</string>
|
||||
<string name="error_create_database_file">Bu şifrə və açar faylı ilə məlumat bazası yaratmaq mümkün deyil.</string>
|
||||
<string name="error_otp_counter">Sayğac %1$dvə%2$d aralığında olmalıdır.</string>
|
||||
<string name="error_otp_period">Dövr %1$dvə%2$d saniyə aralığında olmalıdır.</string>
|
||||
<string name="contribution">İanə</string>
|
||||
<string name="feedback">Rəy</string>
|
||||
<string name="about_description">Keepass şifrə menecerinin android tətbiqi</string>
|
||||
<string name="accept">Qəbul et</string>
|
||||
<string name="master_key">Ana şifrə</string>
|
||||
<string name="security">Təhlükəsizlik</string>
|
||||
<string name="encryption">Şifrələmə</string>
|
||||
<string name="encryption_algorithm">Şifrələmə alqortiması</string>
|
||||
<string name="clipboard_error">Bəzi cihazlar mübadilə buferindən istifadə etməyə icazə verməyəcək.</string>
|
||||
<string name="clipboard_error_clear">Mübadilə buferi təmizlənmədi</string>
|
||||
<string name="content_description_password_checkbox">Şifrə təsdiqi</string>
|
||||
<string name="expired">Müddəti bitdi</string>
|
||||
<string name="content_description_entry_foreground_color">Şifrənin ön plan rəngi</string>
|
||||
<string name="content_description_entry_background_color">Şifrənin arxa plan rəngi</string>
|
||||
<string name="validate">Doğrula</string>
|
||||
<string name="discard">Ləğv et</string>
|
||||
<string name="content_description_passphrase_word_count">Şifrədəki söz sayısı</string>
|
||||
<string name="content_description_update_from_list">Yenilə</string>
|
||||
<string name="content_description_remove_from_list">Sil</string>
|
||||
<string name="html_about_contribution"><strong>Müstəqilliyimiz qorumaq</strong>, <strong>xətaları düzəltmək</strong>,<strong>yeni funskiyalar əlavə etmək</strong> və <strong>hər zaman aktiv olmaq</strong>üçün<strong>sizin </strong>dəstəyinizə etibar edirik.</string>
|
||||
<string name="entry_created">Yaradıldı</string>
|
||||
<string name="entry_expires">İstifadə müddəti biti</string>
|
||||
<string name="tags">Etiketlər</string>
|
||||
<string name="entry_password">Şifrə</string>
|
||||
<string name="error_disallow_no_credentials">Ən azından bir ədəd şəxsiyyəti təyin edən məlumat təyin edilməlidir.</string>
|
||||
<string name="error_pass_gen_type">Ən azından bir ədəd şifrə generatoru növü seçilməlidir.</string>
|
||||
<string name="error_rounds_too_large">\"Transformasiya mərhələləri\" çox yüksəkdir. 2147483648-ə təyin edin.</string>
|
||||
<string name="error_save_database">Malumat bazasını yadda saxlamaq mümkün olmadı.</string>
|
||||
<string name="error_otp_secret_key">Məxfi söz Base32 formatında olmalıdır.</string>
|
||||
<string name="error_challenge_already_requested">Doğrulama artıq istənilib.</string>
|
||||
<string name="error_response_already_provided">Artıq cavab verilib.</string>
|
||||
<string name="error_location_unknown">Məlumat bazasının yeri məlum deyil, məlumat bazası funksiyası yerinə yetirilə bilməz.</string>
|
||||
<string name="error_empty_key">Açar bölməsi boş saxlanıla bilməz.</string>
|
||||
<string name="field_name">Sahə adı</string>
|
||||
<string name="field_value">Sahə dəyəri</string>
|
||||
<string name="file_not_found_content">Fayl tapılmadı. Onu fayl menecerində yenidən açmağı yoxlayın.</string>
|
||||
<string name="corrupted_file">Zədələnmiş fayl.</string>
|
||||
<string name="hint_conf_pass">Şifrəni təsdiq et</string>
|
||||
<string name="hint_generated_password">Yaradılmış şifrə</string>
|
||||
<string name="hint_group_name">Qrup adı</string>
|
||||
<string name="hint_icon_name">İkona adı</string>
|
||||
<string name="hint_keyfile">Açar faylı</string>
|
||||
<string name="passphrase">Şifrəli cümlə</string>
|
||||
<string name="error_driver_required">%1$s üçün drayver lazımdır.</string>
|
||||
<string name="error_cancel_by_user">İstifadəçi tərəfindən ləğv edildi.</string>
|
||||
<string name="hint_length">Uzunluq</string>
|
||||
<string name="error_hardware_key_unsupported">Aparat-təchizat açarı dəstəklənmir.</string>
|
||||
<string name="generate_password">Şifrə yarat</string>
|
||||
<string name="password">Şifrə</string>
|
||||
<string name="file_browser">Fayl meneceri</string>
|
||||
<string name="hint_pass">Şifrə</string>
|
||||
<string name="show_uuid_title">UUID-ni göstər</string>
|
||||
<string name="show_uuid_summary">Şifrə və ya şifrə qrupuna bağlı UUID-ni göstər</string>
|
||||
<string name="list_groups_show_number_entries_summary">Qrupdaki şifrələrin sayını göstər</string>
|
||||
<string name="list_size_title">Listdəki faylların həcmi</string>
|
||||
<string name="list_size_summary">Element listindəki mətnin ölçüsü</string>
|
||||
<string name="creating_database">Məlumat bazası yaradılır …</string>
|
||||
<string name="loading_database">Məlumat bazası yüklənir …</string>
|
||||
<string name="lowercase">Kiçik hərf</string>
|
||||
<string name="about">Haqqında</string>
|
||||
<string name="menu_change_key_settings">Ana açarı dəyişdir</string>
|
||||
<string name="copy_field">%1$s nüsxələndi</string>
|
||||
<string name="menu_form_filling_settings">Forum doldurma</string>
|
||||
<string name="menu_form_filling_settings_summary">Klaviatura, avtomatik douldurma, mübadilə buferi</string>
|
||||
<string name="menu_advanced_unlock_settings">Cihaz kilidini aç</string>
|
||||
<string name="menu_advanced_unlock_settings_summary">Biometrik, cihaz şəxsiyyətini təyin edən məlumatlar</string>
|
||||
<string name="menu_security_settings_summary">Şifrələmə, açar yaratma funskiyası</string>
|
||||
<string name="menu_master_key_settings">Ana açar parametrləri</string>
|
||||
<string name="settings">Parametrlər</string>
|
||||
<string name="menu_app_settings">Tətbiq parametrləri</string>
|
||||
<string name="menu_app_settings_summary">Axtar, kilidlə, tarixçə, xüsusiyyətlər</string>
|
||||
<string name="menu_database_settings">Məlumat bazası parametrləri</string>
|
||||
<string name="menu_database_settings_summary">Meta məlumatlar, zibil qutusu, şablonlar, tarixçə</string>
|
||||
<string name="menu_security_settings">Təhlükəsizlik parametrləri</string>
|
||||
<string name="menu_paste">Mubadilə buferindən əlavə et</string>
|
||||
<string name="menu_delete">Sil</string>
|
||||
<string name="menu_cancel">Ləğv et</string>
|
||||
<string name="menu_hide_password">Şifrəni gizlət</string>
|
||||
<string name="menu_lock">Məlumat bazasını kilidlə</string>
|
||||
<string name="menu_save_database">Məlumatları yadda saxla</string>
|
||||
<string name="menu_merge_database">Məlumatları birləşdir</string>
|
||||
<string name="menu_reload_database">Məlumatları yenidən yüklə</string>
|
||||
<string name="menu_merge_from">... -dan birləşdir</string>
|
||||
<string name="menu_save_copy_to">Bir nüsxəsini burada ... yadda saxla</string>
|
||||
<string name="menu_open">Aç</string>
|
||||
<string name="menu_search">Axtar</string>
|
||||
<string name="menu_showpass">Şifrəni göstər</string>
|
||||
<string name="menu_donate">İanə et</string>
|
||||
<string name="master_key_settings_summary">Dəyişiklik, yenilənmə</string>
|
||||
<string name="menu_edit">Düzəliş et</string>
|
||||
<string name="menu_copy">Nüsxələ</string>
|
||||
<string name="menu_move">Köçür</string>
|
||||
<string name="remember_hardware_key_title">Aparat-təchizat açarlarını xatırla</string>
|
||||
<string name="remember_keyfile_locations_title">Açar faylın yerini xatırla</string>
|
||||
<string name="remember_keyfile_locations_summary">Açar faylların saxlanıldığı yeri unutma</string>
|
||||
<string name="show_recent_files_title">Ən son faylları göstər</string>
|
||||
<string name="hide_broken_locations_title">Zədələnmiş məlumat bazası linklərini gizlət</string>
|
||||
<string name="show_recent_files_summary">Ən son məlumat bazalarının yerini göstər</string>
|
||||
<string name="export_app_properties_title">Tətbiqin parametrlərini ixrac et</string>
|
||||
<string name="export_app_properties_summary">Tətbiqin parametrlərini ixrac etmək üçün bir fayl yaradın</string>
|
||||
<string name="description_app_properties">Tətbiq parametrlərini idarə etmək üçün KeePassDX xüsusiyyətləri</string>
|
||||
<string name="success_import_app_properties">Tətbiqin parametrləri idxal edildi</string>
|
||||
<string name="success_export_app_properties">Tətbiqin parametrləri ixrac edildi</string>
|
||||
<string name="encryption_explanation">Bütün malumatlar üçün istifadə olunan məlumat bazası şifrələmə alqoritması</string>
|
||||
<string name="do_not_kill_app">Tətbiqi bağlamayın …</string>
|
||||
<string name="space">Boşluq</string>
|
||||
<string name="filter">Filter</string>
|
||||
<string name="sort_ascending">Öncə ən aşağı</string>
|
||||
<string name="sort_groups_before">Öncə qruplar</string>
|
||||
<string name="sort_recycle_bin_bottom">Aşağıdakı zibil qutusu</string>
|
||||
<string name="sort_db">Təbii sıralama</string>
|
||||
<string name="sort_title">Başlıq</string>
|
||||
<string name="sort_creation_time">Yaradılma</string>
|
||||
<string name="sort_last_modify_time">Dəyişiklik</string>
|
||||
<string name="search">Axtar</string>
|
||||
<string name="underline">Altdan xətt</string>
|
||||
<string name="uppercase">Böyük hərf</string>
|
||||
<string name="warning">Xəbərdarlıq</string>
|
||||
<string name="error_import_app_properties">Tətbiqin parametrlərinin idxalı zamanı xəta baş verdi.</string>
|
||||
<string name="error_export_app_properties">Tətbiqin parametrləri idxal edilən zaman xəta baş verdi.</string>
|
||||
<string name="root">Kök</string>
|
||||
<string name="sort_menu">Çeşidlə</string>
|
||||
<string name="sort_username">İstifadəçi adı</string>
|
||||
<string name="sort_last_access_time">Giriş</string>
|
||||
<string name="special">Özəl</string>
|
||||
<string name="unsupported_db_version">Dəstəklənməyən məlumat bazas versiyası.</string>
|
||||
<string name="merge_success">Birləşdirmə uğurla tamamlandı</string>
|
||||
<string name="warning_copy_permission">Mübadilə buferi bildiriş funksiyası üçün bildiriş icazəsinə ehtiyyac var.</string>
|
||||
<string name="later">Sonra</string>
|
||||
<string name="ask">Soruş</string>
|
||||
<string name="configure">Kofiqurasiya et</string>
|
||||
<string name="keystore_not_accessible">Açar ehtiyyatı düzgün formada başladılmadı.</string>
|
||||
<string name="advanced_unlock_prompt_store_credential_title">Cihaz kilidini açma linki</string>
|
||||
<string name="database_history">Tarixçə</string>
|
||||
<string name="advanced_unlock_scanning_error">Cihaz kilidini açma xətası: %1$s</string>
|
||||
<string name="warning_database_info_reloaded">Məlumat bazasını yenidən yükləmək lokal olaraq modifikasiya olunmuş faylları siləcəkdir.</string>
|
||||
<string name="warning_database_revoked">Fayla giriş fayl meneceri tərəfindən ləğv edildi, məlumat bazasını bağlayın və onu olduğu yerdən yenidən açın.</string>
|
||||
<string name="warning_exact_alarm">Siz tətəbiqin zəngli saatdan istifadə etməsinə icazə verməmisiniz. Nəticədə, taymer tələb edən funksiyalar dəqiq bir zamanda işləməyəckdir.</string>
|
||||
<string name="warning_keyfile_integrity">Android, məlumatlarını anında dəyişdirə biləcəyindən faylın heşi qaranti edilməyib. Doğru bütünlük üçün fayl əlavəsini .bin olaraq dəyişin.</string>
|
||||
<string name="permission">İcazə</string>
|
||||
<string name="version_label">Versiya %1$s</string>
|
||||
<string name="build_label">Nüvə%1$s</string>
|
||||
<string name="configure_biometric">Biometrik və ya cihaz şəxsiyyəti ilə doğrulama məlumatları tapılmadı.</string>
|
||||
<string name="biometric_security_update_required">Biometrik təhlükəsizlik yenilənməsi lazımdır.</string>
|
||||
<string name="unlock_and_link_biometric">Cihaz kilid açma linki</string>
|
||||
<string name="advanced_unlock_prompt_extract_credential_title">Cihaz kilidini tanıma</string>
|
||||
<string name="encrypted_value_stored">Şifrələnmiş şifrə ehtiyyata alındı</string>
|
||||
<string name="advanced_unlock_not_recognized">Cihaz kilidini açmaq üçün barmaq izi tanınmadı</string>
|
||||
<string name="unavailable">Mövcud deyil</string>
|
||||
<string name="credential_before_click_advanced_unlock_button">Şifrəni yazın və sonra bu düyməyə basın.</string>
|
||||
<string name="properties">Xüsusiyyətlər</string>
|
||||
<string name="menu_appearance_settings">Görünüş</string>
|
||||
<string name="menu_appearance_settings_summary">Tema, rəng və atributlar</string>
|
||||
<string name="biometric">Biometriya</string>
|
||||
<string name="device_credential">Cihazın şəxsiyyətini təsdiq edən məlumatları</string>
|
||||
<string name="general">Ümumi</string>
|
||||
<string name="autofill">Avtomatik doldurma</string>
|
||||
<string name="autofill_service_name">KeePassDX avtomatik doldurma formu</string>
|
||||
<string name="autofill_sign_in_prompt">KeePassDX ile giriş edin</string>
|
||||
<string name="education_entry_new_field_title">Xüsusi bölmələr əlavə edin</string>
|
||||
<string name="education_add_attachment_title">Qoşma əlavə edin</string>
|
||||
<string name="advanced_unlock_explanation_summary">Məlumat bazasını daha asan açmaq üçün cihazın kilid açma funksiyasından istifadə edin</string>
|
||||
<string name="device_credential_unlock_enable_summary">Məlumat bazasını açmaq üçün cihaz şəxsiyyət məlumatlarından istifadə etməyə imkan verir</string>
|
||||
<string name="education_add_attachment_summary">Önəmli xarici məlumatları yadda saxlamaq üçün şifrənizə (qeyd) qoşma əlavə edin.</string>
|
||||
<string name="temp_advanced_unlock_enable_title">Müvəqqəti kilid açma</string>
|
||||
<string name="temp_advanced_unlock_timeout_title">Cihazın kilid açma müddəti bitdi</string>
|
||||
<string name="unavailable_feature_version">Bu cihazda Andoird %1$s versiyası var, lakin %2$svə ya daha sonrakı versiya lazımdır.</string>
|
||||
<string name="path">Yol</string>
|
||||
<string name="unavailable_feature_hardware">Lazımi aparat-təchizat tapılmadı.</string>
|
||||
<string name="max_history_size_title">Maksimum həcm</string>
|
||||
<string name="templates_group_uuid_title">Şablonlar qrupu</string>
|
||||
<string name="max_history_items_title">Maskimum sayı</string>
|
||||
<string name="max_history_size_summary">Hər şifrəyə görə tarixçə həcmini limitlə</string>
|
||||
<string name="settings_database_recommend_changing_master_key_summary">Ana açarın dəyişdirilməsini tövsiyə et (gün)</string>
|
||||
<string name="settings_database_force_changing_master_key_title">Yeniləməyə məcbur et</string>
|
||||
<string name="settings_database_force_changing_master_key_next_time_title">Bir sonrakı səfərə yeniləməyə məcbur et</string>
|
||||
<string name="settings_database_force_changing_master_key_summary">Ana açarın dəyişdirilməsini tələb et (gün)</string>
|
||||
<string name="settings_database_force_changing_master_key_next_time_summary">Bir sonrakı səfərə ana açarın dəyişdirilməsini tələb et (tək səfərlik)</string>
|
||||
<string name="keyboard_notification_entry_summary">Şifrə mövcud olanda bildirişi göstər</string>
|
||||
<string name="keyboard_notification_entry_content_text">%1$s</string>
|
||||
<string name="keyboard_appearance_category">Görünüş</string>
|
||||
<string name="keyboard_theme_title">Klaviatura teması</string>
|
||||
<string name="keyboard_change">Klaviaturanı dəyişdir</string>
|
||||
<string name="keyboard_keys_category">Açarlar</string>
|
||||
<string name="keyboard_key_sound_title">Düyməyə toxunulduğunda səs çıxart</string>
|
||||
<string name="education_unlock_summary">Məlumat bazanızın şifrəsini açmaq üçün şifrə və\\və ya açar faylı daxil edin.\n\nMəlumat bazası faylını hər dəfə dəyişəndən sonra etibarlı bir yerdə ehtiyat üçün nüsxələyin.</string>
|
||||
<string name="biometric_unlock_enable_title">Biometrik kilid açma</string>
|
||||
<string name="biometric_unlock_enable_summary">Məlumat bazasını açmaq üçün biometrikləri skan etməyə imkan verir</string>
|
||||
<string name="device_credential_unlock_enable_title">Cihaz şəxsiyyət məlumatları ilə kilid açma</string>
|
||||
<string name="biometric_auto_open_prompt_title">Avtomatik açma istəyi</string>
|
||||
<string name="biometric_auto_open_prompt_summary">Məlumat bazası ondan istifadə ediləcək şəkildə quraşdırılıbsa, cihaz kilidini avtomatik olaraq tələb et</string>
|
||||
<string name="temp_advanced_unlock_enable_summary">Cihaz kilidini açmaq üçün hər hansısa şifrələnmiş məzmunu saxlamayın</string>
|
||||
<string name="biometric_delete_all_key_title">Şifrələnmiş açarları silin</string>
|
||||
<string name="unavailable_feature_text">Bu funksiya işləmədi.</string>
|
||||
<string name="file_name">Fayl adı</string>
|
||||
<string name="assign_master_key">Ana açar təyin edin</string>
|
||||
<string name="data">Məlumat</string>
|
||||
<string name="database_data_compression_title">Məlumat sıxışdırma</string>
|
||||
<string name="database_data_compression_summary">Məlumat sıxışdırma məlumat bazasının həcmini azaldır</string>
|
||||
<string name="database_data_remove_unlinked_attachments_title">Əlaqəsiz məlumatları sil</string>
|
||||
<string name="recycle_bin_title">Zibil qutusu istifadəsi</string>
|
||||
<string name="recycle_bin_summary">Qrup və qeydləri (şifrə) silməzdən öncə \"Zibil qutusuna\" köçür</string>
|
||||
<string name="recycle_bin_group_title">Zibil qutusu qrupu</string>
|
||||
<string name="templates_group_enable_title">Şablonlardan istifadə</string>
|
||||
<string name="templates_group_enable_summary">Şifrə məlumatlarındakı xanaları doldurmaq üçün dinamik şablonlardan istifadə edin</string>
|
||||
<string name="settings_database_recommend_changing_master_key_title">Yeniləməyi tövsiyə et</string>
|
||||
<string name="allow_copy_password_summary">Şifrələrin və qorunan məlumatların mübadilə buferinə nüsxələnməsinə icazə ver</string>
|
||||
<string name="allow_copy_password_warning">Xəbərdarlıq: Mübadilə buferi bütün tətbiqlər tərəfindən istifadə olunur. Əgər həssas məlumatlar nüsxələnibsə, digər tətbiqlər onu bərpa edə bilər.</string>
|
||||
<string name="enable">Aktiv et</string>
|
||||
<string name="disable">Deaktiv et</string>
|
||||
<string name="notification">Bildiriş</string>
|
||||
<string name="clear_clipboard_notification_title">Tətbiqi bağlayarkən sil</string>
|
||||
<string name="database_name_title">Məlumat bazasının adı</string>
|
||||
<string name="database_description_title">Məlumat bazasının açıqlaması</string>
|
||||
<string name="database_default_username_title">Standart (susmaya görə) istifadəçi adı</string>
|
||||
<string name="database_custom_color_title">Xüsusi məlumat bazası rəngi</string>
|
||||
<string name="database_version_title">Məlumat bazası versiyası</string>
|
||||
<string name="text_appearance">Mətn</string>
|
||||
<string name="application_appearance">İnterfeys</string>
|
||||
<string name="other">Digər</string>
|
||||
<string name="compression">Sıxışdırma</string>
|
||||
<string name="compression_none">Heç biri</string>
|
||||
<string name="compression_gzip">Gzip</string>
|
||||
<string name="recycle_bin">Zibil qutusu</string>
|
||||
<string name="templates">Şablonlar</string>
|
||||
<string name="keyboard">Klaviatura</string>
|
||||
<string name="magic_keyboard_title">Magikeyboard</string>
|
||||
<string name="device_keyboard_setting_title">Cihaz klaviatura parametrləri</string>
|
||||
<string name="keyboard_name">Magikeyboard</string>
|
||||
<string name="keyboard_label">Magikeyboard (KeePassDX)</string>
|
||||
<string name="keyboard_setting_label">Magikeyboard parametrləri</string>
|
||||
<string name="keyboard_entry_category">Şifrə</string>
|
||||
<string name="keyboard_selection_entry_title">Şifrə seçimi</string>
|
||||
<string name="keyboard_notification_entry_title">Bildiriş məlumatı</string>
|
||||
<string name="keyboard_save_search_info_title">Paylaşılan məlumatları yadda saxla</string>
|
||||
<string name="keyboard_notification_entry_clear_close_title">Tətbiqi bağlayarkən təmizlə</string>
|
||||
<string name="keyboard_notification_entry_clear_close_summary">Bildirişi bağlayarkən məlumat bazasını bağla</string>
|
||||
<string name="keyboard_entry_timeout_title">Taymaut</string>
|
||||
<string name="keyboard_notification_entry_content_title_text">Şifrə</string>
|
||||
<string name="keyboard_notification_entry_content_title">%1$s Magikeyboard-da istifadə edilə bilər</string>
|
||||
<string name="keyboard_key_vibrate_title">Düyməyə toxunulduğunda titrət</string>
|
||||
<string name="education_setup_OTP_title">Birdəfəlik şifrə (OTP) təyin edin</string>
|
||||
<string name="education_unlock_title">Məlaumat bazasının şifrəsini açın</string>
|
||||
<string name="education_read_only_title">Məlumat bazasını dəyişiklik edilməsinə qarşı qoruyun</string>
|
||||
<string name="education_field_copy_title">Bölməni (sahəni) nüsxələyin</string>
|
||||
<string name="education_field_copy_summary">Nüsxələnmiş bölmələr (sahələr) istənilən yerə nüsxələnə bilər.\n\nÜntünlük verdiyiniz form doldurma metodunu seçin.</string>
|
||||
<string name="education_lock_title">Məlumat bazasını kilidləyin</string>
|
||||
<string name="html_text_donation">Azadlığımızı qorumaq və daima aktiv olmağınız üçün sizin <strong>yardımınıza güvənirik.</strong></string>
|
||||
<string name="html_text_feature_generosity">Bu <strong>görünüş stili</strong>sizin əliaçıqlığınız sayəsində mövuddur.</string>
|
||||
<string name="html_text_dev_feature">Bu xüsusiyyət <strong>hazırlıq mərhələsindədir</strong> və tezliklə <strong>istifadə verilməsi üçün sizin <strong>yardımınıza ehtiyyacı var.</string>
|
||||
<string name="html_text_dev_feature_encourage">tərtibatçıları <strong>yeni funksiyalar əlavə etməyə</strong>və <strong>sizin rəylərinizə əsasən </strong>xətaları düzəltməyə həvəsləndirirsiniz.</string>
|
||||
<string name="contribute">Yardım et</string>
|
||||
<string name="unit_kibibyte">KiB</string>
|
||||
<string name="unit_mebibyte">MiB</string>
|
||||
<string name="unit_gibibyte">GiB</string>
|
||||
<string name="style_name_simple">Sadə</string>
|
||||
<string name="save">Yadda saxla</string>
|
||||
<string name="number">Nömrə</string>
|
||||
<string name="card_verification_value">CVV</string>
|
||||
<string name="personal_identification_number">PİN</string>
|
||||
<string name="international_bank_account_number">İBAN</string>
|
||||
<string name="standard">Standart</string>
|
||||
<string name="warning_sure_add_file">Hər bir halda fayl əlavə edilsinmi?</string>
|
||||
<string name="warning_remove_unlinked_attachment">Əlaqəsiz məlumatların silinməsi məlumat bazanızın həcmini azalda bilər, lakin KeePass modulları üçün olan məlumatları da silə bilər.</string>
|
||||
<string name="warning_sure_remove_data">Hər bir halda bu məlumatlar silinsinmi?</string>
|
||||
<string name="warning_empty_keyfile">Boş bir açar faylı əlavə etmək məsləhət görülmür.</string>
|
||||
<string name="warning_empty_keyfile_explanation">Açar faylın məzmunu heç vaxt dəyişdirilə bilinməməlidir və ən yaxşı halda təsadüfi yaradılmış məlumatlardan ibarət olmalıdır.</string>
|
||||
<string name="warning_database_info_changed">Məlumat bazası faylınızda olan informasiya tətbiq xaricində dəyişdirilib.</string>
|
||||
<string name="warning_database_info_changed_options_read_only">Ən son dəyişikliklərlə məlumat bazasını yenidən yükləyin.</string>
|
||||
<string name="warning_database_notification_permission">Bildiriş icazəsi, məlumat bazasının statusunu göstərməyə və onu əlçatan bir düymə ilə kilidləməyə imkan verir.\n\nƏgər icazəni aktivləşdirməsəniz arxa planda açıq olan məlumat bazası, ön planda başqa bir tətbiq varkən görünməyəcəkdir.</string>
|
||||
<string name="warning_database_info_changed_options">Məlumatları birləşdirin, məlumat bazasını yadda saxlayaraq xarici dəyişikliklərin üzərinə yazın və ya ən son dəyişikliklər ilə onu yenidən yükləyin.</string>
|
||||
<string name="clipboard">Mübadilə buferi</string>
|
||||
<string name="clipboard_explanation_summary">Cihazınızın mübadilə buferindən istifadə edərək şifrə sahələrini (bölmələrini) nüsxələyin</string>
|
||||
<string name="clipboard_notifications_title">Mübadilə buferi bildirişləri</string>
|
||||
<string name="clipboard_notifications_summary">Şifrəni göstərərkən sahələri (bölmə) nüsxələmək üçün mübadilə buferi bildirişlərini göstər</string>
|
||||
<string name="clipboard_warning">Əgər mübadilə buferinin avtomatik silinməsi uğursuz olarsa, onun tarixçəsini əllə silin.</string>
|
||||
<string name="html_text_ad_free">Digər bir çox şifrə menecerlerindən fərqli olaraq, bu tətbiq <strong>reklamsız</strong>,<strong>azad lisenziyaya sahibdir</strong> və hansı versiyanı istifadə etdiyinizdən asılı olmayaraq, şəxsi məlumatlarınızı öz serverlərində toplamır.</string>
|
||||
<string name="advanced_unlock_keystore_warning">Bu xüsusiyyət, şifrələnən şəxsiyyəti təsdiq edən məlumatları cihazın təhlükəsiz açar bazasında saxlayacaqdır.\n\nƏməliyyat sisteminin yerli APİ-nin tətbiqindən asılı olaraq, tam olaraq funksional olmaya bilər.\n\nCihazın istehsalçısı və istifadə etdiyiniz ROM-un tərtibatçısı ilə açar bazasının uyğunluğu və təhlükəsizliyini yoxlayın.</string>
|
||||
<string name="autofill_inline_suggestions_title">Cümlə daxili təkliflər</string>
|
||||
<string name="autofill_inline_suggestions_summary">Birbaşa uyğun olan klaviaturadan avtomatik doldurma təkliflərini göstərməyə çalış</string>
|
||||
<string name="autofill_manual_selection_title">Əllə seçim</string>
|
||||
<string name="autofill_manual_selection_summary">İstifadəçiyə məlumat bazası şifrəsini seçməyə imkan verən seçimi göstər</string>
|
||||
<string name="autofill_save_search_info_title">Axtarış məlumatlarını yadda saxla</string>
|
||||
<string name="autofill_inline_suggestions_keyboard">Avtomatik doldurma təklifləri əlavə edildi.</string>
|
||||
<string name="allow_no_password_title">Ana açar olmamasına icazə ver</string>
|
||||
<string name="enable_read_only_summary">Məlumat bazasını standart olaraq yazma-qorumalı (dəyişməz) aç</string>
|
||||
<string name="enable_auto_save_database_title">Məlumat bazasını avtomatik olaraq yadda saxla</string>
|
||||
<string name="reset_education_screens_summary">Bütün təlim məlumatlarını yenidən göstər</string>
|
||||
<string name="reset_education_screens_text">Təlim ipuclarını sıfırlamaq</string>
|
||||
<string name="education_new_node_title">Məlumat bazanıza məlumatlar (fayl) əlavə edin</string>
|
||||
<string name="education_search_summary">Şifrələrinizi geri əldə etmək üçün başlıq, istifadəçi adı və ya digər sahələrin (bölmə) məzmununu daxil et.</string>
|
||||
<string name="education_entry_edit_title">Şifrəyə düzəliş edin</string>
|
||||
<string name="education_generate_password_summary">Şifrənizlə əlaqələndirmək üçün güclü bir şifrə yaradın, anketin kriteriyalarına görə onu asanlıqla müəyyənlşdirin və güvənli şifrəni unutmayın.</string>
|
||||
<string name="education_generate_password_title">Güclü şifrə yaradın</string>
|
||||
<string name="keyboard_previous_lock_title">Məlumat bazasını kilidlə</string>
|
||||
<string name="file_manager_install_description">Məlumat bazası fayllarını yaratmaq, açmaq və yadda saxlamaq üçün ACTION_CREATE_DOCUMENT və ACTION_OPEN_DOCUMENT funksiyalarını həyata keçirə bilən bir fayl meneceri tələb olunur.</string>
|
||||
<string name="content_description_node_children">Şəbəkə nöqtəsinin alt kateqoriyası</string>
|
||||
<string name="content_description_add_node">Şəbəkə nöqtəsi əlavə edin</string>
|
||||
<string name="content_description_repeat_toggle_password_visibility">Şifrənin görünüb-görünməməsinin dəyişdirilməsini təkrarlayın</string>
|
||||
<string name="content_description_nav_header">Naviqasiya başlığı</string>
|
||||
<string name="navigation_drawer_open">Naviqasiya panelini aç</string>
|
||||
<string name="navigation_drawer_close">Naviqasiya panelini bağla</string>
|
||||
<string name="entry_add_field">Sahə (bölmə) əlavə et</string>
|
||||
<string name="content_description_remove_field">Sahəni (bölməni) sil</string>
|
||||
<string name="content_description_keyboard_close_fields">Sahələri (bölmələri) bağla</string>
|
||||
<string name="html_about_licence">KeePassDX©%1$dKunzisoft<strong>açıq mənbəlidir və</strong>və<strong>ondan heç bir reklam yoxdur</strong>.\n<strong>GPLv3</strong>lisenziyasına sahibdir, hər hansısa bir qarantiyası yoxdur.</string>
|
||||
<string name="inherited">İdxal et</string>
|
||||
<string name="auto_type">Avtomatik yazma</string>
|
||||
<string name="auto_type_sequence">Avtomatik yazma sırası</string>
|
||||
<string name="entry_not_found">Şifrə məlumatları tapılmadı.</string>
|
||||
<string name="custom_data">Özəl məlumat</string>
|
||||
<string name="entry_title">Başlıq</string>
|
||||
<string name="entry_setup_otp">Tək səfərlik şifrə təyin et</string>
|
||||
<string name="otp_type">OTP növü</string>
|
||||
<string name="otp_secret">Sirr</string>
|
||||
<string name="otp_period">Müddət (saniyə)</string>
|
||||
<string name="otp_counter">Sayğac</string>
|
||||
<string name="otp_digits">Rəqəmlər</string>
|
||||
<string name="search_filters">Axtarış filterləri</string>
|
||||
<string name="otp_algorithm">Alqoritma</string>
|
||||
<string name="current_group">Hazırki qrup</string>
|
||||
<string name="regex">Müntəzəm ifadə</string>
|
||||
<string name="debit_credit_card">Debet / Kredit Kartı</string>
|
||||
<string name="holder">Sahib</string>
|
||||
<string name="id_card">Səxsiyyət Vəsiqəsi</string>
|
||||
<string name="name">Ad</string>
|
||||
<string name="place_of_issue">Verildiyi yer</string>
|
||||
<string name="date_of_issue">Verildiyi tarix</string>
|
||||
<string name="email">Elektron poçt</string>
|
||||
<string name="email_address">Elektron poçt adresi</string>
|
||||
<string name="wireless">Wi-Fi</string>
|
||||
<string name="ssid">SSİD</string>
|
||||
<string name="type">Növ</string>
|
||||
<string name="cryptocurrency">Kripto valyuta pul kisəsi</string>
|
||||
<string name="token">Jeton</string>
|
||||
<string name="private_key">Şəxsi açar</string>
|
||||
<string name="public_key">Ortaq açar</string>
|
||||
<string name="seed">Başlanğıc</string>
|
||||
<string name="account">Hesab</string>
|
||||
<string name="bank">Bank</string>
|
||||
<string name="bank_name">Bank adı</string>
|
||||
<string name="bank_identifier_code">SWIFT / BIC</string>
|
||||
<string name="secure_note">Təhlükəsizlik Qeydi</string>
|
||||
<string name="membership">Üzvlük</string>
|
||||
<string name="template">Şablon</string>
|
||||
<string name="version">Versiya</string>
|
||||
<string name="entry_otp">OTP</string>
|
||||
<string name="entry_url">URL</string>
|
||||
<string name="entry_user_name">İstifadəçi adı</string>
|
||||
<string name="error_arc4">Arcfour axın şifrəsi dəstəklənmir.</string>
|
||||
<string name="error_file_not_create">Faylı yaratmaq mümkün olmadə.</string>
|
||||
<string name="error_can_not_handle_uri">Bu URİ-nin KeePassDX-də istifadəsi mümkün olmadı.</string>
|
||||
<string name="case_sensitive">Böyük/kiçik hərf həssaslığı</string>
|
||||
<string name="error_invalid_db">Məlumat bazasını oxumaq mümkün olmadı.</string>
|
||||
<string name="error_invalid_path">Fayl yolunun doğru olduğundan əmin olun.</string>
|
||||
<string name="error_invalid_OTP">Etibarsız gizli OTP.</string>
|
||||
<string name="error_no_name">Ad daxil edin.</string>
|
||||
<string name="error_word_reserved">Bu söz rezerv edilib və istifadəsi mümkün deyil.</string>
|
||||
<string name="error_nokeyfile">Açar faylı seçin.</string>
|
||||
<string name="error_no_hardware_key">Aparat-təchizat açarı seçin.</string>
|
||||
<string name="error_out_of_memory">Bütün məlumat bazanızı yükləyəcək qədər yaddaşda yer yoxdur.</string>
|
||||
<string name="error_XML_malformed">XML xətalı formalaşıb.</string>
|
||||
<string name="error_load_database">Məlumat bazasını yükləmək mümkün olmadı.</string>
|
||||
<string name="error_load_database_KDF_memory">Açarı yükləmək mümkün olmadı. KDF \"Yaddaş İstifadəsini\" azaltmağa çalışın.</string>
|
||||
<string name="error_move_entry_here">Bu şifrəni buraya köçürə bilməzsiniz.</string>
|
||||
<string name="error_copy_entry_here">Bu şifrəni buraya nüsxələyə bilməzsiniz.</string>
|
||||
<string name="error_otp_digits">Jeton %1$d ilə %2$d arası rəqəmlərdən ibarət olmalıdır.</string>
|
||||
<string name="error_otp_type">Mövcud OTP növü bu form tərəfindən tanınmır, onun doğrulaması artıq düzgün şəkildə jeton yaratmaya bilər.</string>
|
||||
<string name="error_string_type">Bu mətn istənilən məlumat (fayl) ilə uyğunlaşmır.</string>
|
||||
<string name="error_registration_read_only">Dəyişməz (yalnız oxuna bilən) məlumat bazasında yeni bir məlumatın yadda saxlanılmasına icazə verilmir.</string>
|
||||
<string name="error_field_name_already_exists">Sahə (bölmə) adı artıq mövcuddur.</string>
|
||||
<string name="error_database_uri_null">Mləlumat bazası URİ-sini geri qaytarmaq olmur.</string>
|
||||
<string name="error_rebuild_list">Listi düzgün şəkildə yenidən hazırlamaq mümkün deyil.</string>
|
||||
<string name="error_file_to_big">Qarşıya yükləməyə çalışdığınız faylın həcmi çox böyükdür.</string>
|
||||
<string name="error_duplicate_file">Fayl məlumatları artıq mövcuddur.</string>
|
||||
<string name="error_upload_file">Fayl məlumatları qarşıya yüklənərkən xəta baş verdi.</string>
|
||||
<string name="error_remove_file">Fayl məlumatlarını silərkən xəta baş verdi.</string>
|
||||
<string name="error_start_database_action">Məlumat bazasında prosses həyata keçirilərkən xəta baş verdi.</string>
|
||||
<string name="error_no_response_from_challenge">Doğrulama istəyindən cavab almaq mümkün deyil.</string>
|
||||
<string name="error_unable_merge_database_kdb">kdb məlumat bazası faylı ilə birləşdirmə etmək mümkün deyil.</string>
|
||||
<string name="invalid_credentials">Şəxsiyyəti təsdiq edən məlumatları oxumaq mümkün olmadı.</string>
|
||||
<string name="invalid_algorithm">Yanlış alqoritma.</string>
|
||||
<string name="invalid_db_same_uuid">%1$s eyni UUİD dəyərinə sahib %2$s artıq mövcuddur.</string>
|
||||
<string name="invalid_db_sig">Məlumat bazasının formatını tanımaq mümkün olmadı.</string>
|
||||
<string name="keyfile_is_empty">Açar faylı boşdur.</string>
|
||||
<string name="length">Uzunluq</string>
|
||||
<string name="hide_password_title">Şifrələri gizlət</string>
|
||||
<string name="hide_password_summary">Şifrələri standart olaraq (***) ilə maskala</string>
|
||||
<string name="colorize_password_title">Şifrələri rəngləndir</string>
|
||||
<string name="colorize_password_summary">Şifrə hərflərini (simvollarını) növə görə rəngləndir</string>
|
||||
<string name="list_entries_show_username_title">İstifadəçi adlarını göstər</string>
|
||||
<string name="list_entries_show_username_summary">Şifrə siyahılarında olan istifadəçi adlarını göstər</string>
|
||||
<string name="list_groups_show_number_entries_title">Şifrələrin sayını göstər</string>
|
||||
<string name="show_otp_token_title">OTP Jetononu göstər</string>
|
||||
<string name="show_otp_token_summary">Şifrələrin siyahısında OTP jetonlarını göstər</string>
|
||||
<string name="menu_keystore_remove_key">Cihaz kilid açma açarını sil</string>
|
||||
<string name="menu_url">URL-ni aç</string>
|
||||
<string name="menu_file_selection_read_only">Yazma qoruması</string>
|
||||
<string name="menu_open_file_read_and_write">Modifikasiya edilə bilən</string>
|
||||
<string name="menu_empty_recycle_bin">Zibil qutusunu boşalt</string>
|
||||
<string name="menu_restore_entry_history">Tarixçəni bərpa et</string>
|
||||
<string name="menu_delete_entry_history">Tarixçəni sil</string>
|
||||
<string name="menu_external_icon">Xarici ikona</string>
|
||||
<string name="minus">Mənfi</string>
|
||||
<string name="never">Heç vaxt</string>
|
||||
<string name="no_results">Axtarılan nəticə tapılmadı</string>
|
||||
<string name="no_url_handler">Bu URL-ni açmaq üçün bir veb brauzer quraşdır.</string>
|
||||
<string name="select_database_file">Mövcud kassanı aç</string>
|
||||
<string name="create_keepass_file">Yeni kassa yarat</string>
|
||||
<string name="auto_focus_search_title">Sürətli axtarış</string>
|
||||
<string name="auto_focus_search_summary">Məlumat bazasını açarkən axtarış tələb et</string>
|
||||
<string name="subdomain_search_title">Alt domendə axtarış</string>
|
||||
<string name="subdomain_search_summary">Veb domenləri, alt domen məhdudiyyətləri ilə arxtarın</string>
|
||||
<string name="progress_create">Yeni məlumat bazası yaradılır …</string>
|
||||
<string name="progress_title">İşləyir …</string>
|
||||
<string name="protection">Qoruma</string>
|
||||
<string name="read_only">Yazma qorumalı</string>
|
||||
<string name="read_only_warning">Fayl menecerinizdən asılı olaraq, KeePassDX cihazınızın yaddaşına yazmasına icazə verilməyə bilər.</string>
|
||||
<string name="contains_duplicate_uuid">Məluamt bazasında təkrarlanan UUİD-lər mövcuddur.</string>
|
||||
<string name="contains_duplicate_uuid_procedure">Təkrarlananlar üçün yeni UUİD-lər yaradaraq problemi həll edib davam et istəyirsinizmi?</string>
|
||||
<string name="search_mode">Axtarış modu</string>
|
||||
<string name="save_mode">Yadda saxlama modu</string>
|
||||
<string name="selection_mode">Seçim modu</string>
|
||||
<string name="registration_mode">Qeydiyyat modu</string>
|
||||
<string name="remember_database_locations_title">Məlumat bazalarının yerlərini xatırlayın</string>
|
||||
<string name="remember_database_locations_summary">Məlumat bazalarının harada saxlanıldığını izlə</string>
|
||||
<string name="remember_hardware_key_summary">Aparat-təchizat açarlarının harada istifadə olunduğunu izlə</string>
|
||||
<string name="hide_broken_locations_summary">Son məlumat bazaları siyahısındakı yararsız linkləri gizlət</string>
|
||||
<string name="import_app_properties_title">Tətbiq parametrlərini idxal et</string>
|
||||
<string name="import_app_properties_summary">Tətbiq parametrlərini idxal etmək üçün fayl seçin</string>
|
||||
<string name="rounds">Transformasiya turları</string>
|
||||
<string name="rounds_explanation">Əlavə şifrələmə turları, brute force hücumlarına qarşı yüksək qoruma təmin edər, lakin yükləmə və yadda saxlama prossesini ciddi şəkildə yavaşladır.</string>
|
||||
<string name="memory_usage">Yaddaş istifadəsi</string>
|
||||
<string name="memory_usage_explanation">Açar yaratma funksiyası tərəfindən istifadə ediləcək yaddaşın miqdarı.</string>
|
||||
<string name="parallelism">Paralellik</string>
|
||||
<string name="kdf_explanation">Şifrələmə alqoritmasının açarını hazırlamaq üçün ana açar, təsadüfi açar yaratma funksiyasından istifadə edilərək çevrilir.</string>
|
||||
<string name="parallelism_explanation">Açar yaratma funksiyası tərəfindən istifadə edilən paralellik dərəcəsi (yəni thread-lərin sayı).</string>
|
||||
<string name="saving_database">Məlumat bazası yadda saxlanılır …</string>
|
||||
<string name="command_execution">Əmr yerinə yetirilir …</string>
|
||||
<string name="warning_no_encryption_key">Şifrələmə açarı olmadan davam edilsinmi?</string>
|
||||
<string name="warning_permanently_delete_nodes">Seçilmiş şəbəkə nöqtələri qalıcı olaraq silinsinmi?</string>
|
||||
<string name="warning_empty_recycle_bin">Zibil qutusundakı bütün şəbəkə nöqtələri qalıcı olaraq silinsinmi?</string>
|
||||
<string name="warning_file_too_big">KeePassDX məlumat bazası sadəcə kiçik köməkçi faylları (PGP açar faylları kimi) ehtiva edə bilər.\n\nMəlumat bazanızın bu yükləməylə həcmi çox arta və performansı aşağı düşə bilər.</string>
|
||||
<string name="warning_replace_file">Bu faylın yüklənməsi mövcud olanı əvəzləyəcəkdir.</string>
|
||||
<string name="warning_password_encoding">Məlumat bazası faylındakı mətn kodlama formatından xaric şifrə hərflərindən (simvol) istifadə etməkdən yayının (tanınmayan hərflər (simvollar) eyni hərfə çevrilir).</string>
|
||||
<string name="warning_database_read_only">Məlumat bazasındakı dəyişiklikləri yadda saxlamaq üçün faylların yazılmasına icazə verin</string>
|
||||
<string name="warning_database_link_revoked">Fayla giriş icazəsi fayl meneceri tərəfindən rədd edildi</string>
|
||||
<string name="warning_database_already_opened">Məlumat bazası artıq açıqdır, yenisi açmaq üçün öncə onu bağlayın</string>
|
||||
<string name="warning_empty_password">Şifrə qoruması olmadan davam edilsinmi?</string>
|
||||
<string name="advanced_unlock_prompt_store_credential_message">Cihazın kilid açma funksiyasından istifadə etsəniz belə, kassanın əsas şəxsiyyət təyin etmə məlumatlarını yenə də xatırlamaq lazımdır.</string>
|
||||
<string name="advanced_unlock_prompt_extract_credential_message">Cihazın kilid açma funksiyası ilə məlumat bazasının şəxsiyyətini tədiq edən məlumatlarını əldə edin</string>
|
||||
<string name="advanced_unlock_invalid_key">Cihazın kilid açma açarı oxunmadı. Zəhmət olmazsa, onu silin və kilid açma prossesini təkrarlayın.</string>
|
||||
<string name="advanced_unlock_prompt_not_initialized">Cihaz kilid açma istəyini başlatmaq mümkün deyil.</string>
|
||||
<string name="autofill_explanation_summary">Digər tətbiqlərdə formları (anket) daha sürətli doldurmaq üçün avtomatik doldurma funksiyasını aktiv edin</string>
|
||||
<string name="autofill_select_entry">Şifrə seç .…</string>
|
||||
<string name="set_autofill_service_title">Standart avtomatik doldurma xidmətini təyin edin</string>
|
||||
<string name="autofill_preference_title">Avtomatik doldurmanın parametrləri</string>
|
||||
<string name="password_size_title">Yaradılan şifrə həcmi</string>
|
||||
<string name="password_size_summary">Yaradılan şifrələrin standart həcmini təyin edər</string>
|
||||
<string name="list_password_generator_options_title">Şifrə hərfləri (simvolları)</string>
|
||||
<string name="list_password_generator_options_summary">İcazə verilən şifrə yaratma hərflərini (simvollarını) təyin et</string>
|
||||
<string name="database_opened">Məlumat bazası açıldı</string>
|
||||
<string name="lock">Kilid</string>
|
||||
<string name="lock_database_screen_off_title">Ekran kilidi</string>
|
||||
<string name="lock_database_screen_off_summary">Ekran söndükdən bir neçə saniyə sonra məlumat bazasının kilidləyin</string>
|
||||
<string name="lock_database_back_root_title">Kilidləmək üçün \"Geri\" düyməsinə sıxın</string>
|
||||
<string name="lock_database_back_root_summary">İstifadəçi kök ekranında geri düyməsinə klik etdikdə məlumat bazasını kilidlə</string>
|
||||
<string name="lock_database_show_button_title">Kilid düyməsini göstərin</string>
|
||||
<string name="lock_database_show_button_summary">İstifadəçi interfeysində kilid düyməsini göstərin</string>
|
||||
<string name="content">Məzmun</string>
|
||||
<string name="unlock">Kilidi aç</string>
|
||||
<string name="advanced_unlock">Cihaz kilidini aç</string>
|
||||
<string name="advanced_unlock_tap_delete">Cihaz kilid açma açarlarını silmək üçün toxunun</string>
|
||||
<string name="temp_advanced_unlock_timeout_summary">Məzmununu silmədən öncə cihazın kilidini açma istifadə müddəti</string>
|
||||
<string name="advanced_unlock_timeout">Cihaz kilidi açma taymout müddəti</string>
|
||||
<string name="biometric_delete_all_key_summary">Cihaz kilid açma tanıması ilə bağlı bütün şifrəli açarları silin</string>
|
||||
<string name="advanced_unlock_delete_all_key_warning">Cihaz kilid açma tanıması ilə bağlı bütün şifrəli açarlar silinsinmi?</string>
|
||||
<string name="database_data_remove_unlinked_attachments_summary">Məlumat bazasında olan, lakin şifrəyə bağlı olmayan qoşmaları silin</string>
|
||||
<string name="max_history_items_summary">Hər şifrə başına düşən keçmiş məlumatların (fayl) sayını limitləyin</string>
|
||||
<string name="monospace_font_fields_enable_title">Sahə (bölmə) yazı tipi</string>
|
||||
<string name="monospace_font_fields_enable_summary">Hərflərin (simvol) daha yaxşı görünməsi üçün sahələrdə (bölmə) istifadə olunan fontu dəyişdirin</string>
|
||||
<string name="allow_copy_password_title">Mübadilə buferi güvəni</string>
|
||||
<string name="clear_clipboard_notification_summary">Mübadilə buferinin istifadə müddəti bitdikdə və ya istifadə etməyə başladıqdan sonra bildiriş bağlandığında məlumat bazasını kilidləyin</string>
|
||||
<string name="magic_keyboard_explanation_summary">Şifrə və bütün şəxsiyyət məlumatlarının daxil olduğu özəl klaviaturanı aktivləşdirin</string>
|
||||
<string name="keyboard_selection_entry_summary">KeePassDX-də bir şifrəyə baxarkən, Magikeyboard-da həmin şifrəni göstər</string>
|
||||
<string name="keyboard_save_search_info_summary">Gələcəkdə daha asan istifadələr üçün əl ilə şifrə seçimi edərkən paylaşılan məlumatları yadda saxlamağa çalışın</string>
|
||||
<string name="keyboard_entry_timeout_summary">Klaviatura şifrəsini təmizləmək üçün taym-aut</string>
|
||||
<string name="keyboard_auto_go_action_title">Avtomatik düymə funksiyası (hərəkəti)</string>
|
||||
<string name="keyboard_auto_go_action_summary">\"Sahə\" düyməsinə basdıqdan sonra \"Get\" düyməsi funksiyası (hərəkəti)</string>
|
||||
<string name="keyboard_previous_database_credentials_title">Məlumat bazasının şəxsiyyətini təsdiq edən məlumatların ekranı</string>
|
||||
<string name="select_entry">Şifrə seç</string>
|
||||
<string name="backspace">Backspace (geri silmə)</string>
|
||||
<string name="enter">Enter (daxil et)</string>
|
||||
<string name="autofill_close_database_title">Məlumat bazasını bağla</string>
|
||||
<string name="autofill_close_database_summary">Avtomatik doldurma seçimindən sonra məlumat bazasını bağla</string>
|
||||
<string name="autofill_save_search_info_summary">Gələcəkdə daha asan istifadələr üçün əllə şifrə seçimi edərkən axtarış məlumatlarını yadda saxlamağa çalış</string>
|
||||
<string name="autofill_ask_to_save_data_title">Məlumatları yadda saxlamaq üçün sorğula</string>
|
||||
<string name="autofill_ask_to_save_data_summary">Anket doldurma prossesi tamamlandığında məlumatları yadda saxlamaq üçün sorğula</string>
|
||||
<string name="autofill_application_id_blocklist_title">Tətbiqin bloklama siyahısı</string>
|
||||
<string name="autofill_application_id_blocklist_summary">Tətbiqlərin avtomatik olaraq doldurulmasını əngəlləyən bloklama siyahısı</string>
|
||||
<string name="autofill_web_domain_blocklist_title">Veb domen bloklama siyahısı</string>
|
||||
<string name="autofill_web_domain_blocklist_summary">Veb domenlərin avtomatik olaraq doldurulmasını əngəlləyən bloklama siyahısı</string>
|
||||
<string name="autofill_block">Avtomatik doldurmanı blokla</string>
|
||||
<string name="autofill_block_restart">Bloklamanı aktiv etmək üçün anketin daxil olduğu tətbiqi yenidən başladın.</string>
|
||||
<string name="autofill_read_only_save">Yazma-qorumalı (dəyişməz) olaraq açılan məlumat bazasında yeni məlumatları yadda saxlamağa icazə verilmir.</string>
|
||||
<string name="allow_no_password_summary">Əgər şəxsiyyəti təsdiq edən məlumatlar seçilməyibsə, \"Aç\" düyməsinin sıxılmasına icazə ver</string>
|
||||
<string name="delete_entered_password_title">Şifrəni sil</string>
|
||||
<string name="delete_entered_password_summary">Məlumat bazasına bağlantı cəhdindən sonra daxil edilmiş şifrəni sil</string>
|
||||
<string name="enable_read_only_title">Yazma qorumalı</string>
|
||||
<string name="enable_auto_save_database_summary">Hər önəmli prossesdən sonra məlumat bazasını yadda saxla (\"Modifikasiya edilə bilən\" modda keçərlidir)</string>
|
||||
<string name="enable_keep_screen_on_title">Ekranı açıq saxla</string>
|
||||
<string name="enable_keep_screen_on_summary">Şifrəyə baxarkən və ya redaktə edərkən ekranı açıq saxla</string>
|
||||
<string name="keyboard_previous_database_credentials_summary">Məlumat bazası şəxsiyyətini təsdiq edən məlumatlar ekranında avtomatik olaraq əvvəlki klaviaturaya geri dön</string>
|
||||
<string name="keyboard_previous_search_title">Axtarış ekranı</string>
|
||||
<string name="keyboard_previous_search_summary">Axtarış ekranında avtomatik olaraq əvvəlki klaviaturaya geri dön</string>
|
||||
<string name="keyboard_previous_fill_in_title">Geri dön</string>
|
||||
<string name="keyboard_previous_fill_in_summary">\"Avtomatik funksiya düyməsi\" prossesi həyata keçirildikdən sonra avtomatik olaraq əvvəlki klaviaturaya geri dön</string>
|
||||
<string name="education_validate_entry_title">Şifrəni doğrula</string>
|
||||
<string name="education_validate_entry_summary">Şifrəni doğrulamağı və məlumat bazasını yadda saxlamağı unutmayın.\n\nƏgər avtomatik kilidləmə aktivləşərsə və dəyişiklik etdiyinizi unutsanız, məlumatlarınızı itirmə riskiniz olar.</string>
|
||||
<string name="education_entry_new_field_summary">Əlavə bir sahəni (bölmə) qeydiyyata alın, bir dəyər əlavə edin və istəyə bağlı olaraq onu qoruyun.</string>
|
||||
<string name="education_setup_OTP_summary">İki faktorlu doğrulama (2FA) üçün tələb olunan jetonu yaratmaq üçün bir dəfəlik şifrə menecerini (HOTP / TOTP) təyin edin.</string>
|
||||
<string name="education_read_only_summary">Sessiya üçün açılış modunu dəyişin.\n\n\"Yazma qoruması\" funksiyası, məlumat bazasına istənilməyən dəyişikliklərin qarşısını alır.\n\"Modifikasiya edilə bilmə\" funksiyası, istədiyiniz kimi bütün elementləri əlavə etməyinizə, silmənizə və ya dəyişdirməyinizə icazə verir.</string>
|
||||
<string name="education_lock_summary">Məlumat bazanızı cəld şəkildə kilidləyin, müəyyən müddət sonra və ekran söndükdə tətbiqin onu kilidləməsi üçün təyinatlandıra bilərsiniz.</string>
|
||||
<string name="enable_screenshot_mode_title">Ekran görüntüsü modu</string>
|
||||
<string name="enable_screenshot_mode_summary">Üçüncü tərəf tətbiqlərə bu tətbiqdə ekran görüntüsü qeyd etməyə və almağa icazə ver</string>
|
||||
<string name="enable_education_screens_title">Təlim ipucları</string>
|
||||
<string name="enable_education_screens_summary">Tətbiqin necə işlədiyini öyrənmək üçün elementləri önə çıxarın</string>
|
||||
<string name="reset_education_screens_title">Təlim ipuclarını sıfırla</string>
|
||||
<string name="education_create_database_title">Məlumat bazası faylınızı yaradın</string>
|
||||
<string name="education_create_database_summary">İlk şifrə meneceri faylınızı yaradın.</string>
|
||||
<string name="education_select_database_title">Mövcud məlumat bazasını açın</string>
|
||||
<string name="education_select_database_summary">İstifadəyə davam etmək üçün fayl brauzerinizdən əvvəlki məlumat bazası faylını açın.</string>
|
||||
<string name="education_new_node_summary">Şifrələr rəqəmsal şəxsiyyəti təsdiq edən məlumatları idarə etməyinizə kömək edir.\n\nQruplar (~qovluqlar) məlumat bazasındakı şifrələri düzəltdir.</string>
|
||||
<string name="education_search_title">Şifrələrdə axtarış edin</string>
|
||||
<string name="education_advanced_unlock_title">Cihaz maəlumat bazası kilidini açma</string>
|
||||
<string name="education_advanced_unlock_summary">Məlumat bazanızı daha sürətli açmaq üçün şifrənizi skan edilmiş biometriya və ya cihaz şəxsiyyəti təsdiq edən məlumatlarla əlaqələndirin.</string>
|
||||
<string name="education_entry_edit_summary">Şifrəyə özəl sahələrlə (bölmə) düzəliş edin. Ümumi məlumatlara müxtəlif şifrə sahələri arasında istinad edilə bilər.</string>
|
||||
<string name="education_sort_title">Məlumatları (fayl) sıralayın</string>
|
||||
<string name="education_sort_summary">Şifrə və qrupların necə sıralandığını seçin.</string>
|
||||
<string name="education_donation_title">İştirak et</string>
|
||||
<string name="education_donation_summary">Stabilliyin, təhlükəsizliyin artırılmasına və daha çox funksiyaların əlavə edilməsinə yardım edin.</string>
|
||||
<string name="html_text_buy_pro">Pro versiyasını alaraq, bu <strong>görünüş stilindən</strong>istifadə edə və xüsusilə <strong>ictimai layihələrinin həyata keçirilməsinə yardım etmiş olacaqsınız.</strong></string>
|
||||
<string name="html_text_dev_feature_buy_pro"><strong>Pro</strong>versiyasını alaraq,</string>
|
||||
<string name="html_text_dev_feature_contibute"><strong>Yardım göstərərək</strong>,</string>
|
||||
<string name="html_text_dev_feature_thanks">Yardım etdiyiniz üçün çox sağ olun.</string>
|
||||
<string name="html_text_dev_feature_work_hard">Bu funksiyası tezliklə yayımlamaq üçün çox çaılşırıq.</string>
|
||||
<string name="html_text_dev_feature_upgrade">Yeni versiyaları quraşdıraraq tətbiqi yeni saxlamağı unutmayın.</string>
|
||||
<string name="download">Yüklə</string>
|
||||
<string name="download_attachment">Yüklə%1$s</string>
|
||||
<string name="upload_attachment">%1$sYüklə</string>
|
||||
<string name="download_initialization">Başladılır …</string>
|
||||
<string name="download_progression">Davam edir:%1$d%%</string>
|
||||
<string name="download_finalization">Yekunlaşdırılır…</string>
|
||||
<string name="download_complete">Bitdi!</string>
|
||||
<string name="download_canceled">Ləğv edildi!</string>
|
||||
<string name="unit_byte">B</string>
|
||||
<string name="entropy">Entropiya:%1$s bit</string>
|
||||
<string name="entropy_high">Entropiya: Yüksək</string>
|
||||
<string name="entropy_calculate">Entropiya: Hesabla …</string>
|
||||
<string name="at_least_one_char">Hər birindən ən az bir hərf (simvol)</string>
|
||||
<string name="exclude_ambiguous_chars">Qeyri-müəyyən hərfləri (simvolları) istisna et</string>
|
||||
<string name="consider_chars_filter">Hərfləri (simvolları) nəzərə al</string>
|
||||
<string name="word_separator">Ayırıcı</string>
|
||||
<string name="ignore_chars_filter">Hərfləri (simvolları) nəzərə alma</string>
|
||||
<string name="lower_case">kiçik hərf</string>
|
||||
<string name="upper_case">BÖYÜK HƏRF</string>
|
||||
<string name="title_case">İlk hərflər böyük</string>
|
||||
<string name="character_count">Hərf (simvol) sayı:%1$d</string>
|
||||
<string name="screenshot_mode_banner_text">Ekran görüntüsü modu</string>
|
||||
<string name="style_choose_title">Tətbiq teması</string>
|
||||
<string name="style_choose_summary">Tətbiqdə istifadə olunan tema</string>
|
||||
<string name="style_name_forest">Meşə</string>
|
||||
<string name="style_name_divine">Müqəddəs</string>
|
||||
<string name="style_name_classic">Klassik</string>
|
||||
<string name="style_name_moon">Ay</string>
|
||||
<string name="style_name_sun">Günəş</string>
|
||||
<string name="style_name_reply">Cavab ver</string>
|
||||
<string name="style_name_kunzite">Kunzit</string>
|
||||
<string name="style_name_follow_system">Sistemi izle</string>
|
||||
<string name="style_brightness_title">Tema parlaqlığı</string>
|
||||
<string name="style_brightness_summary">Açıq və ya tünd temaları seç</string>
|
||||
<string name="style_name_light">Açıq</string>
|
||||
<string name="style_name_dark">Tünd</string>
|
||||
<string name="icon_section_standard">Standart</string>
|
||||
<string name="icon_section_custom">Özəl</string>
|
||||
<string name="icon_pack_choose_title">İkona paketi</string>
|
||||
<string name="icon_pack_choose_summary">Tətbiqdə istifadı edilən ikona paketi</string>
|
||||
<string name="show_entry_colors_title">Şifrə rəngləri</string>
|
||||
<string name="show_entry_colors_summary">Şifrələr üçün ön və arxa plan rənglərini göstərir</string>
|
||||
<string name="hide_expired_entries_title">İstifadə müddəti bitən, istifadə olunmayan şifrələri gizlət</string>
|
||||
<string name="hide_expired_entries_summary">İstifadə müddəti bitən şifrələr göstərilmir</string>
|
||||
<string name="keyboard_previous_lock_summary">Məlumat bazasını kilidlədikdən sonra avtomatik olaraq əvvəlki klaviaturaya geri dön</string>
|
||||
<string name="custom_fields">Özəl sahələr (bölmə)</string>
|
||||
<string name="back_to_previous_keyboard">Əvvəlki klaviaturaya geri dön</string>
|
||||
</resources>
|
||||
@@ -27,7 +27,7 @@
|
||||
<string name="menu_showpass">Prikaži lozinku</string>
|
||||
<string name="menu_search">Traži</string>
|
||||
<string name="menu_open">Otvori</string>
|
||||
<string name="menu_save_database">Sačuvaj bazu podataka</string>
|
||||
<string name="menu_save_database">Sačuvaj podatake</string>
|
||||
<string name="menu_lock">Zaključaj bazu podataka</string>
|
||||
<string name="menu_hide_password">Sakrij lozinku</string>
|
||||
<string name="menu_cancel">Otkaži</string>
|
||||
@@ -74,7 +74,7 @@
|
||||
<string name="file_not_found_content">Nije moguće pronaći datoteku. Pokušajte ponovo da je otvorite iz svog pregledača datoteka.</string>
|
||||
<string name="field_value">Vrednost polja</string>
|
||||
<string name="field_name">Naziv polja</string>
|
||||
<string name="error_registration_read_only">Čuvanje nove stavke nije dozvoljeno u bazi podataka koja je samo za čitanje</string>
|
||||
<string name="error_registration_read_only">Čuvanje nove stavke nije dozvoljeno u bazi podataka koja je samo za čitanje.</string>
|
||||
<string name="error_string_type">Ovaj tekst se ne podudara sa traženom stavkom.</string>
|
||||
<string name="error_otp_period">Broj sekundi perioda mora biti u opsegu od %1$d do %2$d.</string>
|
||||
<string name="error_otp_digits">Broj cifara tokena mora biti u opsegu od %1$d do %2$d.</string>
|
||||
@@ -100,7 +100,7 @@
|
||||
<string name="error_invalid_OTP">Nevažeća OTP tajna.</string>
|
||||
<string name="error_invalid_path">Proverite da li je putanja ispravna.</string>
|
||||
<string name="error_invalid_db">Nije moguće pročitati bazu podataka.</string>
|
||||
<string name="error_file_not_create">Nije moguće kreirati datoteku</string>
|
||||
<string name="error_file_not_create">Nije moguće kreirati datoteku.</string>
|
||||
<string name="error_can_not_handle_uri">Nije moguće obraditi ovaj URI u keePassDX-u.</string>
|
||||
<string name="error_arc4">Archfour šifrovanje nije podržano.</string>
|
||||
<string name="entry_user_name">Korisničko ime</string>
|
||||
@@ -224,12 +224,12 @@
|
||||
<string name="html_about_contribution">Kako bismo <strong>zadržali našu slobodu</strong>, <strong>ispravljali greške</strong>, <strong>dodavali nove opcije</strong> i <strong>uvek bili aktivni</strong>, računamo na Vaš <strong>doprinos</strong>.</string>
|
||||
<string name="html_about_licence">KeePassDX © %1$d Kunzisoft je <strong>otvorenog koda</strong> i <strong>ne sadrži reklame</strong>.
|
||||
\nPonuđen je onakav kakav jeste, pod <strong>GPLv3</strong> licencom, bez ikakvih garancija.</string>
|
||||
<string name="digits">Cifre</string>
|
||||
<string name="digits">Znamenke</string>
|
||||
<string name="default_checkbox">Koristi kao podrazumevanu bazu podataka</string>
|
||||
<string name="decrypting_db">Dešifrovanje sadržaja baze podataka…</string>
|
||||
<string name="database">Baza podataka</string>
|
||||
<string name="retrieving_db_key">Dohvatanje ključa baze podataka…</string>
|
||||
<string name="select_to_copy">Izabarite kako bi ste kopirali %1$s u međuspremnik</string>
|
||||
<string name="select_to_copy">Izaberite kako bi ste kopirali %1$s u međuspremnik</string>
|
||||
<string name="content_description_keyboard_close_fields">Zatvori polja</string>
|
||||
<string name="content_description_remove_from_list">Obriši</string>
|
||||
<string name="content_description_update_from_list">Ažuriraj</string>
|
||||
@@ -256,10 +256,161 @@
|
||||
<string name="clipboard_timeout">Vreme isteka međuspremnika</string>
|
||||
<string name="clipboard_error_clear">Nije moguće očistiti međuspremnik</string>
|
||||
<string name="clipboard_error">Neki uređaji neće dozvoliti aplikacijama da koriste međuspremnik.</string>
|
||||
<string name="clipboard_cleared">Međuspremnik je očišćena</string>
|
||||
<string name="clipboard_cleared">Međuspremnik je očišćen</string>
|
||||
<string name="clipboard_error_title">Greška međuspremnika</string>
|
||||
<string name="allow">Dozvoli</string>
|
||||
<string name="edit_entry">Izmeni stavku</string>
|
||||
<string name="add_entry">Dodaj stavku</string>
|
||||
<string name="contact">Kontakt</string>
|
||||
<string name="biometric_security_update_required">Neophodno je ažurirati biometriju.</string>
|
||||
<string name="configure">Podesi</string>
|
||||
<string name="content_description_passphrase_word_count">Broj reči pristupne fraze</string>
|
||||
<string name="passphrase">Dugačka lozinka</string>
|
||||
<string name="filter">Filtar</string>
|
||||
<string name="content_description_hardware_key_checkbox">Polje za potvrdu hardverskog ključa</string>
|
||||
<string name="content_description_entry_background_color">Boja pozadine unosa</string>
|
||||
<string name="name">Ime</string>
|
||||
<string name="error_rebuild_list">Nije moguće pravilno obnoviti listu.</string>
|
||||
<string name="auto_focus_search_title">Brza pretraga</string>
|
||||
<string name="protection">Zaštita</string>
|
||||
<string name="import_app_properties_summary">Izaberite datoteku za uvoz podešavanja aplikacije</string>
|
||||
<string name="rounds">Transformacioni krugovi</string>
|
||||
<string name="content_description_database_color">Boja baze podataka</string>
|
||||
<string name="content_description_entry_foreground_color">Ulazna boja prednjeg plana</string>
|
||||
<string name="debit_credit_card">Debitna/kreditna kartica</string>
|
||||
<string name="place_of_issue">Mjesto izdavanja</string>
|
||||
<string name="date_of_issue">Datum izdavanja</string>
|
||||
<string name="email">Email</string>
|
||||
<string name="email_address">Adresa e-pošte</string>
|
||||
<string name="type">Vrsta</string>
|
||||
<string name="cryptocurrency">Novčanik za kriptovalute</string>
|
||||
<string name="token">Token</string>
|
||||
<string name="public_key">Javni ključ</string>
|
||||
<string name="private_key">Privatni ključ</string>
|
||||
<string name="seed">Tajna fraza</string>
|
||||
<string name="account">Račun</string>
|
||||
<string name="bank_identifier_code">SVIFT / BIC</string>
|
||||
<string name="membership">Članstvo</string>
|
||||
<string name="error_otp_type">Ovaj obrazac ne prepoznaje postojeći tip OTP-a, njegova validacija možda više neće ispravno generisati token.</string>
|
||||
<string name="error_start_database_action">Došlo je do greške pri izvođenju radnje u bazi podataka.</string>
|
||||
<string name="menu_reload_database">Поново учитај податке</string>
|
||||
<string name="no_url_handler">Instalirajte veb pregledač da biste otvorili ovu URL adresu.</string>
|
||||
<string name="select_database_file">Otvorite postojeći trezor</string>
|
||||
<string name="remember_database_locations_summary">Prati gde se čuvaju baze podataka</string>
|
||||
<string name="hide_broken_locations_summary">Sakrijte pokvarene veze na listi nedavnih baza podataka</string>
|
||||
<string name="content_description_otp_information">Informacije o jednokratnoj lozinci</string>
|
||||
<string name="error_upload_file">Došlo je do greške pri otpremanju podataka datoteke.</string>
|
||||
<string name="hint_icon_name">Ime ikone</string>
|
||||
<string name="no_results">Nema rezultata pretrage</string>
|
||||
<string name="memory_usage">Korišćenje memorije</string>
|
||||
<string name="show_recent_files_title">Prikaži nedavne datoteke</string>
|
||||
<string name="show_uuid_title">Prikaži UUID</string>
|
||||
<string name="html_about_privacy"><strong>Ne preuzimaju se nikakvi korisnički podaci</strong>, ova aplikacija se ne povezuje ni na jedan server, radi samo lokalno i u potpunosti poštuje privatnost korisnika.</string>
|
||||
<string name="expired">Isteklo</string>
|
||||
<string name="hardware_key">Hardverski ključ</string>
|
||||
<string name="bank">Banka</string>
|
||||
<string name="bank_name">Ime banke</string>
|
||||
<string name="version">Verzija</string>
|
||||
<string name="error_remove_file">Došlo je do greške pri uklanjanju podataka iz datoteke.</string>
|
||||
<string name="error_challenge_already_requested">Izazov je već zahtevan.</string>
|
||||
<string name="error_hardware_key_unsupported">Hardverski ključ nije podržan.</string>
|
||||
<string name="error_empty_key">Ključ ne može biti prazan.</string>
|
||||
<string name="colorize_password_summary">Obojite znakove lozinke po tipu</string>
|
||||
<string name="show_otp_token_title">Prikaži OTP token</string>
|
||||
<string name="show_uuid_summary">Prikazuje UUID povezan sa unosom ili grupom</string>
|
||||
<string name="menu_merge_from">Sjedini iz …</string>
|
||||
<string name="progress_title">Rad u toku …</string>
|
||||
<string name="export_app_properties_summary">Napravite datoteku za izvoz podešavanja aplikacije</string>
|
||||
<string name="success_export_app_properties">Podešavanja aplikacije su izvezena</string>
|
||||
<string name="root">Koren</string>
|
||||
<string name="rounds_explanation">Dodatne runde šifrovanja pružaju veću zaštitu od napada grube sile, ali zaista mogu usporiti učitavanje i čuvanje.</string>
|
||||
<string name="memory_usage_explanation">Količina memorije koju će koristiti funkcija izvođenja ključa.</string>
|
||||
<string name="space">Razmak</string>
|
||||
<string name="error_unable_merge_database_kdb">Nije moguće spojiti sa kdb datotekom baze podataka.</string>
|
||||
<string name="error_location_unknown">Lokacija baze podataka je nepoznata, radnja baze podataka se ne može izvršiti.</string>
|
||||
<string name="corrupted_file">Oštećena datoteka.</string>
|
||||
<string name="colorize_password_title">Obojite lozinke</string>
|
||||
<string name="show_otp_token_summary">Prikazuje OTP tokene na listi unosa</string>
|
||||
<string name="error_field_name_already_exists">Ime polja već postoji.</string>
|
||||
<string name="menu_merge_database">Objedini podatke</string>
|
||||
<string name="menu_keystore_remove_key">Izbrišite ključ za otključavanje uređaja</string>
|
||||
<string name="subdomain_search_summary">Pretražujte veb domene sa ograničenjima poddomena</string>
|
||||
<string name="export_app_properties_title">Izvezite podešavanja aplikacije</string>
|
||||
<string name="registration_mode">Režim registracije</string>
|
||||
<string name="remember_database_locations_title">Zapamtite lokacije baza podataka</string>
|
||||
<string name="remember_hardware_key_title">Zapamtite hardverske ključeve</string>
|
||||
<string name="remember_hardware_key_summary">Vodi evidenciju o korišćenim hardverskim ključevima</string>
|
||||
<string name="error_import_app_properties">Greška tokom uvoza podešavanja aplikacije.</string>
|
||||
<string name="hide_broken_locations_title">Sakrij neispravne veze baze podataka</string>
|
||||
<string name="import_app_properties_title">Uvezite podešavanja aplikacije</string>
|
||||
<string name="description_app_properties">KeePassDX svojstva za upravljanje podešavanjima aplikacije</string>
|
||||
<string name="show_recent_files_summary">Prikaži lokacije nedavnih baza podataka</string>
|
||||
<string name="success_import_app_properties">Podešavanja aplikacije su uvezena</string>
|
||||
<string name="kdf_explanation">Da bi se generisao ključ za algoritam šifrovanja, glavni ključ se transformiše korišćenjem nasumično slane funkcije izvođenja ključa.</string>
|
||||
<string name="do_not_kill_app">Ne ubijajte aplikaciju…</string>
|
||||
<string name="encryption_explanation">Algoritam šifrovanja baze podataka koji se koristi za sve podatke</string>
|
||||
<string name="command_execution">Izvršavanje komande…</string>
|
||||
<string name="content_description_nav_header">Zaglavlje za navigaciju</string>
|
||||
<string name="navigation_drawer_open">Ploča navigacije otvorena</string>
|
||||
<string name="navigation_drawer_close">Ploča navigacije zatvorena</string>
|
||||
<string name="searchable">Pretraživo</string>
|
||||
<string name="inherited">Nasledi</string>
|
||||
<string name="auto_type_sequence">Automatska sekvenca unosa</string>
|
||||
<string name="tags">Oznake</string>
|
||||
<string name="custom_data">Prilagođeni podaci</string>
|
||||
<string name="search_filters">Filteri za pretragu</string>
|
||||
<string name="current_group">Trenutna grupa</string>
|
||||
<string name="case_sensitive">Osetljivo na velika i mala slova</string>
|
||||
<string name="personal_identification_number">PIN</string>
|
||||
<string name="international_bank_account_number">IBAN</string>
|
||||
<string name="secure_note">Sigurna beleška</string>
|
||||
<string name="error_database_uri_null">URI baze podataka se ne može preuzeti.</string>
|
||||
<string name="read_only_warning">U zavisnosti od vašeg menadžera datoteka, KeePassDX možda neće dozvoliti da upisuje u vašu memoriju.</string>
|
||||
<string name="sort_menu">Sortiraj</string>
|
||||
<string name="auto_type">Automatski unos</string>
|
||||
<string name="save_mode">Režim čuvanja</string>
|
||||
<string name="info">Informacije</string>
|
||||
<string name="waiting_challenge_request">Čeka se zahtev za izazov…</string>
|
||||
<string name="waiting_challenge_response">Čeka se odgovor na izazov…</string>
|
||||
<string name="template_group_name">Predlošci</string>
|
||||
<string name="regex">Regularni izraz</string>
|
||||
<string name="holder">Vlasnik</string>
|
||||
<string name="number">Broj</string>
|
||||
<string name="error_word_reserved">Ova reč je rezervisana i ne može se koristiti.</string>
|
||||
<string name="card_verification_value">CVV</string>
|
||||
<string name="id_card">Lična karta</string>
|
||||
<string name="wireless">Vi-Fi</string>
|
||||
<string name="ssid">SSID</string>
|
||||
<string name="standard">Standardno</string>
|
||||
<string name="template">Šablon</string>
|
||||
<string name="error_no_hardware_key">Izaberite hardverski ključ.</string>
|
||||
<string name="error_XML_malformed">XML je pogrešno oblikovan.</string>
|
||||
<string name="error_move_group_here">Ovde ne možete premestiti grupu.</string>
|
||||
<string name="error_file_to_big">Datoteka koju pokušavate da otpremite je prevelika.</string>
|
||||
<string name="error_duplicate_file">Podaci o fajlu već postoje.</string>
|
||||
<string name="error_response_already_provided">Odgovor je već dat.</string>
|
||||
<string name="error_no_response_from_challenge">Nije moguće dobiti odgovor na izazov.</string>
|
||||
<string name="error_cancel_by_user">Korisnik je otkazao.</string>
|
||||
<string name="error_driver_required">Potreban je drajver za %1$s.</string>
|
||||
<string name="menu_app_settings_summary">Pretraga, zaključavanje, istorija, svojstva</string>
|
||||
<string name="menu_form_filling_settings_summary">Tastatura, automatsko popunjavanje, klipbord</string>
|
||||
<string name="menu_advanced_unlock_settings_summary">Biometrija, akreditiv uređaja</string>
|
||||
<string name="menu_database_settings_summary">Metapodaci, korpa za otpatke, šabloni, istorija</string>
|
||||
<string name="menu_security_settings_summary">Šifrovanje, funkcija izvođenja ključa</string>
|
||||
<string name="master_key_settings_summary">Promena, obnova</string>
|
||||
<string name="menu_save_copy_to">Sačuvajte kopiju u…</string>
|
||||
<string name="menu_external_icon">Vanjska ikona</string>
|
||||
<string name="create_keepass_file">Napravite novi trezor</string>
|
||||
<string name="auto_focus_search_summary">Zatražite pretragu prilikom otvaranja baze podataka</string>
|
||||
<string name="subdomain_search_title">Pretraga poddomena</string>
|
||||
<string name="progress_create">Pravljenje nove baze podataka…</string>
|
||||
<string name="read_only">Zaštićeno od pisanja</string>
|
||||
<string name="error_export_app_properties">Greška tokom izvoza podešavanja aplikacije.</string>
|
||||
<string name="contains_duplicate_uuid">Baza podataka sadrži duplirane UUID-ove.</string>
|
||||
<string name="contains_duplicate_uuid_procedure">Rešiti problem generisanjem novih UUID-ova za nastavak duplikata?</string>
|
||||
<string name="search_mode">Režim pretrage</string>
|
||||
<string name="selection_mode">Režim izbora</string>
|
||||
<string name="parallelism">Paralelizam</string>
|
||||
<string name="parallelism_explanation">Stepen paralelizma (tj. broj niti) koji koristi funkcija izvođenja ključa.</string>
|
||||
<string name="saving_database">Čuvanje baze podataka…</string>
|
||||
</resources>
|
||||
142
app/src/main/res/values-b+yue+Hant/strings.xml
Normal file
142
app/src/main/res/values-b+yue+Hant/strings.xml
Normal file
@@ -0,0 +1,142 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="accept">接受</string>
|
||||
<string name="add_entry">新增項目</string>
|
||||
<string name="edit_entry">編輯項目</string>
|
||||
<string name="add_group">新增群組</string>
|
||||
<string name="master_key">主密鑰</string>
|
||||
<string name="security">安全</string>
|
||||
<string name="encryption">加密</string>
|
||||
<string name="encryption_algorithm">加密演算法</string>
|
||||
<string name="key_derivation_function">密鑰推算函數</string>
|
||||
<string name="app_timeout">超時</string>
|
||||
<string name="application">應用程式</string>
|
||||
<string name="brackets">括弧</string>
|
||||
<string name="extended_ASCII">延伸ASCII</string>
|
||||
<string name="allow">允許</string>
|
||||
<string name="clipboard_error_title">剪貼簿錯誤</string>
|
||||
<string name="clipboard_error">有啲設備唔容許其他應用程式用剪貼簿。</string>
|
||||
<string name="clipboard_cleared">清除咗剪貼簿</string>
|
||||
<string name="app_timeout_summary">鎖定資料庫前嘅閒置時間</string>
|
||||
<string name="clipboard_error_clear">清除唔到剪貼簿</string>
|
||||
<string name="clipboard_timeout">剪貼簿超時</string>
|
||||
<string name="clipboard_timeout_summary">剪貼簿保留時間(如果裝置支持)</string>
|
||||
<string name="content_description_background">背景</string>
|
||||
<string name="content_description_open_file">開啟檔案</string>
|
||||
<string name="content_description_node_children">子節點</string>
|
||||
<string name="content_description_add_node">新增節點</string>
|
||||
<string name="content_description_add_entry">新增項目</string>
|
||||
<string name="content_description_add_group">新增群組</string>
|
||||
<string name="content_description_add_item">新增項目</string>
|
||||
<string name="content_description_credentials_information">憑證資訊</string>
|
||||
<string name="content_description_otp_information">一次性密碼(OTP)訊息</string>
|
||||
<string name="content_description_password_checkbox">密碼核取方塊</string>
|
||||
<string name="content_description_keyfile_checkbox">密鑰檔案核取方塊</string>
|
||||
<string name="content_description_hardware_key_checkbox">硬件密鑰方塊</string>
|
||||
<string name="content_description_repeat_toggle_password_visibility">重複切換密碼能見度</string>
|
||||
<string name="content_description_entry_icon">項目圖示</string>
|
||||
<string name="content_description_entry_foreground_color">項目前景顏色</string>
|
||||
<string name="content_description_entry_background_color">項目背景顏色</string>
|
||||
<string name="content_description_nav_header">導覽</string>
|
||||
<string name="validate">驗證</string>
|
||||
<string name="discard_changes">放棄更改?</string>
|
||||
<string name="entry_password_generator">密碼產生器</string>
|
||||
<string name="content_description_password_length">密碼長度</string>
|
||||
<string name="content_description_passphrase_word_count">密碼短句字數</string>
|
||||
<string name="entry_add_field">新增欄位</string>
|
||||
<string name="entry_add_attachment">新增附件</string>
|
||||
<string name="content_description_remove_field">刪除欄位</string>
|
||||
<string name="content_description_update_from_list">更新</string>
|
||||
<string name="content_description_keyboard_close_fields">關閉欄位</string>
|
||||
<string name="discard">放棄</string>
|
||||
<string name="select_to_copy">複製%1$s去剪貼簿</string>
|
||||
<string name="default_checkbox">用作預設資料庫</string>
|
||||
<string name="digits">數字</string>
|
||||
<string name="html_about_licence">KeePassDX © %1$d Kunzisoft;呢個係<strong>冇廣告</strong>嘅<strong>開源</strong>軟件。 \n你可以喺遵循<strong>GPL 3</strong>或者更高版本嘅情況下重新發佈,而Kunzisoft對此不帶有任何擔保。</string>
|
||||
<string name="html_about_privacy"><strong>唔收集用戶資料。</strong>,呢個應用程式唔會連接任何伺服器,只會喺裝置上運作,完全尊重用戶私穩。</string>
|
||||
<string name="html_about_contribution">為程式能夠<strong>保持自主</strong>、<strong>修復漏洞</strong>、<strong>新增功能</strong>同<strong>保持持續開發</strong>,有賴你的<strong>貢獻</strong>。</string>
|
||||
<string name="entry_confpassword">確認密碼</string>
|
||||
<string name="entry_expires">失效時間</string>
|
||||
<string name="expired">過期</string>
|
||||
<string name="entry_UUID">UUID</string>
|
||||
<string name="entry_attachments">附件</string>
|
||||
<string name="entry_keyfile">密鑰檔案</string>
|
||||
<string name="hardware_key">硬件密鑰</string>
|
||||
<string name="entry_modified">修改時間</string>
|
||||
<string name="entry_created">建立時間</string>
|
||||
<string name="inherited">繼承</string>
|
||||
<string name="auto_type">自動填入</string>
|
||||
<string name="entry_not_found">找不到項目資料。</string>
|
||||
<string name="entry_password">密碼</string>
|
||||
<string name="tags">標籤</string>
|
||||
<string name="custom_data">自定義數據</string>
|
||||
<string name="save">儲存</string>
|
||||
<string name="entry_title">名稱</string>
|
||||
<string name="entry_setup_otp">設定一次性密碼(OTP)</string>
|
||||
<string name="otp_secret">OTP密鑰</string>
|
||||
<string name="otp_period">間隔(秒)</string>
|
||||
<string name="search_filters">搜尋過濾器</string>
|
||||
<string name="otp_algorithm">演算法</string>
|
||||
<string name="current_group">目前組别</string>
|
||||
<string name="case_sensitive">區分大小寫</string>
|
||||
<string name="regex">正則表達式</string>
|
||||
<string name="debit_credit_card">扣賬卡 / 信用卡</string>
|
||||
<string name="holder">持卡人</string>
|
||||
<string name="email_address">電郵地址</string>
|
||||
<string name="wireless">Wi-Fi</string>
|
||||
<string name="standard">標準</string>
|
||||
<string name="version">版本</string>
|
||||
<string name="entry_otp">OTP</string>
|
||||
<string name="error_arc4">唔支援Arcfour stream密碼。</string>
|
||||
<string name="error_can_not_handle_uri">KeePassDX 處理唔到呢個網址。</string>
|
||||
<string name="error_file_not_create">新增唔到檔案。</string>
|
||||
<string name="error_invalid_db">讀取唔到資料庫。</string>
|
||||
<string name="error_invalid_path">請確保路徑正確。</string>
|
||||
<string name="error_invalid_OTP">無效 OTP 密鑰。</string>
|
||||
<string name="error_no_name">請輸入用戶名。</string>
|
||||
<string name="contact">聯絡方法</string>
|
||||
<string name="info">資訊</string>
|
||||
<string name="contribution">貢獻</string>
|
||||
<string name="homepage">首頁</string>
|
||||
<string name="feedback">反映意見</string>
|
||||
<string name="about_description">相容KeePass密碼管理軟件嘅Android App</string>
|
||||
<string name="file_manager_install_description">檔案總管要支援 ACTION_CREATE_DOCUMENT 和 ACTION_OPEN_DOCUMENT 的 intent,先可以建立、開啟同儲存資料庫檔案。</string>
|
||||
<string name="content_description_file_information">檔案資訊</string>
|
||||
<string name="content_description_database_color">資料庫顔色</string>
|
||||
<string name="content_description_remove_from_list">移除</string>
|
||||
<string name="template_group_name">範本</string>
|
||||
<string name="retrieving_db_key">攞緊資料庫密鑰……</string>
|
||||
<string name="waiting_challenge_response">等緊Challenge回應……</string>
|
||||
<string name="waiting_challenge_request">等緊Challenge請求……</string>
|
||||
<string name="decrypting_db">解密緊資料庫內容……</string>
|
||||
<string name="database">資料庫</string>
|
||||
<string name="entry_accessed">存取時間</string>
|
||||
<string name="entry_cancel">取消</string>
|
||||
<string name="entry_notes">備註</string>
|
||||
<string name="otp_type">OTP 類型</string>
|
||||
<string name="otp_counter">計數器</string>
|
||||
<string name="number">卡號</string>
|
||||
<string name="otp_digits">數位</string>
|
||||
<string name="card_verification_value">安全碼(CVV)</string>
|
||||
<string name="personal_identification_number">PIN 碼</string>
|
||||
<string name="id_card">身份證</string>
|
||||
<string name="name">姓名</string>
|
||||
<string name="place_of_issue">發行地</string>
|
||||
<string name="date_of_issue">發行日期</string>
|
||||
<string name="email">電郵</string>
|
||||
<string name="ssid">SSID</string>
|
||||
<string name="public_key">公鑰</string>
|
||||
<string name="type">類型</string>
|
||||
<string name="cryptocurrency">加密貨幣錢包</string>
|
||||
<string name="token">Token</string>
|
||||
<string name="bank">銀行</string>
|
||||
<string name="international_bank_account_number">IBAN</string>
|
||||
<string name="membership">會籍</string>
|
||||
<string name="private_key">私鑰</string>
|
||||
<string name="seed">種子</string>
|
||||
<string name="bank_identifier_code">SWIFT / BIC</string>
|
||||
<string name="account">帳戶</string>
|
||||
<string name="bank_name">銀行名稱</string>
|
||||
<string name="entry_url">網址</string>
|
||||
<string name="entry_user_name">用戶名</string>
|
||||
</resources>
|
||||
@@ -4,10 +4,10 @@
|
||||
<string name="encryption_algorithm">Алгоритъм за шифроване</string>
|
||||
<string name="encryption">Шифроване</string>
|
||||
<string name="security">Сигурност</string>
|
||||
<string name="master_key">Главен ключ</string>
|
||||
<string name="master_key">Главна парола</string>
|
||||
<string name="add_group">Нова група</string>
|
||||
<string name="edit_entry">Редактиране на запис</string>
|
||||
<string name="add_entry">Добавяне на запис</string>
|
||||
<string name="add_entry">Нов запис</string>
|
||||
<string name="accept">Приемане</string>
|
||||
<string name="biometric_delete_all_key_title">Изтриване на шифроващите ключове</string>
|
||||
<string name="digits">Цифри</string>
|
||||
@@ -22,67 +22,667 @@
|
||||
<string name="clipboard_timeout_summary">Продължителност на съхранение в клипборда (ако се поддържа от вашето устройство)</string>
|
||||
<string name="clipboard_error">Някои устройства не позволяват на приложенията да използват клипборда.</string>
|
||||
<string name="entry_title">Заглавие</string>
|
||||
<string name="about_description">Android версия на мениджъра на пароли KeePass</string>
|
||||
<string name="save">Запази</string>
|
||||
<string name="entry_confpassword">Потвърди парола</string>
|
||||
<string name="key_derivation_function">Функция за генериране на ключа</string>
|
||||
<string name="content_description_open_file">Отвори файл</string>
|
||||
<string name="about_description">Версия за Андроид на приложението за управление на пароли KeePass</string>
|
||||
<string name="save">Запазване</string>
|
||||
<string name="entry_confpassword">Потвърждаване на парола</string>
|
||||
<string name="key_derivation_function">Функция за извличане на ключ</string>
|
||||
<string name="content_description_open_file">Отваряне на файл</string>
|
||||
<string name="entry_cancel">Отказ</string>
|
||||
<string name="custom_data">Персонализирани данни</string>
|
||||
<string name="tags">Тагове</string>
|
||||
<string name="clipboard_explanation_summary">Копирайте полетата за въвеждане, като използвате клипборда на вашето устройство</string>
|
||||
<string name="otp_type">Тип OTP</string>
|
||||
<string name="entry_url">Линк</string>
|
||||
<string name="custom_data">Потребителски данни</string>
|
||||
<string name="tags">Етикети</string>
|
||||
<string name="clipboard_explanation_summary">Копиране на полета за въвеждане посредством междинната памет на устройството</string>
|
||||
<string name="otp_type">Вид на OTP</string>
|
||||
<string name="entry_url">Адрес в интернет</string>
|
||||
<string name="contribution">Участие</string>
|
||||
<string name="entry_UUID">UUID</string>
|
||||
<string name="entry_UUID">Идентификатор</string>
|
||||
<string name="entry_history">История</string>
|
||||
<string name="copy_field">Копие на %1$s</string>
|
||||
<string name="copy_field">Копирано: %1$s</string>
|
||||
<string name="clipboard_error_title">Грешка в клипборда</string>
|
||||
<string name="file_manager_install_description">За създаване, отваряне и запазване на файлове на базата данни е необходим файлов мениджър, който приема действието ACTION_CREATE_DOCUMENT и ACTION_OPEN_DOCUMENT.</string>
|
||||
<string name="content_description_add_entry">Добави запис</string>
|
||||
<string name="file_manager_install_description">За създаване, отваряне и запазване на файлове на хранилищата е необходимо приложение за управление на файлове, което приема действието ACTION_CREATE_DOCUMENT и ACTION_OPEN_DOCUMENT.</string>
|
||||
<string name="content_description_add_entry">Нов запис</string>
|
||||
<string name="clipboard_timeout">Време за изчакване на клипборда</string>
|
||||
<string name="expired">Изтекъл</string>
|
||||
<string name="expired">Изтекла давност</string>
|
||||
<string name="entry_password">Парола</string>
|
||||
<string name="retrieving_db_key">Ключът на базата данни се извлича…</string>
|
||||
<string name="entry_accessed">Достъп</string>
|
||||
<string name="retrieving_db_key">Получаване на ключа на хранилището…</string>
|
||||
<string name="entry_accessed">Достъпен</string>
|
||||
<string name="entry_created">Създаден</string>
|
||||
<string name="entry_user_name">Потребителско име</string>
|
||||
<string name="entry_user_name">Потребител</string>
|
||||
<string name="content_description_background">Фон</string>
|
||||
<string name="clipboard_error_clear">Не може да се изчисти клипборда</string>
|
||||
<string name="entry_expires">Изтича</string>
|
||||
<string name="entry_expires">Изтичаща давност</string>
|
||||
<string name="entry_attachments">Прикачени файлове</string>
|
||||
<string name="otp_period">Период (секунди)</string>
|
||||
<string name="app_timeout_summary">Период на бездействие, след който базата се заключва</string>
|
||||
<string name="app_timeout_summary">Време без активност преди заключване на хранилището</string>
|
||||
<string name="otp_digits">Цифри</string>
|
||||
<string name="extended_ASCII">Разширен ASCII</string>
|
||||
<string name="extended_ASCII">Разширен набор от ASCII</string>
|
||||
<string name="entry_otp">OTP</string>
|
||||
<string name="entry_notes">Бележки</string>
|
||||
<string name="entry_notes">Бележка</string>
|
||||
<string name="otp_counter">Брояч</string>
|
||||
<string name="allow">Позволи</string>
|
||||
<string name="allow_copy_password_warning">Внимание: Клипбордът се споделя от всички приложения. Ако се копират чувствителни данни, друг софтуер може да ги възстанови.</string>
|
||||
<string name="allow">Разрешаване</string>
|
||||
<string name="allow_copy_password_warning">Внимание: Междинната памет се споделя от всички приложения. Ако бъде копирана чувствителна информация, друго приложение може да ги използва.</string>
|
||||
<string name="entry_modified">Променен</string>
|
||||
<string name="select_to_copy">Изберете, за да копирате %1$s в клипборда</string>
|
||||
<string name="otp_secret">Таен ключ</string>
|
||||
<string name="homepage">Уебсайт</string>
|
||||
<string name="loading_database">Базата данни се зарежда…</string>
|
||||
<string name="loading_database">Зареждане на хранилището…</string>
|
||||
<string name="password">Парола</string>
|
||||
<string name="remember_hardware_key_title">Запомни хардуерните ключове</string>
|
||||
<string name="decrypting_db">Съдържанието на базата данни се декриптира…</string>
|
||||
<string name="unlock">Отключи</string>
|
||||
<string name="unavailable_feature_hardware">Не може да се намери съответният хардуер.</string>
|
||||
<string name="remember_hardware_key_title">Запомняне на хардуерните ключове</string>
|
||||
<string name="decrypting_db">Разшифроване на хранилището…</string>
|
||||
<string name="unlock">Отключване</string>
|
||||
<string name="unavailable_feature_hardware">Необходимият хардуер не може да бъде намерен.</string>
|
||||
<string name="hardware_key">Хардуерен ключ</string>
|
||||
<string name="hide_password_summary">Маскира паролите (***) по подразбиране</string>
|
||||
<string name="select_database_file">Отвори съществуваща база данни</string>
|
||||
<string name="content_description_hardware_key_checkbox">Хардуерен ключ отметка</string>
|
||||
<string name="hide_password_summary">Скриване на паролите (***) по подразбиране</string>
|
||||
<string name="select_database_file">Отключване на хранилище</string>
|
||||
<string name="content_description_hardware_key_checkbox">Отметка на поле с хардуерен ключ</string>
|
||||
<string name="hide_password_title">Скриване на пароли</string>
|
||||
<string name="hint_pass">Парола</string>
|
||||
<string name="education_select_database_title">Отвори съществуваща база данни</string>
|
||||
<string name="content_description_keyfile_checkbox">Файл с ключ отметка</string>
|
||||
<string name="education_select_database_title">Отворете съществуващо хранилище</string>
|
||||
<string name="content_description_keyfile_checkbox">Отметка на поле за файл с ключ</string>
|
||||
<string name="error_hardware_key_unsupported">Хардуерният ключ не се поддържа.</string>
|
||||
<string name="remember_hardware_key_summary">Пази запис на използваните хардуерни ключове</string>
|
||||
<string name="error_nokeyfile">Избери файл с ключ.</string>
|
||||
<string name="remember_hardware_key_summary">Запомняне на използваните хардуерни ключове</string>
|
||||
<string name="error_nokeyfile">Избиране на файл с ключ.</string>
|
||||
<string name="entry_keyfile">Файл с ключ</string>
|
||||
<string name="error_no_hardware_key">Избери хардуерен ключ.</string>
|
||||
<string name="advanced_unlock_prompt_store_credential_message">Ще трябва да запомните основните си идентификационни данни на базата данни, дори като използвате разпознаване на отключването на устройството.</string>
|
||||
<string name="create_keepass_file">Създай нова база данни</string>
|
||||
</resources>
|
||||
<string name="error_no_hardware_key">Изберете хардуерен ключ.</string>
|
||||
<string name="advanced_unlock_prompt_store_credential_message">Въпреки че използвате разпознаване на отключването на устройството ще трябва да запомните главната парола на хранилището.</string>
|
||||
<string name="create_keepass_file">Ново хранилище</string>
|
||||
<string name="recycle_bin">Кошче</string>
|
||||
<string name="default_checkbox">Използване като хранилище по подразбиране</string>
|
||||
<string name="otp_algorithm">Алгоритъм</string>
|
||||
<string name="email">Ел. поща</string>
|
||||
<string name="email_address">Адрес на ел. поща</string>
|
||||
<string name="personal_identification_number">ПИН</string>
|
||||
<string name="database">Хранилище</string>
|
||||
<string name="menu_lock">Заключване на хранилището</string>
|
||||
<string name="content_description_password_length">Дължина на паролата</string>
|
||||
<string name="content_description_remove_from_list">Премахване</string>
|
||||
<string name="content_description_update_from_list">Обновяване</string>
|
||||
<string name="entry_password_generator">Създаване на парола</string>
|
||||
<string name="version">Издание</string>
|
||||
<string name="settings">Настройки</string>
|
||||
<string name="creating_database">Създаване на хранилището…</string>
|
||||
<string name="lock">Заключване</string>
|
||||
<string name="keyboard">Клавиатура</string>
|
||||
<string name="keyboard_keys_category">Ключове</string>
|
||||
<string name="number">Номер</string>
|
||||
<string name="name">Име</string>
|
||||
<string name="public_key">Публичен ключ</string>
|
||||
<string name="private_key">Частен ключ</string>
|
||||
<string name="menu_database_settings">Настройки на хранилището</string>
|
||||
<string name="menu_app_settings">Настройки на приложението</string>
|
||||
<string name="discard">Отхвърляне</string>
|
||||
<string name="entry_add_field">Ниво поле</string>
|
||||
<string name="application_appearance">Интерфейс</string>
|
||||
<string name="other">Други</string>
|
||||
<string name="database_default_username_title">Потребител по подразбиране</string>
|
||||
<string name="text_appearance">Текст</string>
|
||||
<string name="download">Изтегляне</string>
|
||||
<string name="sort_username">Потребител</string>
|
||||
<string name="menu_save_database">Запазване на данните</string>
|
||||
<string name="never">Никога</string>
|
||||
<string name="field_name">Име на полето</string>
|
||||
<string name="sort_menu">Сортиране</string>
|
||||
<string name="field_value">Стойност на полето</string>
|
||||
<string name="hint_group_name">Име на групата</string>
|
||||
<string name="menu_merge_database">Обединяване на данните</string>
|
||||
<string name="menu_merge_from">Обединяване с…</string>
|
||||
<string name="menu_save_copy_to">Запазване на копие в…</string>
|
||||
<string name="sort_title">Заглавие</string>
|
||||
<string name="discard_changes">Отхвърляне на промените?</string>
|
||||
<string name="menu_reload_database">Презареждане на данните</string>
|
||||
<string name="contribute">Допринасяне</string>
|
||||
<string name="error_load_database_KDF_memory">Ключът не може да бъде зареден. Пробвайте да намалите използваната памет от функцията за извличане на ключове.</string>
|
||||
<string name="content_description_passphrase_word_count">Брой думи във фраза за достъп</string>
|
||||
<string name="search_filters">Филтри за търсене</string>
|
||||
<string name="current_group">Текуща група</string>
|
||||
<string name="case_sensitive">Съвпадение на регистъра</string>
|
||||
<string name="passphrase">Фраза за достъп</string>
|
||||
<string name="holder">Собственик</string>
|
||||
<string name="menu_form_filling_settings">Попълване на формуляри</string>
|
||||
<string name="menu_delete_entry_history">Премахване на история</string>
|
||||
<string name="menu_restore_entry_history">Възстановяване на история</string>
|
||||
<string name="minus">Дефис</string>
|
||||
<string name="no_results">Няма съвпадения</string>
|
||||
<string name="progress_title">Обработка…</string>
|
||||
<string name="progress_create">Създаване на хранилище…</string>
|
||||
<string name="do_not_kill_app">Не затваряйте приложението…</string>
|
||||
<string name="menu_appearance_settings">Външен вид</string>
|
||||
<string name="download_finalization">Завършване…</string>
|
||||
<string name="content_description_database_color">Цвят на хранилище</string>
|
||||
<string name="entry_not_found">Данни за записа не са намерени.</string>
|
||||
<string name="seed">Криптографско семе</string>
|
||||
<string name="account">Профил</string>
|
||||
<string name="bank">Банка</string>
|
||||
<string name="bank_name">Наименование на банката</string>
|
||||
<string name="standard">Стандарт</string>
|
||||
<string name="template">Шаблон</string>
|
||||
<string name="menu_move">Преместване</string>
|
||||
<string name="menu_cancel">Отказ</string>
|
||||
<string name="menu_hide_password">Скриване на парола</string>
|
||||
<string name="auto_focus_search_summary">Търсене при отключване на хранилище</string>
|
||||
<string name="saving_database">Запазване на хранилището…</string>
|
||||
<string name="command_execution">Изпълнение на команда…</string>
|
||||
<string name="content_description_keyboard_close_fields">Затваряне на полета</string>
|
||||
<string name="content_description_otp_information">Информация за еднократна парола</string>
|
||||
<string name="content_description_repeat_toggle_password_visibility">Превключвател на видимостта на парола на поле за повтаряне на парола</string>
|
||||
<string name="content_description_entry_icon">Пиктограма на запис</string>
|
||||
<string name="inherited">Наследено</string>
|
||||
<string name="menu_empty_recycle_bin">Изпразване на кошчето</string>
|
||||
<string name="html_about_privacy"><strong>Не се събират никакви потребителски данни</strong>, приложението не се свързва с никакви сървъри, работи изцяло локално и напълно уважава поверителността на потребителите.</string>
|
||||
<string name="searchable">Достъпно за търсене</string>
|
||||
<string name="menu_external_icon">Външна пиктограма</string>
|
||||
<string name="autofill_select_entry">Избиране на запис…</string>
|
||||
<string name="enable_education_screens_title">Обучителни подсказки</string>
|
||||
<string name="entropy_calculate">Ентропия: изчисляване…</string>
|
||||
<string name="template_group_name">Шаблони</string>
|
||||
<string name="bank_identifier_code">SWIFT / BIC</string>
|
||||
<string name="menu_paste">Поставяне</string>
|
||||
<string name="content_description_nav_header">Заглавка на меню</string>
|
||||
<string name="auto_type_sequence">Последователност за автом. въвеждане</string>
|
||||
<string name="id_card">Карта за самоличност</string>
|
||||
<string name="card_verification_value">CVV</string>
|
||||
<string name="place_of_issue">Място на издаване</string>
|
||||
<string name="date_of_issue">Дата на издаване</string>
|
||||
<string name="ssid">SSID</string>
|
||||
<string name="type">Вид</string>
|
||||
<string name="cryptocurrency">Портфейл за криптовалута</string>
|
||||
<string name="token">Код за достъп</string>
|
||||
<string name="menu_change_key_settings">Промяна на главната парола</string>
|
||||
<string name="menu_advanced_unlock_settings">Отключване на устройството</string>
|
||||
<string name="menu_security_settings">Настройки за сигурност</string>
|
||||
<string name="menu_donate">Даряване</string>
|
||||
<string name="menu_edit">Променяне</string>
|
||||
<string name="menu_copy">Копиране</string>
|
||||
<string name="menu_file_selection_read_only">Само за четене</string>
|
||||
<string name="menu_search">Търсене</string>
|
||||
<string name="menu_showpass">Показване на паролата</string>
|
||||
<string name="menu_keystore_remove_key">Премахване на ключа за устройството</string>
|
||||
<string name="menu_url">Посещаване на адреса</string>
|
||||
<string name="menu_open_file_read_and_write">За четене и запис</string>
|
||||
<string name="auto_type">Автоматично въвеждане</string>
|
||||
<string name="content_description_node_children">Дъщерен възел</string>
|
||||
<string name="content_description_add_node">Нов възел</string>
|
||||
<string name="content_description_file_information">Информация за файл</string>
|
||||
<string name="content_description_credentials_information">Информация за самоличност</string>
|
||||
<string name="content_description_add_item">Нов елемент</string>
|
||||
<string name="content_description_password_checkbox">Отметка на поле за парола</string>
|
||||
<string name="content_description_entry_foreground_color">Цвят на шрифта на запис</string>
|
||||
<string name="navigation_drawer_open">Отваряне на страничното меню</string>
|
||||
<string name="navigation_drawer_close">Затваряне на страничното меню</string>
|
||||
<string name="validate">Проверяване</string>
|
||||
<string name="content_description_remove_field">Премахване на поле</string>
|
||||
<string name="entry_add_attachment">Нов прикачен файл</string>
|
||||
<string name="waiting_challenge_request">Изчакване на заявка за предизвикване…</string>
|
||||
<string name="waiting_challenge_response">Изчакване на отговор на предизвикване…</string>
|
||||
<string name="entry_setup_otp">Настройка на еднократна парола</string>
|
||||
<string name="regex">Регулярен израз</string>
|
||||
<string name="debit_credit_card">Банкова карта</string>
|
||||
<string name="wireless">Безжична мрежа</string>
|
||||
<string name="international_bank_account_number">IBAN</string>
|
||||
<string name="secure_note">Защитена бележка</string>
|
||||
<string name="membership">Членство</string>
|
||||
<string name="error_arc4">Поточният шифър Аркфор не се поддържа.</string>
|
||||
<string name="error_empty_key">Ключът не трябва да е празен.</string>
|
||||
<string name="keyfile_is_empty">Файлът с ключ е празен.</string>
|
||||
<string name="length">Дължина</string>
|
||||
<string name="menu_app_settings_summary">Търсене, заключване, история, настройки</string>
|
||||
<string name="menu_form_filling_settings_summary">Клавиатура, автовъвеждане, междинна памет</string>
|
||||
<string name="menu_database_settings_summary">Описателни данни, кошче, шаблони, история</string>
|
||||
<string name="master_key_settings_summary">Промяна, обновяване</string>
|
||||
<string name="menu_open">Отключване</string>
|
||||
<string name="auto_focus_search_title">Бързо търсене</string>
|
||||
<string name="subdomain_search_title">Търсене на поддомейни</string>
|
||||
<string name="menu_delete">Изтриване</string>
|
||||
<string name="menu_appearance_settings_summary">Теми, цветове, атрибути</string>
|
||||
<string name="download_initialization">Подготвяне…</string>
|
||||
<string name="content_description_entry_background_color">Цвят на фона на запис</string>
|
||||
<string name="html_about_licence">KeePassDX © %1$d Kunzisoft е приложение с <strong>отворен код</strong> и <strong>без реклами</strong>. \nРазпространява се под лиценза <strong>GPLv3</strong> без каквато и да е гаранция.</string>
|
||||
<string name="menu_advanced_unlock_settings_summary">Биометрия, удостоверяване</string>
|
||||
<string name="menu_security_settings_summary">Шифроване, функция за извличане на ключ</string>
|
||||
<string name="menu_master_key_settings">Настройки на главната парола</string>
|
||||
<string name="file_browser">Управление на файлове</string>
|
||||
<string name="generate_password">Създаване на парола</string>
|
||||
<string name="autofill_service_name">Услуга за автоматично попълване на KeePassDX</string>
|
||||
<string name="settings_database_force_changing_master_key_next_time_summary">Изисква смяна на главната парола следващия път (веднъж)</string>
|
||||
<string name="filter">Филтър</string>
|
||||
<string name="sort_db">Естествен ред</string>
|
||||
<string name="sort_recycle_bin_bottom">Кошчето е най-долу</string>
|
||||
<string name="sort_groups_before">Първо групите</string>
|
||||
<string name="autofill_preference_title">Настройка на автоматично попълване</string>
|
||||
<string name="database_custom_color_title">Цвят на хранилището по избор</string>
|
||||
<string name="keyboard_theme_title">Тема на клавиатурата</string>
|
||||
<string name="keyboard_auto_go_action_title">Автоматично действие на клавиш</string>
|
||||
<string name="education_advanced_unlock_title">Отключвайте хранилището заедно с устройството</string>
|
||||
<string name="education_advanced_unlock_summary">Свържете паролата със сканиране на биометрични данни или удостоверяване на устройството, за да отключвате бързо хранилищата.</string>
|
||||
<string name="education_entry_new_field_summary">Създайте допълнително поле, добавете стойност и при необходимост я защитете.</string>
|
||||
<string name="education_unlock_title">Отключете хранилището</string>
|
||||
<string name="education_sort_title">Сортиране на записи</string>
|
||||
<string name="education_donation_summary">Допринесете за повишаване на стабилността, сигурността и добавянето на нови възможности.</string>
|
||||
<string name="show_entry_colors_summary">Шрифта и фона на записите да е цветен</string>
|
||||
<string name="backspace">Backspace</string>
|
||||
<string name="keyboard_previous_database_credentials_title">Екран за въвеждане на главната парола</string>
|
||||
<string name="select_entry">Изберете запис</string>
|
||||
<string name="education_new_node_title">Добавете елементи към хранилището</string>
|
||||
<string name="education_generate_password_summary">Създавайте надеждни пароли за записите, задайте лесно изискванията на формуляра и вашите изисквания за сигурност.</string>
|
||||
<string name="education_add_attachment_summary">За да запазите важни външни данни можете да прикачвате файлове към записите.</string>
|
||||
<string name="download_progression">Изпълнение: %1$d%%</string>
|
||||
<string name="download_complete">Готово!</string>
|
||||
<string name="unit_kibibyte">КиБ</string>
|
||||
<string name="character_count">Брой знаци: %1$d</string>
|
||||
<string name="style_brightness_title">Яркост на темата</string>
|
||||
<string name="style_brightness_summary">Избор между светла и тъмна тема</string>
|
||||
<string name="icon_section_standard">Стандартен</string>
|
||||
<string name="icon_section_custom">Потребителски</string>
|
||||
<string name="custom_fields">Потребителски полета</string>
|
||||
<string name="back_to_previous_keyboard">Превключва предната клавиатура</string>
|
||||
<string name="enable_auto_save_database_title">Автоматично запазване на хранилището</string>
|
||||
<string name="kdf_explanation">При създаване на ключа за алгоритъма за шифроване, главната парола се преобразува с помощта на функция за извличане на ключ и случайна „сол“.</string>
|
||||
<string name="rounds">Брой преобразувания</string>
|
||||
<string name="sort_ascending">Възходящо ↓</string>
|
||||
<string name="delete_entered_password_title">Премахване на парола</string>
|
||||
<string name="file_not_found_content">Файлът не е намерен. Пробвайте да го отворите от приложението за управление на файлове.</string>
|
||||
<string name="unit_byte">Б</string>
|
||||
<string name="search">Търсене</string>
|
||||
<string name="uppercase">Горен регистър</string>
|
||||
<string name="warning">Внимание</string>
|
||||
<string name="lock_database_back_root_summary">Заключва хранилището при докосване на бутона „Назад“ на началния екран</string>
|
||||
<string name="read_only">Само за четене</string>
|
||||
<string name="contains_duplicate_uuid">Хранилището съдържа повтарящ се идентификатор.</string>
|
||||
<string name="biometric">Биометричен ключ</string>
|
||||
<string name="set_autofill_service_title">Задаване на подразбирана услуга за автоматично попълване</string>
|
||||
<string name="password_size_title">Дължина на създаваните пароли</string>
|
||||
<string name="lock_database_back_root_title">Заключване при „Назад“</string>
|
||||
<string name="content">Съдържание</string>
|
||||
<string name="advanced_unlock">Отключване на устройството</string>
|
||||
<string name="settings_database_recommend_changing_master_key_title">Препоръчителна смяна</string>
|
||||
<string name="settings_database_recommend_changing_master_key_summary">Препоръчване на смяна на главната парола (в дни)</string>
|
||||
<string name="settings_database_force_changing_master_key_title">Принудителна смяна</string>
|
||||
<string name="database_name_title">Име на хранилището</string>
|
||||
<string name="database_description_title">Описание на хранилището</string>
|
||||
<string name="magic_keyboard_title">Настройки на Magikeyboard</string>
|
||||
<string name="keyboard_label">Magikeyboard (KeePassDX)</string>
|
||||
<string name="keyboard_entry_category">Запис</string>
|
||||
<string name="keyboard_appearance_category">Външен вид</string>
|
||||
<string name="allow_no_password_summary">Разрешава докосване на бутона „Отключване“ без попълнена главна парола</string>
|
||||
<string name="delete_entered_password_summary">Премахва въведената парола след опит за отключване на хранилище</string>
|
||||
<string name="reset_education_screens_text">Обучителните подсказки са нулирани</string>
|
||||
<string name="education_entry_edit_summary">Редактирайте записи с потребителски полета. Можете да правите кръстосани връзки между полетата на различни записи.</string>
|
||||
<string name="education_generate_password_title">Създавайте надеждни пароли</string>
|
||||
<string name="education_field_copy_summary">Копираните полета могат да бъдат поставени навсякъде.
|
||||
\n
|
||||
\nИзползвайте предпочитания то вас метод за попълване на формуляри.</string>
|
||||
<string name="exclude_ambiguous_chars">Изключване на еднакво изглеждащите знаци</string>
|
||||
<string name="at_least_one_char">Най-малко по един символ от всяка група</string>
|
||||
<string name="education_entry_new_field_title">Добавяйте полета по ваш избор</string>
|
||||
<string name="icon_pack_choose_title">Пакет с пиктограми</string>
|
||||
<string name="icon_pack_choose_summary">Използвания в приложението пакет с пиктограми</string>
|
||||
<string name="import_app_properties_title">Внасяне на настройки</string>
|
||||
<string name="no_url_handler">Инсталирайте мрежов четец, който да отвори този адрес.</string>
|
||||
<string name="sort_last_modify_time">Дата на промяна</string>
|
||||
<string name="autofill_sign_in_prompt">Влизане чрез KeePassDX</string>
|
||||
<string name="style_choose_title">Тема на приложението</string>
|
||||
<string name="education_search_title">Търсете елементи</string>
|
||||
<string name="corrupted_file">Файлът е повреден.</string>
|
||||
<string name="lowercase">Долен регистър</string>
|
||||
<string name="protection">Защита</string>
|
||||
<string name="space">Интервал</string>
|
||||
<string name="sort_creation_time">Дата на създаване</string>
|
||||
<string name="sort_last_access_time">Дата на последен достъп</string>
|
||||
<string name="special">Специални</string>
|
||||
<string name="underline">Подчертаване</string>
|
||||
<string name="unsupported_db_version">Неподдържана версия на хранилището.</string>
|
||||
<string name="database_history">История</string>
|
||||
<string name="general">Общи</string>
|
||||
<string name="autofill">Автоматично попълване</string>
|
||||
<string name="device_credential">Удостоверяване на устройството</string>
|
||||
<string name="lock_database_show_button_summary">Показва бутон за заключване в интерфейса</string>
|
||||
<string name="assign_master_key">Задаване на главна парола</string>
|
||||
<string name="file_name">Име на файла</string>
|
||||
<string name="path">Път</string>
|
||||
<string name="settings_database_force_changing_master_key_summary">Изисква смяна на главната парола (в дни)</string>
|
||||
<string name="settings_database_force_changing_master_key_next_time_title">Принудителна смяна следващия път</string>
|
||||
<string name="data">Данни</string>
|
||||
<string name="database_data_compression_title">Компресия на данните</string>
|
||||
<string name="database_data_compression_summary">Компресията на данните намалява размера на хранилището</string>
|
||||
<string name="database_version_title">Версия на хранилището</string>
|
||||
<string name="compression">Компресия</string>
|
||||
<string name="compression_none">Няма</string>
|
||||
<string name="compression_gzip">Gzip</string>
|
||||
<string name="templates">Шаблони</string>
|
||||
<string name="keyboard_name">Magikeyboard</string>
|
||||
<string name="keyboard_setting_label">Настройки на Magikeyboard</string>
|
||||
<string name="keyboard_selection_entry_title">Избор на записи</string>
|
||||
<string name="allow_no_password_title">Разрешаване без главна парола</string>
|
||||
<string name="enable_read_only_title">Само за четене</string>
|
||||
<string name="keyboard_notification_entry_content_text">%1$s</string>
|
||||
<string name="keyboard_notification_entry_content_title">Записът %1$s е достъпен в Magikeyboard</string>
|
||||
<string name="keyboard_notification_entry_content_title_text">Запис</string>
|
||||
<string name="enter">Enter</string>
|
||||
<string name="autofill_close_database_title">Затваряне на хранилище</string>
|
||||
<string name="autofill_close_database_summary">Затваряне на хранилището след избор на автоматично попълване</string>
|
||||
<string name="enable_education_screens_summary">Откроява елементи, с цел да опише как работи приложението</string>
|
||||
<string name="reset_education_screens_title">Нулиране на обучителни подсказки</string>
|
||||
<string name="reset_education_screens_summary">Отново показва всички обучителни подсказки</string>
|
||||
<string name="education_create_database_title">Създайте файла на хранилището</string>
|
||||
<string name="education_create_database_summary">Създайте своя първи файл за управление на пароли.</string>
|
||||
<string name="education_select_database_summary">Отворете вече създаден файл на хранилище, за да продължите да го използвате.</string>
|
||||
<string name="education_entry_edit_title">Променяйте записи</string>
|
||||
<string name="education_validate_entry_title">Потвърждаване на записа</string>
|
||||
<string name="education_add_attachment_title">Добавяйте прикачени файлове</string>
|
||||
<string name="education_read_only_title">Хранилище само за четене</string>
|
||||
<string name="education_setup_OTP_title">Настройка на OTP</string>
|
||||
<string name="education_read_only_summary">Променете режима на отваряне за сесията.
|
||||
\n
|
||||
\nРежимът „само за четене“ предотвратява нежеланите промени в хранилището.
|
||||
\nРежимът „за четене и запис“ дава възможност за добавяне, промяна и премахване на елементи.</string>
|
||||
<string name="education_field_copy_title">Копирайте поле</string>
|
||||
<string name="education_lock_title">Заключете хранилището</string>
|
||||
<string name="education_lock_summary">Бързо заключете хранилището. Настройте приложението да се заключва след определено време или при изгасяне на екрана.</string>
|
||||
<string name="education_sort_summary">Изберете признак за подредбата на записи и групи.</string>
|
||||
<string name="education_donation_title">Участвайте</string>
|
||||
<string name="download_attachment">Изтегляне %1$s</string>
|
||||
<string name="upload_attachment">Изпращане %1$s</string>
|
||||
<string name="download_canceled">Отказано!</string>
|
||||
<string name="unit_mebibyte">МиБ</string>
|
||||
<string name="unit_gibibyte">ГиБ</string>
|
||||
<string name="entropy">Ентропия: %1$s бита</string>
|
||||
<string name="entropy_high">Ентропия: висока</string>
|
||||
<string name="consider_chars_filter">Допълнителни знаци</string>
|
||||
<string name="word_separator">Разделител</string>
|
||||
<string name="ignore_chars_filter">Пренебрегнати знаци</string>
|
||||
<string name="title_case">Всяка Дума</string>
|
||||
<string name="screenshot_mode_banner_text">Режим екранни снимки</string>
|
||||
<string name="style_choose_summary">Използваната в приложението тема</string>
|
||||
<string name="show_entry_colors_title">Оцветяване на записи</string>
|
||||
<string name="hide_expired_entries_summary">Записите с изтекла давност не се показват</string>
|
||||
<string name="education_new_node_summary">Елементите дават възможност да управлявате цифрови идентичности.
|
||||
\n
|
||||
\nИзползвайте групите (подобно на папки), за да групирате записите в хранилището.</string>
|
||||
<string name="education_search_summary">Търсете по заглавие, потребител или съдържание на други полета, за да намерите своите пароли.</string>
|
||||
<string name="html_about_contribution">За <strong>запазване на нашата независимост</strong>, <strong>отстраняване на дефекти</strong>, <strong>добавяне на нови възможности</strong> и <strong>поддържане на активна разработка</strong>, разчитаме на вашата <strong>поддръжка</strong>.</string>
|
||||
<string name="lock_database_show_button_title">Бутон за заключване</string>
|
||||
<string name="autofill_explanation_summary">Включете услугата за попълване на формуляри в други приложения</string>
|
||||
<string name="properties">Свойства</string>
|
||||
<string name="enable_read_only_summary">По подразбиране отваря хранилището само за четене</string>
|
||||
<string name="education_validate_entry_summary">Не забравяйте да потвърдите записа и да го запазите в хранилището.
|
||||
\n
|
||||
\nАко се задейства автоматичното заключване, а сте направили промени, рискувате загуба на данни.</string>
|
||||
<string name="education_setup_OTP_summary">Настройте управлението на еднократни пароли (HOTP / TOTP) което да създава кодове за достъп за двустепенно удостоверяване (2FA).</string>
|
||||
<string name="education_unlock_summary">Въведете паролата и/или файла с ключ, за да отключите хранилището.
|
||||
\n
|
||||
\nПравете резервно копие на хранилището на сигурно място след всяка промяна.</string>
|
||||
<string name="lower_case">долен регистър</string>
|
||||
<string name="upper_case">ГОРЕН РЕГИСТЪР</string>
|
||||
<string name="hide_expired_entries_title">Скриване на записите без давност</string>
|
||||
<string name="hint_conf_pass">Потвърждаване на парола</string>
|
||||
<string name="subdomain_search_summary">Търсене на домейни със зададени поддомейни</string>
|
||||
<string name="import_app_properties_summary">Изберете резервно копие на настройките</string>
|
||||
<string name="export_app_properties_summary">Създава резервно копие на настройките</string>
|
||||
<string name="root">Корен</string>
|
||||
<string name="show_uuid_title">Идентификатор</string>
|
||||
<string name="html_text_dev_feature_buy_pro">Купувайки версията <strong>Pro</strong>,</string>
|
||||
<string name="html_text_dev_feature_contibute"><strong>Участвайки в проекта</strong>,</string>
|
||||
<string name="html_text_dev_feature">Тази възможност е <strong>в разработка</strong> и изисква вашето <strong>участие</strong>, за да бъде достъпна скоро.</string>
|
||||
<string name="html_text_feature_generosity">Тази <strong>тема</strong> е достъпна, благодарение на вашата щедрост.</string>
|
||||
<string name="invalid_db_sig">Форматът на хранилището не може да бъде определен.</string>
|
||||
<string name="list_entries_show_username_summary">Показват се потребителските имена в списъка със записите</string>
|
||||
<string name="list_entries_show_username_title">Потребители</string>
|
||||
<string name="list_groups_show_number_entries_title">Брой записи</string>
|
||||
<string name="list_groups_show_number_entries_summary">Показват се броя записи в група</string>
|
||||
<string name="list_size_title">Размер на списъка</string>
|
||||
<string name="contains_duplicate_uuid_procedure">Разрешаване на проблема, чрез създаване на нов идентификатор и продължаване?</string>
|
||||
<string name="show_uuid_summary">Показва се идентификаторът на даден запис или група</string>
|
||||
<string name="list_size_summary">Размер на текста на елементите от списъка</string>
|
||||
<string name="colorize_password_summary">Оцветяване на паролите според вида на знаците</string>
|
||||
<string name="export_app_properties_title">Изнасяне на настройки</string>
|
||||
<string name="enable_screenshot_mode_summary">Разрешава на други приложения да записват и правят снимки на екрана</string>
|
||||
<string name="html_text_dev_feature_thanks">Много благодарим за поддръжката.</string>
|
||||
<string name="html_text_dev_feature_work_hard">Работим усърдно, за да добавим бързо тази възможност.</string>
|
||||
<string name="hint_generated_password">Създадена парола</string>
|
||||
<string name="hint_length">Дължина</string>
|
||||
<string name="invalid_credentials">Неправилна главна парола или файл с ключ.</string>
|
||||
<string name="show_otp_token_summary">Показват се кодовете за достъп от OTP в списъка със записите</string>
|
||||
<string name="show_otp_token_title">Кодове от OTP</string>
|
||||
<string name="error_can_not_handle_uri">Указаният URI не може да бъде обработен от KeePassDX.</string>
|
||||
<string name="error_file_not_create">Файлът не може да бъде създаден.</string>
|
||||
<string name="error_invalid_db">Грешка при четене на хранилището.</string>
|
||||
<string name="hint_icon_name">Наименование на пиктограмата</string>
|
||||
<string name="invalid_db_same_uuid">%1$s с идентификатор %2$s вече съществува.</string>
|
||||
<string name="colorize_password_title">Оцветяване на пароли</string>
|
||||
<string name="enable_screenshot_mode_title">Режим екранни снимки</string>
|
||||
<string name="enable_keep_screen_on_title">Екранът винаги включен</string>
|
||||
<string name="enable_keep_screen_on_summary">Поддържа екрана включен при преглед или промяна на запис</string>
|
||||
<string name="enable_auto_save_database_summary">Запазва хранилището при важни действия (в режим „четене и запис“)</string>
|
||||
<string name="html_text_ad_free">За разлика от много други приложения за управление на пароли това е <strong>без реклами</strong>, <strong>свободно от лицензи</strong> и не събира лични данни на сървърите си без значение каква версия използвате.</string>
|
||||
<string name="html_text_dev_feature_upgrade">Не забравяйте да обновявате приложението.</string>
|
||||
<string name="html_text_dev_feature_encourage">вие поощрявате разработчиците да добавят <strong>нови възможности</strong> и да <strong>отстраняват дефекти</strong> според вашите отзиви.</string>
|
||||
<string name="html_text_buy_pro">Купувайки версията Pro ще имате достъп до тази <strong>тема</strong> и особено ще помогнете за <strong>изпълнението на проекти на общността</strong>.</string>
|
||||
<string name="html_text_donation">Като <strong>допринасяте</strong> за проекта <i>(финансово, с код или преводи)</i> му помагате да живее и процъвтява, а също получавате процедурата за отключване на <strong>темите</strong>.</string>
|
||||
<string name="hint_keyfile">Файл с ключ</string>
|
||||
<string name="invalid_algorithm">Грешен алгоритъм.</string>
|
||||
<string name="description_app_properties">Свойства за управление на настройките на KeePassDX</string>
|
||||
<string name="success_export_app_properties">Настройките на приложението са изнесени</string>
|
||||
<string name="error_export_app_properties">Грешка при изнасяне на настройки.</string>
|
||||
<string name="error_invalid_OTP">Неприемлива тайна за OTP.</string>
|
||||
<string name="error_no_name">Въведете име.</string>
|
||||
<string name="hide_broken_locations_summary">Скрива вече несъществуващи хранилища от списъка с последно отваряните</string>
|
||||
<string name="registration_mode">Режим регистрация</string>
|
||||
<string name="remember_database_locations_title">Запомняне използваните хранилища</string>
|
||||
<string name="show_recent_files_title">Показване на последните хранилища</string>
|
||||
<string name="search_mode">Режим търсене</string>
|
||||
<string name="save_mode">Режим запазване</string>
|
||||
<string name="selection_mode">Режим избиране</string>
|
||||
<string name="remember_database_locations_summary">Запазва местоположението на хранилищата</string>
|
||||
<string name="remember_keyfile_locations_title">Запомняне използваните ключове</string>
|
||||
<string name="remember_keyfile_locations_summary">Запазва местоположението на ключовете</string>
|
||||
<string name="show_recent_files_summary">Показва местоположението на последно използваните хранилища</string>
|
||||
<string name="encryption_explanation">Алгоритъм за шифроване на цялата информация</string>
|
||||
<string name="memory_usage">Използвана памет</string>
|
||||
<string name="error_invalid_path">Уверете се, че пътят е правилен.</string>
|
||||
<string name="error_import_app_properties">Грешка при внасяне на настройки.</string>
|
||||
<string name="parallelism">Паралелно изпълняване</string>
|
||||
<string name="success_import_app_properties">Настройките на приложението са внесени</string>
|
||||
<string name="read_only_warning">В зависимост от приложението за управление на файлове, KeePassDX може да няма права да пише в паметта на устройството.</string>
|
||||
<string name="hide_broken_locations_title">Скриване на липсващи хранилища</string>
|
||||
<string name="rounds_explanation">По-големият брой преобразувания дава по-добра устойчивост срещу атаки с груба сила, но може сериозно да забави зареждането изапазването.</string>
|
||||
<string name="warning_sure_remove_data">Премахване на данните въпреки това?</string>
|
||||
<string name="build_label">Компилация %1$s</string>
|
||||
<string name="warning_permanently_delete_nodes">Безвъзвратно премахване на избраните възли?</string>
|
||||
<string name="warning_database_read_only">Дайте права за писане на файла, за да бъдат запазени промените в хранилището</string>
|
||||
<string name="warning_database_link_revoked">Достъпът до файла е оттеглен от приложението за управление на файлове</string>
|
||||
<string name="warning_empty_password">Продължаване без парола за защита на хранилището?</string>
|
||||
<string name="warning_no_encryption_key">Продължаване без ключ за шифроване?</string>
|
||||
<string name="warning_empty_keyfile">Не е препоръчително да бъде добавян празен файл с ключ.</string>
|
||||
<string name="warning_database_revoked">Достъпът до файла е оттеглен от приложението за управление на файлове, отворете хранилището отново.</string>
|
||||
<string name="version_label">Издание %1$s</string>
|
||||
<string name="list_password_generator_options_title">Знаци за парола</string>
|
||||
<string name="lock_database_screen_off_title">Заключване на екрана</string>
|
||||
<string name="database_data_remove_unlinked_attachments_title">Премахване на несвързани данни</string>
|
||||
<string name="warning_sure_add_file">Добавяне на файла въпреки това?</string>
|
||||
<string name="error_unable_merge_database_kdb">Не е възможно обединяване с хранилище във формат KBD.</string>
|
||||
<string name="memory_usage_explanation">Количество памет, използвана от функцията за извличане на ключове.</string>
|
||||
<string name="warning_database_already_opened">Има отворено хранилище, затворете го, за да отворите друго</string>
|
||||
<string name="warning_replace_file">При добавяне на този файл ще бъде заменен вече съществуващ.</string>
|
||||
<string name="warning_remove_unlinked_attachment">Премахването на несвързаните данни може да намали размера на хранилището, но може да изтрие информация от разширения на KeePass.</string>
|
||||
<string name="warning_database_info_changed">Информация от хранилището е променена извън приложението.</string>
|
||||
<string name="warning_database_info_reloaded">При презареждане на хранилището ще бъдат изгубени местните промени.</string>
|
||||
<string name="merge_success">Обединяването е завършено</string>
|
||||
<string name="configure">Настройка</string>
|
||||
<string name="unavailable">Недостъпно</string>
|
||||
<string name="database_opened">Хранилището е отключено</string>
|
||||
<string name="ask">Питане</string>
|
||||
<string name="list_password_generator_options_summary">Задава набора от разрешени знаци за създаване на парола</string>
|
||||
<string name="later">По-късно</string>
|
||||
<string name="warning_empty_recycle_bin">Безвъзвратно премахване на всички възли в кошчето?</string>
|
||||
<string name="parallelism_explanation">Степен на едновременно изпълняване (т.е. брой нишки), използвана от функцията за извличане на ключове.</string>
|
||||
<string name="warning_password_encoding">Избягвайте да използвате в паролите знаци, които не са от кодировката на текста на хранилището (такива знаци ще бъдат превърнати в една буква).</string>
|
||||
<string name="warning_file_too_big">Предполага се, че хранилищата на KeePass съдържат само малки служебни файлове (например файлове с ключове на PGP).
|
||||
\n
|
||||
\nАко добавите този файл, хранилището ще нарасне много и бързодействието ще намалее.</string>
|
||||
<string name="database_data_remove_unlinked_attachments_summary">Премахва от хранилището прикачени файлове без връзка със запис</string>
|
||||
<string name="warning_empty_keyfile_explanation">Съдържанието на файла с ключ не трябва да бъде променяно и най-добре е да съдържа случайна стойност.</string>
|
||||
<string name="warning_database_info_changed_options">Обединете данните, презапишете външните промени или презаредете хранилището с последните промени.</string>
|
||||
<string name="temp_advanced_unlock_timeout_summary">Време на живот на съдържанието, което се използва за отключване</string>
|
||||
<string name="advanced_unlock_delete_all_key_warning">Да бъдат ли премахнати всички ключове за шифроване, свързани с разпознаването на отключване на устройството?</string>
|
||||
<string name="biometric_delete_all_key_summary">Премахване на всички ключове за шифроване, свързани с разпознаването на отключване на устройството</string>
|
||||
<string name="unavailable_feature_text">Тази възможност не може да бъде използвана.</string>
|
||||
<string name="unavailable_feature_version">Устройството разполага с Андроид %1$s, но е необходим %2$s или по-нов.</string>
|
||||
<string name="templates_group_enable_title">Използване на шаблони</string>
|
||||
<string name="advanced_unlock_prompt_extract_credential_title">Разпознаване на отключване на устройството</string>
|
||||
<string name="credential_before_click_advanced_unlock_button">Въведете паролата и докоснете бутона.</string>
|
||||
<string name="lock_database_screen_off_summary">Заключва хранилището нколко секунди след изключване на екрана</string>
|
||||
<string name="temp_advanced_unlock_enable_summary">За да се възползвате от отключване на устройството не пазете шифровано съдържание</string>
|
||||
<string name="temp_advanced_unlock_timeout_title">Време на действие</string>
|
||||
<string name="advanced_unlock_timeout">Времетраене на отключването на устройството</string>
|
||||
<string name="recycle_bin_title">Използване на кошчето</string>
|
||||
<string name="recycle_bin_summary">Премества групите и записите в групата „Кошче“ вместо да ги премахва директно</string>
|
||||
<string name="advanced_unlock_prompt_store_credential_title">Отключване с устройството</string>
|
||||
<string name="advanced_unlock_scanning_error">Грешка при отключване на устройството: %1$s</string>
|
||||
<string name="advanced_unlock_not_recognized">Не може да бъде разпознато кога устройството е отключено</string>
|
||||
<string name="advanced_unlock_prompt_not_initialized">Заявката за отключване не може да бъде подготвена.</string>
|
||||
<string name="password_size_summary">Подразбирана дължина на създаваните пароли</string>
|
||||
<string name="advanced_unlock_tap_delete">Докоснете, за да премахнете ключовете за отключване на устройството</string>
|
||||
<string name="temp_advanced_unlock_enable_title">Временно отключване на устройството</string>
|
||||
<string name="advanced_unlock_explanation_summary">За по-лесно отключване на хранилището използвайте отключване на устройството</string>
|
||||
<string name="recycle_bin_group_title">Група „Кошче“</string>
|
||||
<string name="templates_group_uuid_title">Група „Шаблони“</string>
|
||||
<string name="advanced_unlock_prompt_extract_credential_message">Извличане на главната парола на хранилището при отключване на устройството</string>
|
||||
<string name="advanced_unlock_invalid_key">Ключът за отключване на устройството не може да бъде прочетен. Премахнете го и повторете процедурата по разпознаване.</string>
|
||||
<string name="advanced_unlock_keystore_warning">Това свойство на приложението ще пази шифровани данни за достъп в защитеното хранилище за ключове на устройството.
|
||||
\n
|
||||
\nВ зависимост реализацията на ППИ на операционната система то може да не е пълнофункционално.
|
||||
\n
|
||||
\nПроверете съвместимостта и степента на сигурност на хранилището за ключове при производителя на устройството или автора на инсталираната операционната система.</string>
|
||||
<string name="templates_group_enable_summary">Използване на динамични шаблони за попълване на полетата на записи</string>
|
||||
<string name="max_history_items_title">Максимален брой записи</string>
|
||||
<string name="max_history_items_summary">Ограничаване на броя на елементите от историята на запис</string>
|
||||
<string name="max_history_size_title">Максимален размер</string>
|
||||
<string name="monospace_font_fields_enable_summary">Полетата използват различен шрифт за по-добра четимост на знаците</string>
|
||||
<string name="magic_keyboard_explanation_summary">Включете потребителска клавиатура, която да попълва пароли и полета за удостоверяване</string>
|
||||
<string name="clear_clipboard_notification_title">Изчистване при затваряне</string>
|
||||
<string name="max_history_size_summary">Ограничаване на размера на историята на всеки запис</string>
|
||||
<string name="keyboard_notification_entry_summary">Показване на известие, когато има достъпен запис</string>
|
||||
<string name="monospace_font_fields_enable_title">Отделен шрифт за полетата</string>
|
||||
<string name="enable">Включване</string>
|
||||
<string name="disable">Изключване</string>
|
||||
<string name="notification">Известие</string>
|
||||
<string name="device_keyboard_setting_title">Настройки на клавиатурата на устройството</string>
|
||||
<string name="keyboard_selection_entry_summary">При преглед на запис в KeePassDX, стойностите на Magikeyboard да бъдат попълнени с неговите данни</string>
|
||||
<string name="keyboard_notification_entry_title">Известие за наличие</string>
|
||||
<string name="error_disallow_no_credentials">Трябва да има зададена най-малко една парола.</string>
|
||||
<string name="error_pass_match">Паролите се различават.</string>
|
||||
<string name="error_string_type">Текстът не съвпада с търсения елемент.</string>
|
||||
<string name="error_registration_read_only">Нов запис не може да бъде добавен в хранилище, отворено само за четене.</string>
|
||||
<string name="error_start_database_action">Възникна грешка при извършване на действие с хранилището.</string>
|
||||
<string name="keyboard_entry_timeout_title">Време за изчакване</string>
|
||||
<string name="autofill_application_id_blocklist_title">Черен списък на приложения</string>
|
||||
<string name="autofill_read_only_save">В хранилище, отворено само за четене не могат да бъдат запазвани промени.</string>
|
||||
<string name="error_move_group_here">Група не може да бъде преместена тук.</string>
|
||||
<string name="keyboard_notification_entry_clear_close_title">Изчистване при затваряне</string>
|
||||
<string name="autofill_save_search_info_summary">При ръчен избор на запис прави опит за запазване на информация от търсене за по-лесно бъдещо използване</string>
|
||||
<string name="keyboard_change">Превключване на клавиатури</string>
|
||||
<string name="autofill_application_id_blocklist_summary">Списък от приложения, в които автоматично попълване да не работи</string>
|
||||
<string name="autofill_block">Спиране на автоматичното попълване</string>
|
||||
<string name="keyboard_previous_lock_title">Заключване на хранилище</string>
|
||||
<string name="error_word_reserved">Тази дума е запазена и не може да бъде използвана.</string>
|
||||
<string name="error_load_database">Хранилището не може да бъде заредено.</string>
|
||||
<string name="error_create_database_file">С тази парола и ключ хранилище не може да бъде създадено.</string>
|
||||
<string name="error_duplicate_file">Файл с тези данни съществува.</string>
|
||||
<string name="error_file_to_big">Файлът, който изпращате е твърде голям.</string>
|
||||
<string name="keyboard_save_search_info_title">Запазване на обща информация</string>
|
||||
<string name="keyboard_notification_entry_clear_close_summary">Затваря хранилището при затваряне на известието</string>
|
||||
<string name="keyboard_auto_go_action_summary">Действие на бутона „Напред“ след докоснат бутон „Поле“</string>
|
||||
<string name="keyboard_previous_database_credentials_summary">Автоматично превключва предната клавиатура на екрана за удостоверяване на хранилището</string>
|
||||
<string name="error_wrong_length">Полето „Дължина“ трябва да има положителна целочислена стойност.</string>
|
||||
<string name="error_autofill_enable_service">Услугата за автоматично попълване не може да бъде включена.</string>
|
||||
<string name="error_move_entry_here">Запис не може да бъде преместен тук.</string>
|
||||
<string name="error_otp_digits">Кодът за достъп трябва да съдържа от %1$d до %2$d цифри.</string>
|
||||
<string name="keyboard_key_vibrate_title">Тактилна обратна връзка</string>
|
||||
<string name="error_copy_entry_here">Запис не може да бъде копиран тук.</string>
|
||||
<string name="error_pass_gen_type">Изберете един или повече вида знаци.</string>
|
||||
<string name="error_copy_group_here">Група не може да бъде копирана тук.</string>
|
||||
<string name="error_create_database">Хранилището не може да бъде създадено.</string>
|
||||
<string name="error_otp_counter">Броячът трябва да бъде в интервала от %1$d до %2$d.</string>
|
||||
<string name="keyboard_previous_fill_in_title">Превключване назад</string>
|
||||
<string name="keyboard_previous_search_summary">Автоматично превключва предната клавиатура на екрана за търсене</string>
|
||||
<string name="keyboard_previous_fill_in_summary">Автоматично превключва предната клавиатура след докосване на бутона за автоматично действие</string>
|
||||
<string name="autofill_block_restart">Рестартирайте приложението, съдържащо формуляра, за да влезе в сила ограничението.</string>
|
||||
<string name="autofill_inline_suggestions_keyboard">Предложения за автом. попълване са добавени.</string>
|
||||
<string name="error_rounds_too_large">Полето „Брой преобразувания“ има твърде голяма стойност. Променена е на 2147483648.</string>
|
||||
<string name="error_string_key">Всяко поле трябва да има наименование.</string>
|
||||
<string name="error_label_exists">Такъв етикет вече съществува.</string>
|
||||
<string name="error_save_database">Хранилището не може да бъде запазено.</string>
|
||||
<string name="error_otp_period">Периодът трябва да бъде в интервала от %1$d до %2$d секунди.</string>
|
||||
<string name="autofill_inline_suggestions_summary">Опит за показване предложения за автоматично попълване от съвместимата клавиатура</string>
|
||||
<string name="keyboard_save_search_info_summary">При ръчен избор на запис прави опит за запазване на обща информация за по-лесно бъдещо използване</string>
|
||||
<string name="autofill_ask_to_save_data_title">Питане за запазване на данни</string>
|
||||
<string name="autofill_ask_to_save_data_summary">Искане на разрешение за запазване на информация след попълване на формуляр</string>
|
||||
<string name="autofill_web_domain_blocklist_title">Черен списък на домейни</string>
|
||||
<string name="error_response_already_provided">Отговор вече е получен.</string>
|
||||
<string name="autofill_web_domain_blocklist_summary">Списък от домейни, на които автоматично попълване да не работи</string>
|
||||
<string name="error_out_of_memory">Недостатъчно памет за работа с хранилището.</string>
|
||||
<string name="error_XML_malformed">Повреден XML.</string>
|
||||
<string name="error_otp_secret_key">Тайният ключ трябва да бъде във формат Base32.</string>
|
||||
<string name="error_field_name_already_exists">Поле с такова име съществува.</string>
|
||||
<string name="error_no_response_from_challenge">Не може да бъде получен отговор на предизвикването.</string>
|
||||
<string name="error_challenge_already_requested">Предизвикване вече е заявено.</string>
|
||||
<string name="permission">Разрешение</string>
|
||||
<string name="keyboard_entry_timeout_summary">Изчакване, след което записът се изчиства от клавиатурата</string>
|
||||
<string name="keyboard_key_sound_title">Звукова обратна връзка</string>
|
||||
<string name="keyboard_previous_search_title">Екран за търсене</string>
|
||||
<string name="keyboard_previous_lock_summary">Автоматично превключва предната клавиатура след заключване на хранилището</string>
|
||||
<string name="autofill_inline_suggestions_title">Предложения на място</string>
|
||||
<string name="autofill_manual_selection_title">Ръчен избор</string>
|
||||
<string name="autofill_manual_selection_summary">Показване на възможните записи от хранилището, от които потребителят да избере</string>
|
||||
<string name="autofill_save_search_info_title">Запазване на информация от търсене</string>
|
||||
<string name="biometric_unlock_enable_title">Биометрично отключване</string>
|
||||
<string name="biometric_auto_open_prompt_title">Питане при автоматично отключване</string>
|
||||
<string name="configure_biometric">Не са регистрирани биометрични или други способи за отключване на устройството.</string>
|
||||
<string name="biometric_security_update_required">Необходимо е обновяване на биометричната система за сигурност.</string>
|
||||
<string name="encrypted_value_stored">Шифрованата парола е запазена</string>
|
||||
<string name="keystore_not_accessible">Хранилището за ключове не е подготвено.</string>
|
||||
<string name="clipboard">Междинна памет</string>
|
||||
<string name="device_credential_unlock_enable_title">Отключване на устройството</string>
|
||||
<string name="error_database_uri_null">Идентификаторът на хранилището не може да бъде получен.</string>
|
||||
<string name="error_remove_file">Грешка при премахване на файла.</string>
|
||||
<string name="error_upload_file">Грешка при изпращане на файла.</string>
|
||||
<string name="error_cancel_by_user">Отказано от потребителя.</string>
|
||||
<string name="error_driver_required">За %1$s е необходим драйвер.</string>
|
||||
<string name="error_location_unknown">Мястото на хранилището е неизвестно, действието не може да бъде извършено.</string>
|
||||
<string name="warning_copy_permission">Разрешението е необходимо за показване на известия за междинната памет.</string>
|
||||
<string name="unlock_and_link_biometric">Настройка отключване с устройството</string>
|
||||
<string name="clipboard_warning">При неуспешно автоматично изчистване на междинната памет, изчистете историята ѝ ръчно.</string>
|
||||
<string name="clipboard_notifications_title">Известия от междинната памет</string>
|
||||
<string name="clipboard_notifications_summary">Известия от междинната памет за копиране на полета при преглед на запис</string>
|
||||
<string name="biometric_unlock_enable_summary">Дава възможност за отключване на хранилището посредством биометрични данни</string>
|
||||
<string name="device_credential_unlock_enable_summary">Дава възможност за отключване на хранилището при отключване на устройството</string>
|
||||
<string name="biometric_auto_open_prompt_summary">Автоматична заявка за отключване на устройството ако хранилището се отключва с устройството</string>
|
||||
<string name="allow_copy_password_summary">Разрешава копиране на паролите и защитените полета от записите в междинната памет</string>
|
||||
<string name="error_rebuild_list">Списъкът не може да бъде изграден отново.</string>
|
||||
<string name="error_otp_type">Формулярът не разпознава този вид OTP и може да не създава правилни кодове за достъп.</string>
|
||||
<string name="warning_keyfile_integrity">Отпечатъкът от файла не е сигурен, защото Андроид може да променя данните в движение. Променете разширението на файла на .bin, за бъде невредим.</string>
|
||||
<string name="allow_copy_password_title">Доверяване на междинната памет</string>
|
||||
<string name="warning_exact_alarm">Приложението няма права за използване на точен будилник. В резултат на това дейностите, които зависят от него няма да се изпълняват на време.</string>
|
||||
<string name="clear_clipboard_notification_summary">Заключва хранилището при затваряне на известието или изтече времето за изчакване на междинната памет</string>
|
||||
<string name="warning_database_notification_permission">Разрешението дава възможност за показване на състоянието на хранилището, както и да го заключвате с леснодостъпен бутон.
|
||||
\n
|
||||
\nАко не предоставите това разрешение, отвореното във фонов режим хранилище няма да бъде видимо, ако друго приложение се показва в момента.</string>
|
||||
<string name="style_name_forest">Горска</string>
|
||||
<string name="style_name_divine">Божествена</string>
|
||||
<string name="style_name_classic">Класическа</string>
|
||||
<string name="style_name_simple">Обикновена</string>
|
||||
<string name="style_name_moon">Лунна</string>
|
||||
<string name="style_name_sun">Слънчева</string>
|
||||
<string name="style_name_reply">Отговор</string>
|
||||
<string name="style_name_kunzite">Авторска</string>
|
||||
<string name="style_name_follow_system">Като системната</string>
|
||||
<string name="style_name_light">Светла</string>
|
||||
<string name="style_name_dark">Тъмна</string>
|
||||
<string name="warning_database_info_changed_options_read_only">Презаредете последните промени в хранилището.</string>
|
||||
<string name="generate_keyfile">Създаване на файл с ключ</string>
|
||||
<string name="nodes">Възли</string>
|
||||
<string name="recursive_number_entries_summary">Изчислява броя на всички записи в групата</string>
|
||||
<string name="recursive_number_entries_title">Брой на записите</string>
|
||||
<string name="warning_large_keyfile">Не се препоръчва използването на голям файл с ключ, защото може да попречи на отварянето на хранилището.</string>
|
||||
<string name="hide_templates_summary">Шаблоните не се показват</string>
|
||||
<string name="hide_templates_title">Скриване на шаблоните</string>
|
||||
</resources>
|
||||
|
||||
@@ -155,8 +155,8 @@
|
||||
<string name="version">সংস্করণ</string>
|
||||
<string name="error_arc4">আর্কফোর স্ট্রিম সাইফার সমর্থিত নয়।</string>
|
||||
<string name="error_can_not_handle_uri">KeePassDX-এ এই URI পরিচালনা করা যায়নি।</string>
|
||||
<string name="error_file_not_create">ফাইল তৈরি করা যায়নি</string>
|
||||
<string name="error_invalid_db">ডাটাবেস পড়া যায়নি.</string>
|
||||
<string name="error_file_not_create">ফাইল তৈরি করা যায়নি।</string>
|
||||
<string name="error_invalid_db">ডাটাবেস পড়া যায়নি।</string>
|
||||
<string name="error_invalid_path">পথ সঠিক কিনা নিশ্চিত করুন।</string>
|
||||
<string name="error_invalid_OTP">অবৈধ OTP গোপন.</string>
|
||||
<string name="error_no_name">একটি নাম লিখুন।</string>
|
||||
@@ -169,7 +169,7 @@
|
||||
<string name="error_copy_entry_here">আপনি এখানে একটি এন্ট্রি কপি করতে পারবেন না.</string>
|
||||
<string name="error_copy_group_here">আপনি এখানে একটি গ্রুপ অনুলিপি করতে পারবেন না.</string>
|
||||
<string name="error_create_database">ডাটাবেস ফাইল তৈরি করতে অক্ষম।</string>
|
||||
<string name="error_create_database_file">এই পাসওয়ার্ড এবং কীফাইল দিয়ে ডাটাবেস তৈরি করতে অক্ষম৷</string>
|
||||
<string name="error_create_database_file">এই পাসওয়ার্ড এবং কীফাইল দিয়ে ডাটাবেস তৈরি করতে অক্ষম৷।</string>
|
||||
<string name="error_move_group_here">আপনি এখানে একটি গ্রুপ সরাতে পারবেন না.</string>
|
||||
<string name="error_otp_type">বিদ্যমান OTP প্রকারটি এই ফর্ম দ্বারা স্বীকৃত নয়, এর বৈধতা আর সঠিকভাবে টোকেন তৈরি করতে পারে না।</string>
|
||||
<string name="error_string_type">এই পাঠ্যটি অনুরোধ করা আইটেমের সাথে মেলে না।</string>
|
||||
@@ -263,8 +263,8 @@
|
||||
<string name="error_rebuild_list">সঠিকভাবে তালিকা পুনর্নির্মাণ করতে অক্ষম.</string>
|
||||
<string name="error_duplicate_file">ফাইল ডেটা ইতিমধ্যেই বিদ্যমান।</string>
|
||||
<string name="error_response_already_provided">প্রতিক্রিয়া ইতিমধ্যে প্রদান করা হয়েছে.</string>
|
||||
<string name="error_driver_required">%1$s এর জন্য ড্রাইভার প্রয়োজন৷</string>
|
||||
<string name="error_unable_merge_database_kdb">একটি ডাটাবেস V1 থেকে মার্জ করতে অক্ষম৷</string>
|
||||
<string name="error_driver_required">%1$s এর জন্য ড্রাইভার প্রয়োজন৷।</string>
|
||||
<string name="error_unable_merge_database_kdb">একটি ডাটাবেস V1 থেকে মার্জ করতে অক্ষম৷।</string>
|
||||
<string name="error_location_unknown">ডাটাবেস অবস্থান অজানা, ডাটাবেস কর্ম সঞ্চালিত করা যাবে না.</string>
|
||||
<string name="error_hardware_key_unsupported">হার্ডওয়্যার কী সমর্থিত নয়।</string>
|
||||
<string name="error_empty_key">কী খালি হতে পারে না।</string>
|
||||
@@ -337,12 +337,12 @@
|
||||
<string name="menu_empty_recycle_bin">রিসাইকেল বিন খালি করুন</string>
|
||||
<string name="menu_restore_entry_history">ইতিহাস পুনরুদ্ধার করুন</string>
|
||||
<string name="rounds_explanation">অতিরিক্ত এনক্রিপশন রাউন্ডগুলি ব্রুট ফোর্স অ্যাটাকগুলির বিরুদ্ধে উচ্চ সুরক্ষা প্রদান করে, তবে এটি সত্যিই লোড এবং সংরক্ষণকে ধীর করে দিতে পারে।</string>
|
||||
<string name="error_export_app_properties">অ্যাপ্লিকেশন বৈশিষ্ট্য রপ্তানি সময় ত্রুটি</string>
|
||||
<string name="error_export_app_properties">অ্যাপ্লিকেশন বৈশিষ্ট্য রপ্তানি সময় ত্রুটি।</string>
|
||||
<string name="command_execution">কমান্ড কার্যকর করা হচ্ছে…</string>
|
||||
<string name="export_app_properties_title">অ্যাপের বৈশিষ্ট্য রপ্তানি করুন</string>
|
||||
<string name="export_app_properties_summary">অ্যাপের বৈশিষ্ট্য রপ্তানি করতে একটি ফাইল তৈরি করুন</string>
|
||||
<string name="description_app_properties">অ্যাপ সেটিংস পরিচালনা করতে KeePassDX বৈশিষ্ট্য</string>
|
||||
<string name="error_import_app_properties">অ্যাপ বৈশিষ্ট্য আমদানির সময় ত্রুটি</string>
|
||||
<string name="error_import_app_properties">অ্যাপ বৈশিষ্ট্য আমদানির সময় ত্রুটি।</string>
|
||||
<string name="warning_database_already_opened">একটি ডাটাবেস ইতিমধ্যেই খোলা আছে, নতুনটি খুলতে প্রথমে এটি বন্ধ করুন</string>
|
||||
<string name="warning_empty_keyfile_explanation">কীফাইলের বিষয়বস্তু কখনই পরিবর্তন করা উচিত নয় এবং সর্বোত্তম ক্ষেত্রে, এলোমেলোভাবে উৎপন্ন ডেটা থাকা উচিত।</string>
|
||||
<string name="warning_remove_unlinked_attachment">আনলিঙ্ক করা ডেটা মুছে দিলে আপনার ডাটাবেসের আকার কমে যেতে পারে কিন্তু KeePass প্লাগইনগুলির জন্য ব্যবহৃত ডেটাও মুছে যেতে পারে।</string>
|
||||
@@ -354,16 +354,16 @@
|
||||
<string name="waiting_challenge_response">চ্যালেঞ্জের প্রতিক্রিয়ার জন্য অপেক্ষা করা হচ্ছে…</string>
|
||||
<string name="template_group_name">টেমপ্লেট</string>
|
||||
<string name="save">সংরক্ষণ</string>
|
||||
<string name="error_remove_file">ফাইল ডেটা সরানোর সময় একটি ত্রুটি ঘটেছে৷</string>
|
||||
<string name="error_start_database_action">ডাটাবেসে একটি ক্রিয়া সম্পাদন করার সময় একটি ত্রুটি ঘটেছে৷</string>
|
||||
<string name="error_challenge_already_requested">চ্যালেঞ্জ ইতিমধ্যে অনুরোধ করা হয়েছে</string>
|
||||
<string name="error_remove_file">ফাইল ডেটা সরানোর সময় একটি ত্রুটি ঘটেছে৷।</string>
|
||||
<string name="error_start_database_action">ডাটাবেসে একটি ক্রিয়া সম্পাদন করার সময় একটি ত্রুটি ঘটেছে৷।</string>
|
||||
<string name="error_challenge_already_requested">চ্যালেঞ্জ ইতিমধ্যে অনুরোধ করা হয়েছে।</string>
|
||||
<string name="error_otp_secret_key">গোপন কী অবশ্যই বেস 32 ফর্ম্যাটে হতে হবে।</string>
|
||||
<string name="error_otp_counter">কাউন্টার অবশ্যই %1$d এবং %2$d এর মধ্যে হতে হবে।</string>
|
||||
<string name="error_otp_period">সময়কাল %1$d এবং %2$d সেকেন্ডের মধ্যে হতে হবে।</string>
|
||||
<string name="error_otp_digits">টোকেনে %1$d থেকে %2$d সংখ্যা থাকতে হবে।</string>
|
||||
<string name="error_upload_file">ফাইল ডেটা আপলোড করার সময় একটি ত্রুটি ঘটেছে৷</string>
|
||||
<string name="error_upload_file">ফাইল ডেটা আপলোড করার সময় একটি ত্রুটি ঘটেছে৷।</string>
|
||||
<string name="error_save_database">ডাটাবেস সংরক্ষণ করা যায়নি.</string>
|
||||
<string name="parallelism_explanation">কী ডেরিভেশন ফাংশন দ্বারা ব্যবহৃত সমান্তরালতার ডিগ্রি (যেমন থ্রেডের সংখ্যা)।</string>
|
||||
<string name="saving_database">ডাটাবেস সংরক্ষণ করা হচ্ছে…</string>
|
||||
<string name="consider_chars_filter">Aintzat hartu karaktereak</string>
|
||||
</resources>
|
||||
</resources>
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
<string name="application">Aplicació</string>
|
||||
<string name="menu_app_settings">Configuració de l\'aplicació</string>
|
||||
<string name="brackets">Parèntesis</string>
|
||||
<string name="file_manager_install_description">Es requereix un gestor d\'arxius que accepti les intencions ACTION_CREATE_DOCUMENT i ACTION_OPEN_DOCUMENT per a crear, obrir i desar fitxers de base de dades.</string>
|
||||
<string name="file_manager_install_description">Cal crear un gestor de fitxers que accepti les accions intencionals ACTION_CREATE_DOCUMENT i ACTION_OPEN_DOCUMENT per crear, obrir i desar fitxers de base de dades.</string>
|
||||
<string name="clipboard_cleared">Porta-retalls netejat</string>
|
||||
<string name="clipboard_timeout">Temps d\'espera del porta-retalls</string>
|
||||
<string name="clipboard_timeout_summary">Temps abans de netejar el porta-retalls (si el teu dispositiu ho suporta)</string>
|
||||
@@ -42,7 +42,7 @@
|
||||
<string name="digits">Dígits</string>
|
||||
<string name="html_about_licence">KeePassDX © %1$d Kunzisoft és <strong> programari lliure </strong> i <strong>sense anuncis</strong>.
|
||||
\nEs proporciona tal com està, sota una llicència <strong>GPLv3</strong>, sense cap garantia.</string>
|
||||
<string name="select_database_file">Obri una base de dades existent</string>
|
||||
<string name="select_database_file">Obre una caixa forta existent</string>
|
||||
<string name="entry_accessed">Accedida</string>
|
||||
<string name="entry_cancel">Cancel·la</string>
|
||||
<string name="entry_notes">Comentaris</string>
|
||||
@@ -58,7 +58,7 @@
|
||||
<string name="entry_user_name">Nom d’usuari</string>
|
||||
<string name="error_arc4">No s’admet el xifratge de flux Arcfour.</string>
|
||||
<string name="error_can_not_handle_uri">El KeePassDX no pot gestionar aquest URI.</string>
|
||||
<string name="error_file_not_create">No s’ha pogut crear el fitxer</string>
|
||||
<string name="error_file_not_create">No s’ha pogut crear el fitxer.</string>
|
||||
<string name="error_invalid_db">No s’ha pogut llegir la base de dades.</string>
|
||||
<string name="error_invalid_path">Assegureu-vos que el camí és correcte.</string>
|
||||
<string name="error_no_name">Introduïu-hi un nom.</string>
|
||||
@@ -98,11 +98,11 @@
|
||||
<string name="menu_open">Obre</string>
|
||||
<string name="menu_search">Cerca</string>
|
||||
<string name="menu_showpass">Mostra la contrasenya</string>
|
||||
<string name="menu_url">Ves a la URL</string>
|
||||
<string name="menu_url">Ves a l\'URL</string>
|
||||
<string name="minus">Menys</string>
|
||||
<string name="never">Mai</string>
|
||||
<string name="no_results">Cap resultat de cerca</string>
|
||||
<string name="no_url_handler">Instal·leu un navegador web per a obri aquesta URL</string>
|
||||
<string name="no_url_handler">Instal·leu un navegador web per a obrir aquest URL.</string>
|
||||
<string name="progress_create">Creant nova base de dades…</string>
|
||||
<string name="progress_title">Treballant…</string>
|
||||
<string name="content_description_remove_from_list">Elimina</string>
|
||||
@@ -150,18 +150,18 @@
|
||||
<string name="recycle_bin_group_title">Grup paperera</string>
|
||||
<string name="recycle_bin_summary">Mou els grups i les entrades al grup \"paperera\" abans de suprimir-los</string>
|
||||
<string name="recycle_bin_title">Ús de la paperera</string>
|
||||
<string name="database_data_compression_summary">La compressió de les dades redueix la mida de la base de dades.</string>
|
||||
<string name="database_data_compression_summary">La compressió de les dades redueix la mida de la base de dades</string>
|
||||
<string name="database_data_compression_title">Compressió de les dades</string>
|
||||
<string name="assign_master_key">Assigna una contrasenya mestra</string>
|
||||
<string name="path">Camí</string>
|
||||
<string name="file_name">Nom de fitxer</string>
|
||||
<string name="unavailable_feature_version">La vostra versió d\'Android (%1$s) no compleix els requeriments; la versió mínima és %2$s.</string>
|
||||
<string name="unavailable_feature_version">El dispositiu està executant Android %1$s, però es necessita %2$s o superior.</string>
|
||||
<string name="biometric_delete_all_key_title">Suprimeix les claus de xifrat</string>
|
||||
<string name="lock_database_show_button_summary">Mostra el botó de blocar en la interfície d\'usuari</string>
|
||||
<string name="lock_database_show_button_title">Mostra el botó de blocar</string>
|
||||
<string name="lock_database_back_root_summary">Bloca la base de dades quan l\'usuari toca el botó enrere en la pantalla principal</string>
|
||||
<string name="lock_database_back_root_title">Premeu \'enrere\' per a blocar</string>
|
||||
<string name="lock_database_screen_off_summary">Bloca la base de dades quan la pantalla està desactivada</string>
|
||||
<string name="lock_database_screen_off_summary">Bloqueja la base de dades després d\'uns segons de desactivar la pantalla</string>
|
||||
<string name="lock">Bloca</string>
|
||||
<string name="clipboard_warning">Si la supressió automàtica del porta-retalls falla, suprimiu-ne la història manualment.</string>
|
||||
<string name="clipboard_notifications_title">Notificacions del porta-retalls</string>
|
||||
@@ -177,7 +177,7 @@
|
||||
<string name="autofill">Autocompleta</string>
|
||||
<string name="general">General</string>
|
||||
<string name="biometric">Biomètric</string>
|
||||
<string name="menu_appearance_settings">Apariència</string>
|
||||
<string name="menu_appearance_settings">Aparença</string>
|
||||
<string name="database_history">Història</string>
|
||||
<string name="encrypted_value_stored">Contrasenya xifrada desada</string>
|
||||
<string name="warning_permanently_delete_nodes">Voleu suprimir definitivament els nodes seleccionats\?</string>
|
||||
@@ -199,7 +199,7 @@
|
||||
<string name="show_recent_files_summary">Mostra la ubicació de les bases de dades recents</string>
|
||||
<string name="show_recent_files_title">Mostra els fitxers recents</string>
|
||||
<string name="remember_keyfile_locations_title">Recorda la ubicació dels fitxers de claus</string>
|
||||
<string name="remember_database_locations_summary">Recorda la ubicació de les bases de dades</string>
|
||||
<string name="remember_database_locations_summary">Fes un seguiment d\'on s\'emmagatzemen les bases de dades</string>
|
||||
<string name="remember_database_locations_title">Recorda l\'ubicació de les bases de dades</string>
|
||||
<string name="selection_mode">Mode de selecció</string>
|
||||
<string name="contains_duplicate_uuid_procedure">Voleu resoldre el problema creant nous UUIDs per als duplicats per a continuar\?</string>
|
||||
@@ -209,13 +209,13 @@
|
||||
<string name="protection">Protecció</string>
|
||||
<string name="auto_focus_search_summary">Sol·licita una cerca quan s\'obre una base de dades</string>
|
||||
<string name="auto_focus_search_title">Cerca ràpida</string>
|
||||
<string name="create_keepass_file">Crea una nova base de dades</string>
|
||||
<string name="create_keepass_file">Crea una caixa forta</string>
|
||||
<string name="menu_delete_entry_history">Suprimeix la història</string>
|
||||
<string name="menu_restore_entry_history">Restaura la història</string>
|
||||
<string name="menu_empty_recycle_bin">Buida la paperera</string>
|
||||
<string name="menu_open_file_read_and_write">Modificable</string>
|
||||
<string name="menu_file_selection_read_only">Protegit contra escriptura</string>
|
||||
<string name="menu_save_database">Desa la base de dades</string>
|
||||
<string name="menu_save_database">Desa les dades</string>
|
||||
<string name="menu_cancel">Cancel·lar</string>
|
||||
<string name="menu_paste">Enganxar</string>
|
||||
<string name="menu_move">Moure</string>
|
||||
@@ -228,11 +228,11 @@
|
||||
<string name="creating_database">Es crea la base de dades…</string>
|
||||
<string name="list_groups_show_number_entries_summary">Mostra el nombre d\'entrades en un grup</string>
|
||||
<string name="list_groups_show_number_entries_title">Mostra el nombre d\'entades</string>
|
||||
<string name="list_entries_show_username_summary">Mostra els noms d\'usuari en les llistes d\'entrades</string>
|
||||
<string name="list_entries_show_username_summary">Mostra els noms d\'usuari a les llistes d\'entrades</string>
|
||||
<string name="list_entries_show_username_title">Mostra noms d\'usuari</string>
|
||||
<string name="keyfile_is_empty">El fitxer de clau és buit.</string>
|
||||
<string name="invalid_algorithm">Algorisme incorrecte.</string>
|
||||
<string name="file_not_found_content">No s\'ha trobat el fitxer. Mireu de reobrir-lo des de l\'explorador de fitxers.</string>
|
||||
<string name="file_not_found_content">No s\'ha trobat el fitxer. Mireu de tornar-lo a obrir des de l\'explorador de fitxers.</string>
|
||||
<string name="field_value">Valor del camp</string>
|
||||
<string name="field_name">Nom del camp</string>
|
||||
<string name="error_otp_digits">El testimoni ha de tenir entre %1$d i %2$d dígits.</string>
|
||||
@@ -283,9 +283,9 @@
|
||||
<string name="error_rebuild_list">La llista no s\'ha pogut reconstruir correctament.</string>
|
||||
<string name="error_database_uri_null">No es pot recuperar l\'URI de la base de dades.</string>
|
||||
<string name="error_field_name_already_exists">El nom del camp ja existeix.</string>
|
||||
<string name="error_registration_read_only">No es permet desar un element nou en una base de dades de només lectura</string>
|
||||
<string name="error_registration_read_only">No es permet desar un element nou en una base de dades de només lectura.</string>
|
||||
<string name="error_string_type">Aquest text no coincideix amb l\'element sol·licitat.</string>
|
||||
<string name="error_otp_type">L\'OTP existent no està reconegut per aquest formulari, la seva validació ja no pot generar correctament el token.</string>
|
||||
<string name="error_otp_type">L\'OTP existent no està reconegut per aquest formulari, la seva validació ja no pot generar correctament el testimoni.</string>
|
||||
<string name="error_create_database_file">No s’ha pogut crear una base de dades amb aquesta contrasenya i fitxer de clau.</string>
|
||||
<string name="error_autofill_enable_service">No s’ha pogut habilitar el servei de compleció automàtica.</string>
|
||||
<string name="content_description_node_children">Nodes fill</string>
|
||||
@@ -295,7 +295,7 @@
|
||||
<string name="warning_sure_add_file">Voleu afegir el fitxer igualment\?</string>
|
||||
<string name="warning_empty_password">Voleu continuar sense la protecció contra desblocatge amb contrasenya\?</string>
|
||||
<string name="error_move_group_here">No és possible moure cap grup aquí.</string>
|
||||
<string name="error_load_database_KDF_memory">No s’ha pogut carregar la clau. Proveu de reduir l’«Ús de memòria» del KDF.</string>
|
||||
<string name="error_load_database_KDF_memory">No s’ha pogut carregar la clau. Proveu de reduir l\'«Ús de memòria» del KDF.</string>
|
||||
<string name="error_word_reserved">Aquesta paraula està reservada i no es pot usar.</string>
|
||||
<string name="error_invalid_OTP">El secret OTP no és vàlid.</string>
|
||||
<string name="education_read_only_title">Protecció contra escriptura de la base de dades</string>
|
||||
@@ -312,7 +312,7 @@
|
||||
<string name="html_text_feature_generosity">Aquest <strong>estil visual</strong> és disponible gràcies a la vostra generositat.</string>
|
||||
<string name="html_text_dev_feature_upgrade">No us oblideu de mantenir l’aplicació actualitzada instal·lant les versions noves.</string>
|
||||
<string name="icon_section_standard">Estàndard</string>
|
||||
<string name="show_uuid_title">Mostra l’UUID</string>
|
||||
<string name="show_uuid_title">Mostra l\'UUID</string>
|
||||
<string name="hide_expired_entries_summary">No es mostren les entrades expirades</string>
|
||||
<string name="hide_expired_entries_title">Amaga les entrades expirades</string>
|
||||
<string name="contribute">Contribuïu-hi</string>
|
||||
@@ -328,7 +328,7 @@
|
||||
<string name="icon_pack_choose_title">Paquet d’icones</string>
|
||||
<string name="icon_section_custom">Personalitzat</string>
|
||||
<string name="template_group_name">Plantilles</string>
|
||||
<string name="error_unable_merge_database_kdb">No es pot fusionar d\'una base de dades V1.</string>
|
||||
<string name="error_unable_merge_database_kdb">No es pot fusionar d\'una base de dades V1</string>
|
||||
<string name="auto_type">Auto-Escriptura</string>
|
||||
<string name="import_app_properties_title">Importar configuració de l\'aplicació</string>
|
||||
<string name="card_verification_value">CVV</string>
|
||||
@@ -365,10 +365,10 @@
|
||||
<string name="advanced_unlock">Desbloqueja dispositiu</string>
|
||||
<string name="template">Plantilla</string>
|
||||
<string name="title_case">Primera Majúscula</string>
|
||||
<string name="navigation_drawer_open">Obrir calaix de navegació</string>
|
||||
<string name="navigation_drawer_open">El calaix de navegació està obert</string>
|
||||
<string name="max_history_size_summary">Limita la mida de l\'historial per entrada</string>
|
||||
<string name="success_export_app_properties">Configuració de l\'aplicació exportada</string>
|
||||
<string name="error_export_app_properties">Error a l\'exportar la configuració de l\'aplicació</string>
|
||||
<string name="error_export_app_properties">Error a l\'exportar la configuració de l\'aplicació.</string>
|
||||
<string name="type">Tipus</string>
|
||||
<string name="content_description_hardware_key_checkbox">Casella de clau física</string>
|
||||
<string name="settings_database_recommend_changing_master_key_title">Recomanar renovació</string>
|
||||
@@ -380,7 +380,7 @@
|
||||
<string name="autofill_close_database_summary">Tanca la base de dades després d\'auto-completar</string>
|
||||
<string name="screenshot_mode_banner_text">Mode captura de pantalla</string>
|
||||
<string name="application_appearance">Interfície</string>
|
||||
<string name="error_import_app_properties">Error a l\'importar la configuració de l\'aplicació</string>
|
||||
<string name="error_import_app_properties">Error a l\'importar la configuració de l\'aplicació.</string>
|
||||
<string name="case_sensitive">Sensible a majúscules i minúscules</string>
|
||||
<string name="error_location_unknown">Localització de la base de dades desconeguda, l\'acció no es pot fer.</string>
|
||||
<string name="membership">Pertinença</string>
|
||||
@@ -418,7 +418,7 @@
|
||||
<string name="standard">Estàndard</string>
|
||||
<string name="error_XML_malformed">XML mal format.</string>
|
||||
<string name="remember_hardware_key_summary">Recorda les claus físiques que s\'han usat</string>
|
||||
<string name="token">Token</string>
|
||||
<string name="token">Testimoni</string>
|
||||
<string name="debit_credit_card">Targeta de Dèbit / Crèdit</string>
|
||||
<string name="description_app_properties">Propietats de KeePassDX per administrar la configuració de l\'aplicació</string>
|
||||
<string name="menu_save_copy_to">Desar còpia a …</string>
|
||||
@@ -445,4 +445,255 @@
|
||||
<string name="settings_database_force_changing_master_key_next_time_summary">Requereix canviar la clau mestra el pròxim cop (un cop)</string>
|
||||
<string name="allow_copy_password_summary">Permet copiar la clau i els camps protegits d\'una entrada al porta-retalls</string>
|
||||
<string name="success_import_app_properties">Configuració de l\'aplicació importada</string>
|
||||
</resources>
|
||||
<string name="passphrase">Contrasenya</string>
|
||||
<string name="colorize_password_title">Acoloreix les contrasenyes</string>
|
||||
<string name="colorize_password_summary">Acoloreix les contrasenyes per tipus</string>
|
||||
<string name="error_remove_file">S\'ha produït un error en suprimir les dades del fitxer.</string>
|
||||
<string name="error_start_database_action">S\'ha produït un error en realitzar una acció a la base de dades.</string>
|
||||
<string name="error_response_already_provided">Ja s\'ha proveït la resposta.</string>
|
||||
<string name="show_otp_token_title">Mostra el testimoni OTP</string>
|
||||
<string name="error_no_response_from_challenge">No s\'ha pogut obtenir la resposta del desafiament.</string>
|
||||
<string name="error_upload_file">S\'ha produït un error en pujar les dades del fitxer.</string>
|
||||
<string name="error_duplicate_file">Les dades del fitxer ja existeixen.</string>
|
||||
<string name="hint_icon_name">Nom de la icona</string>
|
||||
<string name="advanced_unlock_prompt_store_credential_message">Us haureu de recordar de la credencial principal de la caixa forta en el cas que feu servir el reconeixement del dispositiu pel desbloqueig.</string>
|
||||
<string name="secure_note">Nota segura</string>
|
||||
<string name="error_file_to_big">El fitxer que esteu intentant pujar és massa gros.</string>
|
||||
<string name="error_challenge_already_requested">El desafiament ja s\'ha sol·licitat.</string>
|
||||
<string name="error_cancel_by_user">S\'ha cancel·lat per l\'usuari.</string>
|
||||
<string name="error_driver_required">Es requereix un controlador per %1$s.</string>
|
||||
<string name="warning_empty_recycle_bin">Voleu suprimir permanentment tots els nodes de la paperera de reciclatge?</string>
|
||||
<string name="warning_file_too_big">Se suposa que una base de dades KeePass només conté petits fitxers d\'utilitat (com ara fitxers de claus PGP).
|
||||
\n
|
||||
\nAmb aquesta pujada, la base de dades pot ser molt gran i afectar el rendiment.</string>
|
||||
<string name="biometric_delete_all_key_summary">Suprimeix totes les claus de xifratge relacionades amb el reconeixement de desbloqueig del dispositiu</string>
|
||||
<string name="database_data_remove_unlinked_attachments_title">Elimina les dades no enllaçades</string>
|
||||
<string name="menu_database_settings_summary">Metadades, paperera de reciclatge, plantilles, historial</string>
|
||||
<string name="encryption_explanation">Algorisme de xifratge de la base de dades utilitzat per a totes les dades</string>
|
||||
<string name="delete_entered_password_summary">Suprimeix la contrasenya introduïda després d\'un intent de connexió a una base de dades</string>
|
||||
<string name="enable_read_only_title">Protegit contra l\'escriptura</string>
|
||||
<string name="enable_read_only_summary">Obre la base de dades en mode només de lectura per defecte</string>
|
||||
<string name="enable_screenshot_mode_summary">Permet que les aplicacions de tercers gravin o facin captures de pantalla de l\'aplicació</string>
|
||||
<string name="enable_education_screens_summary">Ressalta els elements per saber com funciona l\'aplicació</string>
|
||||
<string name="reset_education_screens_title">Reinicia els consells educatius</string>
|
||||
<string name="enable_education_screens_title">Consells educatius</string>
|
||||
<string name="education_new_node_title">Afegeix elements a la base de dades</string>
|
||||
<string name="education_search_summary">Introduïu el títol, el nom d\'usuari o el contingut d\'altres camps per recuperar les contrasenyes.</string>
|
||||
<string name="education_advanced_unlock_title">Desbloqueig de la base de dades dels dispositius</string>
|
||||
<string name="autofill_save_search_info_title">Desa la informació de cerca</string>
|
||||
<string name="education_entry_edit_summary">Editeu l\'entrada amb camps personalitzats. Les dades del fons es poden referenciar entre diferents camps d\'entrada.</string>
|
||||
<string name="education_generate_password_title">Crea una contrasenya forta</string>
|
||||
<string name="education_generate_password_summary">Genereu una contrasenya forta per associar-la a l\'entrada, definiu-la fàcilment segons els criteris del formulari i no oblideu la contrasenya segura.</string>
|
||||
<string name="education_entry_new_field_summary">Registreu un camp addicional, afegiu un valor i, opcionalment, protegiu-lo.</string>
|
||||
<string name="education_add_attachment_summary">Pengeu un adjunt a la vostra entrada per a desar dades externes importants.</string>
|
||||
<string name="download_initialization">S\'està inicialitzant…</string>
|
||||
<string name="education_sort_title">Ordenació d\'elements</string>
|
||||
<string name="education_sort_summary">Trieu com s\'ordenen les entrades i els grups.</string>
|
||||
<string name="entropy_high">Entropia: alta</string>
|
||||
<string name="entropy_calculate">Entropia: Calcula…</string>
|
||||
<string name="warning_database_revoked">S\'ha revocat l\'accés al fitxer pel gestor de fitxers, tanqueu la base de dades i torneu-la a obrir des de la seva ubicació.</string>
|
||||
<string name="warning_copy_permission">Cal el permís de notificació per a utilitzar la característica de notificació del porta-retalls.</string>
|
||||
<string name="device_credential">Credencial del dispositiu</string>
|
||||
<string name="autofill_web_domain_blocklist_summary">Llista que impedeix l\'emplenament automàtic de determinats dominis web</string>
|
||||
<string name="autofill_block">Bloqueja l\'emplenament automàtic</string>
|
||||
<string name="biometric_auto_open_prompt_title">Obre la petició automàticament</string>
|
||||
<string name="keyboard_notification_entry_summary">Mostra una notificació quan hi hagi una entrada disponible</string>
|
||||
<string name="keyboard_previous_database_credentials_title">Pantalla de credencials de la base de dades</string>
|
||||
<string name="keyboard_previous_database_credentials_summary">Torna automàticament al teclat anterior a la pantalla de credencials de la base de dades</string>
|
||||
<string name="back_to_previous_keyboard">Torna al teclat anterior</string>
|
||||
<string name="autofill_inline_suggestions_summary">Intenta mostrar els suggeriments d\'emplenament automàtic directament des d\'un teclat compatible</string>
|
||||
<string name="warning_database_already_opened">Ja hi ha oberta una base de dades, tanqueu-la primer abans d\'obrir-ne una de nova</string>
|
||||
<string name="build_label">Construeix 2%1$s</string>
|
||||
<string name="advanced_unlock_prompt_extract_credential_title">Reconeixement de desbloqueig del dispositiu</string>
|
||||
<string name="clipboard_explanation_summary">Copia els camps d\'entrada utilitzant el porta-retalls del dispositiu</string>
|
||||
<string name="temp_advanced_unlock_enable_title">Desbloqueig temporal del dispositiu</string>
|
||||
<string name="temp_advanced_unlock_enable_summary">No emmagatzemeu cap contingut xifrat per utilitzar el desbloqueig del dispositiu</string>
|
||||
<string name="database_data_remove_unlinked_attachments_summary">Elimina els adjunts continguts a la base de dades però no vinculats a una entrada</string>
|
||||
<string name="keyboard_label">Magikeyboard (KeePassDX)</string>
|
||||
<string name="keyboard_selection_entry_title">Selecció d\'entrada</string>
|
||||
<string name="keyboard_selection_entry_summary">Quan es visualitzi una entrada a KeePassDX, emplena el Magikeyboard amb aquesta entrada</string>
|
||||
<string name="keyboard_notification_entry_clear_close_title">Neteja en tancar</string>
|
||||
<string name="keyboard_entry_timeout_summary">Temps d\'espera per netejar l\'entrada del teclat</string>
|
||||
<string name="keyboard_keys_category">Tecles</string>
|
||||
<string name="keyboard_previous_fill_in_title">Torna enrere</string>
|
||||
<string name="autofill_manual_selection_title">Selecció manual</string>
|
||||
<string name="autofill_application_id_blocklist_summary">Llista que impedeix l\'emplenament automàtic en determinades aplicacions</string>
|
||||
<string name="education_search_title">Cerca a través de les entrades</string>
|
||||
<string name="menu_merge_database">Fusiona les dades</string>
|
||||
<string name="menu_keystore_remove_key">Suprimeix la clau de desbloqueig del dispositiu</string>
|
||||
<string name="warning_password_encoding">Eviteu els caràcters de contrasenya fora del format de codificació de text en el fitxer de base de dades (els caràcters no reconeguts es converteixen a la mateixa lletra).</string>
|
||||
<string name="warning_database_read_only">Concedeix accés d\'escriptura al fitxer per a desar els canvis a la base de dades</string>
|
||||
<string name="warning_database_info_changed_options">Fusiona les dades, sobreescriu les modificacions externes desant la base de dades o torna-la a carregar amb els últims canvis.</string>
|
||||
<string name="warning_database_info_reloaded">En tornar a carregar la base de dades se suprimiran les dades modificades localment.</string>
|
||||
<string name="advanced_unlock_invalid_key">No es pot llegir la clau de desbloqueig del dispositiu. Si us plau, suprimiu-la i repetiu el procediment de reconeixement de desbloqueig.</string>
|
||||
<string name="advanced_unlock_not_recognized">No s\'ha pogut reconèixer l\'empremta digital per desbloquejar el dispositiu</string>
|
||||
<string name="autofill_select_entry">Selecciona una entrada…</string>
|
||||
<string name="advanced_unlock_tap_delete">Toca per suprimir les claus de desbloqueig del dispositiu</string>
|
||||
<string name="temp_advanced_unlock_timeout_title">Venciment del desbloqueig del dispositiu</string>
|
||||
<string name="temp_advanced_unlock_timeout_summary">Durada de l\'ús del desbloqueig del dispositiu abans de suprimir el seu contingut</string>
|
||||
<string name="advanced_unlock_timeout">Temps d\'espera per desbloquejar el dispositiu</string>
|
||||
<string name="database_custom_color_title">Color personalitzat de la base de dades</string>
|
||||
<string name="database_version_title">Versió de la base de dades</string>
|
||||
<string name="text_appearance">Text</string>
|
||||
<string name="keyboard_notification_entry_clear_close_summary">Tanca la base de dades en tancar la notificació</string>
|
||||
<string name="keyboard_entry_timeout_title">Temps d\'espera</string>
|
||||
<string name="keyboard_key_vibrate_title">Vibració del teclat</string>
|
||||
<string name="autofill_inline_suggestions_title">Suggeriments integrats</string>
|
||||
<string name="autofill_inline_suggestions_keyboard">S\'han afegit els suggeriments d\'emplenament automàtic.</string>
|
||||
<string name="allow_no_password_summary">Permet prémer el botó \"Obre\" sense seleccionar cap credencial</string>
|
||||
<string name="delete_entered_password_title">Suprimeix la contrasenya</string>
|
||||
<string name="enable_auto_save_database_title">Desa automàticament la base de dades</string>
|
||||
<string name="enable_auto_save_database_summary">Desa la base de dades després de cada acció important (en el mode «Modificable»)</string>
|
||||
<string name="enable_keep_screen_on_title">Manté la pantalla activada</string>
|
||||
<string name="education_create_database_summary">Creeu el vostre primer fitxer de gestió de contrasenyes.</string>
|
||||
<string name="show_entry_colors_title">Colors de l\'entrada</string>
|
||||
<string name="keyboard_appearance_category">Aparença</string>
|
||||
<string name="keyboard_auto_go_action_summary">Acció de la tecla «Ves» després de prémer una tecla «Camp»</string>
|
||||
<string name="autofill_ask_to_save_data_title">Demana desar les dades</string>
|
||||
<string name="keyboard_change">Commuta el teclat</string>
|
||||
<string name="backspace">Retrocés</string>
|
||||
<string name="enter">Introdueix</string>
|
||||
<string name="autofill_save_search_info_summary">Això intenta desar la informació de cerca en fer una selecció d\'entrada manual per a usos futurs més fàcils</string>
|
||||
<string name="autofill_web_domain_blocklist_title">Llista de bloqueig de dominis web</string>
|
||||
<string name="autofill_block_restart">Reinicieu l\'aplicació que conté el formulari per activar el bloqueig.</string>
|
||||
<string name="enable_keep_screen_on_summary">Manté la pantalla activada en veure o editar una entrada</string>
|
||||
<string name="education_create_database_title">Creeu el fitxer de la base de dades</string>
|
||||
<string name="education_new_node_summary">Les entrades ajuden a gestionar les identitats digitals.
|
||||
\n
|
||||
\nEls grups (carpetes) organitzen entrades a la base de dades.</string>
|
||||
<string name="download_attachment">Baixa %1$s</string>
|
||||
<string name="download_progression">En curs: %1$d%%</string>
|
||||
<string name="download_complete">S\'ha completat!</string>
|
||||
<string name="advanced_unlock_prompt_extract_credential_message">Extreu la credencial de la base de dades amb les dades de desbloqueig del dispositiu</string>
|
||||
<string name="keyboard">Teclat</string>
|
||||
<string name="magic_keyboard_title">Magikeyboard</string>
|
||||
<string name="custom_fields">Camps personalitzats</string>
|
||||
<string name="advanced_unlock_prompt_store_credential_title">Enllaç al desbloqueig del dispositiu</string>
|
||||
<string name="education_entry_edit_title">Edita l\'entrada</string>
|
||||
<string name="filter">Filtra</string>
|
||||
<string name="keyboard_auto_go_action_title">Acció de la tecla automàtica</string>
|
||||
<string name="configure_biometric">No hi ha cap credencial biomètrica ni de dispositiu inscrita.</string>
|
||||
<string name="advanced_unlock_explanation_summary">Utilitza el desbloqueig del dispositiu per obrir una base de dades més fàcilment</string>
|
||||
<string name="device_credential_unlock_enable_summary">Us permet utilitzar la credencial del dispositiu per obrir la base de dades</string>
|
||||
<string name="biometric_auto_open_prompt_summary">Sol·licita automàticament el desbloqueig del dispositiu si la base de dades està configurada per utilitzar-lo</string>
|
||||
<string name="advanced_unlock_delete_all_key_warning">Voleu suprimir totes les claus de xifratge relacionades amb el reconeixement de desbloqueig del dispositiu?</string>
|
||||
<string name="biometric_unlock_enable_title">Desbloqueig biomètric</string>
|
||||
<string name="biometric_unlock_enable_summary">Us permet escanejar la vostra biomètrica per obrir la base de dades</string>
|
||||
<string name="autofill_application_id_blocklist_title">Llista de bloqueig d\'aplicacions</string>
|
||||
<string name="enable_screenshot_mode_title">Mode captura de pantalla</string>
|
||||
<string name="search_mode">Mode de cerca</string>
|
||||
<string name="save_mode">Desa el mode</string>
|
||||
<string name="keyboard_save_search_info_title">Desa la informació compartida</string>
|
||||
<string name="keyboard_notification_entry_content_title">%1$s disponbile al Magikeyboard</string>
|
||||
<string name="warning_empty_keyfile_explanation">El contingut del fitxer clau no s\'ha de canviar mai, i en el millor dels casos, ha de contenir dades generades aleatòriament.</string>
|
||||
<string name="invalid_db_same_uuid">%1$s amb el mateix UUID %2$s ja existeix.</string>
|
||||
<string name="menu_external_icon">Icona externa</string>
|
||||
<string name="remember_keyfile_locations_summary">Fa un seguiment d\'on s\'emmagatzemen els fitxers de claus</string>
|
||||
<string name="hide_broken_locations_title">Amaga els enllaços trencats de la base de dades</string>
|
||||
<string name="autofill_manual_selection_summary">Mostra l\'opció de permetre que l\'usuari seleccioni l\'entrada de la base de dades</string>
|
||||
<string name="download_canceled">S\'ha cancel·lat!</string>
|
||||
<string name="do_not_kill_app">No matis l\'aplicació…</string>
|
||||
<string name="lock_database_screen_off_title">Bloqueig de pantalla</string>
|
||||
<string name="at_least_one_char">Com a mínim un caràcter de cada</string>
|
||||
<string name="show_entry_colors_summary">Mostra els colors de primer pla i de fons per a una entrada</string>
|
||||
<string name="keystore_not_accessible">El magatzem de claus no està correctament inicialitzat.</string>
|
||||
<string name="autofill_service_name">Emplenament automàtic de formularis de KeePassDX</string>
|
||||
<string name="show_otp_token_summary">Mostra els testimonis OTP a la llista d\'entrades</string>
|
||||
<string name="show_uuid_summary">Mostra l\'UUID enllaçat a una entrada o un grup</string>
|
||||
<string name="menu_app_settings_summary">Cerca, bloqueja, historial, propietats</string>
|
||||
<string name="menu_security_settings_summary">Xifratge, funció de derivació de la clau</string>
|
||||
<string name="master_key_settings_summary">Canvi, renovació</string>
|
||||
<string name="subdomain_search_title">Cerca de subdomini</string>
|
||||
<string name="subdomain_search_summary">Cerca dominis web amb restriccions de subdominis</string>
|
||||
<string name="warning_replace_file">La pujada d\'aquest fitxer substituirà l\'existent.</string>
|
||||
<string name="warning_remove_unlinked_attachment">Eliminar les dades desenllaçades pot disminuir la mida de la base de dades, però també pot eliminar les dades utilitzades per als connectors del KeePass.</string>
|
||||
<string name="warning_sure_remove_data">Voleu suprimir aquestes dades de totes maneres?</string>
|
||||
<string name="warning_database_info_changed">La informació continguda al fitxer de la base de dades s\'ha modificat fora de l\'aplicació.</string>
|
||||
<string name="later">Més tard</string>
|
||||
<string name="configure">Configura</string>
|
||||
<string name="biometric_security_update_required">Cal actualitzar la seguretat biomètrica.</string>
|
||||
<string name="unlock_and_link_biometric">Enllaç de desbloqueig del dispositiu</string>
|
||||
<string name="advanced_unlock_scanning_error">Error en desbloquejar el dispositiu: %1$s</string>
|
||||
<string name="unavailable">No disponible</string>
|
||||
<string name="advanced_unlock_prompt_not_initialized">No s\'ha pogut inicialitzar l\'indicador de desbloqueig del dispositiu.</string>
|
||||
<string name="credential_before_click_advanced_unlock_button">Escriviu la contrasenya i, a continuació, feu clic en aquest botó.</string>
|
||||
<string name="menu_appearance_settings_summary">Temes, colors, atributs</string>
|
||||
<string name="clipboard_notifications_summary">Mostra les notificacions del porta-retalls per a copiar camps en visualitzar una entrada</string>
|
||||
<string name="content">Contingut</string>
|
||||
<string name="device_credential_unlock_enable_title">Desbloqueig de les credencials del dispositiu</string>
|
||||
<string name="unavailable_feature_text">No s\'ha pogut iniciar aquesta característica.</string>
|
||||
<string name="unavailable_feature_hardware">No s\'ha pogut trobar el maquinari corresponent.</string>
|
||||
<string name="templates_group_enable_title">Ús de plantilles</string>
|
||||
<string name="templates_group_enable_summary">Utilitza plantilles dinàmiques per omplir els camps d\'una entrada</string>
|
||||
<string name="templates_group_uuid_title">Grup de plantilles</string>
|
||||
<string name="max_history_items_summary">Limita el nombre d\'elements de l\'historial per entrada</string>
|
||||
<string name="recycle_bin">Paperera de reciclatge</string>
|
||||
<string name="templates">Plantilles</string>
|
||||
<string name="magic_keyboard_explanation_summary">Activeu un teclat personalitzat que empleni les contrasenyes i tots els camps d\'identitat</string>
|
||||
<string name="device_keyboard_setting_title">Configuració del teclat del dispositiu</string>
|
||||
<string name="keyboard_name">Magikeyboard</string>
|
||||
<string name="keyboard_setting_label">Configuració del Magikeyboard</string>
|
||||
<string name="keyboard_entry_category">Entrada</string>
|
||||
<string name="keyboard_notification_entry_title">Informació de la notificació</string>
|
||||
<string name="keyboard_notification_entry_content_title_text">Entrada</string>
|
||||
<string name="keyboard_notification_entry_content_text">%1$s</string>
|
||||
<string name="keyboard_theme_title">Tema del teclat</string>
|
||||
<string name="keyboard_key_sound_title">Prémer les tecles amb so</string>
|
||||
<string name="keyboard_save_search_info_summary">Això intenta desar la informació compartida en fer una selecció d\'entrada manual per a usos futurs més fàcils</string>
|
||||
<string name="keyboard_previous_search_title">Pantalla de cerca</string>
|
||||
<string name="keyboard_previous_search_summary">Torna automàticament al teclat anterior a la pantalla de cerca</string>
|
||||
<string name="keyboard_previous_fill_in_summary">Torna automàticament al teclat anterior després d\'executar «Acció de la tecla automàtica»</string>
|
||||
<string name="keyboard_previous_lock_title">Bloqueja la base de dades</string>
|
||||
<string name="keyboard_previous_lock_summary">Torna automàticament al teclat anterior després de bloquejar la base de dades</string>
|
||||
<string name="select_entry">Selecciona una entrada</string>
|
||||
<string name="autofill_ask_to_save_data_summary">Demana desar les dades quan es completi l\'emplenament d\'un formulari</string>
|
||||
<string name="autofill_read_only_save">No es permet desar dades en una base de dades oberta en mode només de lectura.</string>
|
||||
<string name="reset_education_screens_summary">Torna a mostrar tota la informació educativa</string>
|
||||
<string name="reset_education_screens_text">Reinicialitza els consells educatius</string>
|
||||
<string name="education_select_database_title">Obre una base de dades existent</string>
|
||||
<string name="education_select_database_summary">Obriu el fitxer anterior de la base de dades des del navegador de fitxers per a continuar utilitzant-lo.</string>
|
||||
<string name="education_advanced_unlock_summary">Enllaça la contrasenya a una credencial biomètrica escanejada o de dispositiu per desbloquejar ràpidament la base de dades.</string>
|
||||
<string name="education_validate_entry_title">Valida l\'entrada</string>
|
||||
<string name="education_entry_new_field_title">Afegeix camps personalitzats</string>
|
||||
<string name="education_add_attachment_title">Afegeix un adjunt</string>
|
||||
<string name="education_setup_OTP_title">Configura l\'OTP</string>
|
||||
<string name="education_unlock_title">Desbloqueja la base de dades</string>
|
||||
<string name="education_setup_OTP_summary">Configureu la gestió de contrasenyes d\'un sol ús (HOTP / TOTP) per generar un testimoni sol·licitat per a l\'autenticació de dos factors (2FA).</string>
|
||||
<string name="education_field_copy_title">Copia un camp</string>
|
||||
<string name="html_text_donation">Al <strong>contribuir</strong> al projecte <i>(monetàriament, codi, traducció)</i>, l\'ajudareu a continuar vivint i prosperant, i també podreu optar al procediment de desbloqueig del <strong>tema</strong>.</string>
|
||||
<string name="upload_attachment">Puja %1$s</string>
|
||||
<string name="download_finalization">S\'està finalitzant…</string>
|
||||
<string name="entropy">Entropia: %1$s bit</string>
|
||||
<string name="warning_exact_alarm">No heu permès que l\'aplicació utilitzi una alarma exacta. Com a resultat, les característiques que requereixen un temporitzador no es faran amb un temps exacte.</string>
|
||||
<string name="warning_keyfile_integrity">El hash del fitxer no està garantit perquè Android pot canviar les seves dades al moment. Canvia l\'extensió del fitxer a .bin per a una integritat correcta.</string>
|
||||
<string name="html_text_ad_free">A diferència de moltes aplicacions de gestió de contrasenyes, aquest un és un <strong>programari sense anuncis</strong>, <strong> copyleft i lliure</strong> i no recull dades personals en els seus servidors, no importa quina versió utilitzeu.</string>
|
||||
<string name="education_field_copy_summary">Els camps copiats es poden enganxar en qualsevol lloc.\n\nUtilitza el mètode d\'emplenament de formularis que prefereixis.</string>
|
||||
<string name="generate_keyfile">Genera un fitxer de claus</string>
|
||||
<string name="nodes">Nodes</string>
|
||||
<string name="recursive_number_entries_summary">Calcula recursivament el nombre d\'entrades d\'un grup</string>
|
||||
<string name="warning_large_keyfile">No es recomana afegir un fitxer de claus gran, això pot impedir que s\'obri la base de dades.</string>
|
||||
<string name="education_lock_summary">Bloqueja la base de dades ràpidament, pots configurar l\'aplicació per bloquejar-la al cap d\'un temps, i quan la pantalla s\'apagui.</string>
|
||||
<string name="recursive_number_entries_title">Nombre recursiu d\'entrades</string>
|
||||
<string name="advanced_unlock_keystore_warning">Aquesta característica emmagatzemarà dades de credencials encriptades a l\'espai segur KeyStore del vostre dispositiu.\n\nDepenent de la implementació nativa de l\'API del sistema operatiu, pot no ser completament funcional.\n\nComprova la compatibilitat i seguretat de KeyStore amb el fabricant del teu dispositiu i el creador de la ROM que estàs utilitzant.</string>
|
||||
<string name="kdf_explanation">Per a generar la clau per a l\'algorisme d\'encriptació, la clau mestra es transforma utilitzant una funció de derivació de clau sal aleatòria.</string>
|
||||
<string name="education_validate_entry_summary">Recordeu validar la vostra entrada i desar la vostra base de dades.\n\nSi s\'activa un bloqueig automàtic i t\'oblides que estaves fent una modificació, t\'arrisques a perdre les teves dades.</string>
|
||||
<string name="education_read_only_summary">Canvieu el mode inaugural per a la sessió. \n \n\"Escriu-emparat\" impedeix canvis involuntaris a la base de dades. \n\"Modificable\" us permet afegir, eliminar o modificar tots els elements com vulgueu.</string>
|
||||
<string name="warning_database_info_changed_options_read_only">Torna a carregar la base de dades amb els darrers canvis.</string>
|
||||
<string name="warning_database_notification_permission">El permís de notificació permet mostrar l\'estat de la base de dades i bloquejar-la amb un botó de fàcil accés.\n\nSi no activeu aquest permís, la base de dades oberta en segon pla no serà visible si hi ha una altra aplicació en primer pla.</string>
|
||||
<string name="html_text_buy_pro">En comprar la versió pro, tindreu accés a aquest <strong> estil visual</strong> i sereu ajundant especialment <strong> a la realització de projectes comunitaris.</strong></string>
|
||||
<string name="html_text_dev_feature">Aquesta característica és <strong>en desenvolupament</strong> i requereix que la vostra <strong>contribució</strong> estigui disponible aviat.</string>
|
||||
<string name="style_name_forest">Bosc</string>
|
||||
<string name="style_name_divine">Divina</string>
|
||||
<string name="style_name_classic">Clàssic</string>
|
||||
<string name="style_name_reply">Respondre</string>
|
||||
<string name="style_name_kunzite">Kunzite</string>
|
||||
<string name="style_name_follow_system">Seguiu el sistema</string>
|
||||
<string name="hide_templates_title">Amaga les plantilles</string>
|
||||
<string name="hide_templates_summary">Les plantilles no són mostrades</string>
|
||||
<string name="html_text_dev_feature_encourage">esteu animant a qui desenvolupa a crear <strong>noves funcions</strong> i a <strong>corregir errors</strong> segons les vostres observacions.</string>
|
||||
<string name="style_name_simple">Simple</string>
|
||||
<string name="style_name_moon">Lluna</string>
|
||||
<string name="style_name_sun">Sol</string>
|
||||
<string name="style_name_light">Clar</string>
|
||||
<string name="style_name_dark">Obscur</string>
|
||||
</resources>
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
<string name="entry_user_name">Uživatelské jméno</string>
|
||||
<string name="error_arc4">Arcfour proudová šifra není podporována.</string>
|
||||
<string name="error_can_not_handle_uri">KeePassDX nemůže zpracovat toto URI.</string>
|
||||
<string name="error_file_not_create">Soubor se nepodařilo vytvořit</string>
|
||||
<string name="error_file_not_create">Soubor se nepodařilo vytvořit.</string>
|
||||
<string name="error_invalid_db">Databázi se nepodařilo přečíst.</string>
|
||||
<string name="error_invalid_path">Ujistěte se, že je popis umístění správný.</string>
|
||||
<string name="error_no_name">Zadejte název.</string>
|
||||
@@ -266,7 +266,7 @@
|
||||
<string name="html_text_ad_free">Na rozdíl od mnoha aplikací pro správu hesel je tato <strong>bez reklam</strong>, je <strong>svobodný software pod copyleft licencí</strong> a nesbírá žádné osobní údaje na svých serverech bez ohledu na to, jakou verzi používáte.</string>
|
||||
<string name="html_text_buy_pro">Zakoupením varianty \"pro\" získáte přístup k tomuto <strong>vizuálnímu stylu</strong> a hlavně pomůžete <strong>uskutečnění komunitních projektů.</strong></string>
|
||||
<string name="html_text_feature_generosity">Tento <strong>vizuální styl</strong> je k dispozici díky vaší štědrosti.</string>
|
||||
<string name="html_text_donation">Pro zajištění svobody nás všech a pokračování aktivity počítáme s Vaším <strong>přispěním.</strong></string>
|
||||
<string name="html_text_donation"><strong>Přispěním</strong> do projektu <i>(peněžně, kódem, překlady)</i> mu pomůžete žít a prosperovat a dostanete přístup k postupu odemčení <strong>motivů</strong>.</string>
|
||||
<string name="html_text_dev_feature">Tato funkce je <strong>ve vývoji</strong> a potřebuje Váš <strong>příspěvek</strong>, aby byla brzy k dispozici.</string>
|
||||
<string name="html_text_dev_feature_buy_pro">Zakoupením <strong>pro</strong> varianty,</string>
|
||||
<string name="html_text_dev_feature_contibute"><strong>Podpořením vývoje</strong>,</string>
|
||||
@@ -484,10 +484,10 @@
|
||||
<string name="configure_biometric">Žádné přihlašovací ani biometrické údaje nejsou registrovány.</string>
|
||||
<string name="warning_empty_recycle_bin">Trvale odstranit všechny uzly z koše\?</string>
|
||||
<string name="registration_mode">Registrace</string>
|
||||
<string name="save_mode">Uložit</string>
|
||||
<string name="save_mode">Režim ukládání</string>
|
||||
<string name="search_mode">Vyhledávání</string>
|
||||
<string name="error_field_name_already_exists">Jméno kolonky již existuje.</string>
|
||||
<string name="error_registration_read_only">Uložení nové položky v režimu databáze pouze pro čtení není dovoleno</string>
|
||||
<string name="error_registration_read_only">Uložení nové položky v režimu databáze pouze pro čtení není dovoleno.</string>
|
||||
<string name="enter">Enter</string>
|
||||
<string name="backspace">Backspace</string>
|
||||
<string name="select_entry">Vybrat záznam</string>
|
||||
@@ -539,9 +539,9 @@
|
||||
<string name="error_file_to_big">Soubor, který se pokoušíte nahrát, je příliš velký.</string>
|
||||
<string name="content_description_otp_information">Info o jednorázovém heslu</string>
|
||||
<string name="properties">Vlastnosti</string>
|
||||
<string name="error_export_app_properties">Během exportu nastavení aplikace došlo k chybě</string>
|
||||
<string name="error_export_app_properties">Během exportu nastavení aplikace došlo k chybě.</string>
|
||||
<string name="success_export_app_properties">Nastavení aplikace byla exportována</string>
|
||||
<string name="error_import_app_properties">Během importu nastavení aplikace došlo k chybě</string>
|
||||
<string name="error_import_app_properties">Během importu nastavení aplikace došlo k chybě.</string>
|
||||
<string name="success_import_app_properties">Nastavení aplikace byla importována</string>
|
||||
<string name="description_app_properties">Vlastnosti KeePassDX pro správu aplikačních nastavení</string>
|
||||
<string name="export_app_properties_summary">Vytvořte soubor pro export nastavení aplikace</string>
|
||||
@@ -628,6 +628,7 @@
|
||||
<string name="advanced_unlock_keystore_warning">Tato funkce uloží přihlašovací údaje v bezpečném úložišti klíčů Vašeho zařízení.
|
||||
\n
|
||||
\nV závislosti na implementaci nativního API operačního systému nemusí být plně funkční.
|
||||
\n
|
||||
\nOvěřte kompatibilitu a zabezpečení úložiště klíčů u výrobce svého zařízení a dodavatele operačního systému, jejž používáte.</string>
|
||||
<string name="keyboard_previous_search_title">Panel hledání</string>
|
||||
<string name="keyboard_previous_search_summary">Automaticky přepnout na předchozí klávesnici v panelu hledání</string>
|
||||
@@ -648,12 +649,12 @@
|
||||
<string name="html_about_privacy"><strong>Nenačítají se žádná uživatelská data</strong>, tato aplikace se nespojuje s žádnými servery, pracuje pouze lokálně a plně respektuje soukromí uživatelů.</string>
|
||||
<string name="hardware_key">Hardwarový klíč</string>
|
||||
<string name="error_XML_malformed">XML chybný.</string>
|
||||
<string name="error_challenge_already_requested">Výzva byla již vyžádána</string>
|
||||
<string name="error_challenge_already_requested">Výzva byla již vyžádána.</string>
|
||||
<string name="error_response_already_provided">Odpověď byla již poskytnuta.</string>
|
||||
<string name="error_no_response_from_challenge">Odezvu nelze z výzvy obdržet.</string>
|
||||
<string name="error_cancel_by_user">Zrušeno uživatelem.</string>
|
||||
<string name="error_driver_required">Ovladač pro %1$s je nutný.</string>
|
||||
<string name="error_unable_merge_database_kdb">Spojení z databáze V1 nelze provést.</string>
|
||||
<string name="error_unable_merge_database_kdb">Nepodařilo se sloučit s databázovým souborem kdb.</string>
|
||||
<string name="error_hardware_key_unsupported">Hardwarový klíč není podporován.</string>
|
||||
<string name="error_empty_key">Klíč nemůže být prázdný.</string>
|
||||
<string name="enable_screenshot_mode_title">Režim screenshotu</string>
|
||||
@@ -689,4 +690,23 @@
|
||||
<string name="education_validate_entry_summary">Nezapomeňte ověřit svůj vstup a uložit databázi.
|
||||
\n
|
||||
\nPokud je aktivované automatické uzamčení a zapomenete, že jste něco upravili, riskujete ztrátu dat.</string>
|
||||
</resources>
|
||||
<string name="style_name_forest">Les</string>
|
||||
<string name="style_name_divine">Božský</string>
|
||||
<string name="style_name_classic">Klasický</string>
|
||||
<string name="style_name_simple">Jednoduchý</string>
|
||||
<string name="style_name_moon">Měsíc</string>
|
||||
<string name="style_name_sun">Slunce</string>
|
||||
<string name="style_name_reply">Reply</string>
|
||||
<string name="style_name_kunzite">Kunzit</string>
|
||||
<string name="style_name_follow_system">Podle systému</string>
|
||||
<string name="style_name_light">Světlý</string>
|
||||
<string name="style_name_dark">Tmavý</string>
|
||||
<string name="warning_database_info_changed_options_read_only">Znovu načíst databázi s posledními změnami.</string>
|
||||
<string name="nodes">Uzly</string>
|
||||
<string name="generate_keyfile">Vygenerovat klíčový soubor</string>
|
||||
<string name="recursive_number_entries_title">Rekurzivní počet záznamů</string>
|
||||
<string name="recursive_number_entries_summary">Rekurzivně vypočítá počet záznamů ve skupině</string>
|
||||
<string name="warning_large_keyfile">Nedoporučuje se přidávat velký klíčový soubor, mohlo by to zabránit otevření databáze.</string>
|
||||
<string name="hide_templates_title">Skrýt šablony</string>
|
||||
<string name="hide_templates_summary">Šablony nejsou zobrazeny</string>
|
||||
</resources>
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
<string name="decrypting_db">Dekrypterer databaseindhold…</string>
|
||||
<string name="default_checkbox">Brug som standarddatabase</string>
|
||||
<string name="digits">Cifre</string>
|
||||
<string name="select_database_file">Åbn en eksisterende database</string>
|
||||
<string name="select_database_file">Åbn eksisterende boks</string>
|
||||
<string name="entry_accessed">Senest åbnet</string>
|
||||
<string name="entry_cancel">Annuller</string>
|
||||
<string name="entry_confpassword">Bekræft adgangskode</string>
|
||||
@@ -58,7 +58,7 @@
|
||||
<string name="entry_user_name">Brugernavn</string>
|
||||
<string name="error_arc4">Arcfour stream cipher er ikke understøttet.</string>
|
||||
<string name="error_can_not_handle_uri">Kunne ikke håndtere denne URI i KeePassDX.</string>
|
||||
<string name="error_file_not_create">Kunne ikke oprette fil</string>
|
||||
<string name="error_file_not_create">Kunne ikke oprette fil.</string>
|
||||
<string name="error_invalid_db">Kunne ikke læse databasen.</string>
|
||||
<string name="error_invalid_path">Sørg for, at stien er korrekt.</string>
|
||||
<string name="error_no_name">Indtast et navn.</string>
|
||||
@@ -193,18 +193,18 @@
|
||||
<string name="lock">Lås</string>
|
||||
<string name="lock_database_screen_off_title">Skærmlås</string>
|
||||
<string name="lock_database_screen_off_summary">Lås databasen få sekunder efter at skærmen slukkes</string>
|
||||
<string name="advanced_unlock">Avanceret oplåsning</string>
|
||||
<string name="advanced_unlock">Enhedsoplåsning</string>
|
||||
<string name="biometric_unlock_enable_title">Biometrisk oplåsning</string>
|
||||
<string name="biometric_unlock_enable_summary">Giver mulighed for at scanne dine biometriske data for at åbne databasen</string>
|
||||
<string name="biometric_delete_all_key_title">Slet krypteringsnøgler</string>
|
||||
<string name="biometric_delete_all_key_summary">Slet alle krypteringsnøgler, der er relateret til avanceret oplåsningsgenkendelse</string>
|
||||
<string name="biometric_delete_all_key_summary">Slet alle krypteringsnøgler, der er relateret til oplåsningsgenkendelse</string>
|
||||
<string name="unavailable_feature_text">Funktionen kunne ikke startes.</string>
|
||||
<string name="unavailable_feature_version">Enheden kører Android %1$s, men har brug for %2$s eller nyere.</string>
|
||||
<string name="unavailable_feature_hardware">Kunne ikke finde den tilsvarende hardware.</string>
|
||||
<string name="file_name">Filnavn</string>
|
||||
<string name="path">Sti</string>
|
||||
<string name="assign_master_key">Tildel en hovednøgle</string>
|
||||
<string name="create_keepass_file">Opret en ny database</string>
|
||||
<string name="create_keepass_file">Opret ny boks</string>
|
||||
<string name="recycle_bin_title">Brug af papirkurven</string>
|
||||
<string name="recycle_bin_summary">Flyt grupper og poster til \"Papirkurv\" før sletning</string>
|
||||
<string name="monospace_font_fields_enable_title">Feltskrifttype</string>
|
||||
@@ -333,10 +333,10 @@
|
||||
<string name="content_description_update_from_list">Opdater</string>
|
||||
<string name="content_description_keyboard_close_fields">Luk felter</string>
|
||||
<string name="error_create_database_file">Kan ikke oprette database med denne adgangskode og nøglefil.</string>
|
||||
<string name="menu_advanced_unlock_settings">Avanceret oplåsning</string>
|
||||
<string name="menu_advanced_unlock_settings">Oplåsning af enhed</string>
|
||||
<string name="biometric">Biometrisk</string>
|
||||
<string name="biometric_auto_open_prompt_title">Prompt til automatisk åbning</string>
|
||||
<string name="biometric_auto_open_prompt_summary">Spørg automatisk efter avanceret oplåsning, hvis databasen er konfigureret til at bruge det</string>
|
||||
<string name="biometric_auto_open_prompt_summary">Anmod automatisk om oplåsning af enheden, hvis databasen er konfigureret til at bruge den</string>
|
||||
<string name="enable">Aktivér</string>
|
||||
<string name="disable">Deaktiver</string>
|
||||
<string name="master_key">Hovednøgle</string>
|
||||
@@ -365,7 +365,7 @@
|
||||
<string name="contains_duplicate_uuid_procedure">Løs problemet ved at generere nye UUID\'er for dubletter og fortsætte\?</string>
|
||||
<string name="database_opened">Database åbnet</string>
|
||||
<string name="clipboard_explanation_summary">Kopier indtastningsfelter ved hjælp af enhedens udklipsholder</string>
|
||||
<string name="advanced_unlock_explanation_summary">Brug avanceret oplåsning for at gøre det lettere at åbne en database</string>
|
||||
<string name="advanced_unlock_explanation_summary">Brug enhedsoplåsning til at åbne en database nemmere</string>
|
||||
<string name="database_data_compression_title">Datakomprimering</string>
|
||||
<string name="database_data_compression_summary">Datakomprimering reducerer databasens størrelse</string>
|
||||
<string name="max_history_items_title">Maksimalt antal</string>
|
||||
@@ -441,7 +441,7 @@
|
||||
<string name="autofill_application_id_blocklist_summary">Blokeringsliste der forhindrer automatisk udfyldning af apps</string>
|
||||
<string name="autofill_application_id_blocklist_title">Blokeringsliste for applikation</string>
|
||||
<string name="keyboard_previous_fill_in_summary">Skift automatisk tilbage til det forrige tastatur efter udførelse af \"Automatisk tastehandling\"</string>
|
||||
<string name="keyboard_previous_fill_in_title">Automatisk tastehandling</string>
|
||||
<string name="keyboard_previous_fill_in_title">Skift tilbage</string>
|
||||
<string name="keyboard_previous_database_credentials_summary">Skift automatisk tilbage til det forrige tastatur på databasens legitimationsskærm</string>
|
||||
<string name="keyboard_previous_database_credentials_title">Skærm til databaselegitimationsoplysninger</string>
|
||||
<string name="keyboard_change">Skift tastatur</string>
|
||||
@@ -481,7 +481,7 @@
|
||||
<string name="registration_mode">Registreringstilstand</string>
|
||||
<string name="save_mode">Gem-tilstand</string>
|
||||
<string name="search_mode">Søgetilstand</string>
|
||||
<string name="error_registration_read_only">Det er ikke tilladt at gemme et nyt element i en skrivebeskyttet database</string>
|
||||
<string name="error_registration_read_only">Det er ikke tilladt at gemme et nyt element i en skrivebeskyttet database.</string>
|
||||
<string name="content_description_credentials_information">Legitimationsoplysninger</string>
|
||||
<string name="configure_biometric">Der er ikke tilmeldt biometriske legitimationsoplysninger eller enhedsoplysninger.</string>
|
||||
<string name="education_add_attachment_summary">Overfør en vedhæftet fil til posten for at gemme vigtige eksterne data.</string>
|
||||
@@ -497,24 +497,24 @@
|
||||
<string name="unit_kibibyte">KiB</string>
|
||||
<string name="unit_byte">B</string>
|
||||
<string name="download_canceled">Annulleret!</string>
|
||||
<string name="education_advanced_unlock_title">Avanceret database-oplåsning</string>
|
||||
<string name="education_advanced_unlock_title">Database-oplåsning</string>
|
||||
<string name="autofill_inline_suggestions_keyboard">Forslag til autofyld tilføjet.</string>
|
||||
<string name="select_entry">Vælg post</string>
|
||||
<string name="back_to_previous_keyboard">Tilbage til forrige tastatur</string>
|
||||
<string name="custom_fields">Brugerdefinerede felter</string>
|
||||
<string name="advanced_unlock_delete_all_key_warning">Slet alle krypteringsnøgler relateret til avanceret oplåsningsgenkendelse\?</string>
|
||||
<string name="advanced_unlock_tap_delete">Tryk for at slette avancerede oplåsningsnøgler</string>
|
||||
<string name="advanced_unlock_delete_all_key_warning">Seletealle krypteringsnøgler relateret til enhedsoplåsningsgenkendelse?</string>
|
||||
<string name="advanced_unlock_tap_delete">Tryk for at slette enhedens oplåsningsnøgler</string>
|
||||
<string name="content">Indhold</string>
|
||||
<string name="credential_before_click_advanced_unlock_button">Indtast adgangskoden, og klik derefter på denne knap.</string>
|
||||
<string name="advanced_unlock_prompt_not_initialized">Kunne ikke initialisere avanceret oplåsningsprompt.</string>
|
||||
<string name="advanced_unlock_scanning_error">Fejl ved avanceret oplåsning: %1$s</string>
|
||||
<string name="advanced_unlock_not_recognized">Kunne ikke genkende aftryk til avanceret oplåsning</string>
|
||||
<string name="advanced_unlock_invalid_key">Den avancerede oplåsningsnøgle kan ikke læses. Slet den og gentag proceduren for genkendelse af oplåsning.</string>
|
||||
<string name="advanced_unlock_prompt_extract_credential_title">Åbn database med avanceret oplåsningsgenkendelse</string>
|
||||
<string name="advanced_unlock_prompt_store_credential_title">Avanceret oplåsningsgenkendelse</string>
|
||||
<string name="advanced_unlock_prompt_not_initialized">Kunne ikke initialisere oplåsningsprompt.</string>
|
||||
<string name="advanced_unlock_scanning_error">Fejl ved oplåsning: %1$s</string>
|
||||
<string name="advanced_unlock_not_recognized">Kunne ikke genkende aftryk til oplåsning</string>
|
||||
<string name="advanced_unlock_invalid_key">Oplåsningsnøgle kan ikke læses. Slet den og gentag proceduren for genkendelse af oplåsning.</string>
|
||||
<string name="advanced_unlock_prompt_extract_credential_title">Enhedsoplåsningsgenkendelse</string>
|
||||
<string name="advanced_unlock_prompt_store_credential_title">Link til enhedsoplåsning</string>
|
||||
<string name="warning_database_info_changed_options">Flet data, overskriv de eksterne ændringer ved at gemme databasen eller genindlæs den med de seneste ændringer.</string>
|
||||
<string name="warning_database_info_changed">Oplysningerne i databasefilen er blevet ændret uden for appen.</string>
|
||||
<string name="menu_keystore_remove_key">Slet avanceret oplåsningsnøgle</string>
|
||||
<string name="menu_keystore_remove_key">Slet enheds oplåsningsnøgle</string>
|
||||
<string name="menu_reload_database">Genindlæs data</string>
|
||||
<string name="error_duplicate_file">Fildataene findes allerede.</string>
|
||||
<string name="error_upload_file">Der opstod en fejl under overførsel af fildataene.</string>
|
||||
@@ -522,35 +522,35 @@
|
||||
<string name="error_rebuild_list">Listen kan ikke genopbygges korrekt.</string>
|
||||
<string name="error_database_uri_null">Database-URI kan ikke hentes.</string>
|
||||
<string name="content_description_otp_information">Oplysninger om engangsadgangskode</string>
|
||||
<string name="advanced_unlock_prompt_extract_credential_message">Udtræk database legitimationsoplysninger med avancerede oplåsningdata</string>
|
||||
<string name="advanced_unlock_prompt_store_credential_message">Du skal stadig huske din primære legitimationsoplysning, hvis du bruger avanceret oplåsningsgenkendelse.</string>
|
||||
<string name="advanced_unlock_prompt_extract_credential_message">Udtræk databases legitimationsoplysninger med enheds oplåsningdata</string>
|
||||
<string name="advanced_unlock_prompt_store_credential_message">Du skal stadig huske din boks primære legitimationsoplysning, hvis du bruger oplåsningsgenkendelse på enheden.</string>
|
||||
<string name="warning_database_revoked">Adgang til filen tilbagekaldt af filhåndteringsprogrammet, luk databasen og genåbn den fra dens placering.</string>
|
||||
<string name="error_start_database_action">Der opstod en fejl under udførelsen af en handling på databasen.</string>
|
||||
<string name="error_remove_file">Der opstod en fejl under fjernelsen af fildata.</string>
|
||||
<string name="error_otp_type">Den existerende OTP-type kunne ikke genkendes. Det kan være, at dens validering ikke længere genererer token korrekt.</string>
|
||||
<string name="education_advanced_unlock_summary">Sammenkæd din adgangskode med din scannede biometriske data eller enhedens legitimationsoplysninger for hurtigt at låse din database op.</string>
|
||||
<string name="enter">Enter</string>
|
||||
<string name="temp_advanced_unlock_timeout_summary">Varigheden af avanceret oplåsning, før indholdet slettes</string>
|
||||
<string name="temp_advanced_unlock_timeout_summary">Varigheden af oplåsning, før indholdet slettes</string>
|
||||
<string name="device_credential_unlock_enable_summary">Giver dig mulighed for at bruge dine enhedsoplysninger til at åbne databasen</string>
|
||||
<string name="device_credential_unlock_enable_title">Oplåsning via enhedsoplysninger</string>
|
||||
<string name="autofill_inline_suggestions_summary">Forsøg at vise forslag til automatisk udfyldning direkte fra et kompatibelt tastatur</string>
|
||||
<string name="autofill_inline_suggestions_title">Indbyggede forslag</string>
|
||||
<string name="backspace">Tilbagetast</string>
|
||||
<string name="advanced_unlock_timeout">Tidsudløb for avanceret oplåsning</string>
|
||||
<string name="temp_advanced_unlock_timeout_title">Udløb af avanceret oplåsning</string>
|
||||
<string name="temp_advanced_unlock_enable_summary">Gem ikke krypteret indhold for at bruge avanceret oplåsning</string>
|
||||
<string name="temp_advanced_unlock_enable_title">Midlertidig avanceret oplåsning</string>
|
||||
<string name="advanced_unlock_timeout">Tidsudløb for oplåsning</string>
|
||||
<string name="temp_advanced_unlock_timeout_title">Udløb af oplåsning af enhed</string>
|
||||
<string name="temp_advanced_unlock_enable_summary">Gem ikke krypteret indhold for at bruge enhedsoplåsning</string>
|
||||
<string name="temp_advanced_unlock_enable_title">Midlertidig oplåsning af enhed</string>
|
||||
<string name="device_credential">Enhedens legitimation</string>
|
||||
<string name="properties">Egenskaber</string>
|
||||
<string name="error_export_app_properties">Fejl under eksport af app-egenskaber</string>
|
||||
<string name="success_export_app_properties">App-egenskaber eksporteret</string>
|
||||
<string name="error_import_app_properties">Fejl under importering af app-egenskaber</string>
|
||||
<string name="success_import_app_properties">App-egenskaber importeret</string>
|
||||
<string name="error_export_app_properties">Fejl under eksport af app-indstillinger.</string>
|
||||
<string name="success_export_app_properties">App-indstillinger eksporteret</string>
|
||||
<string name="error_import_app_properties">Fejl under importering af app-indstillinger.</string>
|
||||
<string name="success_import_app_properties">App-indstillinger importeret</string>
|
||||
<string name="description_app_properties">KeePassDX-egenskaber til at administrere app-indstillinger</string>
|
||||
<string name="export_app_properties_summary">Opret en fil for at eksportere app-egenskaber</string>
|
||||
<string name="export_app_properties_title">Eksporter app-egenskaber</string>
|
||||
<string name="import_app_properties_summary">Vælg en fil for at importere app-egenskaber</string>
|
||||
<string name="import_app_properties_title">Importer app-egenskaber</string>
|
||||
<string name="export_app_properties_summary">Opret en fil for at eksportere app-indstillinger</string>
|
||||
<string name="export_app_properties_title">Eksporter app-indstillinger</string>
|
||||
<string name="import_app_properties_summary">Vælg en fil for at importere app-indstillinger</string>
|
||||
<string name="import_app_properties_title">Importér app-indstillinger</string>
|
||||
<string name="error_move_group_here">Du kan ikke flytte en gruppe hertil.</string>
|
||||
<string name="error_word_reserved">Dette ord er reserveret og kan ikke bruges.</string>
|
||||
<string name="expired">Udløbet</string>
|
||||
@@ -591,7 +591,7 @@
|
||||
<string name="permission">Tilladelse</string>
|
||||
<string name="templates_group_uuid_title">Skabelongruppe</string>
|
||||
<string name="autofill_manual_selection_title">Manuelt valg</string>
|
||||
<string name="enable_keep_screen_on_summary">Hold skærmen tændt, når du ser på posten</string>
|
||||
<string name="enable_keep_screen_on_summary">Hold skærmen tændt, når du læser eller redigere et indlæg</string>
|
||||
<string name="enable_keep_screen_on_title">Hold skærmen tændt</string>
|
||||
<string name="keyboard_previous_search_title">Søgeskærm</string>
|
||||
<string name="keyboard_previous_search_summary">Skift automatisk tilbage til det tidligere tastatur på søgeskærmen</string>
|
||||
@@ -610,7 +610,7 @@
|
||||
<string name="error_location_unknown">Databaseplacering er ukendt, databasehandling kan ikke udføres.</string>
|
||||
<string name="error_hardware_key_unsupported">Hardwarenøgle er ikke understøttet.</string>
|
||||
<string name="error_empty_key">Nøglen må ikke være tom.</string>
|
||||
<string name="error_challenge_already_requested">Der er allerede anmodet om udfordring</string>
|
||||
<string name="error_challenge_already_requested">Der er allerede anmodet om udfordring.</string>
|
||||
<string name="error_no_response_from_challenge">Kan ikke få svaret fra udfordringen.</string>
|
||||
<string name="show_otp_token_title">Vis OTP-token</string>
|
||||
<string name="remember_hardware_key_title">Husk hardwarenøgler</string>
|
||||
@@ -645,8 +645,8 @@
|
||||
<string name="templates_group_enable_summary">Brug dynamiske skabeloner til at udfylde felterne i en post</string>
|
||||
<string name="advanced_unlock_keystore_warning">Denne funktion gemmer krypterede legitimationsdata i den sikre KeyStore på din enhed.
|
||||
\n
|
||||
\nAfhængigt af operativsystemets indbyggede API-implementering er den muligvis ikke fuldt funktionel.
|
||||
\nKontroller KeyStore\'s kompatibilitet og sikkerhed med producenten af din enhed og skaberen af den ROM, du bruger.</string>
|
||||
\nAfhængigt af operativsystemets indbyggede API-implementering er funktionen muligvis ikke fuldt funktionsdygtig.
|
||||
\nKontroller kompatibiliteten og sikkerheden af KeyStore med producenten af din enhed og skaberen af den ROM, du bruger.</string>
|
||||
<string name="entropy">Entropi: %1$s bit</string>
|
||||
<string name="consider_chars_filter">Overvej tegn</string>
|
||||
<string name="html_about_privacy"><strong>Der hentes ingen brugerdata</strong>, denne applikation opretter ikke forbindelse til nogen server, kører kun lokalt og respekterer fuldt ud brugernes privatliv.</string>
|
||||
@@ -667,4 +667,38 @@
|
||||
<string name="bank_identifier_code">SWIFT/BIC</string>
|
||||
<string name="secure_note">Sikker note</string>
|
||||
<string name="show_entry_colors_title">Postfarver</string>
|
||||
</resources>
|
||||
<string name="unlock">Lås op</string>
|
||||
<string name="master_key_settings_summary">Ændring, fornyelse</string>
|
||||
<string name="info">Info</string>
|
||||
<string name="ask">Spørg</string>
|
||||
<string name="menu_form_filling_settings_summary">Tastatur, autofyld, udklipsholder</string>
|
||||
<string name="configure">Konfigurér</string>
|
||||
<string name="menu_security_settings_summary">Kryptering, Nøgleafledningsfunktion</string>
|
||||
<string name="menu_advanced_unlock_settings_summary">Biometri, enhedens legitimation</string>
|
||||
<string name="warning_database_notification_permission">Meddelelsestilladelsen giver dig mulighed for at vise status for databasen og låse den med en let tilgængelig knap.
|
||||
\n
|
||||
\nHvis du ikke aktiverer denne tilladelse, vil den database, der er åben i baggrunden, ikke være synlig, hvis et andet program er i forgrunden.</string>
|
||||
<string name="unlock_and_link_biometric">Link til oplåsning af enhed</string>
|
||||
<string name="warning_copy_permission">Meddelelsestilladelsen er nødvendig for at bruge udklipsholderens meddelelsesfunktion.</string>
|
||||
<string name="menu_database_settings_summary">Metadata, papirkurven, skabeloner, historik</string>
|
||||
<string name="merge_success">Sammenfletning gennemført</string>
|
||||
<string name="menu_app_settings_summary">Søg, lås, historik, egenskaber</string>
|
||||
<string name="later">Senere</string>
|
||||
<string name="menu_appearance_settings_summary">Temaer, farver, attributter</string>
|
||||
<string name="style_name_forest">Skov</string>
|
||||
<string name="style_name_divine">Guddommelig</string>
|
||||
<string name="style_name_classic">Klassisk</string>
|
||||
<string name="style_name_light">Lys</string>
|
||||
<string name="style_name_dark">Mørk</string>
|
||||
<string name="education_validate_entry_title">Bekræft ændring</string>
|
||||
<string name="warning_database_info_changed_options_read_only">Genindlæs databasen med de seneste ændringer.</string>
|
||||
<string name="education_validate_entry_summary">Husk at validere dine indtastede data og sikre, at din database er gemt.
|
||||
\n
|
||||
\nHvis en automatisk lås aktiveres uden, at ændringerne er blevet gemt, kan det resultere i tab af data.</string>
|
||||
<string name="style_name_simple">Simpel</string>
|
||||
<string name="style_name_moon">Måne</string>
|
||||
<string name="style_name_sun">Sol</string>
|
||||
<string name="style_name_reply">Besvar</string>
|
||||
<string name="style_name_kunzite">Kunzite</string>
|
||||
<string name="style_name_follow_system">Følg systemets tilstand</string>
|
||||
</resources>
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
--><resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||
<string name="contact">Kontakt</string>
|
||||
<string name="contribution">Beiträge</string>
|
||||
<string name="feedback">Rückmeldung</string>
|
||||
<string name="feedback">Feedback</string>
|
||||
<string name="homepage">Webseite</string>
|
||||
<string name="about_description">Android-Implementierung des Passwortmanagers KeePass</string>
|
||||
<string name="accept">Akzeptieren</string>
|
||||
@@ -36,10 +36,10 @@
|
||||
<string name="menu_app_settings">App-Einstellungen</string>
|
||||
<string name="brackets">Klammern</string>
|
||||
<string name="file_manager_install_description">Zum Erstellen, Öffnen und Speichern von Datenbankdateien wird ein Dateimanager benötigt, der die beabsichtigte Aktion ACTION_CREATE_DOCUMENT und ACTION_OPEN_DOCUMENT akzeptiert.</string>
|
||||
<string name="clipboard_cleared">Zwischenablage geleert</string>
|
||||
<string name="clipboard_cleared">Zwischenablage gelöscht</string>
|
||||
<string name="clipboard_error_title">Zwischenablage-Fehler</string>
|
||||
<string name="clipboard_error">Einige Geräte lassen keine Nutzung der Zwischenablage durch Apps zu.</string>
|
||||
<string name="clipboard_error_clear">Leeren der Zwischenablage fehlgeschlagen</string>
|
||||
<string name="clipboard_error_clear">Löschen der Zwischenablage fehlgeschlagen</string>
|
||||
<string name="clipboard_timeout">Zwischenablage-Inaktivitätszeit</string>
|
||||
<string name="clipboard_timeout_summary">Speicherdauer in der Zwischenablage (falls vom Gerät unterstützt)</string>
|
||||
<string name="select_to_copy">%1$s in die Zwischenablage kopieren</string>
|
||||
@@ -48,12 +48,12 @@
|
||||
<string name="decrypting_db">Datenbankinhalt wird entschlüsselt …</string>
|
||||
<string name="default_checkbox">Als Standarddatenbank verwenden</string>
|
||||
<string name="digits">Stellen</string>
|
||||
<string name="html_about_licence">KeePassDX © %1$d Kunzisoft ist <strong>quelloffen</strong> und <strong>ohne Werbung</strong>.\nDie Nutzung der Software erfolgt auf eigene Verantwortung und ohne jegliche Garantie. Die Applikation wird unter den Bedingungen der <strong>GPLv3</strong> lizenziert.</string>
|
||||
<string name="html_about_licence">KeePassDX © %1$d Kunzisoft ist <strong>quelloffen</strong> und <strong>ohne Werbung</strong>. \nDie Nutzung der Software erfolgt auf eigene Verantwortung und ohne jegliche Garantie. Die Applikation wird unter den Bedingungen der <strong>GPLv3</strong> lizenziert.</string>
|
||||
<string name="html_about_contribution">Damit wir <strong>unsere Unabhängigkeit erhalten</strong>, <strong>Fehler beheben</strong>, <strong>Funktionen hinzufügen</strong> und <strong>weiterhin aktiv bleiben</strong> können, zählen wir auf deinen <strong>Beitrag</strong>.</string>
|
||||
<string name="select_database_file">Vorhandene Datenbank öffnen</string>
|
||||
<string name="entry_accessed">Letzter Zugriff</string>
|
||||
<string name="entry_cancel">Abbrechen</string>
|
||||
<string name="entry_notes">Notizen</string>
|
||||
<string name="entry_notes">Hinweise</string>
|
||||
<string name="entry_confpassword">Passwort bestätigen</string>
|
||||
<string name="entry_created">Erstellt</string>
|
||||
<string name="entry_expires">Gültig bis</string>
|
||||
@@ -64,12 +64,12 @@
|
||||
<string name="save">Speichern</string>
|
||||
<string name="entry_title">Titel</string>
|
||||
<string name="entry_url">URL</string>
|
||||
<string name="entry_user_name">Nutzername</string>
|
||||
<string name="entry_user_name">Benutzername</string>
|
||||
<string name="error_arc4">Die RC4/Arcfour-Stromverschlüsselung wird nicht unterstützt.</string>
|
||||
<string name="error_can_not_handle_uri">KeePassDX kann diese URI-Adresse nicht verarbeiten.</string>
|
||||
<string name="error_file_not_create">Datei konnte nicht erstellt werden</string>
|
||||
<string name="error_file_not_create">Datei konnte nicht erstellt werden.</string>
|
||||
<string name="error_invalid_db">Datenbank nicht lesbar.</string>
|
||||
<string name="error_invalid_path">Stelle sicher, dass der Pfad korrekt ist.</string>
|
||||
<string name="error_invalid_path">Bitte sicherstellen, dass der Pfad korrekt ist.</string>
|
||||
<string name="error_no_name">Namen eingeben.</string>
|
||||
<string name="error_nokeyfile">Schlüsseldatei auswählen.</string>
|
||||
<string name="error_out_of_memory">Zu wenig Speicher, um die gesamte Datenbank zu laden.</string>
|
||||
@@ -80,7 +80,7 @@
|
||||
<string name="error_wrong_length">Gib eine positive ganze Zahl in das Feld „Länge“ ein.</string>
|
||||
<string name="field_name">Feldname</string>
|
||||
<string name="field_value">Feldwert</string>
|
||||
<string name="file_not_found_content">Datei nicht gefunden. Versuche sie über den Dateimanager zu öffnen.</string>
|
||||
<string name="file_not_found_content">Datei nicht gefunden. Bitte versuchen, sie über den Dateimanager zu öffnen.</string>
|
||||
<string name="file_browser">Dateimanager</string>
|
||||
<string name="generate_password">Passwort generieren</string>
|
||||
<string name="hint_conf_pass">Passwort bestätigen</string>
|
||||
@@ -124,7 +124,7 @@
|
||||
<string name="progress_title">Bearbeitung läuft …</string>
|
||||
<string name="protection">Schutz</string>
|
||||
<string name="read_only">Schreibgeschützt</string>
|
||||
<string name="read_only_warning">Abhängig von deinem Dateienmanager hat KeePassDX möglicherweise keine Schreibberechtigung.</string>
|
||||
<string name="read_only_warning">Abhängig vom Dateimanager hat KeePassDX möglicherweise keine Schreibberechtigung.</string>
|
||||
<string name="content_description_remove_from_list">Entfernen</string>
|
||||
<string name="root">Start</string>
|
||||
<string name="rounds">Verschlüsselungsrunden</string>
|
||||
@@ -174,7 +174,7 @@
|
||||
<string name="unavailable">Nicht vorhanden</string>
|
||||
<string name="encryption">Verschlüsselung</string>
|
||||
<string name="key_derivation_function">Schlüsselableitungsfunktion</string>
|
||||
<string name="extended_ASCII">Erweiterte ASCII</string>
|
||||
<string name="extended_ASCII">Erweiterter ASCII</string>
|
||||
<string name="allow">Erlauben</string>
|
||||
<string name="error_autofill_enable_service">Dienst für automatisches Ausfüllen kann nicht aktiviert werden.</string>
|
||||
<string name="copy_field">Kopie von %1$s</string>
|
||||
@@ -184,20 +184,20 @@
|
||||
<string name="memory_usage">Arbeitsspeichernutzung</string>
|
||||
<string name="memory_usage_explanation">Arbeitsspeicher, der für die Schlüsselableitung gebraucht wird.</string>
|
||||
<string name="parallelism">Parallelisierung</string>
|
||||
<string name="parallelism_explanation">Grad der Parallelisierung (d.h. Anzahl der Threads), der für die Schlüsselableitung genutzt wird.</string>
|
||||
<string name="parallelism_explanation">Grad der Parallelisierung (d. h. Anzahl der Threads), der für die Schlüsselableitung genutzt wird.</string>
|
||||
<string name="sort_menu">Sortieren</string>
|
||||
<string name="sort_ascending">Aufsteigend ↓</string>
|
||||
<string name="sort_groups_before">Gruppen oben</string>
|
||||
<string name="sort_recycle_bin_bottom">Papierkorb unten</string>
|
||||
<string name="sort_title">Titel</string>
|
||||
<string name="sort_username">Nutzername</string>
|
||||
<string name="sort_username">Benutzername</string>
|
||||
<string name="sort_creation_time">Erstellungsdatum</string>
|
||||
<string name="sort_last_modify_time">Änderungsdatum</string>
|
||||
<string name="sort_last_access_time">Zugriffsdatum</string>
|
||||
<string name="autofill">Automatisches Ausfüllen</string>
|
||||
<string name="autofill_service_name">KeePassDX Auto-Formularausfüllung</string>
|
||||
<string name="autofill_sign_in_prompt">Mit KeePassDX anmelden</string>
|
||||
<string name="set_autofill_service_title">Standard Autofill-Service festlegen</string>
|
||||
<string name="set_autofill_service_title">Standard-Autofill-Service festlegen</string>
|
||||
<string name="autofill_explanation_summary">Automatisches Ausfüllen aktivieren, um Formulare in anderen Apps schnell auszufüllen</string>
|
||||
<string name="autofill_select_entry">Eintrag auswählen …</string>
|
||||
<string name="clipboard">Zwischenablage</string>
|
||||
@@ -224,19 +224,19 @@
|
||||
<string name="reset_education_screens_summary">Alle Hilfsinfos nochmal anzeigen</string>
|
||||
<string name="reset_education_screens_text">Hilfeanzeige zurückgesetzt</string>
|
||||
<string name="education_create_database_title">Datenbankdatei erstellen</string>
|
||||
<string name="education_create_database_summary">Erstellt eine erste Datei zur Passwortverwaltung.</string>
|
||||
<string name="education_create_database_summary">Erste Datei zur Passwortverwaltung erstellen.</string>
|
||||
<string name="education_select_database_title">Existierende Datenbank öffnen</string>
|
||||
<string name="education_select_database_summary">Öffnet über den Dateimanager eine früher erstellte Datenbankdatei, um sie weiter zu verwenden.</string>
|
||||
<string name="education_select_database_summary">Öffnet über den Dateimanager eine früher erstellte Datenbankdatei, um sie weiterzuverwenden.</string>
|
||||
<string name="education_new_node_title">Datenbankelemente hinzufügen</string>
|
||||
<string name="education_new_node_summary">Einträge helfen dabei digitale Konten zu verwalten.
|
||||
<string name="education_new_node_summary">Einträge helfen, digitale Konten zu verwalten.
|
||||
\n
|
||||
\nGruppen/Ordner gliedern Einträge in der Datenbank.</string>
|
||||
<string name="education_search_title">Einträge durchsuchen</string>
|
||||
<string name="education_search_summary">Titel, Nutzernamen oder Inhalte anderer Felder eingeben, um Passwörter zu finden.</string>
|
||||
<string name="education_search_summary">Titel, Benutzernamen oder Inhalt anderer Felder eingeben, um Passwörter zu finden.</string>
|
||||
<string name="education_entry_edit_title">Eintrag bearbeiten</string>
|
||||
<string name="education_entry_edit_summary">Dem Eintrag eigene Felder hinzufügen. Die Felder können mit Querverweisen aus anderen Einträgen ergänzt werden.</string>
|
||||
<string name="education_generate_password_title">Ein starkes Passwort erstellen</string>
|
||||
<string name="education_generate_password_summary">Lassen Sie ein starkes Passwort erstellen, das mit Ihrem Eintrag verbunden wird, legen Sie es einfach anhand von Formularkriterien fest und vergessen Sie nicht Ihr Passwort zu sichern.</string>
|
||||
<string name="education_generate_password_summary">Ein starkes Passwort, das mit dem Eintrag verbunden wird, kann einfach anhand von Formularkriterien festgelegt werden und bitte nicht vergessen dieses Passwort zu sichern.</string>
|
||||
<string name="education_entry_new_field_title">Eigene Felder hinzufügen</string>
|
||||
<string name="education_entry_new_field_summary">Ein zusätzliches Feld einfügen, einen Wert hinzufügen und diesen optional schützen.</string>
|
||||
<string name="education_unlock_title">Datenbank entsperren</string>
|
||||
@@ -250,10 +250,10 @@
|
||||
<string name="education_sort_summary">Wählen, wie Einträge und Gruppen sortiert werden.</string>
|
||||
<string name="education_donation_title">Mitmachen</string>
|
||||
<string name="education_donation_summary">Mithelfen, um Stabilität und Sicherheit zu verbessern sowie weitere Funktionen zu ermöglichen.</string>
|
||||
<string name="html_text_ad_free">Anders als viele Passwortmanager ist dieser <strong>werbefrei</strong>, <strong>quelloffen</strong>, <strong>freie Copyleft-Software</strong> und keine persönlichen Daten werden auf Servern gesammelt, egal welche Version du verwendest.</string>
|
||||
<string name="html_text_ad_free">Anders als viele Passwortmanager ist dieser <strong>werbefrei</strong>, <strong>quelloffen</strong>, <strong>freie Copyleft-Software</strong> und keine persönlichen Daten werden auf Servern gesammelt, egal welche Version man verwendet.</string>
|
||||
<string name="html_text_buy_pro">Mit dem Kauf der Pro-Version erhältst du Zugriff auf diesen <strong>visuellen Stil</strong> und unterstützt insbesondere <strong>die Umsetzung gemeinschaftlicher Projekte.</strong></string>
|
||||
<string name="html_text_feature_generosity">Dieser <strong>visuelle Stil</strong> ist dank deiner Großzügigkeit verfügbar.</string>
|
||||
<string name="html_text_donation">Um unsere Freiheit zu erhalten und stets aktiv zu bleiben, zählen wir auf deinen <strong>Beitrag.</strong></string>
|
||||
<string name="html_text_donation">Mit <strong>Beitragen</strong> zum Projekt <i>(finanziell, Code, Übersetzung)</i> wird sichergestellt, dass es weiterlebt und gedeiht, und außerdem berechtigt das für den Vorgang der <strong>Design</strong>-Freischaltung.</string>
|
||||
<string name="html_text_dev_feature">Diese Funktion ist <strong>in Entwicklung</strong> und erfordert <strong>deinen Beitrag</strong>, um bald verfügbar zu sein.</string>
|
||||
<string name="html_text_dev_feature_buy_pro">Durch den Kauf der <strong>Pro-Version</strong>,</string>
|
||||
<string name="html_text_dev_feature_contibute">Durch deinen <strong>Beitrag</strong>,</string>
|
||||
@@ -286,9 +286,9 @@
|
||||
\nMit „Änderbar“ lässt sich jedes Element frei bearbeiten, hinzufügen oder löschen.</string>
|
||||
<string name="edit_entry">Eintrag bearbeiten</string>
|
||||
<string name="error_load_database">Die Datenbank konnte nicht geladen werden.</string>
|
||||
<string name="error_load_database_KDF_memory">Laden des Schlüssels fehlgeschlagen. Bitte versuchen, die „Speicherplatznutzung“ von KDF zu verringern.</string>
|
||||
<string name="list_entries_show_username_title">Nutzernamen anzeigen</string>
|
||||
<string name="list_entries_show_username_summary">Nutzernamen in Liste anzeigen</string>
|
||||
<string name="error_load_database_KDF_memory">Laden des Schlüssels fehlgeschlagen. Bitte versuchen, die „Arbeitsspeichernutzung“ der Schlüsselableitungsfunktion zu verringern.</string>
|
||||
<string name="list_entries_show_username_title">Benutzernamen anzeigen</string>
|
||||
<string name="list_entries_show_username_summary">Benutzernamen in Eintragslisten anzeigen</string>
|
||||
<string name="build_label">Build %1$s</string>
|
||||
<string name="keyboard_name">Magikeyboard</string>
|
||||
<string name="keyboard_label">Magikeyboard (KeePassDX)</string>
|
||||
@@ -318,7 +318,7 @@
|
||||
<string name="hide_broken_locations_title">Defekte Datenbankverknüpfungen ausblenden</string>
|
||||
<string name="hide_broken_locations_summary">Defekte Verknüpfungen in der Liste der zuletzt verwendeten Datenbanken ausblenden</string>
|
||||
<string name="do_not_kill_app">App nicht beenden …</string>
|
||||
<string name="lock_database_back_root_summary">Datenbank sperren, wenn im Wurzelordner die Zurück-Taste gedrückt wird</string>
|
||||
<string name="lock_database_back_root_summary">Datenbank sperren, wenn auf dem Hauptbildschirm die Taste „Zurück“ gedrückt wird</string>
|
||||
<string name="clear_clipboard_notification_title">Beim Schließen löschen</string>
|
||||
<string name="recycle_bin">Papierkorb</string>
|
||||
<string name="keyboard_selection_entry_title">Eintragsauswahl</string>
|
||||
@@ -382,7 +382,7 @@
|
||||
<string name="menu_security_settings">Sicherheitseinstellungen</string>
|
||||
<string name="menu_master_key_settings">Hauptschlüsseleinstellungen</string>
|
||||
<string name="contains_duplicate_uuid">Die Datenbank enthält doppelte UUIDs.</string>
|
||||
<string name="contains_duplicate_uuid_procedure">Problem lösen, indem neue UUIDs für Duplikate generiert werden um fortzufahren\?</string>
|
||||
<string name="contains_duplicate_uuid_procedure">Problem lösen, indem neue UUIDs für Duplikate generiert werden, um fortzufahren?</string>
|
||||
<string name="database_opened">Datenbank geöffnet</string>
|
||||
<string name="clipboard_explanation_summary">Eintragsfelder mit der Zwischenablage des Geräts kopieren</string>
|
||||
<string name="advanced_unlock_explanation_summary">Geräteentsperrung verwenden, um eine Datenbank einfacher zu öffnen</string>
|
||||
@@ -393,12 +393,12 @@
|
||||
<string name="max_history_size_title">Maximale Größe</string>
|
||||
<string name="max_history_size_summary">Verlaufsumfang pro Eintrag begrenzen</string>
|
||||
<string name="settings_database_recommend_changing_master_key_title">Passwortänderung empfehlen</string>
|
||||
<string name="settings_database_recommend_changing_master_key_summary">(Nach Tagen) Ändern des Hauptschlüssels empfehlen</string>
|
||||
<string name="settings_database_recommend_changing_master_key_summary">Ändern des Hauptschlüssels empfehlen (Tage)</string>
|
||||
<string name="settings_database_force_changing_master_key_title">Passwortänderung erzwingen</string>
|
||||
<string name="settings_database_force_changing_master_key_summary">Ändern des Hauptschlüssels erforderlich (Tage)</string>
|
||||
<string name="settings_database_force_changing_master_key_next_time_title">Änderung nächstes Mal erzwingen</string>
|
||||
<string name="settings_database_force_changing_master_key_next_time_summary">Ändern des Hauptschlüssels beim nächsten Mal erfordern (einmalig)</string>
|
||||
<string name="database_default_username_title">Standardnutzername</string>
|
||||
<string name="database_default_username_title">Standardbenutzername</string>
|
||||
<string name="database_custom_color_title">Eigene Datenbankfarbe</string>
|
||||
<string name="compression">Komprimierung</string>
|
||||
<string name="compression_none">Keine</string>
|
||||
@@ -434,10 +434,10 @@
|
||||
<string name="style_name_moon">Mond</string>
|
||||
<string name="style_name_sun">Sonne</string>
|
||||
<string name="style_name_reply">Antwort</string>
|
||||
<string name="style_name_kunzite">Kunzite</string>
|
||||
<string name="style_name_follow_system">System verfolgen</string>
|
||||
<string name="style_name_kunzite">Kunzit</string>
|
||||
<string name="style_name_follow_system">System folgen</string>
|
||||
<string name="warning_database_read_only">Schreibrechte gewähren, um Datenbankänderungen zu speichern</string>
|
||||
<string name="education_setup_OTP_summary">Einmal-Passwortverwaltung (HOTP/TOTP) einrichten, um Token für Zwei-Faktor-Authentifizierung (2FA) zu generieren.</string>
|
||||
<string name="education_setup_OTP_summary">Einmal-Passwortverwaltung (HOTP/TOTP) einrichten, um Token für Zwei-Faktor-Authentifizierung (2FA) zu erzeugen.</string>
|
||||
<string name="education_setup_OTP_title">OTP einrichten</string>
|
||||
<string name="error_create_database">Die Datenbankdatei kann nicht erstellt werden.</string>
|
||||
<string name="entry_add_attachment">Anhang hinzufügen</string>
|
||||
@@ -448,7 +448,7 @@
|
||||
<string name="autofill_manual_selection_summary">Option zur manuellen Auswahl des Datenbankeintrags anzeigen</string>
|
||||
<string name="lock_database_show_button_summary">Zeigt die Sperrtaste in der Benutzeroberfläche an</string>
|
||||
<string name="lock_database_show_button_title">Sperrtaste anzeigen</string>
|
||||
<string name="autofill_preference_title">Autofüll-Einstellungen</string>
|
||||
<string name="autofill_preference_title">Einstellungen für automatisches Ausfüllen</string>
|
||||
<string name="warning_database_link_revoked">Zugriff auf die Datei durch den Dateimanager widerrufen</string>
|
||||
<string name="error_label_exists">Diese Bezeichnung existiert bereits.</string>
|
||||
<string name="autofill_block_restart">Die das Formular enthaltende App neu starten, um die Sperrung zu aktivieren.</string>
|
||||
@@ -463,7 +463,7 @@
|
||||
<string name="content_description_add_item">Element hinzufügen</string>
|
||||
<string name="filter">Filter</string>
|
||||
<string name="keyboard_change">Tastatur wechseln</string>
|
||||
<string name="keyboard_previous_fill_in_title">Zurück wechseln</string>
|
||||
<string name="keyboard_previous_fill_in_title">Zurückwechseln</string>
|
||||
<string name="keyboard_previous_database_credentials_title">Datenbank-Anmeldebildschirm</string>
|
||||
<string name="keyboard_previous_fill_in_summary">Nach dem Ausführen der automatischen Tastenaktion automatisch zur vorherigen Tastatur wechseln</string>
|
||||
<string name="keyboard_previous_database_credentials_summary">Auf dem Datenbank-Anmeldebildschirm automatisch zur vorherigen Tastatur wechseln</string>
|
||||
@@ -476,16 +476,16 @@
|
||||
<string name="warning_sure_remove_data">Diese Daten trotzdem entfernen\?</string>
|
||||
<string name="warning_remove_unlinked_attachment">Das Entfernen nicht verknüpfter Daten kann die Größe der Datenbank reduzieren, allerdings auch Daten löschen, die von KeePass-Plugins genutzt werden.</string>
|
||||
<string name="warning_replace_file">Das Hinzufügen dieser Datei wird die bestehende Datei ersetzen.</string>
|
||||
<string name="warning_file_too_big">Eine KeePass-Datenbank soll nur kleine Dateien beinhalten (wie z.B. PGP-Schlüsseldateien).
|
||||
<string name="warning_file_too_big">Eine KeePass-Datenbank soll nur kleine Dateien beinhalten (wie z. B. PGP-Schlüsseldateien).
|
||||
\n
|
||||
\nDeine Datenbank könnte mit diesem Anhang sehr groß und leistungsschwach werden.</string>
|
||||
\nMit diesem Anhang könnte die Datenbank sehr groß werden und damit die Leistung beeinträchtigen.</string>
|
||||
<string name="upload_attachment">%1$s hochladen</string>
|
||||
<string name="education_add_attachment_title">Anhang hinzufügen</string>
|
||||
<string name="database_data_remove_unlinked_attachments_summary">Entfernt Anhänge, die in der Datenbank enthalten, aber keinem Eintrag zugeordnet sind</string>
|
||||
<string name="warning_sure_add_file">Datei trotzdem hinzufügen\?</string>
|
||||
<string name="show_uuid_summary">Zeigt die mit einem Eintrag oder einer Gruppe verknüpfte UUID an</string>
|
||||
<string name="show_uuid_title">UUID anzeigen</string>
|
||||
<string name="autofill_read_only_save">Daten speichern ist bei schreibgeschützt geöffneter Datenbank nicht möglich.</string>
|
||||
<string name="autofill_read_only_save">Das Speichern von Daten ist bei einer schreibgeschützt geöffneten Datenbank nicht möglich.</string>
|
||||
<string name="autofill_close_database_title">Datenbank schließen</string>
|
||||
<string name="keyboard_previous_lock_summary">Nach dem Sperren der Datenbank automatisch zur vorherigen Tastatur wechseln</string>
|
||||
<string name="keyboard_previous_lock_title">Datenbank sperren</string>
|
||||
@@ -495,8 +495,8 @@
|
||||
<string name="registration_mode">Registrierungsmodus</string>
|
||||
<string name="save_mode">Speichermodus</string>
|
||||
<string name="search_mode">Suchmodus</string>
|
||||
<string name="error_registration_read_only">Speichern eines neuen Elements in einer schreibgeschützten Datenbank ist unzulässig</string>
|
||||
<string name="autofill_save_search_info_summary">Bei manueller Eintragsauswahl Suchinformationen speichern, für leichtere zukünftige Verwendung</string>
|
||||
<string name="error_registration_read_only">Speichern eines neuen Elements in einer schreibgeschützten Datenbank ist unzulässig.</string>
|
||||
<string name="autofill_save_search_info_summary">Bei manueller Eintragsauswahl Suchinformationen speichern, um sie später leichter verwenden zu können</string>
|
||||
<string name="autofill_ask_to_save_data_summary">Fragen, ob Daten nach Formularausfüllung gespeichert werden sollen</string>
|
||||
<string name="autofill_ask_to_save_data_title">Speichern von Daten abfragen</string>
|
||||
<string name="autofill_save_search_info_title">Suchinformationen speichern</string>
|
||||
@@ -511,7 +511,7 @@
|
||||
<string name="education_advanced_unlock_summary">Eigenes Passwort mit Biometrie- oder Geräteanmeldedaten verknüpfen, um die Datenbank schnell zu entsperren.</string>
|
||||
<string name="education_advanced_unlock_title">Geräteentsperrung der Datenbank</string>
|
||||
<string name="advanced_unlock_timeout">Zeitlimit für Geräteentsperrung</string>
|
||||
<string name="temp_advanced_unlock_timeout_summary">Dauer der Geräteentsperrung bis sie zurückgesetzt wird</string>
|
||||
<string name="temp_advanced_unlock_timeout_summary">Dauer der Geräteentsperrung, bis sie zurückgesetzt wird</string>
|
||||
<string name="temp_advanced_unlock_timeout_title">Ablauf der Geräteentsperrung</string>
|
||||
<string name="temp_advanced_unlock_enable_summary">Bei Nutzung der Geräteentsperrung keine verschlüsselten Inhalte speichern</string>
|
||||
<string name="temp_advanced_unlock_enable_title">Zeitlich begrenzte Geräteentsperrung</string>
|
||||
@@ -544,12 +544,12 @@
|
||||
<string name="error_upload_file">Beim Hochladen der Datei ist ein Fehler aufgetreten.</string>
|
||||
<string name="import_app_properties_title">App-Einstellungen importieren</string>
|
||||
<string name="error_start_database_action">Beim Ausführen einer Aktion in der Datenbank ist ein Fehler aufgetreten.</string>
|
||||
<string name="error_otp_type">Der vorhandene OTP-Typ wird von diesem Formular nicht erkannt, seine Validierung erzeugt Token möglicherweise nicht mehr korrekt.</string>
|
||||
<string name="error_otp_type">Der vorhandene OTP-Typ wird von diesem Formular nicht erkannt, seine Validierung kann Token möglicherweise nicht mehr korrekt erzeugen.</string>
|
||||
<string name="content_description_otp_information">Informationen zu Einmalpasswörtern</string>
|
||||
<string name="warning_database_revoked">Auf die Datei kann nicht zugegriffen werden. Schließe die Datenbank und öffne sie von ihrem Speicherort erneut.</string>
|
||||
<string name="error_export_app_properties">Fehler beim Exportieren der App-Einstellungen</string>
|
||||
<string name="warning_database_revoked">Auf die Datei kann nicht zugegriffen werden. Bitte die Datenbank schließen und von ihrem Speicherort aus erneut öffnen.</string>
|
||||
<string name="error_export_app_properties">Fehler beim Exportieren der App-Einstellungen.</string>
|
||||
<string name="success_export_app_properties">App-Einstellungen exportiert</string>
|
||||
<string name="error_import_app_properties">Fehler beim Importieren der App-Einstellungen</string>
|
||||
<string name="error_import_app_properties">Fehler beim Importieren der App-Einstellungen.</string>
|
||||
<string name="success_import_app_properties">App-Einstellungen importiert</string>
|
||||
<string name="export_app_properties_summary">Datei zum Exportieren von App-Einstellungen erstellen</string>
|
||||
<string name="export_app_properties_title">App-Einstellungen exportieren</string>
|
||||
@@ -566,13 +566,13 @@
|
||||
<string name="unit_kibibyte">KiB</string>
|
||||
<string name="unit_byte">B</string>
|
||||
<string name="download_canceled">Abgebrochen!</string>
|
||||
<string name="autofill_inline_suggestions_keyboard">Autofüll-Vorschläge hinzugefügt.</string>
|
||||
<string name="autofill_inline_suggestions_summary">Falls möglich, Autofüll-Vorschläge direkt auf kompatibler Tastatur anzeigen</string>
|
||||
<string name="autofill_inline_suggestions_keyboard">Vorschläge zum automatischen Ausfüllen hinzugefügt.</string>
|
||||
<string name="autofill_inline_suggestions_summary">Falls möglich, Vorschläge zum automatischen Ausfüllen direkt auf kompatibler Tastatur anzeigen</string>
|
||||
<string name="properties">Eigenschaften</string>
|
||||
<string name="description_app_properties">KeePassDX-Eigenschaften zur Verwaltung der App-Einstellungen</string>
|
||||
<string name="secure_note">Sicherer Hinweis</string>
|
||||
<string name="type">Typ</string>
|
||||
<string name="date_of_issue">Datum</string>
|
||||
<string name="date_of_issue">Ausstellungsdatum</string>
|
||||
<string name="place_of_issue">Ausstellungsort</string>
|
||||
<string name="name">Name</string>
|
||||
<string name="id_card">Personalausweis</string>
|
||||
@@ -582,14 +582,14 @@
|
||||
<string name="templates">Vorlagen</string>
|
||||
<string name="templates_group_uuid_title">Vorlagengruppe</string>
|
||||
<string name="templates_group_enable_summary">Dynamische Vorlagen zum Ausfüllen der Felder eines Eintrags verwenden</string>
|
||||
<string name="templates_group_enable_title">Vorlagen-Verwendung</string>
|
||||
<string name="templates_group_enable_title">Verwendung von Vorlagen</string>
|
||||
<string name="version">Version</string>
|
||||
<string name="template">Vorlage</string>
|
||||
<string name="standard">Standard</string>
|
||||
<string name="membership">Mitgliedschaft</string>
|
||||
<string name="international_bank_account_number">IBAN</string>
|
||||
<string name="bank_identifier_code">SWIFT/BIC</string>
|
||||
<string name="bank_name">Bankname</string>
|
||||
<string name="bank_name">Name der Bank</string>
|
||||
<string name="bank">Bank</string>
|
||||
<string name="account">Konto</string>
|
||||
<string name="seed">Seed</string>
|
||||
@@ -615,7 +615,7 @@
|
||||
<string name="tags">Tags</string>
|
||||
<string name="show_entry_colors_title">Eintragsfarben</string>
|
||||
<string name="enable_keep_screen_on_title">Bildschirm eingeschaltet lassen</string>
|
||||
<string name="warning_keyfile_integrity">Der Hash der Datei kann nicht garantiert werden, da Android seine Daten ändern kann. Änder die Dateiendung zu .bin, um die Integrität zu gewährleisten.</string>
|
||||
<string name="warning_keyfile_integrity">Der Hash der Datei kann nicht garantiert werden, da Android deren Daten ändern kann. Bitte die Dateiendung in .bin ändern, um die Integrität zu gewährleisten.</string>
|
||||
<string name="enable_keep_screen_on_summary">Bildschirm beim Anzeigen oder Bearbeiten des Eintrags eingeschaltet lassen</string>
|
||||
<string name="show_entry_colors_summary">Vorder- und Hintergrundfarbe für einen Eintrag anzeigen</string>
|
||||
<string name="auto_type_sequence">Automatische Eingabefolge</string>
|
||||
@@ -626,27 +626,28 @@
|
||||
<string name="search_filters">Suchfilter</string>
|
||||
<string name="current_group">Aktuelle Gruppe</string>
|
||||
<string name="case_sensitive">Groß-/Kleinschreibung beachten</string>
|
||||
<string name="menu_merge_from">Zusammenführen von …</string>
|
||||
<string name="menu_save_copy_to">Kopie speichern unter …</string>
|
||||
<string name="menu_merge_from">Zusammenführen von …</string>
|
||||
<string name="menu_save_copy_to">Kopie speichern unter …</string>
|
||||
<string name="content_description_nav_header">Navigationskopfzeile</string>
|
||||
<string name="navigation_drawer_close">Navigationsleiste schließen</string>
|
||||
<string name="navigation_drawer_open">Navigationsleiste öffnen</string>
|
||||
<string name="expired">Abgelaufen</string>
|
||||
<string name="warning_database_already_opened">Eine Datenbank ist bereits geöffnet. Schließe sie, um eine neue zu öffnen</string>
|
||||
<string name="advanced_unlock_keystore_warning">Diese Funktion speichert verschlüsselte Anmeldedaten im sicheren Schlüsselspeicher deines Geräts.
|
||||
<string name="advanced_unlock_keystore_warning">Diese Funktion speichert verschlüsselte Anmeldedaten im sicheren Schlüsselspeicher dieses Geräts.
|
||||
\n
|
||||
\nJe nach der internen API-Implementierung des Betriebssystems kann sie eingeschränkt sein.
|
||||
\n
|
||||
\nBitte die Kompatibilität und Sicherheit des Schlüsselspeichers vom Gerätehersteller und vom Ersteller der verwendeten ROM abgleichen.</string>
|
||||
<string name="content_description_passphrase_word_count">Passphrasen-Wortanzahl</string>
|
||||
<string name="passphrase">Passphrase</string>
|
||||
<string name="colorize_password_title">Passwörter kolorieren</string>
|
||||
<string name="colorize_password_summary">Koloriere Passwortzeichen nach Typ</string>
|
||||
<string name="colorize_password_title">Passwörter einfärben</string>
|
||||
<string name="colorize_password_summary">Passwortzeichen nach Typ einfärben</string>
|
||||
<string name="keyboard_previous_search_title">Suchbildschirm</string>
|
||||
<string name="keyboard_previous_search_summary">Auf dem Suchbildschirm automatisch zur vorherigen Tastatur wechseln</string>
|
||||
<string name="entropy">Entropie: %1$s Bit</string>
|
||||
<string name="entropy_high">Entropie: Hoch</string>
|
||||
<string name="entropy_calculate">Entropie: Berechnen …</string>
|
||||
<string name="at_least_one_char">Mindestens jedes Zeichen einmal</string>
|
||||
<string name="at_least_one_char">Mindestens ein Zeichen von jedem</string>
|
||||
<string name="consider_chars_filter">Zeichen beinhalten</string>
|
||||
<string name="word_separator">Trennzeichen</string>
|
||||
<string name="ignore_chars_filter">Zeichen ignorieren</string>
|
||||
@@ -663,7 +664,7 @@
|
||||
<string name="waiting_challenge_request">Challenge-Anfrage abwarten …</string>
|
||||
<string name="error_cancel_by_user">Vom Benutzer abgebrochen.</string>
|
||||
<string name="error_driver_required">Treiber für %1$s ist erforderlich.</string>
|
||||
<string name="error_unable_merge_database_kdb">Die Zusammenführung aus einer Datenbank V1 ist nicht möglich.</string>
|
||||
<string name="error_unable_merge_database_kdb">Das Zusammenführen mit einer kdb-Datenbankdatei ist nicht möglich.</string>
|
||||
<string name="error_location_unknown">Der Speicherort der Datenbank ist unbekannt, Datenbankaktion kann nicht ausgeführt werden.</string>
|
||||
<string name="error_hardware_key_unsupported">Der Hardwareschlüssel wird nicht unterstützt.</string>
|
||||
<string name="error_empty_key">Der Schlüssel darf nicht leer sein.</string>
|
||||
@@ -679,7 +680,7 @@
|
||||
<string name="auto_type">Automatische Eingabe</string>
|
||||
<string name="html_about_privacy"><strong>Es werden keine Benutzerdaten ausgelesen</strong>, diese Anwendung stellt keine Verbindung zu einem Server her, arbeitet nur lokal und respektiert vollständig die Privatsphäre der Benutzer.</string>
|
||||
<string name="merge_success">Zusammenführung erfolgreich abgeschlossen</string>
|
||||
<string name="menu_form_filling_settings_summary">Tastatur, Automatisches Ausfüllen, Zwischenablage</string>
|
||||
<string name="menu_form_filling_settings_summary">Tastatur, automatisches Ausfüllen, Zwischenablage</string>
|
||||
<string name="menu_advanced_unlock_settings_summary">Biometrie, Geräteanmeldedaten</string>
|
||||
<string name="menu_database_settings_summary">Metadaten, Papierkorb, Vorlagen, Verlauf</string>
|
||||
<string name="menu_app_settings_summary">Suche, Sperre, Verlauf, Eigenschaften</string>
|
||||
@@ -700,4 +701,14 @@
|
||||
\n
|
||||
\nWenn ein automatisches Sperren aktiviert ist und vergessen wird, dass Änderungen vorgenommen wurden, besteht die Gefahr von Datenverlust.</string>
|
||||
<string name="info">Info</string>
|
||||
</resources>
|
||||
<string name="style_name_light">Hell</string>
|
||||
<string name="style_name_dark">Dunkel</string>
|
||||
<string name="warning_database_info_changed_options_read_only">Die Datenbank mit den letzten Änderungen neu laden.</string>
|
||||
<string name="hide_templates_title">Vorlagen ausblenden</string>
|
||||
<string name="hide_templates_summary">Vorlagen sind ausgeblendet</string>
|
||||
<string name="nodes">Knoten</string>
|
||||
<string name="recursive_number_entries_summary">Berechnet rekursiv die Anzahl der Einträge in einer Gruppe</string>
|
||||
<string name="warning_large_keyfile">Es wird nicht empfohlen, eine große Schlüsseldatei hinzuzufügen, da dies das Öffnen der Datenbank verhindern kann.</string>
|
||||
<string name="recursive_number_entries_title">Rekursive Anzahl der Einträge</string>
|
||||
<string name="generate_keyfile">Schlüsseldatei generieren</string>
|
||||
</resources>
|
||||
|
||||
@@ -61,7 +61,7 @@
|
||||
<string name="entry_user_name">Όνομα χρήστη</string>
|
||||
<string name="error_arc4">Η ροή κρυπτογράφησης Arcfour δεν υποστηρίζεται.</string>
|
||||
<string name="error_can_not_handle_uri">Το KeePassDX δε μπορεί να χειριστεί αυτή τη διεύθυνση URI.</string>
|
||||
<string name="error_file_not_create">Δεν ήταν δυνατή η δημιουργία αρχείου</string>
|
||||
<string name="error_file_not_create">Δεν ήταν δυνατή η δημιουργία αρχείου.</string>
|
||||
<string name="error_invalid_db">Δεν ήταν δυνατή η ανάγνωση της βάσης δεδομένων.</string>
|
||||
<string name="error_invalid_path">Βεβαιωθείτε ότι η διαδρομή είναι σωστή.</string>
|
||||
<string name="error_no_name">Εισαγάγετε ένα όνομα.</string>
|
||||
@@ -199,7 +199,7 @@
|
||||
<string name="application_appearance">Διεπαφή</string>
|
||||
<string name="other">Άλλα</string>
|
||||
<string name="keyboard">Πληκτρολόγιο</string>
|
||||
<string name="magic_keyboard_title">Magikeyboard</string>
|
||||
<string name="magic_keyboard_title">Magikeybοard</string>
|
||||
<string name="reset_education_screens_title">Επαναφορά εκπαιδευτικών υποδείξεων</string>
|
||||
<string name="reset_education_screens_summary">Εμφάνιση όλων των εκπαιδευτικών πληροφοριών ξανά</string>
|
||||
<string name="reset_education_screens_text">Επαναφορά εκπαιδευτικών υποδείξεων</string>
|
||||
@@ -233,7 +233,7 @@
|
||||
<string name="html_text_ad_free">Σε αντίθεση με πολλές άλλες εφαρμογές διαχείρισης κωδικών πρόσβασης, αυτή είναι <strong>χωρίς διαφημίσεις</strong>, <strong>copylefted libre λογισμικό</strong> και δεν συλλέγει προσωπικά δεδομένα στους διακομιστές της, ανεξάρτητα από την έκδοση που χρησιμοποιείτε.</string>
|
||||
<string name="html_text_buy_pro">Με την αγορά της επαγγελματικής έκδοσης, θα έχετε πρόσβαση σε αυτό το <strong>οπτικό στοιχείο</strong> και θα βοηθήσετε ιδιαίτερα την <strong>υλοποίηση ιδεών της κοινότητας.</strong></string>
|
||||
<string name="html_text_feature_generosity">Αυτό το <strong>οπτικό στυλ</strong> είναι διαθέσιμο χάρη στη γενναιοδωρία σας.</string>
|
||||
<string name="html_text_donation">Για να διατηρήσουμε την ελεύθερη έκδοση και να είμαστε πάντα ενεργοί, υπολογίζουμε στην <strong>συνεισφορά σας.</strong></string>
|
||||
<string name="html_text_donation">Με τη <strong>συνεισφορά σας</strong> στο έργο <i>(χρηματικά, κώδικα, μετάφραση)</i>, θα το βοηθήσετε να συνεχίσει να ζει και να ευδοκιμεί και θα είστε επίσης επιλέξιμοι για τη διαδικασία ξεκλειδώματος <strong>θεμάτων </strong> .</string>
|
||||
<string name="html_text_dev_feature">Αυτή η λειτουργία είναι <strong>υπό ανάπτυξη</strong> και απαιτεί την <strong>συνεισφοράς</strong> σας για να είναι σύντομα διαθέσιμη.</string>
|
||||
<string name="html_text_dev_feature_buy_pro">Με την αγορά της έκδοσης <strong>pro</strong>,</string>
|
||||
<string name="html_text_dev_feature_contibute">Με την <strong>συνεισφορά</strong> σας,</string>
|
||||
@@ -273,8 +273,8 @@
|
||||
<string name="list_entries_show_username_summary">Εμφάνιση ονομάτων χρηστών σε λίστες καταχώρησης</string>
|
||||
<string name="clipboard">Πρόχειρο</string>
|
||||
<string name="build_label">Κατασκευή %1$s</string>
|
||||
<string name="keyboard_name">Magikeyboard</string>
|
||||
<string name="keyboard_label">Magikeyboard (KeePassDX)</string>
|
||||
<string name="keyboard_name">Magikeybοard</string>
|
||||
<string name="keyboard_label">Magikeybοard (KeePassDX)</string>
|
||||
<string name="keyboard_setting_label">Ρυθμίσεις Magikeyboard</string>
|
||||
<string name="keyboard_entry_category">Καταχώριση</string>
|
||||
<string name="keyboard_entry_timeout_title">Τέλος χρόνου</string>
|
||||
@@ -485,7 +485,7 @@
|
||||
<string name="registration_mode">Τρόπος εγγραφής</string>
|
||||
<string name="save_mode">Λειτουργία αποθήκευσης</string>
|
||||
<string name="search_mode">Λειτουργία αναζήτησης</string>
|
||||
<string name="error_registration_read_only">Η αποθήκευση ενός νέου αντικειμένου δεν επιτρέπεται σε μια βάση δεδομένων μόνο για ανάγνωση</string>
|
||||
<string name="error_registration_read_only">Η αποθήκευση ενός νέου αντικειμένου δεν επιτρέπεται σε μια βάση δεδομένων μόνο για ανάγνωση.</string>
|
||||
<string name="error_field_name_already_exists">Το όνομα πεδίου υπάρχει ήδη.</string>
|
||||
<string name="advanced_unlock_prompt_store_credential_title">Σύνδεσμος για ξεκλείδωμα συσκευής</string>
|
||||
<string name="advanced_unlock_prompt_store_credential_message">Θα πρέπει ακόμα να θυμάστε τα κύρια διαπιστευτήρια της κρύπτης εάν χρησιμοποιείτε την αναγνώριση ξεκλειδώματος συσκευής.</string>
|
||||
@@ -540,9 +540,9 @@
|
||||
<string name="error_remove_file">Παρουσιάστηκε σφάλμα κατά την κατάργηση των δεδομένων αρχείου.</string>
|
||||
<string name="error_duplicate_file">Τα δεδομένα αρχείου υπάρχουν ήδη.</string>
|
||||
<string name="properties">Ιδιότητες</string>
|
||||
<string name="error_export_app_properties">Σφάλμα κατά την εξαγωγή ρυθμίσεων εφαρμογής</string>
|
||||
<string name="error_export_app_properties">Σφάλμα κατά την εξαγωγή ρυθμίσεων εφαρμογής.</string>
|
||||
<string name="success_export_app_properties">Έγινε εξαγωγή ρυθμίσεων εφαρμογής</string>
|
||||
<string name="error_import_app_properties">Σφάλμα κατά την εισαγωγή ρυθμίσεων εφαρμογής</string>
|
||||
<string name="error_import_app_properties">Σφάλμα κατά την εισαγωγή ρυθμίσεων εφαρμογής.</string>
|
||||
<string name="success_import_app_properties">Έγινε εισαγωγή ρυθμίσεων εφαρμογής</string>
|
||||
<string name="description_app_properties">Ιδιότητες KeePassDX για διαχείριση ρυθμίσεων εφαρμογής</string>
|
||||
<string name="export_app_properties_summary">Δημιουργήστε ένα αρχείο για εξαγωγή ρυθμίσεων εφαρμογής</string>
|
||||
@@ -624,6 +624,7 @@
|
||||
<string name="advanced_unlock_keystore_warning">Αυτή η δυνατότητα θα αποθηκεύσει κρυπτογραφημένα δεδομένα διαπιστευτηρίων στο ασφαλές KeyStore της συσκευής σας.
|
||||
\n
|
||||
\nΑνάλογα με την εγγενή υλοποίηση API του λειτουργικού συστήματος, ενδέχεται να μην είναι πλήρως λειτουργικό.
|
||||
\n
|
||||
\nΕλέγξτε τη συμβατότητα και την ασφάλεια του KeyStore με τον κατασκευαστή της συσκευής σας και τον δημιουργό της ROM που χρησιμοποιείτε.</string>
|
||||
<string name="passphrase">Συνθηματική φράση</string>
|
||||
<string name="colorize_password_summary">Χρωματίστε τους χαρακτήρες του κωδικού πρόσβασης ανά τύπο</string>
|
||||
@@ -658,10 +659,10 @@
|
||||
<string name="error_no_response_from_challenge">Δεν είναι δυνατή η λήψη της απάντησης από την πρόκληση.</string>
|
||||
<string name="enable_screenshot_mode_title">Λειτουργία στιγμιότυπου οθόνης</string>
|
||||
<string name="screenshot_mode_banner_text">Λειτουργία στιγμιότυπου οθόνης</string>
|
||||
<string name="error_challenge_already_requested">Η πρόκληση έχει ήδη ζητηθεί</string>
|
||||
<string name="error_challenge_already_requested">Η πρόκληση έχει ήδη ζητηθεί.</string>
|
||||
<string name="error_response_already_provided">Η απάντηση έχει ήδη δοθεί.</string>
|
||||
<string name="error_location_unknown">Η θέση της βάσης δεδομένων είναι άγνωστη, η ενέργεια της βάσης δεδομένων δεν μπορεί να εκτελεστεί.</string>
|
||||
<string name="error_unable_merge_database_kdb">Δεν είναι δυνατή η συγχώνευση από μια βάση δεδομένων V1.</string>
|
||||
<string name="error_unable_merge_database_kdb">Δεν είναι δυνατή η συγχώνευση με μια βάση δεδομένων kdb.</string>
|
||||
<string name="error_empty_key">Το κλειδί δεν μπορεί να είναι κενό.</string>
|
||||
<string name="corrupted_file">Κατεστραμμένο αρχείο.</string>
|
||||
<string name="html_about_privacy"><strong>Δεν ανακτώνται δεδομένα χρήστη</strong>, αυτή η εφαρμογή δεν συνδέεται με κανένα διακομιστή, λειτουργεί μόνο τοπικά και σέβεται πλήρως το απόρρητο των χρηστών.</string>
|
||||
@@ -688,4 +689,23 @@
|
||||
<string name="education_validate_entry_summary">Θυμηθείτε να επικυρώσετε την καταχώρησή σας και να αποθηκεύσετε τη βάση δεδομένων σας.
|
||||
\n
|
||||
\nΕάν ενεργοποιηθεί ένα αυτόματο κλείδωμα και ξεχάσετε ότι κάνετε μια τροποποίηση, κινδυνεύετε να χάσετε τα δεδομένα σας.</string>
|
||||
<string name="style_name_forest">Δάσος</string>
|
||||
<string name="style_name_divine">Θείο</string>
|
||||
<string name="style_name_classic">Κλασσικό</string>
|
||||
<string name="style_name_simple">Απλό</string>
|
||||
<string name="style_name_reply">Απάντηση</string>
|
||||
<string name="style_name_light">Φωτεινό</string>
|
||||
<string name="style_name_dark">Σκοτεινό</string>
|
||||
<string name="style_name_moon">Φεγγάρι</string>
|
||||
<string name="style_name_sun">Ήλιος</string>
|
||||
<string name="style_name_kunzite">Κουνζίτης</string>
|
||||
<string name="style_name_follow_system">Όπως το σύστημα</string>
|
||||
<string name="warning_database_info_changed_options_read_only">Επαναφορτώστε τη βάση δεδομένων με τις τελευταίες αλλαγές.</string>
|
||||
<string name="recursive_number_entries_summary">Υπολογίζει αναδρομικά τον αριθμό των καταχωρήσεων σε μια ομάδα</string>
|
||||
<string name="hide_templates_title">Απόκρυψη προτύπων</string>
|
||||
<string name="generate_keyfile">Δημιουργία αρχείου κλειδιού</string>
|
||||
<string name="nodes">Κόμβοι</string>
|
||||
<string name="warning_large_keyfile">Δεν συνιστάται η προσθήκη μεγάλου αρχείου κλειδιού, αυτό μπορεί να εμποδίσει το άνοιγμα της βάσης δεδομένων.</string>
|
||||
<string name="hide_templates_summary">Τα πρότυπα δεν εμφανίζονται</string>
|
||||
<string name="recursive_number_entries_title">Αναδρομικός αριθμός καταχωρήσεων</string>
|
||||
</resources>
|
||||
@@ -33,10 +33,10 @@
|
||||
<string name="encryption">Encryption</string>
|
||||
<string name="contact">Contact</string>
|
||||
<string name="contribution">Contribution</string>
|
||||
<string name="about_description">password</string>
|
||||
<string name="encryption_algorithm">Encryption</string>
|
||||
<string name="about_description">Android implementation of the KeePass password manager</string>
|
||||
<string name="encryption_algorithm">Encryption algorithm</string>
|
||||
<string name="app_timeout">Timeout</string>
|
||||
<string name="app_timeout_summary">database</string>
|
||||
<string name="app_timeout_summary">Idle time before locking the database</string>
|
||||
<string name="application">App</string>
|
||||
<string name="brackets">Brackets</string>
|
||||
<string name="extended_ASCII">Extended ASCII</string>
|
||||
@@ -50,4 +50,190 @@
|
||||
<string name="content_description_add_item">Add item</string>
|
||||
<string name="content_description_file_information">File info</string>
|
||||
<string name="content_description_credentials_information">Credentials info</string>
|
||||
</resources>
|
||||
<string name="content_description_hardware_key_checkbox">Hardware key checkbox</string>
|
||||
<string name="content_description_nav_header">Navigation header</string>
|
||||
<string name="navigation_drawer_open">Navigation drawer open</string>
|
||||
<string name="content_description_passphrase_word_count">Passphrase word count</string>
|
||||
<string name="content_description_remove_from_list">Remove</string>
|
||||
<string name="info">Info</string>
|
||||
<string name="clipboard_cleared">Clipboard cleared</string>
|
||||
<string name="clipboard_error_title">Clipboard error</string>
|
||||
<string name="clipboard_error">Some devices won\'t let apps use the clipboard.</string>
|
||||
<string name="clipboard_timeout_summary">Duration of storage in the clipboard (if supported by your device)</string>
|
||||
<string name="content_description_otp_information">One-time password info</string>
|
||||
<string name="content_description_keyfile_checkbox">Keyfile checkbox</string>
|
||||
<string name="content_description_entry_icon">Entry icon</string>
|
||||
<string name="navigation_drawer_close">Navigation drawer close</string>
|
||||
<string name="validate">Validate</string>
|
||||
<string name="discard_changes">Discard changes?</string>
|
||||
<string name="discard">Discard</string>
|
||||
<string name="entry_password_generator">Password generator</string>
|
||||
<string name="content_description_password_length">Password length</string>
|
||||
<string name="content_description_keyboard_close_fields">Close fields</string>
|
||||
<string name="retrieving_db_key">Retrieving database key…</string>
|
||||
<string name="html_about_contribution">In order to <strong>keep our freedom</strong>, <strong>fix bugs</strong>, <strong>add features</strong> and <strong>to be always active</strong>, we count on your <strong>contribution</strong>.</string>
|
||||
<string name="entry_accessed">Accessed</string>
|
||||
<string name="entry_confpassword">Confirm password</string>
|
||||
<string name="clipboard_error_clear">Could not clear clipboard</string>
|
||||
<string name="clipboard_timeout">Clipboard timeout</string>
|
||||
<string name="content_description_password_checkbox">Password checkbox</string>
|
||||
<string name="content_description_repeat_toggle_password_visibility">Repeat toggle password visibility</string>
|
||||
<string name="waiting_challenge_request">Waiting for the challenge request…</string>
|
||||
<string name="waiting_challenge_response">Waiting for the challenge response…</string>
|
||||
<string name="database">Database</string>
|
||||
<string name="template_group_name">Templates</string>
|
||||
<string name="decrypting_db">Decrypting database content…</string>
|
||||
<string name="default_checkbox">Use as default database</string>
|
||||
<string name="digits">Digits</string>
|
||||
<string name="entry_add_field">Add field</string>
|
||||
<string name="entry_add_attachment">Add attachment</string>
|
||||
<string name="content_description_remove_field">Remove field</string>
|
||||
<string name="content_description_update_from_list">Update</string>
|
||||
<string name="html_about_licence">KeePassDX © %1$d Kunzisoft is <strong>open source</strong> and <strong>without advertising</strong>. \nIt is provided as is, under <strong>GPLv3</strong> license, without any warranty.</string>
|
||||
<string name="html_about_privacy"><strong>No user data is retrieved</strong>, this application does not connect to any server, works only locally and fully respects the privacy of users.</string>
|
||||
<string name="entry_cancel">Cancel</string>
|
||||
<string name="entry_notes">Notes</string>
|
||||
<string name="entry_created">Created</string>
|
||||
<string name="otp_type">OTP type</string>
|
||||
<string name="otp_secret">Secret</string>
|
||||
<string name="otp_period">Period (seconds)</string>
|
||||
<string name="entry_user_name">Username</string>
|
||||
<string name="error_arc4">The Arcfour stream cipher is not supported.</string>
|
||||
<string name="error_file_not_create">Could not create file.</string>
|
||||
<string name="error_load_database_KDF_memory">Could not load the key. Try to lower the KDF \"Memory Usage\".</string>
|
||||
<string name="entry_expires">Expires</string>
|
||||
<string name="expired">Expired</string>
|
||||
<string name="entry_UUID">UUID</string>
|
||||
<string name="entry_history">History</string>
|
||||
<string name="entry_attachments">Attachments</string>
|
||||
<string name="entry_keyfile">Keyfile</string>
|
||||
<string name="hardware_key">Hardware key</string>
|
||||
<string name="entry_modified">Modified</string>
|
||||
<string name="personal_identification_number">PIN</string>
|
||||
<string name="id_card">ID Card</string>
|
||||
<string name="name">Name</string>
|
||||
<string name="place_of_issue">Place of issue</string>
|
||||
<string name="date_of_issue">Date of issue</string>
|
||||
<string name="email">Email</string>
|
||||
<string name="error_invalid_db">Could not read the database.</string>
|
||||
<string name="error_invalid_path">Make sure the path is correct.</string>
|
||||
<string name="error_invalid_OTP">Invalid OTP secret.</string>
|
||||
<string name="error_no_name">Enter a name.</string>
|
||||
<string name="error_word_reserved">This word is reserved and cannot be used.</string>
|
||||
<string name="error_nokeyfile">Select a keyfile.</string>
|
||||
<string name="file_manager_install_description">A file manager that accepts the ACTION_CREATE_DOCUMENT and ACTION_OPEN_DOCUMENT intent action is required to create, open, and save database files.</string>
|
||||
<string name="select_to_copy">Select to copy %1$s to clipboard</string>
|
||||
<string name="searchable">Searchable</string>
|
||||
<string name="inherited">Inherit</string>
|
||||
<string name="auto_type">Auto-Type</string>
|
||||
<string name="auto_type_sequence">Auto-Type sequence</string>
|
||||
<string name="entry_not_found">Could not find entry data.</string>
|
||||
<string name="entry_password">Password</string>
|
||||
<string name="tags">Tags</string>
|
||||
<string name="custom_data">Custom data</string>
|
||||
<string name="save">Save</string>
|
||||
<string name="entry_title">Title</string>
|
||||
<string name="entry_setup_otp">Set up one-time password</string>
|
||||
<string name="otp_counter">Counter</string>
|
||||
<string name="otp_digits">Digits</string>
|
||||
<string name="search_filters">Search filters</string>
|
||||
<string name="otp_algorithm">Algorithm</string>
|
||||
<string name="current_group">Current group</string>
|
||||
<string name="case_sensitive">Case sensitive</string>
|
||||
<string name="regex">Regular expression</string>
|
||||
<string name="debit_credit_card">Debit / Credit Card</string>
|
||||
<string name="holder">Holder</string>
|
||||
<string name="number">Number</string>
|
||||
<string name="card_verification_value">CVV</string>
|
||||
<string name="email_address">Email address</string>
|
||||
<string name="wireless">Wi-Fi</string>
|
||||
<string name="ssid">SSID</string>
|
||||
<string name="type">Type</string>
|
||||
<string name="cryptocurrency">Cryptocurrency wallet</string>
|
||||
<string name="token">Token</string>
|
||||
<string name="public_key">Public key</string>
|
||||
<string name="private_key">Private key</string>
|
||||
<string name="seed">Seed</string>
|
||||
<string name="account">Account</string>
|
||||
<string name="bank">Bank</string>
|
||||
<string name="bank_name">Bank name</string>
|
||||
<string name="bank_identifier_code">SWIFT / BIC</string>
|
||||
<string name="international_bank_account_number">IBAN</string>
|
||||
<string name="secure_note">Secure Note</string>
|
||||
<string name="membership">Membership</string>
|
||||
<string name="standard">Standard</string>
|
||||
<string name="template">Template</string>
|
||||
<string name="version">Version</string>
|
||||
<string name="entry_otp">OTP</string>
|
||||
<string name="entry_url">URL</string>
|
||||
<string name="error_can_not_handle_uri">Could not handle this URI in KeePassDX.</string>
|
||||
<string name="error_no_hardware_key">Select a hardware key.</string>
|
||||
<string name="error_out_of_memory">No memory to load your entire database.</string>
|
||||
<string name="error_XML_malformed">XML malformed.</string>
|
||||
<string name="error_load_database">Could not load the database.</string>
|
||||
<string name="error_pass_gen_type">At least one password generation type must be selected.</string>
|
||||
<string name="error_disallow_no_credentials">At least one credential must be set.</string>
|
||||
<string name="error_pass_match">The passwords do not match.</string>
|
||||
<string name="error_rounds_too_large">\"Transformation rounds\" too high. Setting to 2147483648.</string>
|
||||
<string name="error_string_key">Each string must have a field name.</string>
|
||||
<string name="error_label_exists">This label already exists.</string>
|
||||
<string name="error_challenge_already_requested">Challenge already requested.</string>
|
||||
<string name="error_response_already_provided">Response already provided.</string>
|
||||
<string name="error_no_response_from_challenge">Unable to get the response from the challenge.</string>
|
||||
<string name="error_cancel_by_user">Cancelled by user.</string>
|
||||
<string name="length">Length</string>
|
||||
<string name="hint_pass">Password</string>
|
||||
<string name="error_wrong_length">Enter a positive integer number in the \"Length\" field.</string>
|
||||
<string name="error_autofill_enable_service">Could not enable autofill service.</string>
|
||||
<string name="error_move_group_here">You cannot move a group here.</string>
|
||||
<string name="error_move_entry_here">You cannot move an entry here.</string>
|
||||
<string name="error_copy_entry_here">You cannot copy an entry here.</string>
|
||||
<string name="error_copy_group_here">You cannot copy a group here.</string>
|
||||
<string name="error_create_database">Unable to create database file.</string>
|
||||
<string name="error_create_database_file">Unable to create database with this password and keyfile.</string>
|
||||
<string name="error_save_database">Could not save the database.</string>
|
||||
<string name="error_otp_secret_key">Secret key must be in Base32 format.</string>
|
||||
<string name="error_otp_counter">Counter must be between %1$d and %2$d.</string>
|
||||
<string name="error_duplicate_file">The file data already exists.</string>
|
||||
<string name="error_remove_file">An error occurred while removing the file data.</string>
|
||||
<string name="error_start_database_action">An error occurred while performing an action on the database.</string>
|
||||
<string name="error_driver_required">Driver for %1$s is required.</string>
|
||||
<string name="error_unable_merge_database_kdb">Unable to merge from a database V1.</string>
|
||||
<string name="error_hardware_key_unsupported">Hardware key is not supported.</string>
|
||||
<string name="error_empty_key">Key cannot be empty.</string>
|
||||
<string name="field_name">Field name</string>
|
||||
<string name="field_value">Field value</string>
|
||||
<string name="file_not_found_content">Could not find file. Try reopening it from your file browser.</string>
|
||||
<string name="corrupted_file">Corrupted file.</string>
|
||||
<string name="file_browser">File manager</string>
|
||||
<string name="generate_password">Generate password</string>
|
||||
<string name="hint_conf_pass">Confirm password</string>
|
||||
<string name="hint_generated_password">Generated password</string>
|
||||
<string name="hint_group_name">Group name</string>
|
||||
<string name="hint_icon_name">Icon name</string>
|
||||
<string name="hint_keyfile">Keyfile</string>
|
||||
<string name="hint_length">Length</string>
|
||||
<string name="password">Password</string>
|
||||
<string name="passphrase">Passphrase</string>
|
||||
<string name="invalid_credentials">Could not read credentials.</string>
|
||||
<string name="invalid_algorithm">Wrong algorithm.</string>
|
||||
<string name="invalid_db_same_uuid">%1$s with the same UUID %2$s already exists.</string>
|
||||
<string name="keyfile_is_empty">The keyfile is empty.</string>
|
||||
<string name="hide_password_title">Hide passwords</string>
|
||||
<string name="list_entries_show_username_title">Show usernames</string>
|
||||
<string name="error_otp_period">Period must be between %1$d and %2$d seconds.</string>
|
||||
<string name="error_string_type">This text does not match the requested item.</string>
|
||||
<string name="error_registration_read_only">Saving a new item is not allowed in a read-only database.</string>
|
||||
<string name="error_otp_digits">Token must contain %1$d to %2$d digits.</string>
|
||||
<string name="error_database_uri_null">Database URI cannot be retrieved.</string>
|
||||
<string name="error_field_name_already_exists">The field name already exists.</string>
|
||||
<string name="error_rebuild_list">Unable to properly rebuild the list.</string>
|
||||
<string name="error_file_to_big">The file you are trying to upload is too big.</string>
|
||||
<string name="error_upload_file">An error occurred while uploading the file data.</string>
|
||||
<string name="error_location_unknown">Database location is unknown, database action cannot be performed.</string>
|
||||
<string name="hide_password_summary">Mask passwords (***) by default</string>
|
||||
<string name="list_entries_show_username_summary">Displays usernames in entry lists</string>
|
||||
<string name="list_groups_show_number_entries_title">Show number of entries</string>
|
||||
<string name="show_otp_token_summary">Displays OTP tokens in the list of entries</string>
|
||||
<string name="show_otp_token_title">Show OTP Token</string>
|
||||
</resources>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user